Compare commits
	
		
			2 Commits
		
	
	
		
			91b8fce4fc
			...
			92ccfaf440
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 92ccfaf440 | |||
| 87f7a712e0 | 
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -160,3 +160,6 @@ cython_debug/ | |||||||
| #  option (not recommended) you can uncomment the following to ignore the entire idea folder. | #  option (not recommended) you can uncomment the following to ignore the entire idea folder. | ||||||
| #.idea/ | #.idea/ | ||||||
| 
 | 
 | ||||||
|  | # Specific | ||||||
|  | **/etc/* | ||||||
|  | **/result | ||||||
							
								
								
									
										1
									
								
								CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | # Changelog | ||||||
							
								
								
									
										114
									
								
								README-ru.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								README-ru.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,114 @@ | |||||||
|  | # wg-bootstrap | ||||||
|  | 
 | ||||||
|  | ```sh | ||||||
|  | █░█░█ █▀▀ ▄▄ █▀ ▀█▀ ▄▀█ █▀█ ▀█▀ | ||||||
|  | ▀▄▀▄▀ █▄█ ░░ ▄█ ░█░ █▀█ █▀▄ ░█░ | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | # Утилита обертка для wg-quick | ||||||
|  | 
 | ||||||
|  | Предоставляет удобный интерфейс командной строки для быстрого создания | ||||||
|  | конфигурационного файла интерфейса WireGuard без необходимости вручную | ||||||
|  | редактировать его текстовым редактором. А так же можно использовать для | ||||||
|  | создания интерфейса и его удаления | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ## Возможности | ||||||
|  | 
 | ||||||
|  | - Автоматическая проверка прав пользователя на запуск команд | ||||||
|  | - Создание  конфигурационного файла интерфейса в интерактивном режиме | ||||||
|  | - Изменение AllowedIPs на лету | ||||||
|  | - Добавление AllowedIPs к уже созданным | ||||||
|  | - Автоматическое размещение конфигурационного файла в /etc/wireguard | ||||||
|  | - Чтение информации в конфигурационном файле | ||||||
|  | - Инициализация разных конфигурационных файлов и их запуск по имени | ||||||
|  | - Удаление конфигурационного файла | ||||||
|  | - Включение и отключение интерфейса с теми же ключами что и wg-quick | ||||||
|  | 
 | ||||||
|  | ## Установка и обновление | ||||||
|  | 
 | ||||||
|  | ### Зависимости | ||||||
|  | - GNU/Linux | ||||||
|  | - python3, желательно ^3.8.1 | ||||||
|  | - wireguard или wireguard-tools | ||||||
|  | - wget для загрузки исполняемого файла | ||||||
|  |    | ||||||
|  | ### Установка | ||||||
|  | - Загрузите последнюю версию из ветки main в локальную директорию на пути $PATH | ||||||
|  | ```sh | ||||||
|  | sudo wget https://git.isptech.ru/ISPsystem/QuickAccess/raw/branch/main/wg_bootstrap/wg_start.py -O /usr/local/bin/wg-start && sudo chmod 775 /usr/local/bin/wg-start | ||||||
|  | ``` | ||||||
|  | > Не используйте sudo если пользователь является владельцем локальной директории например ~/.local/bin | ||||||
|  | > | ||||||
|  | > При необходимости измените стандартный путь /usr/local/bin/wg-start в двух местах команды выше на тот который нужен именно вам. | ||||||
|  | > | ||||||
|  | > Команда выше добавит флаг исполнения к команде wg-start автоматически | ||||||
|  | 
 | ||||||
|  | ### Обновление | ||||||
|  | - Выполните загрузку повторно  | ||||||
|  | > Ссылка всегда ведет на последнюю стабильную версию. | ||||||
|  | >  | ||||||
|  | > После тега 0.1.0 ветка main содержит только стабильный релиз | ||||||
|  | 
 | ||||||
|  | ## Использование | ||||||
|  | 
 | ||||||
|  | ### Справка | ||||||
|  | ```sh | ||||||
|  | usage: wg-start [-h] [-v] {init,cat,rm,add,replace,up,down} interface [allowedIPs] | ||||||
|  | 
 | ||||||
