125 lines
3.5 KiB
Python
Executable File
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
|
|
])
|