Giter VIP home page Giter VIP logo

wg-meshconf's Introduction

wg-meshconf

wg-meshconf is a tool that will help you to generate peer configuration files for WireGuard mesh networks. You can easily and quickly create WireGuard mesh networks using this tool.

Installation (PyPI)

This is the recommended way to install wg-meshconf for regular users. This installation method installs the newest release version of wg-meshconf and all of the required dependencies from PyPI.

# installing the program with pip
# note that Pip for Python3 might be named "pip3" on some systems
pip install --user -U wg-meshconf

# running the program
wg-meshconf showpeers

You may now run the program by executing the wg-meshconf command.

Installation (GitHub)

Alternatively, if you would like to install the program directly from source code, you can follow the steps below. If you would like to install directly from the Git repository:

# install the HEAD (latest) commit
pip install 'wg-meshconf@git+https://github.com/k4yt3x/wg-meshconf.git'

# install from a specific tag or commit
pip install 'wg-meshconf@git+https://github.com/k4yt3x/[email protected]'
pip install 'wg-meshconf@git+https://github.com/k4yt3x/wg-meshconf.git@aa16407'

You can also clone it and install it locally.

# cloning the repository with git
git clone https://github.com/k4yt3x/wg-meshconf.git

# enter the directory
cd wg-meshconf

# install the program with Pip
# Pip and PDM will take care of dependency installation
pip install -U .

Learn by an Example

Usages are dull and boring. Let's see a real-life example of how this tool can be used. This section will demonstrate how to create a simple mesh network with four nodes using wg-meshconf.

For this example, suppose you have four servers as shown below. These servers can reach each other via the Endpoint address. For instance, server tokyo1 can ping server shanghai1 with the address shanghai1.com.

image

Step 1: Add Basic Peer Information

You will first need to add the peers' information into the database. There are two ways to do it: via Excel and via the command line interface.

Method A: With Excel

wg-meshconf has changed its database format from JSON to CSV and added the init command since version 2.4.0. This means that it is now possible for users to directly edit the database file with Excel or other CSV-compatible editors to create/read/update/delete peer information.

