Add config feature

This commit is contained in:
Gitea
2021-05-08 11:18:22 +03:00
parent b24441d792
commit aac9fe8d77
3 changed files with 35 additions and 15 deletions

5
.gitignore vendored
View File

@ -2,8 +2,9 @@ __pycache__/
clients/ clients/
server.key server.key
server.pub server.pub
wg0.conf *.conf
wg0.conf_old *.conf_old
!wpm_example.conf
*.swp *.swp
*.swo *.swo
hostname hostname

36
gen.py
View File

@ -3,6 +3,7 @@ import logging
import json import json
import ipaddress import ipaddress
import argparse import argparse
import configparser
from socket import getfqdn from socket import getfqdn
from os import system from os import system
from base64 import b64encode, b64decode from base64 import b64encode, b64decode
@ -22,13 +23,23 @@ my_parser = argparse.ArgumentParser()
my_parser.add_argument('--update', action='store_true', default=False) my_parser.add_argument('--update', action='store_true', default=False)
my_parser.add_argument('--peer', action='store', type=str) my_parser.add_argument('--peer', action='store', type=str)
my_parser.add_argument('--delete', action='store', type=str) my_parser.add_argument('--delete', action='store', type=str)
my_parser.add_argument('--config', action='store', type=str)
ips = "0.0.0.0/5, 8.0.0.0/7, 10.150.200.0/24, 11.0.0.0/8, 12.0.0.0/6, 16.0.0.0/4, 32.0.0.0/3, 64.0.0.0/2, 128.0.0.0/3, 160.0.0.0/5, 168.0.0.0/6, 172.0.0.0/12, 172.32.0.0/11, 172.64.0.0/10, 172.128.0.0/9, 173.0.0.0/8, 174.0.0.0/7, 176.0.0.0/4, 192.0.0.0/9, 192.128.0.0/11, 192.160.0.0/13, 192.169.0.0/16, 192.170.0.0/15, 192.172.0.0/14, 192.176.0.0/12, 192.192.0.0/10, 193.0.0.0/8, 194.0.0.0/7, 196.0.0.0/6, 200.0.0.0/5, 208.0.0.0/4" ## Reading config
config = configparser.ConfigParser()
config.read('wpm.conf')
ips = config['Interface'].get('allowed_ips', '0.0.0.0/0')
dns = config['Interface'].get('dns', '8.8.8.8/32')
#ips = "0.0.0.0/5, 8.0.0.0/7, 10.150.200.0/24, 11.0.0.0/8, 12.0.0.0/6, 16.0.0.0/4, 32.0.0.0/3, 64.0.0.0/2, 128.0.0.0/3, 160.0.0.0/5, 168.0.0.0/6, 172.0.0.0/12, 172.32.0.0/11, 172.64.0.0/10, 172.128.0.0/9, 173.0.0.0/8, 174.0.0.0/7, 176.0.0.0/4, 192.0.0.0/9, 192.128.0.0/11, 192.160.0.0/13, 192.169.0.0/16, 192.170.0.0/15, 192.172.0.0/14, 192.176.0.0/12, 192.192.0.0/10, 193.0.0.0/8, 194.0.0.0/7, 196.0.0.0/6, 200.0.0.0/5, 208.0.0.0/4"
# Execute the parse_args() method # Execute the parse_args() method
args = my_parser.parse_args() args = my_parser.parse_args()
peer_name = args.peer peer_name = args.peer
del_name = args.delete del_name = args.delete
config = args.config if args.config else (config['Interface'].get('config', 'wg0'))
log.info('Using %s WG config file.', config)
is_update = args.update is_update = args.update
@ -53,7 +64,7 @@ class Peer:
else: else:
self.priv_key = self.generate_key() self.priv_key = self.generate_key()
self.pub_key = self.public_key(self.priv_key) self.pub_key = self.public_key(self.priv_key)
self.allowed_ips = allowed_ips if allowed_ips else Helper().next_ip self.allowed_ips = allowed_ips if allowed_ips else Helper(cfg_path=config).next_ip
self.full_comment = "# priv_key: " + " ; ".join([self.priv_key, "comment: " + comment]) self.full_comment = "# priv_key: " + " ; ".join([self.priv_key, "comment: " + comment])
@ -82,7 +93,7 @@ class Peer:
_wg.add_attr(None, 'PrivateKey', self.priv_key) _wg.add_attr(None, 'PrivateKey', self.priv_key)
_wg.add_peer(helper.server_pub_key) _wg.add_peer(helper.server_pub_key)
_wg.add_attr(helper.server_pub_key, 'AllowedIPs', f'{helper.dns}/32, {ips}') _wg.add_attr(helper.server_pub_key, 'AllowedIPs', f'{helper.dns}/32, {ips}')
_wg.add_attr(helper.server_pub_key, 'Endpoint', helper.server_addr) _wg.add_attr(helper.server_pub_key, 'Endpoint', f"{helper.server_addr}:51820")
_wg.add_attr(helper.server_pub_key, 'PersistentKeepalive', 10) _wg.add_attr(helper.server_pub_key, 'PersistentKeepalive', 10)
_wg.write_file() _wg.write_file()
system(f'qrencode -r {filename}.conf -o {filename}-qr.png') system(f'qrencode -r {filename}.conf -o {filename}-qr.png')
@ -93,8 +104,7 @@ class Peer:
class Helper: class Helper:
def __init__( def __init__(
self, self,
cfg_path="/etc/wireguard/wg0.conf", cfg_path):
dns="8.8.8.8"):
self.cfg_path = cfg_path self.cfg_path = cfg_path
self.server_addr = self.hostname self.server_addr = self.hostname
self.dns = dns self.dns = dns
@ -118,7 +128,7 @@ class Helper:
def ip_list(self): def ip_list(self):
"""Return list of IPs""" """Return list of IPs"""
ip_list = list() ip_list = list()
ip_list.append(ipaddress.ip_address(Helper().wg.interface['Address'].split('/')[0])) ip_list.append(ipaddress.ip_address(Helper(cfg_path=config).wg.interface['Address'].split('/')[0]))
for i, v in self.wg.peers.items(): for i, v in self.wg.peers.items():
try: try:
ip_raw = v.get('AllowedIPs', None) ip_raw = v.get('AllowedIPs', None)
@ -166,22 +176,22 @@ class Helper:
def add_peer(peer_name): def add_peer(peer_name):
log.info('Generate a new peer config.') log.info('Generate a new peer config.')
helper = Helper() helper = Helper(cfg_path=config)
helper.add_peer(peer_name) helper.add_peer(peer_name)
helper.wg.write_file() helper.wg.write_file()
system('systemctl restart wg-quick@wg0.service') system(f'systemctl restart wg-quick@{config}.service')
def del_peer(peer_name): def del_peer(peer_name):
log.info(f'Remove given peer {peer_name}.') log.info(f'Remove given peer {peer_name}.')
helper = Helper() helper = Helper(cfg_path=config)
helper.del_peer(peer_name) helper.del_peer(peer_name)
helper.wg.write_file() helper.wg.write_file()
system('systemctl restart wg-quick@wg0.service') system(f'systemctl restart wg-quick@{config}.service')
def update_configs(): def update_configs():
log.info("Update all clients configs.") log.info("Update all clients configs.")
for peer in Helper().peer_list: for peer in Helper(cfg_path=config).peer_list:
peer.gen_config(Helper()) peer.gen_config(Helper(cfg_path=config))
if not is_update and peer_name: if not is_update and peer_name:
add_peer(peer_name) add_peer(peer_name)
@ -190,7 +200,7 @@ if is_update:
update_configs() update_configs()
def list_peers(): def list_peers():
return [{'name': p.comment, 'ip': p.allowed_ips, 'pub_key': p.pub_key} for p in Helper().peer_list] return [{'name': p.comment, 'ip': p.allowed_ips, 'pub_key': p.pub_key} for p in Helper(cfg_path=config).peer_list]
if del_name: if del_name:
del_peer(del_name) del_peer(del_name)

9
wpm_example.conf Normal file
View File

@ -0,0 +1,9 @@
[Interface]
## allowed_ips for generated peer configs.
allowed_ips = 0.0.0.0/0
## DNS for peer configs
dns = 8.8.8.8
## wg0 is default config.
# config = wg0