start on restructuring
parent
c6451b4834
commit
93d4b0a1d3
|
@ -0,0 +1,75 @@
|
||||||
|
import json
|
||||||
|
from functools import partial
|
||||||
|
from os import listdir
|
||||||
|
from os.path import getmtime, join
|
||||||
|
from datetime import datetime
|
||||||
|
from sh import find, facter
|
||||||
|
from .util import slurp, thread
|
||||||
|
|
||||||
|
# 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 guarded_mtime(path):
|
||||||
|
try:
|
||||||
|
return getmtime(path.rstrip())
|
||||||
|
except Exception, e:
|
||||||
|
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 = int(facter("active_user_count").stdout.strip())
|
||||||
|
|
||||||
|
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')}
|
||||||
|
return data.update(user_data)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
print(json.dumps(get_data()))
|
|
@ -0,0 +1,11 @@
|
||||||
|
def slurp(file_path):
|
||||||
|
contents = None
|
||||||
|
with open(file_path, 'r') as f:
|
||||||
|
contents = f.read()
|
||||||
|
return contents
|
||||||
|
|
||||||
|
def thread(initial, *fns):
|
||||||
|
value = initial
|
||||||
|
for fn in fns:
|
||||||
|
value = fn(value)
|
||||||
|
return value
|
Reference in New Issue