This repository has been archived on 2019-12-12. You can view files and clone it, but cannot push or open issues/pull-requests.
tildetown-scripts/tildetown-py/stats.py

83 lines
2.6 KiB
Python

import json
from functools import partial
from os import listdir
from os.path import getmtime, join
from datetime import datetime
from sh import find, uptime, who, sort, wc, cut
from util import slurp, thread, p
# this script emits json on standard out that has information about tilde.town
# users. It denotes who has not updated their page from the default. It also
# reports the time this script was run. The user list is sorted by public_html update time.
DEFAULT_HTML = slurp("/etc/skel/public_html/index.html")
username_to_html_path = lambda u: "/home/{}/public_html".format(u)
def default_p(username):
return DEFAULT_HTML == slurp(join(username_to_html_path(username), "index.html"))
def bounded_find(path):
# find might return 1 but still have worked fine.
return find(path, "-maxdepth", "3", _ok_code=[0,1])
def get_active_user_count():
return int(wc(sort(cut(who(), "-d", " ", "-f1"), "-u"), "-l"))
def guarded_mtime(path):
try:
return getmtime(path.rstrip())
except Exception as _:
return 0
def modify_time(username):
files_to_mtimes = partial(map, guarded_mtime)
return thread(username,
username_to_html_path,
bounded_find,
files_to_mtimes,
list,
max)
def sort_user_list(usernames):
return sorted(usernames, key=modify_time)
def user_generator():
ignore_system_users = lambda f: f != "ubuntu" and f != "poetry"
return filter(ignore_system_users, listdir("/home"))
def get_user_data():
username_to_data = lambda u: {'username': u,
'default': default_p(u),
'favicon':'TODO'}
live_p = lambda user: not user['default']
all_users = thread(user_generator(),
sort_user_list,
reversed,
partial(map, username_to_data),
list)
live_users = list(filter(live_p, all_users))
active_user_count = get_active_user_count()
return {'all_users': all_users,
'num_users': len(all_users),
'num_live_users': len(live_users),
'active_user_count': active_user_count,
'live_users': live_users,}
def get_data():
user_data = get_user_data()
data = {'generated_at': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
'site_name': 'tilde.town',
'site_url': 'http://tilde.town',
'uptime': str(uptime('-p')),}
data.update(user_data)
return data
if __name__ == '__main__':
print(json.dumps(get_data()))