cli: initial import for import/export

This commit is contained in:
Iain Learmonth 2022-04-22 12:52:41 +01:00
parent dc59921498
commit 0c349091e7
3 changed files with 143 additions and 13 deletions

29
app/cli/__main__.py Normal file
View file

@ -0,0 +1,29 @@
import argparse
import logging
import sys
from os.path import basename
from app.cli.db import DbCliHandler
def parse_args(argv):
if basename(argv[0]) == "__main__.py":
argv[0] = "bypass"
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase logging verbosity", action="store_true")
subparsers = parser.add_subparsers(title="command", help="command to run")
DbCliHandler.add_subparser_to(subparsers)
args = parser.parse_args(argv[1:])
if "cls" in args:
command = args.cls(args)
command.run()
else:
parser.print_help()
if __name__ == "__main__":
verbose = "-v" in sys.argv or "--verbose" in sys.argv
logging.basicConfig(
level=logging.DEBUG if verbose else logging.INFO)
logging.debug("Arguments: %s", sys.argv)
parse_args(sys.argv)

74
app/cli/db.py Normal file
View file

@ -0,0 +1,74 @@
import argparse
import csv
import datetime
import logging
import sys
from app import app
from app.extensions import db
from app.models import Group, Origin, Proxy, BridgeConf, Alarm
models = {
"group": Group,
"origin": Origin,
"proxy": Proxy,
"bridge": BridgeConf,
"alarm": Alarm
}
def export(model: db.Model):
out = csv.writer(sys.stdout)
out.writerow(model.csv_header())
for r in model.query.all():
out.writerow(r.csv_row())
def impot(model: db.Model):
first = True
header = model.csv_header()
try:
for line in csv.reader(sys.stdin):
if first:
if line != header:
logging.error("CSV header mismatch")
sys.exit(1)
first = False
continue
x = model()
for i in range(len(header)):
if header[i] in ["added", "updated", "destroyed", "deprecated", "last_updated", "terraform_updated"]:
if line[i] == "":
line[i] = None
else:
line[i] = datetime.datetime.strptime(line[i], "%Y-%m-%d %H:%M:%S.%f")
setattr(x, header[i], line[i])
db.session.add(x)
db.session.commit()
logging.info("Import completed successfully")
except Exception as e:
logging.exception(e)
db.session.rollback()
class DbCliHandler:
@classmethod
def add_subparser_to(cls, subparsers: argparse._SubParsersAction) -> None:
parser = subparsers.add_parser("db", help="database operations")
parser.add_argument("--export", choices=["group", "origin", "proxy", "bridge"],
help="export data to CSV format")
parser.add_argument("--import", choices=["group", "origin", "proxy", "bridge"],
help="import data from CSV format", dest="impot")
parser.set_defaults(cls=cls)
def __init__(self, args):
self.args = args
def run(self):
with app.app_context():
if self.args.export:
export(models[self.args.export])
elif self.args.impot:
impot(models[self.args.impot])
else:
logging.error("No action requested")