(P.S. I thought about making a fancy GUI for wg-meshconf like the other tools, but then I thought, why do it the complex way when you can simply "borrow" Excel's GUI?)

Run the following command to initialize a new database file. By default, the database file is named database.csv. You can also specify the file's name via -d.

wg-meshconf init

Open the database CSV file with an editor like Excel or LibreOffice Calc. You should see the following column headers.

image

You can then fill in the peers' information. You will need to fill in at least the peers' Name, Address, and Endpoint values. These values cannot be automatically generated.

image

Once you're done, save the file and execute the init command again to automatically generate the rest of the needed information such as peer private keys.

wg-meshconf init

If you check the file again, you'll see the necessary fields getting automatically filed in.

image

Method B: With Terminal

If, for some reason, you don't want to edit the database file directly, you can also use this tool purely through its command line interface.

First we need to add all peers in the mesh network into the database. The basic syntax for adding new peers is:

wg-meshconf addpeer NAME --address IP_ADDRESS --address IP_ADDRESS_2 --endpoint ENDPOINT
  • New private key will be generated automatically if unspecified
  • ListenPort defaults to 51820 per WireGuard standard
  • All other values are left empty by default

There are more options which you can specify. Use the command wg-meshconf addpeer -h for more details.

After adding all the peers into the database, you can verify that they have all been added correctly via the wg-meshconf showpeers command. The simplify switch here omits all columns with only Nones.

image

Step 2: Export Configuration Files

Use the genconfig command to generate configuration files for all peers. You may also export configurations for only one peer by specifying the peer's name.

The configuration files will be named after the peers' names. By default, all configuration files are exported into a subdirectory named output. You can change this by specifying output directory using the -o or the --output option.

image

Step 3: Copy Configuration Files to Peers

Copy each of the configuration files to the corresponding peers.

image

Step 4: Start WireGuard Services

Start up the WireGuard interfaces using the wg-quick command. It is also possible to control WireGuard interfaces via WireGuard's wg-quick@ systemd service. WireGuard status can be verified via the wg command after WireGuard interfaces are set up.

image

Step 5: Verify Connectivity

Verify that all endpoints have been configured properly and can connect to each other.

image

Done. Now a mesh network has been created between the four servers.

Updating Peer Information

If you would like to update a peer's information, use the updatepeer command. The syntax of updatepeer is the same as that of the addpeer command. Instead of adding a new peer, this command overwrites values in existing entries.

In the example below, suppose you would like to update tokyo1's endpoint address and change it to tokyo321.com. Use the updatepeer command and specify the new endpoint to be tokyo321.com. This will overwrite tokyo1's existing Endpoint value.

image

Show Peer Information

The showpeers command prints all peers' information by default.

image

Now that's a lot of info and a lot of unnecessary columns which only have Nones. Therefore, I added the -s/--simplify command which omits those useless columns.

image

You may also query information about a specific peer.

image

Plaintext mode has a similar usage. It's just a bit harder to read, at least for me.

image

Deleting Peers

Use the delpeer command to delete peers. The syntax is delpeer PEER_NAME.

This example below shows how to delete the peer tokyo1 from the database.

image

Database Files

Unlike 1.x.x versions of wg-meshconf, version 2.0.0 does not require the user to save or load profiles. Instead, all add peer, update peer and delete peer operations are file operations. The changes will be saved to the database file immediately. The database file to use can be specified via the -d or the --database option. If no database file is specified, database.csv will be used.

Database files are essentially just CSV files (it was JSON before version 2.4.0). Below is an example.

"Name","Address","Endpoint","AllowedIPs","ListenPort","PersistentKeepalive","FwMark","PrivateKey","DNS","MTU","Table","PreUp","PostUp","PreDown","PostDown","SaveConfig"
"tokyo1","10.1.0.1/16","tokyo1.com","","51820","","","yJndNh80ToNWGOfDlbtho1wHAEZGa7ZhNpsHf7AJVUM=","","","","","","","",""
"germany1","10.2.0.1/16","germany1.com","","51820","","","SEOaOjTrhR4do1iUrTTRRHZs6xCA3Q/H0yHW3ZpkHko=","","","","","","","",""
"canada1","10.3.0.1/16","canada1.com","","51820","","","2D34jpbTsU+KeBqfItTEbL5m7nYcBomWWJGTYCT6eko=","","","","","","","",""
"shanghai1","10.4.0.1/16","shanghai1.com","","51820","","","CGyR7goj/uGH3TQHgVknpb9ZBR+/yMfkve+kVNGBYlg=","","","","","","","",""

Detailed Usages

You may refer to the program's help page for usages. Use the -h switch or the --help switch to print the help page.

$ wg-meshconf -h
usage: wg-meshconf [-h] [-d DATABASE] {addpeer,updatepeer,delpeer,showpeers,genconfig} ...

positional arguments:
  {addpeer,updatepeer,delpeer,showpeers,genconfig}

optional arguments:
  -h, --help            show this help message and exit
  -d DATABASE, --database DATABASE
                        path where the database file is stored (default: database.json)

Specify -h or --help after a command to see this command's usages.

$ wg-meshconf addpeer -h
usage: wg-meshconf addpeer [-h] --address ADDRESS [--endpoint ENDPOINT] [--privatekey PRIVATEKEY] [--listenport LISTENPORT] [--fwmark FWMARK] [--dns DNS] [--mtu MTU] [--table TABLE] [--preup PREUP] [--postup POSTUP] [--predown PREDOWN] [--postdown POSTDOWN] [--saveconfig] name

positional arguments:
  name                  Name used to identify this node

optional arguments:
  -h, --help            show this help message and exit
  --address ADDRESS     address of the server
  --endpoint ENDPOINT   peer's public endpoint address
  --privatekey PRIVATEKEY
                        private key of server interface
  --listenport LISTENPORT
                        port to listen on
  --fwmark FWMARK       fwmark for outgoing packets
  --dns DNS             server interface DNS servers
  --mtu MTU             server interface MTU
  --table TABLE         server routing table
  --preup PREUP         command to run before interface is up
  --postup POSTUP       command to run after interface is up
  --predown PREDOWN     command to run before interface is down
  --postdown POSTDOWN   command to run after interface is down
  --saveconfig          save server interface to config upon shutdown

License

This project is licensed under the GNU General Public License Version 3 (GNU GPL v3)
Copyright (c) 2018-2023 K4YT3X and contributors.

GPLv3 Icon

This project includes or dependson the following software and projects:

Project License
Rich MIT License
WireGuard MIT License
cryptography BSD License

Related Project: wg-dynamic

wg-dynamic is a tool designed officially by the WireGuard developing team. This new utility will provide a convenient way of configuring networks dynamically, where mesh network being one of the them. If you're interested, check it out at wg-dynamic@github or wg-dynamic@official repository. You might also want to read this project's idea page.

This section used to be on the top of the page, but has been moved since there has been no new commits observed in this project since 2019.

wg-meshconf's People

Contributors

dimon222 avatar k4yt3x avatar kolanich avatar krombel avatar rudolfbyker avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wg-meshconf's Issues

cannot find wg binary in mac bigsur

which wg

Response:

/usr/local/bin/wg

Adding peer

wg-meshconf addpeer Name --address 10.1.0.1/16 --endpoint xx.xx.xx.xx

Response:

Traceback (most recent call last):
  File "/usr/local/bin/wg-meshconf", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.7/site-packages/wg_meshconf/wg_meshconf.py", line 161, in main
    args.saveconfig,
  File "/usr/local/lib/python3.7/site-packages/wg_meshconf/database_manager.py", line 120, in addpeer
    privatekey = self.wireguard.genkey()
  File "/usr/local/lib/python3.7/site-packages/wg_meshconf/wireguard.py", line 47, in genkey
    stdout=subprocess.PIPE,
  File "/usr/local/Cellar/[email protected]/3.7.9_2/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 488, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/usr/local/Cellar/[email protected]/3.7.9_2/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 800, in __init__
    restore_signals, start_new_session)
  File "/usr/local/Cellar/[email protected]/3.7.9_2/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 1551, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: '/usr/bin/wg': '/usr/bin/wg'

