motd/update_motd

125 lines
3.5 KiB
Python
Executable File

#!/usr/bin/env python3
from subprocess import check_output
from shlex import split
def run(command):
return check_output(split(command)).decode()
def join(lines, fn=lambda x: x):
return "\n".join(list(map(fn, lines)))
def nsplit(text, size):
return [text[i:i+size] for i in range(0, len(text), size)]
def fit(words, offset=0):
parts = [""]
cap = 80 - 4
offs = " " * offset
for w, word in enumerate(words):
part = parts[-1]
oword = offs + word
if len(part + word) <= cap:
if len(part) > 0 and len(part.strip()) > 0:
part = part + " " + word
elif len(part) > 0:
part = part + word
else:
part = word
parts[-1] = part
elif len(part) == 0 or len(oword) > cap:
broken = nsplit(oword, cap - 1)
parts[-1] = broken[0]
for broke in broken[1:]:
parts.append(broke + "-")
else:
parts.append(oword)
return parts
def wrap(text):
line = "| "
if len(text) <= 80 - 4:
line = line + text
pad = " " * (80 - 2 - len(line))
line = line + pad + " |"
return line
#return join(text.split(), fn=wrap)
return None
def entry(text, offset=0):
lines = list(filter(lambda t: len(t) > 0, text.split("\n")))
words_lines = [[word for word in line.strip().split()] for line in lines]
wrapped = list()
for w, words in enumerate(words_lines):
if w == 0:
wrapped.append(join(fit(words, offset=offset), fn=wrap))
else:
words = [" " * offset] + words
wrapped.append(join(fit(words, offset=offset), fn=wrap))
return join(wrapped)
def entries(text, offset=0, start=""):
lines = list(filter(lambda t: len(t) > 0, text.split("\n")))
parts = []
result = []
for line in lines:
if len(parts) == 0 or line[0:len(start)] != start:
parts.append(line)
else:
result.append(entry("\n".join(parts), offset))
parts = [line]
result.append(entry("\n".join(parts), offset))
parts = [line]
joiner = "\n" + wrap("") + "\n"
cap = 5
if len(result) > cap:
return joiner.join(result[-cap:])
else:
return joiner.join(result)
def display(lines):
print("\n".join(lines))
motd_file = "/etc/motd"
release_file = "/etc/centos-release"
updates_file = "/center/etc/updates.txt"
cap = "+" + ("-" * 78) + "+"
empty = wrap("")
header = cap + "\n" + empty
footer = empty + "\n" + cap
update_lines = None
release_line = None
with open(release_file, "r") as release:
release_line = release.read().strip()
with open(updates_file, "r") as updates:
update_lines = updates.read()
uptime_line = run("uptime").strip()
welcome = "~~ Welcome to the Tilde Center project! ~~"
todo_repo = "https://tildegit.org/center/todo"
help_out = "If you would like to help with the project"
help_out = help_out + ", see our todo repository: " + todo_repo
display([
header,
wrap(release_line),
wrap(uptime_line),
empty,
wrap("-" * (80 - 4)),
empty,
wrap(welcome),
empty,
entry(help_out),
empty,
wrap("Things to do: "),
empty,
entry("* chat - irc client that connects to the tilde.chat server", 4),
entry("* mutt - email client to user your @tilde.center email", 4),
entry("* jrnl - journal app for notes and thoughts", 4),
empty,
wrap("Latest updates: "),
empty,
entries(update_lines, offset=16, start="- ["),
empty,
footer
])