|  | CRUD WireGuard config file or UP/DOWN wg-interface | ||||||
|  | 
 | ||||||
|  | positional arguments: | ||||||
|  |   {init,cat,rm,add,replace,up,down} | ||||||
|  |                         Action with interface | ||||||
|  |   interface             WG interface name (wg0, wg1, wgName etc...) | ||||||
|  |   allowedIPs            Set AllowedIPs must be a string | ||||||
|  | 
 | ||||||
|  | options: | ||||||
|  |   -h, --help            show this help message and exit | ||||||
|  |   -v, --version         show program's version number and exit | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### Примеры | ||||||
|  | - Инициализация конфигурационного файла нового интерфейса wg0: | ||||||
|  | ```sh | ||||||
|  | wg-start init wg0 | ||||||
|  | ``` | ||||||
|  | - Инициализация (включение) интерфейса wg0 | ||||||
|  | ```sh | ||||||
|  | wg-start up wg0 | ||||||
|  | ``` | ||||||
|  | - Удаление (отключение) интерфейса wg0 | ||||||
|  | ```sh | ||||||
|  | wg-start up wg0 | ||||||
|  | ``` | ||||||
|  | - Прочитать конфигурационный файл интерфейса wg0 | ||||||
|  | ```sh | ||||||
|  | wg-start cat wg0 | ||||||
|  | ``` | ||||||
|  | - Удалить конфигурационный файл интерфейса wg0 | ||||||
|  | ```sh | ||||||
|  | wg-start rm wg0 | ||||||
|  | ``` | ||||||
|  | - Заменить AllowedIPS на 0.0.0.0/24 в конфигурационном файле интерфейса wg0 | ||||||
|  | ```sh | ||||||
|  | wg-start replace wg0 0.0.0.0/24 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | - Добавить к AllowedIPS 172.10.10.0/24 в конфигурационном файле интерфейса wg0 | ||||||
|  | ```sh | ||||||
|  | wg-start add wg0 172.10.10.0/24 | ||||||
|  | ``` | ||||||
|  | - Добавить к AllowedIPS несколько IP в конфигурационном файле интерфейса wg0 | ||||||
|  | ```sh | ||||||
|  | wg-start add wg0 "172.10.11.0/24, 10.10.10.1/24, 192.168.1.1" | ||||||
|  | ``` | ||||||
|  | > Имя интерфейса может быть любым wg0 это просто пример, можно дать интерфейсу осмысленное название | ||||||
|  | >  | ||||||
|  | > Можно добавлять любое количество интерфейсов, если такой интерфейс уже присутствовал он будет перезаписан! | ||||||
|  | 
 | ||||||
|  | ### Приятного использования, друг и спасибо что дочитал до конца | ||||||
|  | 
 | ||||||
|  | ## License | ||||||
|  | 
 | ||||||
|  | GNU GPL 3.0 | ||||||
							
								
								
									
										115
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										115
									
								
								README.md
									
									
									
									
									
								
							| @ -1,3 +1,114 @@ | |||||||
| # wg-bootstrap | # wg bootstrap | ||||||
| 
 | 
 | ||||||
| Quick setup and connection to the client using WireGuard VPN | ```sh | ||||||
|  | █░█░█ █▀▀ ▄▄ █▀ ▀█▀ ▄▀█ █▀█ ▀█▀ | ||||||
|  | ▀▄▀▄▀ █▄█ ░░ ▄█ ░█░ █▀█ █▀▄ ░█░ | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | # Utility wrapper for wg-quick | ||||||
|  | 
 | ||||||
