-
Notifications
You must be signed in to change notification settings - Fork 55
Write connection details to TTY on boot #53
Changes from 14 commits
b4f26db
4ff305c
be64734
2c4fed6
529c2a7
b8d9ab4
cb3cf60
f6f3fbe
a52c7c6
4a70857
c1bd4c2
23f47ab
675d2e3
d079e16
a3cd43a
08ab57b
0c904fd
268d14b
28a6164
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
pipenv |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
#!/bin/bash -e | ||
|
||
echo "Installing connection-details and dependencies" | ||
|
||
cp files/Pipfile* "${ROOTFS_DIR}"/ | ||
|
||
on_chroot << EOF | ||
pip3 install qrcode | ||
EOF | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would suggest adding python3-qrcode to packages instead. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Wooaaaah, I've been messing around for ages trying to get pipenv to install system packages as root so we can install securely and verify against a checksum, had no idea it was available via apt! |
||
# PIPENV_PIPFILE="/Pipfile" pipenv --python "$(which python3)" install --system | ||
|
||
rm "${ROOTFS_DIR}"/Pipfile* | ||
|
||
chmod +x files/connection-details | ||
cp files/connection-details "${ROOTFS_DIR}"/usr/local/bin/connection-details | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks, was not aware of |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
[[source]] | ||
name = "pypi" | ||
url = "https://pypi.org/simple" | ||
verify_ssl = true | ||
|
||
[dev-packages] | ||
|
||
[packages] | ||
qrcode = "6.1" | ||
|
||
[requires] | ||
python_version = "3.8" |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
#!/usr/bin/env python3 | ||
|
||
import sys | ||
import os | ||
import time | ||
import subprocess | ||
from io import TextIOWrapper, BytesIO | ||
import qrcode | ||
|
||
umbrel_ascii = ''' | ||
,;###GGGGGGGGGGl#Sp | ||
,##GGGlW""^' '`""%GGGG#S, | ||
,#GGG" "lGG#o | ||
#GGl^ '$GG# | ||
,#GGb \GGG, | ||
lGG" "GGG | ||
#GGGlGGGl##p,,p##lGGl##p,,p###ll##GGGG | ||
!GGGlW"""*GGGGGGG#""""WlGGGGG#W""*WGGGGS | ||
"" "^ '" "" | ||
|
||
|
||
@GGS lG# | ||
!GGG !GGG | ||
!GGG !GGG | ||
!GGG !GGG | ||
!GGG !GGG | ||
!GGG !GGG | ||
'GGG $GGl | ||
"GGG#psqp##GG# | ||
"%GGGGGG#" | ||
'''.strip('\n') | ||
|
||
def create_qr(data): | ||
output_buffer = TextIOWrapper(BytesIO(), sys.stdout.encoding) | ||
|
||
qr = qrcode.QRCode(border=0, error_correction=qrcode.constants.ERROR_CORRECT_Q) | ||
qr.add_data(data) | ||
qr.print_ascii(out=output_buffer) | ||
|
||
output_buffer.seek(0) | ||
qr_ascii = output_buffer.read().strip() | ||
|
||
return qr_ascii | ||
|
||
def combine_ascii(left_ascii, right_ascii, spacing=0): | ||
left_lines = left_ascii.split('\n') | ||
right_lines = right_ascii.split('\n') | ||
|
||
no_left_lines = len(left_lines) | ||
no_right_lines = len(right_lines) | ||
|
||
left_width = max(list(map(lambda line: len(line), left_lines))) | ||
max_height = max(no_left_lines, no_right_lines) | ||
|
||
lines = [] | ||
for i in range(max_height): | ||
left_line = left_lines[i] if i < no_left_lines else "" | ||
right_line = right_lines[i] if i < no_right_lines else "" | ||
|
||
padding = " " * ((left_width - len(left_line)) + spacing) | ||
|
||
lines.append(left_line + padding + right_line) | ||
|
||
return "\n".join(lines) | ||
|
||
def read_file_when_available(file_path, timeout): | ||
start = time.time() | ||
while not os.path.exists(file_path): | ||
if (time.time() - start) > timeout: | ||
return False | ||
time.sleep(1) | ||
|
||
with open(file_path, "r") as file: | ||
file_contents = file.read() | ||
|
||
return file_contents | ||
|
||
def run(command): | ||
result = subprocess.run(command, stdout=subprocess.PIPE) | ||
return result.stdout.decode('utf-8').rstrip("\n") | ||
|
||
def main(): | ||
timeout = 30 | ||
tor_hostname_file = "/home/umbrel/tor/data/web/hostname" | ||
tor_hostname = read_file_when_available(tor_hostname_file, timeout) | ||
|
||
if not tor_hostname: | ||
print("Couldn't get connection details") | ||
return | ||
|
||
tor_hostname_qr_ascii = create_qr(tor_hostname.strip()) | ||
ascii_banner = combine_ascii(umbrel_ascii, tor_hostname_qr_ascii, spacing=10) | ||
|
||
ip = run(['hostname', '-I']).split(" ")[0] | ||
|
||
connection_details = f""" | ||
|
||
|
||
{ascii_banner} | ||
|
||
Your Umbrel is up and running at: | ||
|
||
http://umbrel.local | ||
http://{ip} | ||
http://{tor_hostname} | ||
""" | ||
print(connection_details) | ||
|
||
main() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You could add a
clear
here.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure we should clear the TTY here since there could be useful log output on the screen that we don't want to overwrite.