17022: Python packaging for arv-user-activity
[arvados.git] / tools / user-activity / arvados_user_activity / main.py
1 #!/usr/bin/env python3
2 # Copyright (C) The Arvados Authors. All rights reserved.
3 #
4 # SPDX-License-Identifier: AGPL-3.0
5
6 import argparse
7 import sys
8
9 import arvados
10 import arvados.util
11 import datetime
12 import ciso8601
13
14 def parse_arguments(arguments):
15     arg_parser = argparse.ArgumentParser()
16     arg_parser.add_argument('--days', type=int, required=True)
17     args = arg_parser.parse_args(arguments)
18     return args
19
20 def getowner(arv, uuid, owners):
21     if uuid is None:
22         return None
23     if uuid[6:11] == "tpzed":
24         return uuid
25
26     if uuid not in owners:
27         try:
28             gp = arv.groups().get(uuid=uuid).execute()
29             owners[uuid] = gp["owner_uuid"]
30         except:
31             owners[uuid] = None
32
33     return getowner(arv, owners[uuid], owners)
34
35 def getusername(arv, uuid):
36     u = arv.users().get(uuid=uuid).execute()
37     return "%s %s <%s> (%s)" % (u["first_name"], u["last_name"], u["email"], uuid)
38
39 def getname(u):
40     return "\"%s\" (%s)" % (u["name"], u["uuid"])
41
42 def main(arguments=None):
43     if arguments is None:
44         arguments = sys.argv[1:]
45
46     args = parse_arguments(arguments)
47
48     arv = arvados.api()
49
50     since = datetime.datetime.utcnow() - datetime.timedelta(days=args.days)
51
52     print("Activity since %s\n" % (datetime.datetime.now() - datetime.timedelta(days=args.days)).isoformat())
53
54     events = arvados.util.keyset_list_all(arv.logs().list, filters=[["created_at", ">=", since.isoformat()]])
55
56     users = {}
57     owners = {}
58
59     for e in events:
60         owner = getowner(arv, e["object_owner_uuid"], owners)
61         users.setdefault(owner, [])
62         event_at = ciso8601.parse_datetime(e["event_at"]).astimezone().isoformat()
63         # loguuid = e["uuid"]
64         loguuid = ""
65
66         if e["event_type"] == "create" and e["object_uuid"][6:11] == "tpzed":
67             users.setdefault(e["object_uuid"], [])
68             users[e["object_uuid"]].append("%s User account created" % event_at)
69
70         elif e["event_type"] == "update" and e["object_uuid"][6:11] == "tpzed":
71             pass
72
73         elif e["event_type"] == "create" and e["object_uuid"][6:11] == "xvhdp":
74             if e["properties"]["new_attributes"]["requesting_container_uuid"] is None:
75                 users[owner].append("%s Ran container %s %s" % (event_at, getname(e["properties"]["new_attributes"]), loguuid))
76
77         elif e["event_type"] == "update" and e["object_uuid"][6:11] == "xvhdp":
78             pass
79
80         elif e["event_type"] == "create" and e["object_uuid"][6:11] == "j7d0g":
81             users[owner].append("%s Created project %s" %  (event_at, getname(e["properties"]["new_attributes"])))
82
83         elif e["event_type"] == "delete" and e["object_uuid"][6:11] == "j7d0g":
84             users[owner].append("%s Deleted project %s" % (event_at, getname(e["properties"]["old_attributes"])))
85
86         elif e["event_type"] == "update" and e["object_uuid"][6:11] == "j7d0g":
87             users[owner].append("%s Updated project %s" % (event_at, getname(e["properties"]["new_attributes"])))
88
89         elif e["event_type"] in ("create", "update") and e["object_uuid"][6:11] == "gj3su":
90             if len(users[owner]) > 0 and users[owner][-1].endswith("activity"):
91                 sp = users[owner][-1].split(" ")
92                 users[owner][-1] = "%s to %s Account activity" % (sp[0], event_at)
93             else:
94                 users[owner].append("%s Account activity" % (event_at))
95
96         elif e["event_type"] == "create" and e["object_uuid"][6:11] == "o0j2j":
97             if e["properties"]["new_attributes"]["link_class"] == "tag":
98                 users[owner].append("%s Tagged %s" % (event_at, e["properties"]["new_attributes"]["head_uuid"]))
99             elif e["properties"]["new_attributes"]["link_class"] == "permission":
100                 users[owner].append("%s Shared %s with %s" % (event_at, e["properties"]["new_attributes"]["tail_uuid"], e["properties"]["new_attributes"]["head_uuid"]))
101             else:
102                 users[owner].append("%s %s %s %s" % (e["event_type"], e["object_kind"], e["object_uuid"], loguuid))
103
104         elif e["event_type"] == "delete" and e["object_uuid"][6:11] == "o0j2j":
105             if e["properties"]["old_attributes"]["link_class"] == "tag":
106                 users[owner].append("%s Untagged %s" % (event_at, e["properties"]["old_attributes"]["head_uuid"]))
107             elif e["properties"]["old_attributes"]["link_class"] == "permission":
108                 users[owner].append("%s Unshared %s with %s" % (event_at, e["properties"]["old_attributes"]["tail_uuid"], e["properties"]["old_attributes"]["head_uuid"]))
109             else:
110                 users[owner].append("%s %s %s %s" % (e["event_type"], e["object_kind"], e["object_uuid"], loguuid))
111
112         elif e["event_type"] == "create" and e["object_uuid"][6:11] == "4zz18":
113             if e["properties"]["new_attributes"]["properties"].get("type") in ("log", "output", "intermediate"):
114                 pass
115             else:
116                 users[owner].append("%s Created collection %s %s" % (event_at, getname(e["properties"]["new_attributes"]), loguuid))
117
118         elif e["event_type"] == "update" and e["object_uuid"][6:11] == "4zz18":
119             users[owner].append("%s Updated collection %s %s" % (event_at, getname(e["properties"]["new_attributes"]), loguuid))
120
121         elif e["event_type"] == "delete" and e["object_uuid"][6:11] == "4zz18":
122             if e["properties"]["old_attributes"]["properties"].get("type") in ("log", "output", "intermediate"):
123                 pass
124             else:
125                 users[owner].append("%s Deleted collection %s %s" % (event_at, getname(e["properties"]["old_attributes"]), loguuid))
126
127         else:
128             users[owner].append("%s %s %s %s" % (e["event_type"], e["object_kind"], e["object_uuid"], loguuid))
129
130     for k,v in users.items():
131         if k is None or k.endswith("-tpzed-000000000000000"):
132             continue
133         print("%s:" % getusername(arv, k))
134         for ev in v:
135             print("  %s" % ev)
136         print("")
137
138 if __name__ == "__main__":
139     main()