|  | Provides a convenient command line interface for quick creation | ||||||
|  | configuration file of the WireGuard interface without having to manually | ||||||
|  | edit it with a text editor. Also can be used for | ||||||
|  | interface creation and removal | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ## Features | ||||||
|  | 
 | ||||||
|  | - Automatic check of user permissions to run commands | ||||||
|  | - Create interface configuration file interactively | ||||||
|  | - Change AllowedIPs on the fly | ||||||
|  | - Adding AllowedIPs to already created ones | ||||||
|  | - Automatic placement of the configuration file in /etc/wireguard | ||||||
|  | - Reading information in the configuration file | ||||||
|  | - Initializing various configuration files and running them by name | ||||||
|  | - Delete configuration file | ||||||
|  | - Enable and disable the interface with the same keys as wg-quick | ||||||
|  | 
 | ||||||
|  | ## Install and update | ||||||
|  | 
 | ||||||
|  | ### Dependencies | ||||||
|  | - GNU/Linux | ||||||
|  | - python3, preferably ^3.8.1 | ||||||
|  | - wireguard or wireguard-tools | ||||||
|  | - wget to download the executable | ||||||
|  |    | ||||||
|  | ### Installation | ||||||
|  | - Download the latest version from the main branch to a local directory in $PATH | ||||||
|  | ```sh | ||||||
|  | sudo wget https://git.isptech.ru/ISPsystem/QuickAccess/raw/branch/main/wg_bootstrap/wg_start.py -O /usr/local/bin/wg-start && sudo chmod 775 /usr/local/bin/wg-start | ||||||
|  | ``` | ||||||
|  | > Don't use sudo if the user owns a local directory like ~/.local/bin | ||||||
|  | > | ||||||
|  | > If necessary, change the standard path /usr/local/bin/wg-start in the two places in the command above to the one you need. | ||||||
|  | > | ||||||
|  | > The command above will add the execution flag to the wg-start command automatically | ||||||
|  | 
 | ||||||
|  | ### Update | ||||||
|  | - Download again | ||||||
|  | > The link always leads to the latest stable version. | ||||||
|  | > | ||||||
|  | > After the 0.1.0 tag, the main branch only contains the stable release | ||||||
|  | 
 | ||||||
|  | ## Usage | ||||||
|  | 
 | ||||||
|  | ### Reference | ||||||
|  | ```sh | ||||||
|  | usage: wg-start [-h] [-v] {init,cat,rm,add,replace,up,down} interface [allowedIPs] | ||||||
|  | 
 | ||||||
|  | CRUD WireGuard config file or UP/DOWN wg-interface | ||||||
|  | 
 | ||||||
|  | positional arguments: | ||||||
|  |    {init,cat,rm,add,replace,up,down} | ||||||
|  |                          Action with interface | ||||||
|  |    interface WG interface name (wg0, wg1, wgName etc...) | ||||||
|  |    allowedIPs Set AllowedIPs must be a string | ||||||
|  | 
 | ||||||
|  | options: | ||||||
|  |    -h, --help show this help message and exit | ||||||
|  |    -v, --version show program's version number and exit | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### Examples | ||||||
|  | - Initialization of the configuration file of the new wg0 interface: | ||||||
|  | ```sh | ||||||
|  | wg-start init wg0 | ||||||
|  | ``` | ||||||
|  | - Initialization (enabling) of wg0 interface | ||||||
|  | ```sh | ||||||
|  | wg-start up wg0 | ||||||
|  | ``` | ||||||
|  | - Removing (disabling) the wg0 interface | ||||||
|  | ```sh | ||||||
|  | wg-start up wg0 | ||||||
|  | ``` | ||||||
|  | - Read wg0 interface configuration file | ||||||
|  | ```sh | ||||||
|  | wg-start cat wg0 | ||||||
|  | ``` | ||||||
|  | - Delete wg0 interface configuration file | ||||||
|  | ```sh | ||||||
|  | wg-start rm wg0 | ||||||
|  | ``` | ||||||
|  | - Replace AllowedIPS with 0.0.0.0/24 in wg0 interface config file | ||||||
|  | ```sh | ||||||
|  | wg-start replace wg0 0.0.0.0/24 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | - Add to AllowedIPS 172.10.10.0/24 in wg0 interface config file | ||||||
|  | ```sh | ||||||
|  | wg-start add wg0 172.10.10.0/24 | ||||||
|  | ``` | ||||||
|  | - Add multiple IPs to AllowedIPS in wg0 interface config file | ||||||
|  | ```sh | ||||||
|  | wg-start add wg0 "172.10.11.0/24, 10.10.10.1/24, 192.168.1.1" | ||||||
|  | ``` | ||||||
|  | > Interface name can be anything wg0 this is just an example, you can give the interface a meaningful name | ||||||
|  | > | ||||||
|  | > You can add any number of interfaces, if such an interface was already present, it will be overwritten! | ||||||
|  | 
 | ||||||
