You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
7.1 KiB
Python

from jinja2 import Environment, FileSystemLoader
import subprocess
from datetime import datetime, timedelta
import os
10 months ago
import sys
import re
10 months ago
if len(sys.argv) > 1:
time_ago_arg = int(sys.argv[1])
print(f"Going back in time by {time_ago_arg} days")
10 months ago
else:
print(f"Creating a book for today")
time_ago_arg = False
10 months ago
#create the log directory
10 months ago
path = "/home/xpub/www/html/tl-dr/log-books"
10 months ago
if not os.path.exists(path):
os.makedirs(path)
10 months ago
if(time_ago_arg):
now = datetime.today() - timedelta(days=time_ago_arg)
else:
now = datetime.today()
book_name = "TL;DR_" + now.strftime("%B %dth %Y")
10 months ago
print(f"making a book called {book_name}")
10 months ago
def get_journalctl_on():
if time_ago_arg:
return ["-S", f"{time_ago_arg + 1} days ago", "-U", f"{time_ago_arg} days ago"]
10 months ago
else:
return ["-S","today"]
def create_all_logs_file():
10 months ago
list_logs = subprocess.run(["ls", "/home/xpub/www/html/tl-dr/log-books"], capture_output=True)
10 months ago
with open("/home/xpub/www/html/tl-dr/log-books/all.txt", "w") as f:
print(list_logs.stdout.decode('UTF-8').strip(), file=f)
# Execute a command on the command line. Based = used for piped commands
def run_command(command, based = False):
result = subprocess.run(command, capture_output=True, input=based)
result.check_returncode()
stripped = result.stdout.decode('UTF-8').strip()
10 months ago
if "No entries" in stripped:
return ""
else:
return stripped
# Run all the commands for getting the logs, and assign to variables
10 months ago
print("Commands: statics")
10 months ago
# These vars cannot go back in time
if not time_ago_arg:
since_last_boot = run_command(["uptime","-s"])
slb_date = datetime.strptime(since_last_boot, "%Y-%m-%d %H:%M:%S")
10 months ago
time_since_last_boot = (now - slb_date).days
device_info_grab = subprocess.run(["grep", 'Model' , "/proc/cpuinfo"], check=True, capture_output=True)
device_info = run_command(['awk', '-F:', '{ print $2}'], based=device_info_grab.stdout)
ip_address_show = subprocess.run(["ip", "addr", "show", "end0"], check=True, capture_output=True)
ip_address = run_command(['awk', '$1 == "inet" {gsub(/\/.*$/, "", $2); print $2}' ], based=ip_address_show.stdout)
10 months ago
list_active_services = run_command(["sudo", "service", "--status-all"]).splitlines()
10 months ago
else:
since_last_boot = False
10 months ago
device_info = False
ip_address = False
time_since_last_boot = False
10 months ago
list_active_services = False
10 months ago
10 months ago
print("Commands: packages")
10 months ago
dpkg_date = now.strftime("%Y-%m-%d")
list_package_installs = subprocess.run(["grep","-E", dpkg_date + '.*install|install.*' + dpkg_date, "/var/log/dpkg.log"], capture_output=True).stdout.decode('UTF-8').splitlines()
list_package_upgrade = subprocess.run(["grep","-E", dpkg_date + '.*upgrade|upgrade.*' + dpkg_date, "/var/log/dpkg.log"], capture_output=True).stdout.decode('UTF-8').splitlines()
list_package_remove = subprocess.run(["grep","-E", dpkg_date + '.*remove|remove.*' + dpkg_date, "/var/log/dpkg.log"], capture_output=True).stdout.decode('UTF-8').splitlines()
10 months ago
print("Commands: journalctl, this sometimes takes longer");
10 months ago
journal_today = run_command(["sudo", "journalctl","_COMM=useradd", "_COMM=usermod", "_COMM=userdel","_COMM=groupremove", "_COMM=groupadd","-r", "--utc"] + get_journalctl_on()).splitlines()
10 months ago
# TODO this is not working with the time ago. name should be grepped from user_created_today
last_user_added = subprocess.run(["sudo", "journalctl","_COMM=useradd","-r","-n", "1" , "--output-fields=MESSAGE"], capture_output=True)
last_user_added_name = run_command(['grep', '-Po', "(?<=name)\W*\K[^ ]*"], based=last_user_added.stdout)
10 months ago
journal_today = subprocess.run(["sudo", "journalctl","_COMM=systemd-logind","_COMM=useradd", "_COMM=usermod", "_COMM=userdel","_COMM=groupremove", "_COMM=groupadd","-r"] + get_journalctl_on(), check=True, capture_output=True)
def get_last_user(log):
if log:
last = log[-1]
result = re.findall(r"name=([^,]*)", users_created_today[-1])
return result[0]
else:
return False
10 months ago
try:
10 months ago
groups_created = subprocess.run(['grep','groupadd'], capture_output=True, input=journal_today.stdout).stdout.decode('UTF-8').strip().splitlines()
groups_removed = subprocess.run(['grep','groupremove'], capture_output=True, input=journal_today.stdout).stdout.decode('UTF-8').strip().splitlines()
users_created_today = subprocess.run(['grep','useradd'], capture_output=True, input=journal_today.stdout).stdout.decode('UTF-8').strip().splitlines()
user_modified = subprocess.run(['grep','usermod'], capture_output=True, input=journal_today.stdout).stdout.decode('UTF-8').strip().splitlines()
user_deleted = subprocess.run(['grep','userdel'], capture_output=True, input=journal_today.stdout).stdout.decode('UTF-8').strip().splitlines()
logins_today = subprocess.run(['grep','New session'], capture_output=True, input=journal_today.stdout).stdout.decode('UTF-8').strip().splitlines()
10 months ago
last_user_name = get_last_user(users_created_today)
10 months ago
except subprocess.CalledProcessError as e:
raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))
10 months ago
print("Commands: services, this sometimes takes longer");
kitchen_services = run_command(["sudo", "journalctl", "-u", "kitchen-stove.service", "-u", "kitchen-bin.service", "-u", "kitchen-fridge.service", "-r", "-n"] + get_journalctl_on()).splitlines()
10 months ago
10 months ago
print("Got all commands data");
# loading the jinja template environment
10 months ago
env = Environment(loader=FileSystemLoader("/home/xpub/www/html/tl-dr/templates"))
# loading the template (use template.jinja when generating the html webview)
template = env.get_template("book.jinja")
10 months ago
10 months ago
print("rendering the template")
# rendering the template and storing the resultant text in variable output
output = template.render(
now = now.strftime("%B %dth %Y"),
last_user_added=last_user_added.stdout.decode('UTF-8'),
last_user_added_name=last_user_added_name,
since_last_boot=since_last_boot,
10 months ago
list_package_installs=list_package_installs,
list_package_upgrade=list_package_upgrade,
list_package_remove=list_package_remove,
device_info=device_info,
10 months ago
days_since_last_boot = time_since_last_boot,
kitchen_services = kitchen_services,
ip_address = ip_address,
10 months ago
list_active_services = list_active_services,
10 months ago
debian_version = run_command(["cat", "/etc/debian_version"]) if not time_ago_arg else False,
hostname = run_command(["hostname","-i"]) if not time_ago_arg else False,
10 months ago
groups_created = groups_created,
groups_removed = groups_removed,
users_created_today = users_created_today,
user_modified = user_modified,
user_deleted = user_deleted,
logins_today = logins_today,
last_user_name = last_user_name if not last_user_name else False
)
10 months ago
print("Storing the files");
# Export the html as book.html, which is used as an input for pandoc
with open(f"/home/xpub/www/html/tl-dr/book_{time_ago_arg}.html", "w") as f:
print(output, file=f)
10 months ago
if not time_ago_arg:
subprocess.run(['sh', '/home/xpub/www/html/tl-dr/create_book.sh', book_name])
else:
print("i did not create an epub since im an oldie")
print("Finished");
10 months ago