Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/usr/bin/env python3
import datetime
import argparse
import pathlib
import json
import random
import sys
PATH = pathlib.Path("/tmp/test-schnapps.json")
def load_data():
if not PATH.exists():
with PATH.open("w") as f:
json.dump({"snapshots": []}, f)
with PATH.open() as f:
return json.load(f)
def store_data(data):
with PATH.open("w") as f:
json.dump(data, f)
def handle_list(options):
print(json.dumps(load_data()))
return 0
def handle_create(options):
now = datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S +0000")
data = load_data()
new_id = max(e["number"] for e in data["snapshots"] or [{"number": 0}]) + 1
data["snapshots"].append(
{
"number": new_id,
"created": now,
"type": options.t,
"size": f"{random.randint(1, 100000) / 100}MiB",
"description": options.descr,
}
)
store_data(data)
print(f"Snapshot number {new_id} created")
return 0
def handle_delete(options):
data = load_data()
orig_len = len(data["snapshots"])
data["snapshots"] = [e for e in data["snapshots"] if e["number"] != options.id]
store_data(data)
return 1 if orig_len == len(data["snapshots"]) else 0
def handle_rollback(options):
data = load_data()
ids = [e["number"] for e in data["snapshots"]]
if options.id not in ids:
return 1
return 0
CMD_MAP = {
"list": handle_list,
"create": handle_create,
"delete": handle_delete,
"rollback": handle_rollback,
}
def main():
parser = argparse.ArgumentParser(prog="schnapps")
subcmds = parser.add_subparsers(dest="cmd")
subcmds.required = True
list_cmd = subcmds.add_parser("list")
list_cmd.add_argument("-j", default=False, action="store_true")
create_cmd = subcmds.add_parser("create")
create_cmd.add_argument("-t", choices=["single"], required=True)
create_cmd.add_argument("descr")
delete_cmd = subcmds.add_parser("delete")
delete_cmd.add_argument("id", type=int)
rollback_cmd = subcmds.add_parser("rollback")
rollback_cmd.add_argument("id", type=int)
options = parser.parse_args()
sys.exit(CMD_MAP[options.cmd](options))
if __name__ == "__main__":
main()