Relay servers

Here is an example config: example.zip

It has two nodes with public IPs, called alpha and beta, and two nodes without public IPs and behind NATs, called gamma and delta. In this configuration, the mesh works well, except for the connection between gamma and delta. (Note that gamma can talk to alpha and beta and vice versa without issues. The same with delta.)

I can tweak the generated config manually to get everything to work. The required changes are:

  • comment out the AllowedIPs line under the delta peer in the gamma config file
  • comment out the AllowedIPs line under the gamma peer in the delta config file

This tells wireguard that gamma can't reach delta directly, so it uses alpha or beta as a relay server, which is exactly what I want.

Can this be done in wg-meshconf without post-processing the generated config files?

Pre-shared key generation

Any chance pre-shared key generation can be added tor each pair of mesh nodes? (Further security improvement)

Why is Endpoint mandatory?

I don't understand why Endpoint is mandatory in the CSV? It is not mandatory when adding via command line.

Also, Wireguard itself doesn't need the endpoint to work correctly. At least I've never needed it, in my limited experience.

Description Field

Thank you for your script.
It would be great if you add an descpription field to peers, that would be very helpful (to fill in common name).
cu Peje

Bug: `PersistentKeepalive` is added to the wrong side.

Here is a sample database.csv file:

"Name","Address","Endpoint","AllowedIPs","ListenPort","PersistentKeepalive","FwMark","PrivateKey","DNS","MTU","Table","PreUp","PostUp","PreDown","PostDown","SaveConfig"
"alpha","10.0.0.1","alpha.example.com","","51820","","","aCqUml43tjjw3SBVM+M9IyrApZ5pthzrFBMxWKnLPE0=","","","","","","","",""
"beta","10.0.0.2","beta.example.com","","51820","","","cJE+l3HYxY5eHzxUfvNP7i5nbR7TjaSVYwqxvjW4Hl4=","","","","","","","",""
"gamma","10.0.0.3","","","51820","25","","4B6WZu3OyCXIOWyuN7dFKh/FGsVIFzkSuGsszdMsLlg=","","","","","","","",""

This generates the following config:

alpha:

