changed database format from JSON to CSV

This commit is contained in:
k4yt3x 2021-05-29 17:04:21 +00:00
parent 64bc028c55
commit b730c92317
2 changed files with 80 additions and 35 deletions

View File

@ -4,13 +4,13 @@
Name: Database Manager Name: Database Manager
Creator: K4YT3X Creator: K4YT3X
Date Created: July 19, 2020 Date Created: July 19, 2020
Last Modified: May 21, 2021 Last Modified: May 29, 2021
""" """
# built-in imports # built-in imports
import contextlib import contextlib
import copy import copy
import json import csv
import pathlib import pathlib
import sys import sys
@ -19,10 +19,7 @@ with contextlib.suppress(ImportError):
from prettytable import PrettyTable from prettytable import PrettyTable
# local imports # local imports
try: from .wireguard import WireGuard
from wireguard import WireGuard
except ImportError:
from .wireguard import WireGuard
INTERFACE_ATTRIBUTES = [ INTERFACE_ATTRIBUTES = [
"Address", "Address",
@ -64,6 +61,25 @@ PEER_OPTIONAL_ATTRIBUTES = [
"PersistentKeepalive", "PersistentKeepalive",
] ]
KEY_TYPE = {
"name": str,
"Address": list,
"Endpoint": str,
"AllowedIPs": list,
"ListenPort": int,
"PersistentKeepalive": int,
"FwMark": str,
"PrivateKey": str,
"DNS": str,
"MTU": int,
"Table": str,
"PreUp": str,
"PostUp": str,
"PreDown": str,
"PostDown": str,
"SaveConfig": bool,
}
class DatabaseManager: class DatabaseManager:
def __init__(self, database_path: pathlib.Path): def __init__(self, database_path: pathlib.Path):
@ -80,8 +96,23 @@ class DatabaseManager:
if not self.database_path.is_file(): if not self.database_path.is_file():
return self.database_template return self.database_template
database = copy.deepcopy(self.database_template)
with self.database_path.open(mode="r", encoding="utf-8") as database_file: with self.database_path.open(mode="r", encoding="utf-8") as database_file:
return json.load(database_file) peers = csv.DictReader(database_file)
for peer in peers:
for key in peer:
if peer[key] == "":
peer[key] = None
elif KEY_TYPE[key] == list:
peer[key] = peer[key].split(",")
elif KEY_TYPE[key] == int:
peer[key] = int(peer[key])
elif KEY_TYPE[key] == bool:
peer[key] = peer[key].lower() == "true"
database["peers"][peer.pop("name")] = peer
return database
def write_database(self, data: dict): def write_database(self, data: dict):
"""dump data into database file """dump data into database file
@ -89,8 +120,23 @@ class DatabaseManager:
Args: Args:
data (dict): content of database data (dict): content of database
""" """
with self.database_path.open(mode="w", encoding="utf-8") as database_file: with self.database_path.open(mode="w", encoding="utf-8") as database_file:
json.dump(data, database_file, indent=4) writer = csv.DictWriter(
database_file, KEY_TYPE.keys(), quoting=csv.QUOTE_ALL
)
writer.writeheader()
data = copy.deepcopy(data)
for peer in data["peers"]:
data["peers"][peer]["name"] = peer
for key in data["peers"][peer]:
if isinstance(data["peers"][peer][key], list):
data["peers"][peer][key] = ",".join(data["peers"][peer][key])
elif isinstance(data["peers"][peer][key], int):
data["peers"][peer][key] = str(data["peers"][peer][key])
elif isinstance(data["peers"][peer][key], bool):
data["peers"][peer][key] = str(data["peers"][peer][key])
writer.writerow(data["peers"][peer])
def addpeer( def addpeer(
self, self,
@ -111,8 +157,7 @@ class DatabaseManager:
PostDown: str = None, PostDown: str = None,
SaveConfig: bool = None, SaveConfig: bool = None,
): ):
database = copy.deepcopy(self.database_template) database = self.read_database()
database.update(self.read_database())
if name in database["peers"]: if name in database["peers"]:
print(f"Peer with name {name} already exists") print(f"Peer with name {name} already exists")
@ -150,8 +195,7 @@ class DatabaseManager:
PostDown: str = None, PostDown: str = None,
SaveConfig: bool = None, SaveConfig: bool = None,
): ):
database = copy.deepcopy(self.database_template) database = self.read_database()
database.update(self.read_database())
if name not in database["peers"]: if name not in database["peers"]:
print(f"Peer with name {name} does not exist") print(f"Peer with name {name} does not exist")
@ -164,8 +208,7 @@ class DatabaseManager:
self.write_database(database) self.write_database(database)
def delpeer(self, name: str): def delpeer(self, name: str):
database = copy.deepcopy(self.database_template) database = self.read_database()
database.update(self.read_database())
# abort if user doesn't exist # abort if user doesn't exist
if name not in database["peers"]: if name not in database["peers"]:
@ -210,21 +253,26 @@ class DatabaseManager:
# if the style is table # if the style is table
# print with prettytable # print with prettytable
if style == "table": if style == "table":
table = PrettyTable() try:
table.field_names = field_names table = PrettyTable()
table.field_names = field_names
for peer in peers: for peer in peers:
table.add_row( table.add_row(
[peer] [peer]
+ [ + [
database["peers"][peer].get(k) database["peers"][peer].get(k)
if not isinstance(database["peers"][peer].get(k), list) if not isinstance(database["peers"][peer].get(k), list)
else ",".join(database["peers"][peer].get(k)) else ",".join(database["peers"][peer].get(k))
for k in [i for i in table.field_names if i != "name"] for k in [i for i in table.field_names if i != "name"]
] ]
) )
print(table) print(table)
except NameError:
print("PrettyTable is not installed", sys.stderr)
print("Displaying in table mode is not available", sys.stderr)
sys.exit(1)
# if the style is text # if the style is text
# print in plaintext format # print in plaintext format
@ -259,7 +307,7 @@ class DatabaseManager:
) )
raise FileExistsError raise FileExistsError
elif not output.exists(): elif not output.exists():
print(f"Creating output directory: {output}") print(f"Creating output directory: {output}", sys.stderr)
output.mkdir(exist_ok=True) output.mkdir(exist_ok=True)
# for every peer in the database # for every peer in the database

View File

@ -1,10 +1,10 @@
#!/usr/bin/python3 #!/usr/bin/env python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
Name: wg-meshconf Name: wg-meshconf
Creator: K4YT3X Creator: K4YT3X
Date Created: July 19, 2020 Date Created: July 19, 2020
Last Modified: May 21, 2021 Last Modified: May 29, 2021
Licensed under the GNU General Public License Version 3 (GNU GPL v3), Licensed under the GNU General Public License Version 3 (GNU GPL v3),
available at: https://www.gnu.org/licenses/gpl-3.0.txt available at: https://www.gnu.org/licenses/gpl-3.0.txt
@ -17,10 +17,7 @@ import pathlib
import sys import sys
# local imports # local imports
try: from .database_manager import DatabaseManager
from database_manager import DatabaseManager
except ImportError:
from .database_manager import DatabaseManager
def parse_arguments(): def parse_arguments():
@ -34,7 +31,7 @@ def parse_arguments():
"--database", "--database",
type=pathlib.Path, type=pathlib.Path,
help="path where the database file is stored", help="path where the database file is stored",
default=pathlib.Path("database.json"), default=pathlib.Path("database.csv"),
) )
# add subparsers for commands # add subparsers for commands