17022: Produce user activity report from the audit logs
[arvados.git] / tools / user-activity / arv-user-activity.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
12 def parse_arguments(arguments):
13     arg_parser = argparse.ArgumentParser()
14     arg_parser.add_argument('--timespan', type=str)
15     args = arg_parser.parse_args(arguments)
16     return args
17
18 def getowner(arv, uuid, owners):
19     if uuid is None:
20         return None
21     if uuid[6:11] == "tpzed":
22         return uuid
23
24     if uuid not in owners:
25         try:
26             gp = arv.groups().get(uuid=uuid).execute()
27             owners[uuid] = gp["owner_uuid"]
28         except:
29             owners[uuid] = None
30
31     return getowner(arv, owners[uuid], owners)
32
33 def getusername(arv, uuid):
34     u = arv.users().get(uuid=uuid).execute()
35     return "%s %s (%s)" % (u["first_name"], u["last_name"], uuid)
36
37 def getname(u):
38     return "\"%s\" (%s)" % (u["name"], u["uuid"])
39
40 def main(arguments):
41     args = parse_arguments(arguments)
42
43     arv = arvados.api()
44
45     events = arvados.util.keyset_list_all(arv.logs().list, filters=[["created_at", ">=", "2020-10-01T14:51:42-05:00"]])
46
47     users = {}
48     owners = {}
49
50     for e in events:
51         owner = getowner(arv, e["object_owner_uuid"], owners)
52         users.setdefault(owner, [])
53
54         if e["event_type"] == "create" and e["object_uuid"][6:11] == "tpzed":
55             users.setdefault(e["object_uuid"], [])
56             users[e["object_uuid"]].append("%s User account created" % e["event_at"])
57         if e["event_type"] == "update" and e["object_uuid"][6:11] == "tpzed":
58             pass
59             #users.setdefault(e["object_uuid"], [])
60             #users[e["object_uuid"]].append("%s User account created" % e["event_at"])
61         elif e["event_type"] == "create" and e["object_uuid"][6:11] == "xvhdp":
62             if e["properties"]["new_attributes"]["requesting_container_uuid"] is None:
63                 users[owner].append("%s Ran container %s %s" % (e["event_at"], getname(e["properties"]["new_attributes"]), e["uuid"]))
64
65         elif e["event_type"] == "update" and e["object_uuid"][6:11] == "xvhdp":
66             pass
67
68         elif e["event_type"] == "create" and e["object_uuid"][6:11] == "j7d0g":
69             users[owner].append("%s Created project %s" %  (e["event_at"], getname(e["properties"]["new_attributes"])))
70
71         elif e["event_type"] == "delete" and e["object_uuid"][6:11] == "j7d0g":
72             users[owner].append("%s Deleted project %s" % (e["event_at"], getname(e["properties"]["old_attributes"])))
73
74         elif e["event_type"] == "update" and e["object_uuid"][6:11] == "j7d0g":
75             users[owner].append("%s Updated project %s" % (e["event_at"], getname(e["properties"]["new_attributes"])))
76
77         elif e["event_type"] in ("create", "update") and e["object_uuid"][6:11] == "gj3su":
78             if len(users[owner]) > 0 and users[owner][-1].endswith("activity"):
79                 sp = users[owner][-1].split(" ")
80                 users[owner][-1] = "%s to %s Account activity" % (sp[0], e["event_at"])
81             else:
82                 users[owner].append("%s Account activity" % (e["event_at"]))
83
84         elif e["event_type"] == "create" and e["object_uuid"][6:11] == "o0j2j":
85             if e["properties"]["new_attributes"]["link_class"] == "tag":
86                 users[owner].append("%s Tagged %s" % (e["event_at"], e["properties"]["new_attributes"]["head_uuid"]))
87             elif e["properties"]["new_attributes"]["link_class"] == "permission":
88                 users[owner].append("%s Shared %s with %s" % (e["event_at"], e["properties"]["new_attributes"]["tail_uuid"], e["properties"]["new_attributes"]["head_uuid"]))
89             else:
90                 users[owner].append("%s %s %s %s" % (e["event_type"], e["object_kind"], e["object_uuid"], e["uuid"]))
91
92         elif e["event_type"] == "delete" and e["object_uuid"][6:11] == "o0j2j":
93             if e["properties"]["old_attributes"]["link_class"] == "tag":
94                 users[owner].append("%s Untagged %s" % (e["event_at"], e["properties"]["old_attributes"]["head_uuid"]))
95             elif e["properties"]["old_attributes"]["link_class"] == "permission":
96                 users[owner].append("%s Unshared %s with %s" % (e["event_at"], e["properties"]["old_attributes"]["tail_uuid"], e["properties"]["old_attributes"]["head_uuid"]))
97             else:
98                 users[owner].append("%s %s %s %s" % (e["event_type"], e["object_kind"], e["object_uuid"], e["uuid"]))
99
100         elif e["event_type"] == "create" and e["object_uuid"][6:11] == "4zz18":
101             if e["properties"]["new_attributes"]["properties"].get("type") in ("log", "output", "intermediate"):
102                 pass
103             else:
104                 users[owner].append("%s Created collection %s %s" % (e["event_at"], getname(e["properties"]["new_attributes"]), e["uuid"]))
105
106         elif e["event_type"] == "update" and e["object_uuid"][6:11] == "4zz18":
107             users[owner].append("%s Updated collection %s %s" % (e["event_at"], getname(e["properties"]["new_attributes"]), e["uuid"]))
108
109         elif e["event_type"] == "delete" and e["object_uuid"][6:11] == "4zz18":
110             users[owner].append("%s Deleted collection %s %s" % (e["event_at"], getname(e["properties"]["old_attributes"]), e["uuid"]))
111
112         else:
113             users[owner].append("%s %s %s %s" % (e["event_type"], e["object_kind"], e["object_uuid"], e["uuid"]))
114
115     for k,v in users.items():
116         if k is None or k.endswith("-tpzed-000000000000000"):
117             continue
118         print("%s:" % getusername(arv, k))
119         for ev in v:
120             print("  %s" % ev)
121         print("")
122
123 main(sys.argv[1:])