17022: Specify time period in days on command line.
[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 import datetime
12 import ciso8601
13
14 def parse_arguments(arguments):
15     arg_parser = argparse.ArgumentParser()
16     arg_parser.add_argument('--days', type=int)
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):
43     args = parse_arguments(arguments)
44
45     arv = arvados.api()
46
47     since = datetime.datetime.utcnow() - datetime.timedelta(days=args.days)
48
49     print("Activity since %s\n" % (datetime.datetime.now() - datetime.timedelta(days=args.days)).isoformat())
50
51     events = arvados.util.keyset_list_all(arv.logs().list, filters=[["created_at", ">=", since.isoformat()]])
52
53     users = {}
54     owners = {}
55
56     for e in events:
57         owner = getowner(arv, e["object_owner_uuid"], owners)
58         users.setdefault(owner, [])
59         event_at = ciso8601.parse_datetime(e["event_at"]).astimezone().isoformat()
60         # loguuid = e["uuid"]
61         loguuid = ""
62
63         if e["event_type"] == "create" and e["object_uuid"][6:11] == "tpzed":
64             users.setdefault(e["object_uuid"], [])
65             users[e["object_uuid"]].append("%s User account created" % event_at)
66
67         elif e["event_type"] == "update" and e["object_uuid"][6:11] == "tpzed":
68             pass
69
70         elif e["event_type"] == "create" and e["object_uuid"][6:11] == "xvhdp":
71             if e["properties"]["new_attributes"]["requesting_container_uuid"] is None:
72                 users[owner].append("%s Ran container %s %s" % (event_at, getname(e["properties"]["new_attributes"]), loguuid))
73
74         elif e["event_type"] == "update" and e["object_uuid"][6:11] == "xvhdp":
75             pass
76
77         elif e["event_type"] == "create" and e["object_uuid"][6:11] == "j7d0g":
78             users[owner].append("%s Created project %s" %  (event_at, getname(e["properties"]["new_attributes"])))
79
80         elif e["event_type"] == "delete" and e["object_uuid"][6:11] == "j7d0g":
81             users[owner].append("%s Deleted project %s" % (event_at, getname(e["properties"]["old_attributes"])))
82
83         elif e["event_type"] == "update" and e["object_uuid"][6:11] == "j7d0g":
84             users[owner].append("%s Updated project %s" % (event_at, getname(e["properties"]["new_attributes"])))
85
86         elif e["event_type"] in ("create", "update") and e["object_uuid"][6:11] == "gj3su":
87             if len(users[owner]) > 0 and users[owner][-1].endswith("activity"):
88                 sp = users[owner][-1].split(" ")
89                 users[owner][-1] = "%s to %s Account activity" % (sp[0], event_at)
90             else:
91                 users[owner].append("%s Account activity" % (event_at))
92
93         elif e["event_type"] == "create" and e["object_uuid"][6:11] == "o0j2j":
94             if e["properties"]["new_attributes"]["link_class"] == "tag":
95                 users[owner].append("%s Tagged %s" % (event_at, e["properties"]["new_attributes"]["head_uuid"]))
96             elif e["properties"]["new_attributes"]["link_class"] == "permission":
97                 users[owner].append("%s Shared %s with %s" % (event_at, e["properties"]["new_attributes"]["tail_uuid"], e["properties"]["new_attributes"]["head_uuid"]))
98             else:
99                 users[owner].append("%s %s %s %s" % (e["event_type"], e["object_kind"], e["object_uuid"], loguuid))
100
101         elif e["event_type"] == "delete" and e["object_uuid"][6:11] == "o0j2j":
102             if e["properties"]["old_attributes"]["link_class"] == "tag":
103                 users[owner].append("%s Untagged %s" % (event_at, e["properties"]["old_attributes"]["head_uuid"]))
104             elif e["properties"]["old_attributes"]["link_class"] == "permission":
105                 users[owner].append("%s Unshared %s with %s" % (event_at, e["properties"]["old_attributes"]["tail_uuid"], e["properties"]["old_attributes"]["head_uuid"]))
106             else:
107                 users[owner].append("%s %s %s %s" % (e["event_type"], e["object_kind"], e["object_uuid"], loguuid))
108
109         elif e["event_type"] == "create" and e["object_uuid"][6:11] == "4zz18":
110             if e["properties"]["new_attributes"]["properties"].get("type") in ("log", "output", "intermediate"):
111                 pass
112             else:
113                 users[owner].append("%s Created collection %s %s" % (event_at, getname(e["properties"]["new_attributes"]), loguuid))
114
115         elif e["event_type"] == "update" and e["object_uuid"][6:11] == "4zz18":
116             users[owner].append("%s Updated collection %s %s" % (event_at, getname(e["properties"]["new_attributes"]), loguuid))
117
118         elif e["event_type"] == "delete" and e["object_uuid"][6:11] == "4zz18":
119             if e["properties"]["old_attributes"]["properties"].get("type") in ("log", "output", "intermediate"):
120                 pass
121             else:
122                 users[owner].append("%s Deleted collection %s %s" % (event_at, getname(e["properties"]["old_attributes"]), loguuid))
123
124         else:
125             users[owner].append("%s %s %s %s" % (e["event_type"], e["object_kind"], e["object_uuid"], loguuid))
126
127     for k,v in users.items():
128         if k is None or k.endswith("-tpzed-000000000000000"):
129             continue
130         print("%s:" % getusername(arv, k))
131         for ev in v:
132             print("  %s" % ev)
133         print("")
134
135 main(sys.argv[1:])