[Interface]
# Name: alpha
Address = 10.0.0.1
PrivateKey = aCqUml43tjjw3SBVM+M9IyrApZ5pthzrFBMxWKnLPE0=
ListenPort = 51820

[Peer]
# Name: beta
PublicKey = PBFFzDSLOn0CyxF2d0SWo8F0xktozEQFflmIYgYDg14=
Endpoint = beta.example.com:51820
AllowedIPs = 10.0.0.2

[Peer]
# Name: gamma
PublicKey = HV5qryi3YcrhKQd/4A0h6xxWr+ARlncT06K+BY9XsCU=
AllowedIPs = 10.0.0.3
PersistentKeepalive = 25

beta:

[Interface]
# Name: beta
Address = 10.0.0.2
PrivateKey = cJE+l3HYxY5eHzxUfvNP7i5nbR7TjaSVYwqxvjW4Hl4=
ListenPort = 51820

[Peer]
# Name: alpha
PublicKey = KE5NYiNewB3VwoIHGPXBCDxGphf6m3gGUyLyhy7Vd2A=
Endpoint = alpha.example.com:51820
AllowedIPs = 10.0.0.1

[Peer]
# Name: gamma
PublicKey = HV5qryi3YcrhKQd/4A0h6xxWr+ARlncT06K+BY9XsCU=
AllowedIPs = 10.0.0.3
PersistentKeepalive = 25

gamma:

[Interface]
# Name: gamma
Address = 10.0.0.3
PrivateKey = 4B6WZu3OyCXIOWyuN7dFKh/FGsVIFzkSuGsszdMsLlg=
ListenPort = 51820

[Peer]
# Name: alpha
PublicKey = KE5NYiNewB3VwoIHGPXBCDxGphf6m3gGUyLyhy7Vd2A=
Endpoint = alpha.example.com:51820
AllowedIPs = 10.0.0.1

[Peer]
# Name: beta
PublicKey = PBFFzDSLOn0CyxF2d0SWo8F0xktozEQFflmIYgYDg14=
Endpoint = beta.example.com:51820
AllowedIPs = 10.0.0.2

I have read all I could find about PersistentKeepalive (which is not a lot), and it sounds to me like it should only be specified in the config of the node which is behind NAT, which is gamma in this case. But in the above example, it's specified everywhere except in gamma's config.

Is the bug in wg-meshconf, or in my understanding of PersistentKeepalive?

My use case is to have a VPN of VMs, some of which are behind NAT, without public IPs, but most of which have public IPs. The servers without the public IPs should route traffic through one of the servers which DO have public IPs to reach other servers with don't have public IPs.

And yes, I'm trying to replace tinc :)

PersistentKeepalive arguments

The PersistentKeepalive field is in the showpeers table but it is not possible to modify it using addpeer or updatepeer.

Is it in the roadmap to add this option?

Is it possible for wg-meshconf to offer exit-node?

Hi,

I am wondering if I can assign a peer as exit-node? Is this something which wg-meshconf can already do and I missed it or does it not support it yet? Any chance you can add a support for exit node ?

Thanks!

Prerequisites for Debian Stretch

Was getting errors when pip installing the requirements.

libncurses5-dev is needed on Debian Stretch.

(Oh and thank you very much for the fast response to my previous request, and this tool)

The future of wg-dynamic

I see in your readme you make reference to wg-dynamic. Is it known what has happened to development of wg-dynamic?

Seems to be no activity on the git repo since 2019

Error with csv

database.csv

root@debian:~# wg-meshconf init
Traceback (most recent call last):
  File "/usr/local/bin/wg-meshconf", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.9/dist-packages/wg_meshconf/wg_meshconf.py", line 144, in main