|  | ### Have fun friend and thanks for reading to the end | ||||||
|  | 
 | ||||||
|  | ## License | ||||||
|  | 
 | ||||||
|  | GNU GPL 3.0 | ||||||
							
								
								
									
										27
									
								
								flake.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								flake.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | |||||||
|  | { | ||||||
|  |   "nodes": { | ||||||
|  |     "nixpkgs": { | ||||||
|  |       "locked": { | ||||||
|  |         "lastModified": 1689935543, | ||||||
|  |         "narHash": "sha256-6GQ9ib4dA/r1leC5VUpsBo0BmDvNxLjKrX1iyL+h8mc=", | ||||||
|  |         "owner": "nixos", | ||||||
|  |         "repo": "nixpkgs", | ||||||
|  |         "rev": "e43e2448161c0a2c4928abec4e16eae1516571bc", | ||||||
|  |         "type": "github" | ||||||
|  |       }, | ||||||
|  |       "original": { | ||||||
|  |         "owner": "nixos", | ||||||
|  |         "ref": "nixpkgs-unstable", | ||||||
|  |         "repo": "nixpkgs", | ||||||
|  |         "type": "github" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "root": { | ||||||
|  |       "inputs": { | ||||||
|  |         "nixpkgs": "nixpkgs" | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "root": "root", | ||||||
|  |   "version": 7 | ||||||
|  | } | ||||||
							
								
								
									
										30
									
								
								flake.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								flake.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | { | ||||||
|  |   description = "wg-quick wrapper for creating interface config and up/down wg"; | ||||||
|  |   inputs = { | ||||||
|  |     nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   outputs = { self, nixpkgs }: | ||||||
|  |   let | ||||||
|  |     system = "x86_64-linux"; | ||||||
|  |     pkgs = nixpkgs.legacyPackages.${system}; | ||||||
|  |   in{ | ||||||
|  |     packages.${system}.default = pkgs.poetry2nix.mkPoetryApplication { | ||||||
|  |       projectDir = self; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     devShells.${system}.default = pkgs.mkShellNoCC { | ||||||
|  |       shellHook = "echo Welcome to your Nix-powered development environment!";  | ||||||
|  |       WG_BOOTSTRAP = "development"; | ||||||
|  |       packages = with pkgs; [ | ||||||
|  |         (poetry2nix.mkPoetryEnv { projectDir = self; }) | ||||||
|  |         wireguard-tools | ||||||
|  |       ]; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     apps.${system}.default = { | ||||||
|  |       program = "${self.packages.${system}.default}/bin/wg-start"; | ||||||
|  |       type = "app"; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										55
									
								
								poetry.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								poetry.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @ -0,0 +1,55 @@ | |||||||
|  | # This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "flake8" | ||||||
|  | version = "6.0.0" | ||||||
|  | description = "the modular source code checker: pep8 pyflakes and co" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.8.1" | ||||||
|  | files = [ | ||||||
|  |     {file = "flake8-6.0.0-py2.py3-none-any.whl", hash = "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7"}, | ||||||
|  |     {file = "flake8-6.0.0.tar.gz", hash = "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [package.dependencies] | ||||||
|  | mccabe = ">=0.7.0,<0.8.0" | ||||||
|  | pycodestyle = ">=2.10.0,<2.11.0" | ||||||
|  | pyflakes = ">=3.0.0,<3.1.0" | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "mccabe" | ||||||
|  | version = "0.7.0" | ||||||
|  | description = "McCabe checker, plugin for flake8" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.6" | ||||||
|  | files = [ | ||||||
|  |     {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, | ||||||
|  |     {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "pycodestyle" | ||||||
|  | version = "2.10.0" | ||||||
|  | description = "Python style guide checker" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.6" | ||||||
|  | files = [ | ||||||
|  |     {file = "pycodestyle-2.10.0-py2.py3-none-any.whl", hash = "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"}, | ||||||
|  |     {file = "pycodestyle-2.10.0.tar.gz", hash = "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "pyflakes" | ||||||
|  | version = "3.0.1" | ||||||
|  | description = "passive checker of Python programs" | ||||||
|  | optional = false | ||||||
|  | python-versions = ">=3.6" | ||||||
|  | files = [ | ||||||
|  |     {file = "pyflakes-3.0.1-py2.py3-none-any.whl", hash = "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf"}, | ||||||
|  |     {file = "pyflakes-3.0.1.tar.gz", hash = "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd"}, | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | [metadata] | ||||||
|  | lock-version = "2.0" | ||||||
|  | python-versions = "^3.8.1" | ||||||
|  | content-hash = "ae9182c39898ce95ac2f3cc63f487560d954e9af3220b5e508cf2ea23442faa1" | ||||||
							
								
								
									
										24
									
								
								pyproject.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								pyproject.toml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | |||||||
|  | [tool.poetry] | ||||||
|  | name = "wg-bootstrap" | ||||||
|  | version = "0.1.0" | ||||||
|  | description = "wg-quick wrapper for creating interface config and up/down wg" | ||||||
|  | authors = ["MOIS3Y <s.zhukovskii@ispsystem.com>"] | ||||||
|  | license = "GPL-3.0-or-later" | ||||||
|  | repository = "https://git.isptech.ru/ISPsystem/wg-bootstrap" | ||||||
|  | keywords = ["wireguard-tools", "wg", "interface"] | ||||||
|  | include = ["CHANGELOG.md"] | ||||||
|  | readme = "README.md" | ||||||
|  | packages = [{include = "wg_bootstrap"}] | ||||||
|  | 
 | ||||||
|  | [tool.poetry.dependencies] | ||||||
|  | python = "^3.8.1" | ||||||
|  | 
 | ||||||
|  | [tool.poetry.group.dev.dependencies] | ||||||
|  | flake8 = "^6.0.0" | ||||||
|  | 
 | ||||||
|  | [tool.poetry.scripts] | ||||||
|  | wg-start = "wg_bootstrap.wg_start:main" | ||||||
|  | 
 | ||||||
|  | [build-system] | ||||||
|  | requires = ["poetry-core"] | ||||||
|  | build-backend = "poetry.core.masonry.api" | ||||||
							
								
								
									
										0
									
								
								wg_bootstrap/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								wg_bootstrap/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										199
									
								
								wg_bootstrap/wg_start.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										199
									
								
								wg_bootstrap/wg_start.py
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,199 @@ | |||||||
|  | #!/usr/bin/env python3 | ||||||
|  | import os | ||||||
|  | import sys | ||||||
|  | import argparse | ||||||
|  | import subprocess as sp | ||||||
|  | from pathlib import Path | ||||||
|  | from functools import wraps | ||||||
|  | 
 | ||||||
|  | __author__ = "MOIS3Y" | ||||||
|  | __version__ = "0.1.0" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # check development or production environment: | ||||||
|  | if os.environ.get("WG_BOOTSTRAP"): | ||||||
|  |     CONFIG_PATH = Path(__file__).resolve().parents[1] / "etc" / "wireguard" | ||||||
|  | else: | ||||||
|  |     CONFIG_PATH = Path("/etc/wireguard") | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def sudo_required(func): | ||||||
|  |     """ | ||||||
|  |     the decorator raise an exception PermissionError | ||||||
|  |     when trying to call a function without superuser privileges (sudo) | ||||||
|  |     or not from under the root. | ||||||
|  | 
 | ||||||
|  |     Args: | ||||||
|  |         func (_function_): any function | ||||||
|  |     """ | ||||||
|  |     @wraps(func)  # <- save meta info for wrapped func | ||||||
|  |     def is_root(*args, **kwargs): | ||||||
|  |         if not os.environ.get("SUDO_UID") and os.geteuid() != 0: | ||||||
|  |             sys.tracebacklimit = 0 | ||||||
|  |             prog = os.path.basename(__file__) | ||||||
|  |             error_message = f"You need to run {prog} with sudo or as root." | ||||||
|  |             raise PermissionError(error_message) | ||||||
|  |         result = func(*args, **kwargs) | ||||||
|  |         return result | ||||||
|  | 
 | ||||||
|  |     return is_root | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @sudo_required | ||||||
|  | def get_wg_conf() -> dict: | ||||||
|  |     """ | ||||||
|  |     gets the values for the settings dict interactively from the user input | ||||||
|  | 
 | ||||||
|  |     Returns: | ||||||
|  |         dict: settings for wg interface | ||||||
|  |     """ | ||||||
|  |     settings: dict = { | ||||||
|  |         "Interface": { | ||||||
|  |             "PrivateKey": None, | ||||||
|  |             "Address": None, | ||||||
|  |             "DNS": None | ||||||
|  |         }, | ||||||
|  |         "Peer": { | ||||||
|  |             "PublicKey": None, | ||||||
|  |             "AllowedIPs": None, | ||||||
|  |             "Endpoint": None | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     for title in settings: | ||||||
|  |         for key, value in settings[title].items(): | ||||||
|  |             settings[title][key] = input(f"[{title}] - {key}: ") | ||||||
|  | 
 | ||||||
|  |     return settings | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @sudo_required | ||||||
|  | def gen_wg_conf(config_path, **settings): | ||||||
|  |     """ | ||||||
|  |     generates a config file for the wireguard interface, | ||||||
|  |     receiving a dict (**settings) with the desired values | ||||||
|  | 
 | ||||||
|  |     Args: | ||||||
|  |         config_path (Path): path to wg interface configuration file | ||||||
|  |         **settings (dict): settings for wg interface | ||||||
|  |     """ | ||||||
|  |     # check if interface parent dir exist: | ||||||
|  |     config_path.parent.mkdir(parents=True, exist_ok=True) | ||||||
|  | 
 | ||||||
|  |     with open(config_path, 'w') as file: | ||||||
|  |         for title in settings: | ||||||
|  |             if title == "Peer": | ||||||
|  |                 file.write(f"\n[{title}]\n") | ||||||
|  |             else: | ||||||
|  |                 file.write(f"[{title}]\n") | ||||||
|  | 
 | ||||||
|  |             for key, value in settings[title].items(): | ||||||
|  |                 file.write(f"{key} = {value}\n") | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @sudo_required | ||||||
|  | def use_wg_conf(config_path, command): | ||||||
|  |     sp.run([command, config_path]) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def wg_quick(interface, command): | ||||||
|  |     sp.run(["wg-quick", command, interface]) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def exist_wg_conf(config_path): | ||||||
|  |     return config_path.exists() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @sudo_required | ||||||
|  | def change_allowed_ips(config_path, allowed_ips, action="replace"): | ||||||
|  |     """ | ||||||
|  |     the function changes the AllowedIPs value in | ||||||
|  |     the passed configuration file. | ||||||
|  | 
 | ||||||
|  |     Args: | ||||||
|  |         config_file (Path): path to wg interface configuration file | ||||||
|  |         allowed_ips (str): comma and space separated ip addresses | ||||||
|  |         action (str, optional): replace or add. Defaults to "replace". | ||||||
|  |     """ | ||||||
|  |     with open(config_path, 'r') as source: | ||||||
|  |         lines = source.readlines() | ||||||
|  | 
 | ||||||
|  |     with open(config_path, 'w') as target: | ||||||
|  |         for line in lines: | ||||||
|  |             if line.strip().startswith('AllowedIPs = '): | ||||||
|  |                 if action == "add": | ||||||
|  |                     old = line.strip('\n') | ||||||
|  |                     line = f"{old}, {allowed_ips}\n" | ||||||
|  |                 else: | ||||||
|  |                     line = f"AllowedIPs = {allowed_ips}\n" | ||||||
|  |             target.write(line) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def create_parser(): | ||||||
|  |     parser = argparse.ArgumentParser( | ||||||
|  |         description="CRUD WireGuard config file or UP/DOWN wg-interface" | ||||||
|  |     ) | ||||||
|  |     parser.add_argument( | ||||||
|  |         "command", | ||||||
|  |         type=str, | ||||||
|  |         choices=["init", "cat", "rm", "add", "replace", "up", "down"], | ||||||
|  |         help="Action with interface" | ||||||
|  |     ) | ||||||
|  |     parser.add_argument( | ||||||
|  |         "interface", | ||||||
|  |         type=str, | ||||||
|  |         help="WG interface name (wg0, wg1, wgName etc...)" | ||||||
|  |     ) | ||||||
|  |     parser.add_argument( | ||||||
|  |         "allowedIPs", | ||||||
|  |         type=str, | ||||||
|  |         nargs="?", | ||||||
|  |         help="Set AllowedIPs must be a string" | ||||||
|  |     ) | ||||||
|  |     parser.add_argument( | ||||||
|  |         "-v", | ||||||
|  |         "--version", | ||||||
|  |         action='version', | ||||||
|  |         version=f"%(prog)s - {__version__}") | ||||||
|  | 
 | ||||||
|  |     return parser | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     # init cmd args parser: | ||||||
|  |     parser = create_parser() | ||||||
|  |     args = parser.parse_args() | ||||||
|  | 
 | ||||||
|  |     # current wg interface (get from required arg from user): | ||||||
|  |     config_path = CONFIG_PATH / f"{args.interface}.conf" | ||||||
|  | 
 | ||||||
|  |     # interface config: | ||||||
|  |     if args.command == "init": | ||||||
|  |         settings = get_wg_conf() | ||||||
|  |         gen_wg_conf(config_path, **settings) | ||||||
|  | 
 | ||||||
|  |     if args.command == "cat" or args.command == "rm": | ||||||
|  |         if not exist_wg_conf(config_path): | ||||||
|  |             raise parser.error(f"{config_path} does not exist") | ||||||
|  |         use_wg_conf(config_path, args.command) | ||||||
|  | 
 | ||||||
|  |     if args.command == "add" or args.command == "replace": | ||||||
|  |         if not args.allowedIPs: | ||||||
|  |             raise parser.error("With add/replace you must pass AllowedIPs") | ||||||
|  |         if not exist_wg_conf(config_path): | ||||||
|  |             raise parser.error(f"{config_path} does not exist") | ||||||
|  |         change_allowed_ips( | ||||||
|  |             config_path, | ||||||
|  |             args.allowedIPs, | ||||||
|  |             args.command | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |     # run wg-quick: | ||||||
|  |     if args.command == "up" or args.command == "down": | ||||||
|  |         try: | ||||||
|  |             wg_quick(args.interface, args.command) | ||||||
|  |         except KeyboardInterrupt or Exception: | ||||||
|  |             sys.exit(0) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     main() | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user