[database.csv](https://github.com/k4yt3x/wg-meshconf/files/12407899/database.csv)

    database_manager.init()
  File "/usr/local/lib/python3.9/dist-packages/wg_meshconf/database_manager.py", line 98, in init
    database = self.read_database()
  File "/usr/local/lib/python3.9/dist-packages/wg_meshconf/database_manager.py", line 134, in read_database
    elif KEY_TYPE[key] == list:
KeyError: 'Name;Address;Endpoint;AllowedIPs;ListenPort;PersistentKeepalive;FwMark;PrivateKey;DNS;MTU;Table;PreUp;PostUp;PreDown;PostDown;SaveConfig'

Multiple preup, postup, predown, postdown commands

Hi,

I'm experimenting to see how I can make this work in my environment.

On first passs it is very good, allowing for site to site (multiple subnet) mesh plus individual enpoints (e.g. phone, laptop).

I tried to add multiple iptables commands, but no luck. The pre/post actions seem to be single command using either csv or command line.

Could they be treated in a similar fashion to the addresses ( a comma separated list)?

Thanks!

Subnet routing

Hi, what a great tool! So convenient.

How can I specify the interface name? For if I want to use something other than wg0.

edit Oh never mind. I see it is done by renaming the config to /etc/wireguard/ifname.conf.

But before I close this, I do wonder about something else: how do I route a subnet with this script? For example, let the host get the IP 10.20.30.1/24 and route 10.20.30.0/24 to it. If you specify the IP then wg-quick on the remote host will complain:
Warning: AllowedIP has nonzero host part: 10.30.0.1/24

Thanks!

three node mesh trouble...

I get communication only between node2 and node3.
node1 does not want to cooperate.

Can someone give me a hand to understand why this is happening?

All nodes are behind public ip x.x.x.x with port forwarding 1311, 1312, 1313
My local lan is 192.168.11.x/24 with DG 192.168.11.254
Using single FQDN that resolves to my public ip for setup of all nodes public ip.

Following are the configs and status of each node:

node1:

root@node1:~# cat /etc/wireguard/wg0.conf
[Interface]
PrivateKey = uM8T9tFu20Awui5fczv7eUEEDj9CvjiRZi7CgSmaBFc=
Address = 10.10.1.1/24
ListenPort = 1311

[Peer]
PublicKey = lihIj2OjgdIAghaNG+jZrID+AxG+5kbdUsS72mG1ESw=
AllowedIPs = 10.10.1.2/24
Endpoint = my.domain.com:1312
PersistentKeepalive = 25

[Peer]
PublicKey = w6xdVeOs2BQS+peFmD5GNVyUWleT68GTzTd2xcyedV0=
AllowedIPs = 10.10.1.3/24
Endpoint = my.domain.com:1313
PersistentKeepalive = 25
root@node1:~# wg
interface: wg0
public key: tkfaR8L2UkzaDdEWREcw1+rsIeE5GbOdG8HHEDmPOEk=
private key: (hidden)
listening port: 1311

peer: lihIj2OjgdIAghaNG+jZrID+AxG+5kbdUsS72mG1ESw=
endpoint: x.x.x.x:1312
allowed ips: (none)
latest handshake: 28 seconds ago
transfer: 156 B received, 180 B sent
persistent keepalive: every 25 seconds

peer: w6xdVeOs2BQS+peFmD5GNVyUWleT68GTzTd2xcyedV0=
endpoint: x.x.x.x:1313
allowed ips: 10.10.1.0/24
latest handshake: 28 seconds ago
transfer: 156 B received, 180 B sent
persistent keepalive: every 25 seconds

node2:

root@node2:~# cat /etc/wireguard/wg0.conf
[Interface]
PrivateKey = EOBFsx/cK6oeZo/cE0h2W1g2EE4fUnN4gBOxfKoNgXQ=
Address = 10.10.1.2/24
ListenPort = 1312

[Peer]
PublicKey = tkfaR8L2UkzaDdEWREcw1+rsIeE5GbOdG8HHEDmPOEk=
AllowedIPs = 10.10.1.1/24
Endpoint = my.domain.com:1311
PersistentKeepalive = 25

[Peer]
PublicKey = w6xdVeOs2BQS+peFmD5GNVyUWleT68GTzTd2xcyedV0=
AllowedIPs = 10.10.1.3/24
Endpoint = my.domain.com:1313
PersistentKeepalive = 25

root@node2:~# wg
interface: wg0
public key: lihIj2OjgdIAghaNG+jZrID+AxG+5kbdUsS72mG1ESw=
private key: (hidden)
listening port: 1312

peer: tkfaR8L2UkzaDdEWREcw1+rsIeE5GbOdG8HHEDmPOEk=
endpoint: 192.168.11.254:1311
allowed ips: (none)
latest handshake: 2 minutes, 33 seconds ago
transfer: 796 B received, 51.31 KiB sent
persistent keepalive: every 25 seconds

peer: w6xdVeOs2BQS+peFmD5GNVyUWleT68GTzTd2xcyedV0=
endpoint: x.x.x.x:1313
allowed ips: 10.10.1.0/24
transfer: 0 B received, 61.14 KiB sent
persistent keepalive: every 25 seconds

node3:

root@node3:~# cat /etc/wireguard/wg0.conf
[Interface]
PrivateKey = AF8IWDUX7+Mz8Wx94Z6uYPFhojNfrjQVM7TWZhtZUmo=
Address = 10.10.1.3/24
ListenPort = 1313

[Peer]
PublicKey = tkfaR8L2UkzaDdEWREcw1+rsIeE5GbOdG8HHEDmPOEk=
AllowedIPs = 10.10.1.1/24
Endpoint = x.x.x.x:1311
PersistentKeepalive = 25

[Peer]
PublicKey = lihIj2OjgdIAghaNG+jZrID+AxG+5kbdUsS72mG1ESw=
AllowedIPs = 10.10.1.2/24
Endpoint = x.x.x.x:1312
PersistentKeepalive = 25

root@perikleousHP:~# wg
interface: wg0
public key: w6xdVeOs2BQS+peFmD5GNVyUWleT68GTzTd2xcyedV0=
private key: (hidden)
listening port: 1313

peer: tkfaR8L2UkzaDdEWREcw1+rsIeE5GbOdG8HHEDmPOEk=
endpoint: 192.168.11.254:1311
allowed ips: (none)
latest handshake: 1 minute, 4 seconds ago
transfer: 3.17 KiB received, 277.21 KiB sent
persistent keepalive: every 25 seconds

peer: lihIj2OjgdIAghaNG+jZrID+AxG+5kbdUsS72mG1ESw=
endpoint: x.x.x.x:1312
allowed ips: 10.10.1.0/24
transfer: 0 B received, 315.37 KiB sent
persistent keepalive: every 25 seconds

Adding new Hosts via Excel not working

Hello,

I tried to add new hosts after some time and the program fails everytime with error "The value of Address cannot be automatically generated".

Steps to reproduce:

  1. Create .csv file via "wg-meshconf init"
  2. Open .csv file and add hosts
  3. Use command "wg-meshconf init" -> everything works fine and missing data is added automatically
  4. Open .csv file with Excel again and add a new host with only Name, Address and Endpoint and save it
  5. Use command "wg-meshconf init" -> Error message "The value of Address cannot be automatically generated" appears.

Is there any workaround for this except adding all hosts at the beginning?

Thanks

new profile fails

trying to use this app and I'm not seeing results like screenshots indicate.

sudo pip3 install -r requirements.txt
Requirement already satisfied: avalon_framework in /usr/lib/python3.8/site-packages (from -r requirements.txt (line 1)) (1.8.2)
Requirement already satisfied: readline in /usr/lib/python3.8/site-packages (from -r requirements.txt (line 2)) (6.2.4.1)
Requirement already satisfied: netaddr in /usr/lib/python3.8/site-packages (from -r requirements.txt (line 3)) (0.7.19)

python3 wireguard_mesh_configurator.py int
WireGuard Mesh Configurator 1.2.0
(C) 2018-2019 K4YT3X
Licensed under GNU GPL v3
[WGC]> new
[!] WARNING: This will flush the currently loaded profile!
[WGC]>

running arch linux
python3 --version
Python 3.8.1

Output is created in `site-packages` under `venv`

I installed wg-meshconf using a venv for testing on my machine.

When I created the output files, they appeared under the site-packages/wg_meshconf folder.

$ python3 -m venv wg-meshconf
$ . wg-meshconf/bin/activate
$ wg-meshconf addpeer ...

$ wg-meshconf genconfig
Creating output directory: /home/user/wg-meshconf/lib/python3.8/site-packages/wg_meshconf/output

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.