Move a whole bunch of stuff around
@@ -1,7 +0,0 @@
|
|||||||
from flask import Blueprint
|
|
||||||
|
|
||||||
bp = Blueprint('disks', __name__,
|
|
||||||
template_folder='')
|
|
||||||
|
|
||||||
from applets.disks import routes
|
|
||||||
|
|
||||||
@@ -1,155 +0,0 @@
|
|||||||
{% extends "layout.html" %}
|
|
||||||
{% block body %}
|
|
||||||
|
|
||||||
<div style="">
|
|
||||||
|
|
||||||
<p><b>How would you like to install Debian?</b></p>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<div class="radios">
|
|
||||||
<label class="radio">
|
|
||||||
<input type="radio" name="rsvp" />
|
|
||||||
Preconfigured partitioning
|
|
||||||
<label class="radio">
|
|
||||||
<input type="radio" name="rsvp" disabled />
|
|
||||||
Erase entire disk
|
|
||||||
</label>
|
|
||||||
<label class="radio">
|
|
||||||
<input type="radio" name="rsvp" disabled />
|
|
||||||
Install alongside another operating system
|
|
||||||
</label>
|
|
||||||
<label class="radio">
|
|
||||||
<input type="radio" name="rsvp" disabled />
|
|
||||||
Edit existing partitions
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="columns" width="100%">
|
|
||||||
<div class="column"><p> <br>Proposed layout: </p></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
<div style="">
|
|
||||||
<div style="background-color: gray; padding: 4px 6px 7px 6px; border-radius: 10px;">
|
|
||||||
<p> <span style="width: 100%; border-radius: 8px 8px 0 0;" class="tag is-black">Physical disk: TOSHIBA HDWD120 (2000 GB) <br>
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column is-narrow is-primary">
|
|
||||||
<div class="box" style="min-width: 220px; border-radius: 0 0 0px 5px; height: 60px; padding-top: 5px;">
|
|
||||||
<p class="is-tiny">/dev/sda1</p>
|
|
||||||
<p class="title is-5"><span class="tag is-black">/boot/efi</span>
|
|
||||||
<span class="tag is-dark">200 MB</span>
|
|
||||||
<span class="tag is-link">vfat</span>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<a hx-get="/disks/partition/sda" hx-swap="outerHTML"/>
|
|
||||||
<div class="column">
|
|
||||||
<div class="box" style="border-radius: 0 0 5px 0px; height: 60px; padding-top: 5px;">
|
|
||||||
<p class="is-tiny">/dev/sda2</p>
|
|
||||||
<p class="title is-5"><span class="tag is-black">/</span> <span class="tag is-dark">18 GB</span> <span class="tag is-link">btrfs</span></p>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
<p> There are {{ blockdevs["blockdevices"]|count }} block devices detected. </p>
|
|
||||||
<p> They are </p>
|
|
||||||
<br>
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
<!-- {% for disk in blockdevs["blockdevices"] if disk["name"] != "zram0"%} -->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
<h1> Raw data </h1>
|
|
||||||
{{ disk }}
|
|
||||||
|
|
||||||
<h1> Children </h1>
|
|
||||||
|
|
||||||
{% for child in disk['children'] %}
|
|
||||||
|
|
||||||
<h2> <big><b> Child </b></big> </h2>
|
|
||||||
Path: {{ child['path'] }}
|
|
||||||
fstype: {{ child['fstype'] }}
|
|
||||||
fssize: {{ child['fssize'] }}
|
|
||||||
{{ child }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
<div style=""> <!-- partition bars -->
|
|
||||||
<div style="background-color: gray; padding: 4px 6px 7px 6px; border-radius: 10px;">
|
|
||||||
<p> <span style="width: 100%; border-radius: 8px 8px 0 0;" class="tag is-black">
|
|
||||||
<small><small>{{ disk['name'] }} ({{(disk['size']/1024000000)|round(0)|int }} GB) - Serial: {{ disk['serial'] }}</small></small>
|
|
||||||
<div class="columns">
|
|
||||||
{% for child in disk['children'] %}
|
|
||||||
<a hx-get="/disks/partition/{{ child['name'] }}" hx-swap="outerHTML"/>
|
|
||||||
<div class="column is-narrow is-primary">
|
|
||||||
<div class="box" style="min-width: 220px; border-radius: 0 0 0px 5px; height: 60px; padding-top: 5px;">
|
|
||||||
<p class="is-tiny">{{ child['name'] }} ({{ (child['size']/1024000000)|round(2) }} GiB) </p>
|
|
||||||
<p class="title is-5"><span class="tag is-black">{{ child['mountpoint'] }}</span>
|
|
||||||
<span class="tag is-link">{{ child['fstype'] }}</span>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
{% endfor %}
|
|
||||||
{% if disk['maj:min'] == "252:0" %}
|
|
||||||
<div class="column is-narrow is-primary">
|
|
||||||
<div class="box" style="width: 100%; border-radius: 0 0 0px 5px; height: 60px; padding-top: 5px; right: 0px;">
|
|
||||||
<p class="is-tiny"> {{ disk['name'] }} ({{ (disk['size']/1024000000)|round(2) }} GiB) </p>
|
|
||||||
<p class="title is-5"><span class="tag is-black">/dev/{{ disk['name'] }}</span>
|
|
||||||
<span class="tag is-link">swap</span>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
<p> Diskname: {{ disk['name'] }} </p>
|
|
||||||
<p> Model: {{ disk['model'] }} </p>
|
|
||||||
<p> Serial: {{ disk['serial'] }} </p>
|
|
||||||
<p> Removable: {{ disk['rm'] }} </p>
|
|
||||||
<p> Size: {{ disk['size'] | int / 1024000000 | round(2) }} GiB </p>
|
|
||||||
<p> ID: {{disk['id'] }} </p>
|
|
||||||
<p> pttype: {{disk['pttype'] }} </p>
|
|
||||||
<p> Maj:min: {{disk['maj:min']}} </p>
|
|
||||||
<p> phy-sec: {{ disk['phy-sec'] }}. log-sec: {{ disk['log-sec'] }} </p>
|
|
||||||
<p> There are {{ disk['children']|count }} Children </p>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
{% for child in disk['children'] %}
|
|
||||||
<br>
|
|
||||||
<p> Name: {{ child['name'] }}. Path: {{ child['path'] }}. {{ child['size'] }}. Block: {{ child['subsystems'] }} {{ child['maj:min'] }} {{ child['type'] }} </p>
|
|
||||||
<p> Fstype: {{ child['fstype'] }}. Label: {{ child['label'] }}. Rota: {{ child['rota'] }}</p>
|
|
||||||
<p> Parttypename: {{ child['parttypename'] }}
|
|
||||||
<br>
|
|
||||||
{% endfor %}
|
|
||||||
-->
|
|
||||||
|
|
||||||
<br>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
<!-- Add Undetected Disk
|
|
||||||
Add Virtual Filesystem
|
|
||||||
Add Network Filesystem -->
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
<div class="modal is-active">
|
|
||||||
<div class="modal-background"></div>
|
|
||||||
<div class="modal-content">
|
|
||||||
|
|
||||||
<div style="background-color: #424242; padding: 15px; border-radius: 15px; boders: none; color: white;">
|
|
||||||
<h1 class="is-size-4"> Edit partition: {{ partition }} </h1>
|
|
||||||
<p class="title is-6"><span class="tag is-black">Primary Partition</span>
|
|
||||||
|
|
||||||
<span>
|
|
||||||
<p>Select usage: <div class="control is-link">
|
|
||||||
<div class="select">
|
|
||||||
<select>
|
|
||||||
<option>Local file system</option>
|
|
||||||
<option>Remote file system</option>
|
|
||||||
<option>Logical volume for ZFS zpool</option>
|
|
||||||
<option>Logical volume for LVM</option>
|
|
||||||
<option>Logical volume for LUKS encryption</option>
|
|
||||||
<option>Logical volume for Linux (mdadm) RAID</option>
|
|
||||||
<option>Logical volume for Microsoft LDM RAID</option>
|
|
||||||
<option>Swap partition</option>
|
|
||||||
<option>Do not configure</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<span>
|
|
||||||
<p>Select Mount Point: <div class="control is-link">
|
|
||||||
<div class="select">
|
|
||||||
<select>
|
|
||||||
<option>/</option>
|
|
||||||
<option>/usr</option>
|
|
||||||
<option>/var</option>
|
|
||||||
<option>Other...</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<span>
|
|
||||||
<p>Select Filesystem: <div class="control is-link">
|
|
||||||
<div class="select">
|
|
||||||
<select>
|
|
||||||
<option is-active>btrfs</option>
|
|
||||||
<option>ext4</option>
|
|
||||||
<option>ext3</option>
|
|
||||||
<option>ext2</option>
|
|
||||||
<option>xfs</option>
|
|
||||||
<option>jfs</option>
|
|
||||||
<option>ntfs</option>
|
|
||||||
<option>vfat</option>
|
|
||||||
<option>nfs</option>
|
|
||||||
<option>nbd</option>
|
|
||||||
<option>samba</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</span>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="checkboxes">
|
|
||||||
<label class="checkbox">
|
|
||||||
<input type="checkbox" />
|
|
||||||
noatime
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<label class="checkbox">
|
|
||||||
<input type="checkbox" />
|
|
||||||
nodiratime
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<label class="checkbox">
|
|
||||||
<input type="checkbox" />
|
|
||||||
discard
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<div class="columns">
|
|
||||||
<a href="/disks">
|
|
||||||
<div class="column"><button class="button is-light">Cancel</button></div>
|
|
||||||
</a>
|
|
||||||
<a href="/disks"><div class="column"><button class="button is-link">Continue</button></div></a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
from applets.disks import bp
|
|
||||||
from flask import Flask, request, session, redirect, \
|
|
||||||
url_for, render_template, flash, Blueprint
|
|
||||||
import dmm.lsblk as lsblk
|
|
||||||
from flask import current_app
|
|
||||||
|
|
||||||
@bp.route('/disks')
|
|
||||||
def disks():
|
|
||||||
"""
|
|
||||||
Disks screen for the webui.
|
|
||||||
"""
|
|
||||||
blockdevs = lsblk.list_block_devices()
|
|
||||||
print(lsblk.list_block_devices())
|
|
||||||
menu = current_app.config['CONFIG']['settings']['menu_order'].split(" ")
|
|
||||||
next_step_url = menu[menu.index("disks")+1]
|
|
||||||
if menu[menu.index("disks")] == 1:
|
|
||||||
previous_step_url = False
|
|
||||||
else:
|
|
||||||
previous_step_url = menu[menu.index("disks")-1]
|
|
||||||
|
|
||||||
add_disks_button = ' <button class="button iis-info"> <i class="fa fa-hdd-o" aria-hidden="true"></i> Add Disk or Filesystem </button>'
|
|
||||||
add_swap_button = ' <button class="button iis-info"> <i class="fa fa-object-group" aria-hidden="true"></i> Swap Configuration </button>'
|
|
||||||
bottom_menu = add_disks_button + add_swap_button
|
|
||||||
build_summary()
|
|
||||||
|
|
||||||
return render_template('disks.html', blockdevs=blockdevs,
|
|
||||||
menu=current_app.config['CONFIG']['settings']['menu'],
|
|
||||||
menu_order=current_app.config['CONFIG']['settings']['menu_order'].split(),
|
|
||||||
previous_step = previous_step_url,
|
|
||||||
next_step = next_step_url,
|
|
||||||
bottom_menu = bottom_menu)
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/disks/partition/<part>')
|
|
||||||
def disks_partition(part):
|
|
||||||
"""
|
|
||||||
Partition modal for the webui partition screen.
|
|
||||||
"""
|
|
||||||
print("Partition is: " + part)
|
|
||||||
partition = part
|
|
||||||
return render_template('disks_partition.html',
|
|
||||||
menu=current_app.config['CONFIG']['settings']['menu'],
|
|
||||||
partition=partition)
|
|
||||||
|
|
||||||
|
|
||||||
def build_menu():
|
|
||||||
"""
|
|
||||||
Define menu items and paths.
|
|
||||||
"""
|
|
||||||
# proper one once translations are done:
|
|
||||||
#current_app.config['CONFIG']['settings']['menu']['welcome'] = (build_stringlist()['menu_item'], "/welcome", 10)
|
|
||||||
current_app.config['CONFIG']['settings']['menu']['disks'] = ("Disks", "/disks", 30)
|
|
||||||
|
|
||||||
|
|
||||||
def build_summary():
|
|
||||||
"""
|
|
||||||
Write up a summary of what this module will do.
|
|
||||||
"""
|
|
||||||
current_app.config['CONFIG']['Summary']['disks'] = {}
|
|
||||||
current_app.config['CONFIG']['Summary']['disks']['heading'] = "Disks and Partitions"
|
|
||||||
current_app.config['CONFIG']['Summary']['disks']['bleh'] = current_app.config['CONFIG']['recipe']['popcon']['enable_popcon']
|
|
||||||
current_app.config['CONFIG']['Summary']['disks']['text'] = "Pre-configured disk layout."
|
|
||||||
return("ok?")
|
|
||||||
|
|
||||||
build_menu()
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
from flask import Blueprint
|
|
||||||
|
|
||||||
bp = Blueprint('hardware', __name__,
|
|
||||||
template_folder='')
|
|
||||||
|
|
||||||
from applets.hardware import routes
|
|
||||||
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
{% extends "layout.html" %}
|
|
||||||
{% block body %}
|
|
||||||
|
|
||||||
<p> <b> Would you like fries with that? </b></p>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<div style="background-color: gray; padding: 4px 6px 7px 6px;
|
|
||||||
border-radius: 10px; margin-bottom: 20px;">
|
|
||||||
<span style="width: 100%; border-radius: 8px 8px 0 0;"
|
|
||||||
class="tag is-black">
|
|
||||||
Real-time Clock
|
|
||||||
</span>
|
|
||||||
<div style="padding-left: 15px; padding-right: 15px; background-color: #fff;
|
|
||||||
color: #000;">
|
|
||||||
<p>Date / time. / timezone</p> <br>
|
|
||||||
<input style="background-color: #777777;" type="checkbox" id="popcon"
|
|
||||||
name="popcon" hx-post="/software/settings" hx-trigger="change"
|
|
||||||
{% if popcon %} checked {% endif %}>
|
|
||||||
<label for="popcon"> Participate in PopCon </label><br>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style="background-color: gray; padding: 4px 6px 7px 6px;
|
|
||||||
border-radius: 10px; margin-bottom: 20px;">
|
|
||||||
<span style="width: 100%; border-radius: 8px 8px 0 0;"
|
|
||||||
class="tag is-black">
|
|
||||||
Firmware
|
|
||||||
</span>
|
|
||||||
<div style="padding-left: 15px; padding-right: 15px; background-color: #fff;
|
|
||||||
color: #000;">
|
|
||||||
<p>Install additional firmware.</p> <br>
|
|
||||||
<input style="background-color: #777777;" type="checkbox" id="popcon"
|
|
||||||
name="popcon" hx-post="/software/settings" hx-trigger="change"
|
|
||||||
{% if popcon %} checked {% endif %}>
|
|
||||||
<label for="popcon"> Participate in PopCon </label><br>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
from applets.hardware import bp
|
|
||||||
from flask import Flask, request, session, redirect, \
|
|
||||||
url_for, render_template, flash, Blueprint
|
|
||||||
from flask import current_app
|
|
||||||
|
|
||||||
@bp.route('/hardware')
|
|
||||||
def webui_hardware():
|
|
||||||
"""
|
|
||||||
Hardware screen for the webui.
|
|
||||||
"""
|
|
||||||
menu = current_app.config['CONFIG']['settings']['menu_order'].split(" ")
|
|
||||||
next_step_url = menu[menu.index("hardware")+1]
|
|
||||||
if menu[menu.index("hardware")] == 1:
|
|
||||||
previous_step_url = False
|
|
||||||
else:
|
|
||||||
previous_step_url = menu[menu.index("hardware")-1]
|
|
||||||
|
|
||||||
sources_button = ' <button class="button iis-info"> <i class="fa fa-cloud-download" aria-hidden="true"></i> Configure Network </button>'
|
|
||||||
blends_button = ' <button class="button iis-info"> <i class="fa fa-download" aria-hidden="true"></i> Install a Blend </button>'
|
|
||||||
bottom_menu = sources_button + blends_button
|
|
||||||
build_summary()
|
|
||||||
|
|
||||||
return render_template('hardware.html',
|
|
||||||
menu=current_app.config['CONFIG']['settings']['menu'],
|
|
||||||
menu_order=current_app.config['CONFIG']['settings']['menu_order'].split(),
|
|
||||||
previous_step = previous_step_url,
|
|
||||||
next_step = next_step_url,
|
|
||||||
bottom_menu = bottom_menu,
|
|
||||||
popcon=current_app.config['CONFIG']['recipe']['popcon']['enable_popcon'])
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/hardware/settings', methods=['GET', 'POST'])
|
|
||||||
def hardware_settings():
|
|
||||||
"""
|
|
||||||
Receive settings for the hardware applet.
|
|
||||||
"""
|
|
||||||
if request.method == 'POST':
|
|
||||||
popcon = "popcon" in request.form
|
|
||||||
current_app.config['CONFIG']['recipe']['popcon']['enable_popcon'] = popcon
|
|
||||||
print(current_app.config['CONFIG']['recipe']['popcon']['enable_popcon'])
|
|
||||||
build_summary()
|
|
||||||
return ('', 204)
|
|
||||||
|
|
||||||
|
|
||||||
def build_menu():
|
|
||||||
"""
|
|
||||||
Define menu items and paths.
|
|
||||||
"""
|
|
||||||
# proper one once translations are done:
|
|
||||||
#current_app.config['CONFIG']['settings']['menu']['welcome'] = (build_stringlist()['menu_item'], "/welcome", 10)
|
|
||||||
current_app.config['CONFIG']['settings']['menu']['hardware'] = ("Hardware", "/hardware", 40)
|
|
||||||
|
|
||||||
|
|
||||||
def build_summary():
|
|
||||||
"""
|
|
||||||
Write up a summary of what this module will do.
|
|
||||||
"""
|
|
||||||
current_app.config['CONFIG']['Summary']['hardware'] = {}
|
|
||||||
current_app.config['CONFIG']['Summary']['hardware']['heading'] = "Hardware"
|
|
||||||
current_app.config['CONFIG']['Summary']['hardware']['bleh'] = current_app.config['CONFIG']['recipe']['popcon']['enable_popcon']
|
|
||||||
current_app.config['CONFIG']['Summary']['hardware']['text'] = "Participate in Popularity Contest: " + str(current_app.config['CONFIG']['recipe']['popcon']['enable_popcon']) + "<br/>No desktop environment selected."
|
|
||||||
return("ok?")
|
|
||||||
|
|
||||||
|
|
||||||
build_menu()
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
from flask import Blueprint
|
|
||||||
|
|
||||||
bp = Blueprint('install', __name__,
|
|
||||||
template_folder='')
|
|
||||||
|
|
||||||
from applets.install import routes
|
|
||||||
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
{% extends "layout.html" %}
|
|
||||||
{% block body %}
|
|
||||||
|
|
||||||
<center>
|
|
||||||
<p style="position: absolute: left: 45px; top: 10px;">
|
|
||||||
<big><big>
|
|
||||||
Installing...
|
|
||||||
</big></big>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<img style="width: 400px; padding: 20px;" src="/static/slide1.png" /> <br />
|
|
||||||
<p>
|
|
||||||
Installing system, the rest of the process is automated.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p style="margin: 20px;">
|
|
||||||
<input style="background-color: #777777;" type="checkbox"
|
|
||||||
id="reboot" name="reboot" value="reboot" checked>
|
|
||||||
<label for="reboot"> Reboot automatically when ready </label></p><br>
|
|
||||||
|
|
||||||
<div id="output"></div>
|
|
||||||
|
|
||||||
<!-- Hidden input to track last line -->
|
|
||||||
<div id="last-line-container">
|
|
||||||
<input type="hidden" id="last-line" name="last_line" value="0">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Poller -->
|
|
||||||
<div hx-get="/install/status"
|
|
||||||
hx-trigger="load, every 1s"
|
|
||||||
hx-include="#last-line"
|
|
||||||
hx-swap-oob="true"
|
|
||||||
hx-target="this"
|
|
||||||
hx-ext="json-enc"
|
|
||||||
hx-vars="{}">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</center>
|
|
||||||
|
|
||||||
<div style="position: absolute; padding: 10px; background-color: #26495e; left: 40px;
|
|
||||||
right: 40px; bottom: 40px; height: text-align: middle;">
|
|
||||||
<center> Initializing... </center>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,109 +0,0 @@
|
|||||||
from applets.install import bp
|
|
||||||
from flask import Flask, request, session, redirect, \
|
|
||||||
url_for, render_template, flash, Blueprint, jsonify
|
|
||||||
from flask import current_app
|
|
||||||
|
|
||||||
import subprocess
|
|
||||||
import threading
|
|
||||||
|
|
||||||
|
|
||||||
status = {
|
|
||||||
"status": "idle", # idle | running | finished
|
|
||||||
"output": "",
|
|
||||||
"exit_code": None,
|
|
||||||
"lines": []
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/install',methods=['GET', 'POST', 'PUT'])
|
|
||||||
def install_index():
|
|
||||||
"""
|
|
||||||
The page you'd get if you access the root of
|
|
||||||
this app in a browser.
|
|
||||||
"""
|
|
||||||
install_start()
|
|
||||||
return render_template('install.html')
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/install-start',methods=['GET', 'POST', 'PUT'])
|
|
||||||
def install_start():
|
|
||||||
"""
|
|
||||||
Trigger the installation process
|
|
||||||
"""
|
|
||||||
print("The installation process is starting!... in theory at least")
|
|
||||||
if status["status"] == "running":
|
|
||||||
return jsonify({"status": "already running"}), 409 # Conflict
|
|
||||||
threading.Thread(target=run_script).start()
|
|
||||||
return jsonify({"status": "started"})
|
|
||||||
print("did it finish?")
|
|
||||||
|
|
||||||
|
|
||||||
def run_script():
|
|
||||||
global status
|
|
||||||
status["status"] = "running"
|
|
||||||
|
|
||||||
process = subprocess.Popen(
|
|
||||||
["bash", "/data/jonathan/devel/highvoltage/system-installer/daemon/src/fake-install-shell.sh"],
|
|
||||||
stdout = subprocess.PIPE,
|
|
||||||
stderr = subprocess.STDOUT,
|
|
||||||
text = True)
|
|
||||||
|
|
||||||
lines = []
|
|
||||||
for line in iter(process.stdout.readline,''):
|
|
||||||
#lines.append(line.strip())
|
|
||||||
#status["output"] = "\n".join(lines)
|
|
||||||
status["lines"].append(line.strip())
|
|
||||||
|
|
||||||
process.wait()
|
|
||||||
status["status"] = 'finished'
|
|
||||||
status["exit_code"] = process.returncode
|
|
||||||
|
|
||||||
print(lines)
|
|
||||||
print("status:", status["status"], "code:", status["exit_code"])
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/install/status', methods=['GET', 'POST'])
|
|
||||||
def install_status():
|
|
||||||
"""
|
|
||||||
Update on the status of the installation process.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# Keep track of the last line posted, so that we can include
|
|
||||||
# any new lines not provided to the UI yet
|
|
||||||
last_line = int(request.args.get("last_line", 0))
|
|
||||||
new_lines = status["lines"][last_line:]
|
|
||||||
|
|
||||||
if not new_lines and status["status"] == "finished":
|
|
||||||
return "" # Empty response = HTMX will stop polling
|
|
||||||
|
|
||||||
lines_html = ""
|
|
||||||
for i, line in enumerate(new_lines, start=last_line + 1):
|
|
||||||
lines_html += f'<div>{line}</div>'
|
|
||||||
|
|
||||||
return {
|
|
||||||
"output": status['output'],
|
|
||||||
"status": status['status'],
|
|
||||||
"lines": lines_html,
|
|
||||||
"last_line": f'<input type="hidden" id="last-line" name="last_line" value="{last_line + len(new_lines)}">'
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/install/cancel', methods=["POST"])
|
|
||||||
def install_cancel():
|
|
||||||
"""
|
|
||||||
Cancel the installation process.
|
|
||||||
"""
|
|
||||||
if status["status"] != "running" or not status["process"]:
|
|
||||||
return Response("No running script", status=400)
|
|
||||||
process["process"].terminate()
|
|
||||||
process["status"] = "cancelled"
|
|
||||||
process["exit_code"] = -1
|
|
||||||
return Response("Cancelled", status=200)
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/settings',methods=['GET', 'POST', 'PUT'])
|
|
||||||
def settings():
|
|
||||||
"""
|
|
||||||
Manage settings for the installation module.
|
|
||||||
"""
|
|
||||||
print("Settings")
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
from flask import Blueprint
|
|
||||||
|
|
||||||
bp = Blueprint('main', __name__,
|
|
||||||
template_folder='')
|
|
||||||
|
|
||||||
from applets.main import routes
|
|
||||||
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<div class="modal is-active">
|
|
||||||
<div class="modal-background"></div>
|
|
||||||
<div class="modal-content">
|
|
||||||
|
|
||||||
<div style="background-color: #424242; padding: 15px; border-radius: 15px; boders: none; color: white;">
|
|
||||||
<h1 class="is-size-4"> Help </h1>
|
|
||||||
<br/><p class="title is-6"><span class="tag is-danger">The help system is not yet implemented.</span>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="columns">
|
|
||||||
<a href="/welcome"><div class="column"><button class="button is-link">Continue</button></div></a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
<div class="modal is-active">
|
|
||||||
<div class="modal-background"></div>
|
|
||||||
<div class="modal-content">
|
|
||||||
|
|
||||||
<div style="background-color: #424242; padding: 15px; border-radius: 15px; borders: none; color: white;">
|
|
||||||
<h1 class="is-size-4"> Main menu </h1>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
<p> There's nothing yet to do here.</p>
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<div class="columns">
|
|
||||||
<a href="/welcome"><div class="column"><button class="button is-link">Continue</button></div></a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<div class="modal is-active">
|
|
||||||
<div class="modal-background"></div>
|
|
||||||
<div class="modal-content">
|
|
||||||
|
|
||||||
<div style="background-color: #424242; padding: 15px; border-radius: 15px; boders: none; color: white;">
|
|
||||||
<h1 class="is-size-4"> Exit system installer </h1>
|
|
||||||
<br /><p class="title is-6"><span class="tag is-danger">Quitting is not yet implemented.</span>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<p> ALT+F4 will bring up a dialog that works though. </p>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
<div class="columns">
|
|
||||||
<a href="/welcome"><div class="column"><button class="button is-link">Continue</button></div></a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
from applets.welcome import bp
|
|
||||||
from flask import Flask, request, session, redirect, \
|
|
||||||
url_for, render_template, flash, Blueprint
|
|
||||||
# we use this neat little trick to get config data from the main app
|
|
||||||
from flask import current_app
|
|
||||||
import gettext
|
|
||||||
import dmm.lsblk as lsblk
|
|
||||||
|
|
||||||
@bp.route('/')
|
|
||||||
def index():
|
|
||||||
"""
|
|
||||||
The page you'd get if you access the root of
|
|
||||||
this app in a browser.
|
|
||||||
"""
|
|
||||||
return ("Welcome to System Installer Daemon POC <br />"
|
|
||||||
"Version: Unavailable")
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/api/v0')
|
|
||||||
def apihome():
|
|
||||||
"""
|
|
||||||
Not sure what this function should do, but have
|
|
||||||
a feeling that it should exist.
|
|
||||||
"""
|
|
||||||
return ("0")
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/main/help',methods=['GET', 'POST', 'PUT'])
|
|
||||||
def main_welcome():
|
|
||||||
"""
|
|
||||||
Manages the main help system.
|
|
||||||
"""
|
|
||||||
return render_template('help.html')
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/main/quit',methods=['GET', 'POST', 'PUT'])
|
|
||||||
def main_quit():
|
|
||||||
"""
|
|
||||||
Manages the quit dialog.
|
|
||||||
"""
|
|
||||||
return render_template('quit.html')
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/main/menu',methods=['GET', 'POST', 'PUT'])
|
|
||||||
def main_menu():
|
|
||||||
"""
|
|
||||||
Manages the main menu.
|
|
||||||
"""
|
|
||||||
return render_template('menu.html')
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
from flask import Blueprint
|
|
||||||
|
|
||||||
bp = Blueprint('software', __name__,
|
|
||||||
template_folder='')
|
|
||||||
|
|
||||||
from applets.software import routes
|
|
||||||
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
from applets.software import bp
|
|
||||||
from flask import Flask, request, session, redirect, \
|
|
||||||
url_for, render_template, flash, Blueprint
|
|
||||||
from flask import current_app
|
|
||||||
|
|
||||||
@bp.route('/software')
|
|
||||||
def webui_software():
|
|
||||||
"""
|
|
||||||
Software screen for the webui.
|
|
||||||
"""
|
|
||||||
menu = current_app.config['CONFIG']['settings']['menu_order'].split(" ")
|
|
||||||
next_step_url = menu[menu.index("software")+1]
|
|
||||||
if menu[menu.index("software")] == 1:
|
|
||||||
previous_step_url = False
|
|
||||||
else:
|
|
||||||
previous_step_url = menu[menu.index("software")-1]
|
|
||||||
|
|
||||||
sources_button = ' <button class="button iis-info"> <i class="fa fa-cloud-download" aria-hidden="true"></i> Edit Sources </button>'
|
|
||||||
blends_button = ' <button class="button iis-info"> <i class="fa fa-download" aria-hidden="true"></i> Install a Blend </button>'
|
|
||||||
bottom_menu = sources_button + blends_button
|
|
||||||
# Leave out useless buttons until they do more
|
|
||||||
bottom_menu = ''
|
|
||||||
build_summary()
|
|
||||||
|
|
||||||
return render_template('software.html',
|
|
||||||
menu=current_app.config['CONFIG']['settings']['menu'],
|
|
||||||
menu_order=current_app.config['CONFIG']['settings']['menu_order'].split(),
|
|
||||||
previous_step = previous_step_url,
|
|
||||||
next_step = next_step_url,
|
|
||||||
bottom_menu = bottom_menu,
|
|
||||||
popcon=current_app.config['CONFIG']['recipe']['popcon']['enable_popcon'],
|
|
||||||
desktop=current_app.config['CONFIG']['recipe']['install_desktop_environment']['packages'])
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/software/settings', methods=['GET', 'POST'])
|
|
||||||
def software_settings():
|
|
||||||
"""
|
|
||||||
Receive settings for the software applet.
|
|
||||||
"""
|
|
||||||
if request.method == 'POST':
|
|
||||||
popcon = "popcon" in request.form
|
|
||||||
current_app.config['CONFIG']['recipe']['popcon']['enable_popcon'] = popcon
|
|
||||||
print(current_app.config['CONFIG']['recipe']['popcon']['enable_popcon'])
|
|
||||||
build_summary()
|
|
||||||
return ('', 204)
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/software/select-desktop', methods=['GET', 'POST'])
|
|
||||||
def software_select_desktop():
|
|
||||||
"""
|
|
||||||
Select a desktop environment for installation
|
|
||||||
"""
|
|
||||||
if request.method == 'POST':
|
|
||||||
desktop = request.form['software-desktop']
|
|
||||||
print(desktop)
|
|
||||||
current_app.config['CONFIG']['recipe']['install_desktop_environment']['packages'] = desktop
|
|
||||||
build_summary()
|
|
||||||
return ('', 204)
|
|
||||||
|
|
||||||
|
|
||||||
def build_menu():
|
|
||||||
"""
|
|
||||||
Define menu items and paths.
|
|
||||||
"""
|
|
||||||
# proper one once translations are done:
|
|
||||||
#current_app.config['CONFIG']['settings']['menu']['welcome'] = (build_stringlist()['menu_item'], "/welcome", 10)
|
|
||||||
current_app.config['CONFIG']['settings']['menu']['software'] = ("Software", "/software", 40)
|
|
||||||
|
|
||||||
|
|
||||||
def build_summary():
|
|
||||||
"""
|
|
||||||
Write up a summary of what this module will do.
|
|
||||||
"""
|
|
||||||
current_app.config['CONFIG']['Summary']['software'] = {}
|
|
||||||
current_app.config['CONFIG']['Summary']['software']['heading'] = "Software"
|
|
||||||
current_app.config['CONFIG']['Summary']['software']['bleh'] = current_app.config['CONFIG']['recipe']['popcon']['enable_popcon']
|
|
||||||
current_app.config['CONFIG']['Summary']['software']['text'] = "Participate in Popularity Contest: " + str(current_app.config['CONFIG']['recipe']['popcon']['enable_popcon']) + "<br/>Desktop environment selected: " + str(current_app.config['CONFIG']['recipe']['install_desktop_environment']['packages'])
|
|
||||||
return("ok?")
|
|
||||||
|
|
||||||
|
|
||||||
build_menu()
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
{% extends "layout.html" %}
|
|
||||||
{% block body %}
|
|
||||||
|
|
||||||
<p> <b> Would you like fries with that? </b></p>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
<big> Popularity Contest </big>
|
|
||||||
<br><br>
|
|
||||||
<p>The Popularity Contest (popcon) is a programme where anonymous data is sent back to Debian, tracking the number of packages installed. More information can be obtained at https://popcon.debian.org.</p> <br>
|
|
||||||
|
|
||||||
<input style="background-color: #777777;" type="checkbox" id="popcon"
|
|
||||||
name="popcon" hx-post="/software/settings" hx-trigger="change"
|
|
||||||
{% if popcon %} checked {% endif %}>
|
|
||||||
<label for="popcon"> Participate in PopCon </label><br>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
<big><h3> Desktop Environment </h3></big>
|
|
||||||
<br>
|
|
||||||
<p>Would you like to install a graphical environment for this system?</p>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<form>
|
|
||||||
<div class="control is-link">
|
|
||||||
<div class="select">
|
|
||||||
<select hx-post="/software/select-desktop" hx-target="body" name="software-desktop" style="width: 220px">
|
|
||||||
<option value="" {% if desktop == "None" %} selected=selected {% endif %}> None</option>
|
|
||||||
<option value="task-gnome-desktop" {% if desktop == "task-gnome-desktop" %} selected=selected {% endif %} >GNOME</option>
|
|
||||||
<option value="task-kde-desktop" {% if desktop == "task-kde-desktop" %} selected=selected {% endif %}>KDE Plasma</option>
|
|
||||||
<option value="task-xfce-desktop" {% if desktop == "task-xfce-desktop" %} selected=selected {% endif %}>Xfce</option>
|
|
||||||
<option value="task-lxde-desktop" {% if desktop == "task-lxde-desktop" %} selected=selected {% endif %}>LXDE</option>
|
|
||||||
<option value="task-lxqt-desktop" {% if desktop == "task-lxqt-desktop" %} selected=selected {% endif %}>LXQt</option>
|
|
||||||
<option value="task-mate-desktop" {% if desktop == "task-mate-desktop" %} selected=selected {% endif %}>MATE</option>
|
|
||||||
<option value="lomiri" {% if desktop == "lomiri" %} selected=selected {% endif %}>Lomiri</option>
|
|
||||||
<option value="task-cinnamon-desktop" {% if desktop == "task-cinnamon-desktop" %} selected=selected {% endif %}>Cinnamon</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
<div style="background-color: gray; padding: 4px 6px 7px 6px; border-radius: 10px;">
|
|
||||||
<p> <span style="width: 100%; border-radius: 8px 8px 0 0;" class="tag is-black">
|
|
||||||
Desktop Environment</span>
|
|
||||||
<div style="padding: 15px; padding-top: 10px; padding-bottom: 5px; background-color: #fff; color: #000;">
|
|
||||||
<p>
|
|
||||||
<img src="/static/icons/console.png" width="48px" alt="" style="padding-right: 10px;" />
|
|
||||||
<img src="/static/icons/gnome.jpeg" width="48px" alt="" style="padding-right: 10px;" />
|
|
||||||
<img src="/static/icons/kde.jpeg" width="48px" alt="" style="padding-right: 10px;" />
|
|
||||||
<img src="/static/icons/xfce.jpeg" width="48px" alt="" style="padding-right: 10px;" />
|
|
||||||
<img src="/static/icons/mate.jpeg" width="48px" alt="" style="padding-right: 10px;" />
|
|
||||||
<img src="/static/icons/lxde.jpeg" width="48px" alt="" style="padding-right: 10px;" />
|
|
||||||
<p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<div style="background-color: gray; padding: 4px 6px 7px 6px; border-radius: 10px; margin-bottom: 20px;">
|
|
||||||
<p> <span style="width: 100%; border-radius: 8px 8px 0 0;" class="tag is-black">
|
|
||||||
Select software from Debian archives</span>
|
|
||||||
<div style="padding-left: 15px; padding-right: 15px; padding-bottom: 5px; background-color: #fff; color: #000;">
|
|
||||||
<p><b>Select packages or selections of packages from the Debian archives.</b></p>
|
|
||||||
<button class="button is-dark">Games</button>
|
|
||||||
<button class="button is-dark">Productivity</button>
|
|
||||||
<button class="button is-dark">Creativity</button>
|
|
||||||
<button class="button is-dark">Server</button>
|
|
||||||
<button class="button is-dark">Development</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
-->
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
from flask import Blueprint
|
|
||||||
|
|
||||||
bp = Blueprint('summary', __name__,
|
|
||||||
template_folder='')
|
|
||||||
|
|
||||||
from applets.summary import routes
|
|
||||||
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
from applets.summary import bp
|
|
||||||
from flask import Flask, request, session, redirect, \
|
|
||||||
url_for, render_template, flash, Blueprint
|
|
||||||
from flask import current_app
|
|
||||||
|
|
||||||
@bp.route('/summary',methods=['GET', 'POST', 'PUT'])
|
|
||||||
def summary_index():
|
|
||||||
"""
|
|
||||||
The page you'd get if you access the root of
|
|
||||||
this app in a browser.
|
|
||||||
"""
|
|
||||||
build_menu()
|
|
||||||
menu = current_app.config['CONFIG']['settings']['menu_order'].split(" ")
|
|
||||||
previous_step_url = menu[menu.index("summary")-1]
|
|
||||||
next_step_url = "install"
|
|
||||||
|
|
||||||
config = current_app.config['CONFIG']
|
|
||||||
print (current_app.config['CONFIG']['Summary'])
|
|
||||||
html = (str(current_app.config['CONFIG']['Summary']['welcome']) + "<br>" + str(current_app.config['CONFIG']['Summary']['software']))
|
|
||||||
summary = config['Summary']
|
|
||||||
|
|
||||||
return render_template('summary.html',
|
|
||||||
menu=current_app.config['CONFIG']['settings']['menu'],
|
|
||||||
menu_order=current_app.config['CONFIG']['settings']['menu_order'].split(),
|
|
||||||
previous_step=previous_step_url,
|
|
||||||
next_step=next_step_url,
|
|
||||||
config=config,
|
|
||||||
html=html,
|
|
||||||
summary=summary)
|
|
||||||
|
|
||||||
|
|
||||||
def build_menu():
|
|
||||||
"""
|
|
||||||
Define menu items and paths.
|
|
||||||
"""
|
|
||||||
# proper one once translations are done:
|
|
||||||
#current_app.config['CONFIG']['settings']['menu']['welcome'] = (build_stringlist()['menu_item'], "/welcome", 10)
|
|
||||||
current_app.config['CONFIG']['settings']['menu']['summary'] = ("Summary", "/summary", 60)
|
|
||||||
|
|
||||||
|
|
||||||
build_menu()
|
|
||||||
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
{% extends "layout.html" %}
|
|
||||||
{% block body %}
|
|
||||||
|
|
||||||
<p><b> Ready to install! Please review all changes.</b></p>
|
|
||||||
|
|
||||||
<p> This is the last chance to back out before committing to install, please ensure all the details are correct. </p>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
{% for module in summary %}
|
|
||||||
|
|
||||||
<h3> <big> {{ summary[module]['heading'] }} </big> </h3>
|
|
||||||
|
|
||||||
<!-- {{ summary[module]['bleh'] }}
|
|
||||||
{{ summary[module]['settings'] }} -->
|
|
||||||
{{ summary[module]['text']|safe }}
|
|
||||||
|
|
||||||
<br /><br />
|
|
||||||
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
<br><br/>
|
|
||||||
|
|
||||||
<!-- <p>Config is: <code> {{ config }} </code></p> -->
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
from flask import Blueprint
|
|
||||||
|
|
||||||
bp = Blueprint('users', __name__,
|
|
||||||
template_folder='')
|
|
||||||
|
|
||||||
from applets.users import routes
|
|
||||||
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
# SOME DESCRIPTIVE TITLE.
|
|
||||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
|
||||||
# This file is distributed under the same license as the PACKAGE package.
|
|
||||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
|
||||||
#
|
|
||||||
#, fuzzy
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2025-06-20 15:48+0200\n"
|
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
||||||
"Language: \n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=CHARSET\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
#: routes.py:33
|
|
||||||
msgid "Let's set up an initial user."
|
|
||||||
msgstr "Kom on stel 'n gebruiker op."
|
|
||||||
|
|
||||||
msgid "Users"
|
|
||||||
msgstr "Gebruikers"
|
|
||||||
|
|
||||||
#: routes.py:34
|
|
||||||
msgid "Full Name"
|
|
||||||
msgstr "Volle Naam"
|
|
||||||
|
|
||||||
#: routes.py:35
|
|
||||||
msgid "Username"
|
|
||||||
msgstr "Gebruikersnaam"
|
|
||||||
|
|
||||||
#: routes.py:36
|
|
||||||
msgid "This username is available"
|
|
||||||
msgstr "Hierdie gebruikersnaam is nie beskikbaar nie."
|
|
||||||
|
|
||||||
#: routes.py:37
|
|
||||||
msgid "This username is not available"
|
|
||||||
msgstr "Hierdie gebruikersnaam is nie beskikbaar nie."
|
|
||||||
|
|
||||||
#: routes.py:38
|
|
||||||
msgid "This username is reserved by the system"
|
|
||||||
msgstr "Hierdie gebruikersnaam is reserveerd deur vir die sisteem."
|
|
||||||
|
|
||||||
#: routes.py:39
|
|
||||||
msgid "The username must be one word, lowercase, with no special characters"
|
|
||||||
msgstr "Die gebruikersnaam moet een woord wees, kleinletters, met geen spesiale karakters."
|
|
||||||
|
|
||||||
#: routes.py:40
|
|
||||||
msgid "Password"
|
|
||||||
msgstr "Wagwoord"
|
|
||||||
|
|
||||||
#: routes.py:41
|
|
||||||
msgid "Password (confirm)"
|
|
||||||
msgstr "Wagwoord (bevestig)"
|
|
||||||
|
|
||||||
#: routes.py:42
|
|
||||||
msgid "These passwords do now match"
|
|
||||||
msgstr "Hierdie wagwoorde is nie dieselfde nie"
|
|
||||||
|
|
||||||
#: routes.py:43
|
|
||||||
msgid "This password is too short"
|
|
||||||
msgstr "Hierdie wagwoord is te kort"
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
# SOME DESCRIPTIVE TITLE.
|
|
||||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
|
||||||
# This file is distributed under the same license as the PACKAGE package.
|
|
||||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
|
||||||
#
|
|
||||||
#, fuzzy
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2025-06-20 15:48+0200\n"
|
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
||||||
"Language: \n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=CHARSET\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
#: routes.py:33
|
|
||||||
msgid "Let's set up an initial user."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: routes.py:34
|
|
||||||
msgid "Full Name"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: routes.py:35
|
|
||||||
msgid "Username"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: routes.py:36
|
|
||||||
msgid "This username is available"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: routes.py:37
|
|
||||||
msgid "This username is not available"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: routes.py:38
|
|
||||||
msgid "This username is reserved by the system"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: routes.py:39
|
|
||||||
msgid "The username must be one word, lowercase, with no special characters"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: routes.py:40
|
|
||||||
msgid "Password"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: routes.py:41
|
|
||||||
msgid "Password (confirm)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: routes.py:42
|
|
||||||
msgid "These passwords do now match"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: routes.py:43
|
|
||||||
msgid "This password is too short"
|
|
||||||
msgstr ""
|
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
from applets.software import bp
|
|
||||||
from flask import Flask, request, session, redirect, \
|
|
||||||
url_for, render_template, flash, Blueprint
|
|
||||||
import gettext
|
|
||||||
# we use this neat little trick to get config data from the main app
|
|
||||||
from flask import current_app
|
|
||||||
|
|
||||||
# Set up Gettext
|
|
||||||
def set_language(LANG):
|
|
||||||
"""
|
|
||||||
Sets language for this applet
|
|
||||||
"""
|
|
||||||
translations = gettext.translation("users", './applets/users/locales',
|
|
||||||
fallback=True, languages=[LANG])
|
|
||||||
translations.install()
|
|
||||||
_ = translations.gettext
|
|
||||||
|
|
||||||
set_language('')
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/users')
|
|
||||||
def users_root():
|
|
||||||
"""
|
|
||||||
Users screen for the webui.
|
|
||||||
"""
|
|
||||||
set_language(current_app.config['CONFIG']['settings']['language'])
|
|
||||||
string_dict = build_stringlist()
|
|
||||||
build_menu()
|
|
||||||
menu = current_app.config['CONFIG']['settings']['menu_order'].split(" ")
|
|
||||||
next_step_url = menu[menu.index("users")+1]
|
|
||||||
if menu[menu.index("users")] == 1:
|
|
||||||
previous_step_url = False
|
|
||||||
else:
|
|
||||||
previous_step_url = menu[menu.index("users")-1]
|
|
||||||
|
|
||||||
root_button = ' <button class="button not-allowed is-light"> <i class="fa fa-user" aria-hidden="true"></i> Setup root user </button>'
|
|
||||||
ldap_button = ' <button class="button is-light"> <i class="fa fa-address-card" aria-hidden="true"></i> Connect LDAP </button>'
|
|
||||||
ad_button = ' <button class="button is-light"> <i class="fa fa-address-card" aria-hidden="true"></i> Connect AD </button>'
|
|
||||||
csv_button = ' <button class="button is-light"> <i class="fa fa-users" aria-hidden="true"></i> Import CSV </button>'
|
|
||||||
bottom_menu = root_button + ldap_button + ad_button + csv_button
|
|
||||||
bottom_menu = ""
|
|
||||||
|
|
||||||
initial_user = current_app.config['CONFIG']['recipe']['users']['users'][0]
|
|
||||||
|
|
||||||
build_summary()
|
|
||||||
|
|
||||||
return render_template('users.html', string_dict=string_dict,
|
|
||||||
menu=current_app.config['CONFIG']['settings']['menu'],
|
|
||||||
menu_order=current_app.config['CONFIG']['settings']['menu_order'].split(),
|
|
||||||
previous_step=previous_step_url,
|
|
||||||
next_step=next_step_url,
|
|
||||||
bottom_menu=bottom_menu,
|
|
||||||
initial_user=initial_user)
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/users/user-check/', methods=['GET', 'POST', 'PUT'])
|
|
||||||
def check_user():
|
|
||||||
if request.method == 'POST':
|
|
||||||
username = request.form["username"]
|
|
||||||
fullname = request.form["fullname"]
|
|
||||||
current_app.config['CONFIG']['recipe']['users']['users'][0]['username'] = username
|
|
||||||
current_app.config['CONFIG']['recipe']['users']['users'][0]['fullname'] = fullname
|
|
||||||
if username in ["root", "games"]:
|
|
||||||
return('<p class="has-text-danger"><b>That username is not available</b> </p>')
|
|
||||||
else:
|
|
||||||
return('<p class="has-text-success"><b>That username is available</b> </p>')
|
|
||||||
build_summary()
|
|
||||||
return("")
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/users/password-check/', methods=['GET', 'POST', 'PUT'])
|
|
||||||
def check_password():
|
|
||||||
if request.method == 'POST':
|
|
||||||
password = request.form["password"]
|
|
||||||
password_confirm = request.form["password_confirm"]
|
|
||||||
current_app.config['CONFIG']['recipe']['users']['users'][0]['password'] = password
|
|
||||||
current_app.config['CONFIG']['recipe']['users']['users'][0]['password_confirm'] = password_confirm
|
|
||||||
if password != password_confirm:
|
|
||||||
return('<p class="has-text-danger"><b>Passwords do not match</b> </p>')
|
|
||||||
else:
|
|
||||||
return('<p class="has-text-success"><b>Passwords match</b> </p>')
|
|
||||||
build_summary()
|
|
||||||
return("")
|
|
||||||
|
|
||||||
|
|
||||||
def build_stringlist():
|
|
||||||
"""
|
|
||||||
Return all the strings that is used in this applet.
|
|
||||||
"""
|
|
||||||
string_dict = {}
|
|
||||||
string_dict['menu_item'] = _("Users")
|
|
||||||
string_dict['initial_user_text'] = _("Let's set up an initial user.")
|
|
||||||
string_dict['full_name'] = _("Full Name")
|
|
||||||
string_dict['user_name'] = _("Username")
|
|
||||||
string_dict['user_name_hint'] = _("One word, all lowercase")
|
|
||||||
string_dict['user_name_available'] = _("This username is available")
|
|
||||||
string_dict['user_name_not_available'] = _("This username is not available")
|
|
||||||
string_dict['user_name_reserved'] = _("This username is reserved by the system")
|
|
||||||
string_dict['user_name_characters'] = _("The username must be one word, lowercase, with no special characters")
|
|
||||||
string_dict['password'] = _("Password")
|
|
||||||
string_dict['password_confirm'] = _("Password (confirm)")
|
|
||||||
string_dict['password_nomatch'] = _("These passwords do now match")
|
|
||||||
string_dict['password_tooshort'] = _("This password is too short")
|
|
||||||
return string_dict
|
|
||||||
|
|
||||||
|
|
||||||
def build_menu():
|
|
||||||
"""
|
|
||||||
Define menu items and paths.
|
|
||||||
"""
|
|
||||||
current_app.config['CONFIG']['settings']['menu']['users'] = (build_stringlist()['menu_item'], "/users", 20)
|
|
||||||
print(current_app.config['CONFIG']['settings']['menu'])
|
|
||||||
|
|
||||||
|
|
||||||
def build_summary():
|
|
||||||
"""
|
|
||||||
Write up a summary of what this module will do.
|
|
||||||
"""
|
|
||||||
current_app.config['CONFIG']['Summary']['users'] = {}
|
|
||||||
current_app.config['CONFIG']['Summary']['users']['heading'] = "Users and Identity"
|
|
||||||
current_app.config['CONFIG']['Summary']['users']['bleh'] = current_app.config['CONFIG']['recipe']['popcon']['enable_popcon']
|
|
||||||
current_app.config['CONFIG']['Summary']['users']['settings'] = current_app.config['CONFIG']['recipe']['users']['users']
|
|
||||||
current_app.config['CONFIG']['Summary']['users']['text'] = "Add primary user with the username: " + str(current_app.config['CONFIG']['recipe']['users']['users'][0]['username'])
|
|
||||||
return("ok?")
|
|
||||||
|
|
||||||
build_menu()
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
{% extends "layout.html" %}
|
|
||||||
{% block body %}
|
|
||||||
|
|
||||||
<p><b> {{ string_dict['initial_user_text'] }} </b></p>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<form action="/users" method="POST">
|
|
||||||
|
|
||||||
<img src="/static/icons/avatar-default.svg" width="160px" style="float: left; position: absolute;" />
|
|
||||||
|
|
||||||
<div style="margin-left: 180px;">
|
|
||||||
|
|
||||||
<div class="field">
|
|
||||||
<label>{{ string_dict['full_name'] }}</label>
|
|
||||||
<div class="control has-icons-left has-icons-right">
|
|
||||||
<input class="input" name="fullname" type="text" placeholder="Full Name" value="{% if initial_user['fullname'] %}{{ initial_user['fullname'] }}{% endif %}" hx-post="/users/user-check" hx-trigger="keyup changed delay:500ms" hx-target="#username-name">
|
|
||||||
<span class="icon is-small is-left">
|
|
||||||
<i class="fa fa-user-circle-o" aria-hidden="true"></i>
|
|
||||||
</span>
|
|
||||||
<!-- <span class="icon is-small is-right">
|
|
||||||
<img src="/static/icons/emblem-default-symbolic.svg">
|
|
||||||
</span> -->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="field">
|
|
||||||
<label>{{ string_dict['user_name'] }}</label>
|
|
||||||
<div class="control has-icons-left has-icons-right">
|
|
||||||
<input class="input" type="text" placeholder="{{ string_dict['user_name'] }}" value="{% if initial_user['username'] %}{{ initial_user['username'] }}{% endif %}" name="username" hx-post="/users/user-check" hx-trigger="keyup changed delay:200ms" hx-trigger="load" hx-target="#username-status">
|
|
||||||
<span class="icon is-small is-left">
|
|
||||||
<i class="fa fa-user-circle-o" aria-hidden="true"></i>
|
|
||||||
</span>
|
|
||||||
<!-- <span class="icon is-small is-right">
|
|
||||||
<i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
|
|
||||||
</span> -->
|
|
||||||
</div>
|
|
||||||
<div id="username-status">
|
|
||||||
<p> {{ string_dict['user_name_hint'] }}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="field">
|
|
||||||
<label class="password">{{ string_dict['password'] }}</label>
|
|
||||||
<div class="control has-icons-left has-icons-right">
|
|
||||||
<input class="input" name="password" type="password" placeholder="{{ string_dict['password'] }}" value="{% if initial_user['password'] %}{{ initial_user['password'] }}{% endif %}" hx-post="/users/password-check" hx-trigger="keyup changed delay:200ms" hx-target="#password-status">
|
|
||||||
<span class="icon is-small is-left">
|
|
||||||
<i class="fa fa-address-card" aria-hidden="true"></i>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="field">
|
|
||||||
<label class="password">{{ string_dict['password_confirm'] }}</label>
|
|
||||||
<div class="control has-icons-left has-icons-right">
|
|
||||||
<input class="input" name="password_confirm" type="password" placeholder="{{ string_dict['password_confirm'] }}" value="{% if initial_user['password_confirm'] %}{{ initial_user['password_confirm'] }}{% endif %}" hx-post="/users/password-check" hx-trigger="keyup changed delay:200ms" hx-target="#password-status">
|
|
||||||
<span class="icon is-small is-left">
|
|
||||||
<i class="fa fa-address-card" aria-hidden="true"></i>
|
|
||||||
</span>
|
|
||||||
<div id="password-status">
|
|
||||||
<p> </p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</form>
|
|
||||||
|
|
||||||
</div> <!-- style 180 -->
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
from flask import Blueprint
|
|
||||||
|
|
||||||
bp = Blueprint('webui', __name__)
|
|
||||||
|
|
||||||
from applets.webui import routes
|
|
||||||
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
from applets.webui import bp
|
|
||||||
from flask import Flask, request, session, redirect, \
|
|
||||||
url_for, render_template, flash, Blueprint
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/webui')
|
|
||||||
def webui_index():
|
|
||||||
"""
|
|
||||||
The page you'd get if you access the root of
|
|
||||||
this app in a browser.
|
|
||||||
"""
|
|
||||||
return ("""
|
|
||||||
<head>
|
|
||||||
<script src="/static/htmx.min.js.gz crossorigin="anonymous"></script>
|
|
||||||
</head>
|
|
||||||
<button hx-post="/clicked"
|
|
||||||
hx-trigger="click"
|
|
||||||
hx-target="#parent-div"
|
|
||||||
hx-swap="outerHTML" >
|
|
||||||
Click Me!
|
|
||||||
</button>
|
|
||||||
|
|
||||||
|
|
||||||
<div style="background-color: black; color: white; height: 200px; width: 200px;" hx-get="/welcome" hx-trigger="every 2s"></div>
|
|
||||||
<div hx-post="/welcome" hx-trigger="mouseenter">
|
|
||||||
1
|
|
||||||
<br><br><br><br>
|
|
||||||
[Here Mouse, Mouse!]
|
|
||||||
<br><Br><br><br>
|
|
||||||
2
|
|
||||||
</div>
|
|
||||||
|
|
||||||
Welcome to System Installer Daemon POC <br />
|
|
||||||
This is the WebUI Index
|
|
||||||
""")
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/webui/welcome')
|
|
||||||
def webui_welcome():
|
|
||||||
"""
|
|
||||||
Welcome screen for the webui.
|
|
||||||
|
|
||||||
It's job right now is to:
|
|
||||||
|
|
||||||
- Obtain the language
|
|
||||||
- Check basic system eligibility
|
|
||||||
"""
|
|
||||||
return render_template('welcome.html')
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/webui/users')
|
|
||||||
def webui_users():
|
|
||||||
"""
|
|
||||||
Users screen for the webui.
|
|
||||||
|
|
||||||
It's job right now is to:
|
|
||||||
|
|
||||||
- Set up an initial user
|
|
||||||
|
|
||||||
More functions will follow at a later stage
|
|
||||||
"""
|
|
||||||
return render_template('users.html')
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/webui/disks')
|
|
||||||
def webui_disks():
|
|
||||||
"""
|
|
||||||
Disks screen for the webui.
|
|
||||||
"""
|
|
||||||
return render_template('disks.html')
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/webui/disks/partition/<part>')
|
|
||||||
def webui_disks_partition(part):
|
|
||||||
"""
|
|
||||||
Partition modal for the webui partition screen.
|
|
||||||
"""
|
|
||||||
return render_template('disks_partition.html')
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/webui/software')
|
|
||||||
def webui_software():
|
|
||||||
"""
|
|
||||||
Software screen for the webui.
|
|
||||||
"""
|
|
||||||
return render_template('software.html')
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/webui/summary')
|
|
||||||
def webui_summary():
|
|
||||||
"""
|
|
||||||
Summary screen for the webui.
|
|
||||||
"""
|
|
||||||
return render_template('summary.html')
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
from flask import Blueprint
|
|
||||||
|
|
||||||
bp = Blueprint('welcome', __name__,
|
|
||||||
template_folder='')
|
|
||||||
|
|
||||||
from applets.welcome import routes
|
|
||||||
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 69 KiB |
@@ -1,33 +0,0 @@
|
|||||||
#, fuzzy
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2024-12-15 21:52+0200\n"
|
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
||||||
"Language: en\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: UTF-8\n"
|
|
||||||
|
|
||||||
#: routes.py:27
|
|
||||||
msgid "Welcome! This setup program will install Debian on to your system."
|
|
||||||
msgstr "Welkom! Hierdie program sal jou deur die proses lei om Debian te installeer na jou sisteem."
|
|
||||||
|
|
||||||
#: routes.py:28
|
|
||||||
msgid "Please confirm the following details:"
|
|
||||||
msgstr "Bevestig asseblief die volgende:"
|
|
||||||
|
|
||||||
#: routes.py:29
|
|
||||||
msgid "Language:"
|
|
||||||
msgstr "Taal:"
|
|
||||||
|
|
||||||
#: routes.py:30
|
|
||||||
msgid "Keyboard Layout:"
|
|
||||||
msgstr "Knoppies Uitleg:"
|
|
||||||
|
|
||||||
#: routes.py:31
|
|
||||||
msgid "Time Zone:"
|
|
||||||
msgstr "Tyd Zone:"
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
#, fuzzy
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2024-12-15 21:52+0200\n"
|
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
||||||
"Language: en-za\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: UTF-8\n"
|
|
||||||
|
|
||||||
#: routes.py:27
|
|
||||||
msgid "Welcome! This setup program will install Debian on to your system."
|
|
||||||
msgstr "Howzit! This setup program will install Debian on to your system."
|
|
||||||
|
|
||||||
#: routes.py:28
|
|
||||||
msgid "Please confirm the following details:"
|
|
||||||
msgstr "Please confirm the following details:"
|
|
||||||
|
|
||||||
#: routes.py:29
|
|
||||||
msgid "Language:"
|
|
||||||
msgstr "Language:"
|
|
||||||
|
|
||||||
#: routes.py:30
|
|
||||||
msgid "Keyboard Layout:"
|
|
||||||
msgstr "Keyboard Layout:"
|
|
||||||
|
|
||||||
#: routes.py:31
|
|
||||||
msgid "Time Zone:"
|
|
||||||
msgstr "Time Zone:"
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
#, fuzzy
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2024-12-15 21:52+0200\n"
|
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
||||||
"Language: en\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: UTF-8\n"
|
|
||||||
|
|
||||||
#: routes.py:27
|
|
||||||
msgid "Welcome! This setup program will install Debian on to your system."
|
|
||||||
msgstr "Welcomen! This setup program will install Debian on to your system."
|
|
||||||
|
|
||||||
#: routes.py:28
|
|
||||||
msgid "Please confirm the following details:"
|
|
||||||
msgstr "Please confirmen the following details:"
|
|
||||||
|
|
||||||
#: routes.py:29
|
|
||||||
msgid "Language:"
|
|
||||||
msgstr "Language:"
|
|
||||||
|
|
||||||
#: routes.py:30
|
|
||||||
msgid "Keyboard Layout:"
|
|
||||||
msgstr "Keyboard Layout:"
|
|
||||||
|
|
||||||
#: routes.py:31
|
|
||||||
msgid "Time Zone:"
|
|
||||||
msgstr "Time Zone:"
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
#, fuzzy
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2024-12-15 21:52+0200\n"
|
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
||||||
"Language: fr\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: UTF-8\n"
|
|
||||||
|
|
||||||
#: routes.py:27
|
|
||||||
msgid "Welcome! This setup program will install Debian on to your system."
|
|
||||||
msgstr "Bienvienue! This setup program will install Debian on to your system."
|
|
||||||
|
|
||||||
#: routes.py:28
|
|
||||||
msgid "Please confirm the following details:"
|
|
||||||
msgstr "Please confirmen the following details:"
|
|
||||||
|
|
||||||
#: routes.py:29
|
|
||||||
msgid "Language:"
|
|
||||||
msgstr "Language:"
|
|
||||||
|
|
||||||
#: routes.py:30
|
|
||||||
msgid "Keyboard Layout:"
|
|
||||||
msgstr "Keyboard Layout:"
|
|
||||||
|
|
||||||
#: routes.py:31
|
|
||||||
msgid "Time Zone:"
|
|
||||||
msgstr "Time Zone:"
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
# SOME DESCRIPTIVE TITLE.
|
|
||||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
|
||||||
# This file is distributed under the same license as the PACKAGE package.
|
|
||||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
|
||||||
#
|
|
||||||
#, fuzzy
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2024-12-15 21:52+0200\n"
|
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
||||||
"Language: \n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=CHARSET\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
#: routes.py:27
|
|
||||||
msgid "Welcome! This setup program will install Debian on to your system."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: routes.py:28
|
|
||||||
msgid "Please confirm the following details:"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: routes.py:29
|
|
||||||
msgid "Language:"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: routes.py:30
|
|
||||||
msgid "Keyboard Layout:"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: routes.py:31
|
|
||||||
msgid "Time Zone:"
|
|
||||||
msgstr ""
|
|
||||||
@@ -1,114 +0,0 @@
|
|||||||
from applets.welcome import bp
|
|
||||||
from flask import Flask, request, session, redirect, \
|
|
||||||
url_for, render_template, flash, Blueprint
|
|
||||||
# we use this neat little trick to get config data from the main app
|
|
||||||
from flask import current_app
|
|
||||||
import gettext
|
|
||||||
import dmm.lsblk as lsblk
|
|
||||||
import dmm.timezone as timezone
|
|
||||||
|
|
||||||
# Set up Gettext
|
|
||||||
def set_language(LANG):
|
|
||||||
"""
|
|
||||||
Sets language for this applet
|
|
||||||
"""
|
|
||||||
translations = gettext.translation("welcome", './applets/welcome/locales',
|
|
||||||
fallback=True, languages=[LANG])
|
|
||||||
translations.install()
|
|
||||||
_ = translations.gettext
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/welcome',methods=['GET', 'POST', 'PUT'])
|
|
||||||
def welcome_index():
|
|
||||||
"""
|
|
||||||
The page you'd get if you access the root of
|
|
||||||
this app in a browser.
|
|
||||||
"""
|
|
||||||
set_language(current_app.config['CONFIG']['settings']['language'])
|
|
||||||
if request.method == 'POST':
|
|
||||||
if "lang" in request.form.keys():
|
|
||||||
current_app.config['CONFIG']['settings']['language'] = request.form["lang"]
|
|
||||||
LANG = current_app.config['CONFIG']['settings']['language']
|
|
||||||
set_language(LANG)
|
|
||||||
FORMLANG = request.form["lang"]
|
|
||||||
if "keyboard" in request.form.keys():
|
|
||||||
print(request.form["keyboard"])
|
|
||||||
if "timezone" in request.form.keys():
|
|
||||||
print(request.form["timezone"])
|
|
||||||
global lang
|
|
||||||
lang = current_app.config['CONFIG']['settings']['language']
|
|
||||||
blkid = lsblk.list_scsi_devices()
|
|
||||||
string_dict = build_stringlist()
|
|
||||||
build_menu()
|
|
||||||
build_summary()
|
|
||||||
menu = current_app.config['CONFIG']['settings']['menu_order'].split(" ")
|
|
||||||
next_step_url = menu[menu.index("welcome")+1]
|
|
||||||
previous_step_url = menu[menu.index("welcome")-1]
|
|
||||||
|
|
||||||
print("index is: " , menu.index("welcome"))
|
|
||||||
if menu.index("welcome") == 0:
|
|
||||||
previous_step_url = False
|
|
||||||
else:
|
|
||||||
previous_step_url = menu[menu.index("users")-1]
|
|
||||||
|
|
||||||
print("next is: " + next_step_url)
|
|
||||||
print("previous is: " , previous_step_url)
|
|
||||||
power_button = '<button class="button is-dark"> <img width="16px;" src="/static/icons/greencheck.png"> Power: AC </button>'
|
|
||||||
internet_button = ' <button class="button is-dark"> <img width="16px;" src="/static/icons/greencheck.png"> Internet </button>'
|
|
||||||
bottom_menu = power_button + internet_button
|
|
||||||
|
|
||||||
return render_template('welcome.html',
|
|
||||||
string_dict=string_dict, selected_lang=lang,
|
|
||||||
menu=current_app.config['CONFIG']['settings']['menu'],
|
|
||||||
menu_order=current_app.config['CONFIG']['settings']['menu_order'].split(),
|
|
||||||
timezones=timezone.list_timezones()[1].split("\n"),
|
|
||||||
previous_step=previous_step_url,
|
|
||||||
next_step=next_step_url,
|
|
||||||
bottom_menu=bottom_menu)
|
|
||||||
|
|
||||||
|
|
||||||
def build_stringlist():
|
|
||||||
"""
|
|
||||||
Return all the strings that is used in this applet."
|
|
||||||
"""
|
|
||||||
string_dict = {}
|
|
||||||
string_dict['menu_item'] = _("Welcome")
|
|
||||||
string_dict['welcome_text'] = _("Welcome! This setup program will install Debian on to your system.")
|
|
||||||
string_dict['confirm_text'] = _("Please confirm the following details:")
|
|
||||||
string_dict['language_text'] = _("Language:")
|
|
||||||
string_dict['keylayout_text'] = _("Keyboard Layout:")
|
|
||||||
string_dict['timezone_text'] = _("Time Zone:")
|
|
||||||
string_dict['basicsettings_text'] = _("Basic Settings:")
|
|
||||||
lang_dict = {}
|
|
||||||
lang_dict['af'] = _("Afrikaans")
|
|
||||||
lang_dict['en'] = _("English (International)")
|
|
||||||
lang_dict['en-us'] = _("English (United States)")
|
|
||||||
lang_dict['en-uk'] = _("English (United Kingdom)")
|
|
||||||
lang_dict['en-za'] = _("English (South Africa)")
|
|
||||||
string_dict['lang_list'] = lang_dict
|
|
||||||
return string_dict
|
|
||||||
|
|
||||||
def build_menu():
|
|
||||||
"""
|
|
||||||
Define menu items and paths.
|
|
||||||
"""
|
|
||||||
current_app.config['CONFIG']['settings']['menu']['welcome'] = (build_stringlist()['menu_item'], "/welcome", 10)
|
|
||||||
|
|
||||||
|
|
||||||
def build_summary():
|
|
||||||
"""
|
|
||||||
Write up a summary of what this module will do.
|
|
||||||
"""
|
|
||||||
html = ("<b><big>Basic settings</big></b><p> Language: " + lang + "</p>")
|
|
||||||
if not 'Summary' in current_app.config['CONFIG']:
|
|
||||||
current_app.config['CONFIG']['Summary'] = {}
|
|
||||||
current_app.config['CONFIG']['Summary']['welcome'] = {}
|
|
||||||
current_app.config['CONFIG']['Summary']['welcome']['heading'] = "Basic Settings"
|
|
||||||
print(current_app.config['CONFIG']['Summary']['welcome'])
|
|
||||||
text = "Language: " + str(current_app.config['CONFIG']['settings']['language'])
|
|
||||||
current_app.config['CONFIG']['Summary']['welcome']['text'] = text
|
|
||||||
return(html)
|
|
||||||
|
|
||||||
|
|
||||||
set_language(current_app.config['CONFIG']['settings']['language'])
|
|
||||||
build_menu
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
{% extends "layout.html" %}
|
|
||||||
{% block body %}
|
|
||||||
|
|
||||||
<img style="width: 100%; border-radius: 8px;"
|
|
||||||
src="/static/applets/welcome/img/banner.png"
|
|
||||||
alt="Debian Image banner" />
|
|
||||||
|
|
||||||
<p><b> {{ string_dict['welcome_text'] }} </b></p>
|
|
||||||
<p>{{ string_dict['confirm_text'] }} </p> <br />
|
|
||||||
|
|
||||||
<form action="/welcome" method="POST">
|
|
||||||
<i class="fa fa-language" aria-hidden="true"></i> {{ string_dict['language_text'] }}
|
|
||||||
<div class="control is-link" width="180px">
|
|
||||||
<div class="select">
|
|
||||||
<select hx-post="/welcome" hx-target="body" name="lang" style="width: 220px">
|
|
||||||
{% for lang in string_dict['lang_list'] %}
|
|
||||||
<option value="{{lang}}" {% if lang == selected_lang %} selected=selected {% endif %}>{{ string_dict['lang_list'][lang] }}</option>
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<form>
|
|
||||||
<i class="fa fa-keyboard-o" aria-hidden="true"></i> {{ string_dict['keylayout_text'] }}
|
|
||||||
<div class="control is-link">
|
|
||||||
<div class="select">
|
|
||||||
<select hx-post="/welcome" hx-target="body" name="keyboard" style="width: 220px">
|
|
||||||
<option>en-us</option>
|
|
||||||
<option>en-uk</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<br />
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../applets/welcome/img
|
|
||||||
1
src/static/bulma.css
vendored
@@ -1 +0,0 @@
|
|||||||
/usr/share/bulma/css/bulma.css
|
|
||||||
1
src/static/htmx.min.js
vendored
@@ -1 +0,0 @@
|
|||||||
/usr/share/javascript/htmx/htmx.min.js
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg height="128px" viewBox="0 0 128 128" width="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<linearGradient id="a" gradientUnits="userSpaceOnUse" x1="16.98286657496" x2="113.51232281881" y1="91.79046347784" y2="91.79046347784">
|
|
||||||
<stop offset="0" stop-color="#e6f0fc"/>
|
|
||||||
<stop offset="0.0383542" stop-color="#cadff8" stop-opacity="0.996078"/>
|
|
||||||
<stop offset="0.124655" stop-color="#d4e5f9" stop-opacity="0.992157"/>
|
|
||||||
<stop offset="0.901364" stop-color="#b2d0f4" stop-opacity="0.964706"/>
|
|
||||||
<stop offset="0.9589" stop-color="#d0e3f9" stop-opacity="0.964706"/>
|
|
||||||
<stop offset="1" stop-color="#98c1f1" stop-opacity="0.964706"/>
|
|
||||||
</linearGradient>
|
|
||||||
<linearGradient id="b" gradientUnits="userSpaceOnUse" x1="35.05556157496" x2="88.56691281881" y1="91.79046347784" y2="91.79046347784">
|
|
||||||
<stop offset="0" stop-color="#e6f0fc"/>
|
|
||||||
<stop offset="0.230125" stop-color="#cadff8" stop-opacity="0.996078"/>
|
|
||||||
<stop offset="0.383542" stop-color="#d4e5f9" stop-opacity="0.992157"/>
|
|
||||||
<stop offset="0.588996" stop-color="#b2d0f4" stop-opacity="0.964706"/>
|
|
||||||
<stop offset="0.753397" stop-color="#d0e3f9" stop-opacity="0.964706"/>
|
|
||||||
<stop offset="1" stop-color="#98c1f1" stop-opacity="0.964706"/>
|
|
||||||
</linearGradient>
|
|
||||||
<path d="m 65.007812 67.363281 c -24.257812 0.027344 -44.703124 16.957031 -49.898437 39.847657 c -1.597656 5.96875 1.65625 9.007812 5.269531 9.007812 h 88.402344 c 4.75 0 7.4375 -4.191406 6.222656 -8.734375 c -5.097656 -23.042969 -25.625 -40.109375 -49.996094 -40.121094 z m 0 0" fill="url(#a)"/>
|
|
||||||
<path d="m 89.351562 33.375 c 0 14.257812 -11.554687 25.8125 -25.8125 25.8125 c -14.257812 0 -25.816406 -11.554688 -25.816406 -25.8125 s 11.558594 -25.816406 25.816406 -25.816406 c 14.257813 0 25.8125 11.558594 25.8125 25.816406 z m 0 0" fill="url(#b)"/>
|
|
||||||
<path d="m 65.007812 64.082031 c -24.257812 0.03125 -44.703124 16.074219 -49.898437 38.96875 c -1.597656 5.96875 1.65625 9.007813 5.269531 9.007813 h 88.402344 c 4.75 0 7.4375 -4.191406 6.222656 -8.734375 c -5.097656 -23.042969 -25.625 -39.226563 -49.996094 -39.242188 z m 24.34375 -34.046875 c 0 14.257813 -11.554687 25.8125 -25.8125 25.8125 c -14.257812 0 -25.816406 -11.554687 -25.816406 -25.8125 c 0 -14.257812 11.558594 -25.816406 25.816406 -25.816406 c 14.257813 0 25.8125 11.558594 25.8125 25.816406 z m 0 0" fill="#f6f9fe" fill-opacity="0.996078"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 304 KiB |
|
Before Width: | Height: | Size: 8.2 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 21 KiB |
@@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="m 8 0 c -4.40625 0 -8 3.59375 -8 8 s 3.59375 8 8 8 s 8 -3.59375 8 -8 s -3.59375 -8 -8 -8 z m 3.398438 4.507812 c 0.265624 -0.027343 0.527343 0.050782 0.734374 0.21875 c 0.425782 0.351563 0.488282 0.980469 0.140626 1.40625 l -4.5 5.5 c -0.179688 0.21875 -0.441407 0.351563 -0.722657 0.367188 c -0.28125 0.011719 -0.558593 -0.09375 -0.757812 -0.292969 l -2.5 -2.5 c -0.390625 -0.390625 -0.390625 -1.023437 0 -1.414062 s 1.023437 -0.390625 1.414062 0 l 1.71875 1.71875 l 3.800781 -4.644531 c 0.167969 -0.203126 0.410157 -0.335938 0.671876 -0.363282 z m 0 0" fill="#2e3436"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 719 B |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 24 KiB |
@@ -1,53 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<svg
|
|
||||||
width="16"
|
|
||||||
height="16"
|
|
||||||
version="1.1"
|
|
||||||
id="svg2"
|
|
||||||
sodipodi:docname="keyboard.svg"
|
|
||||||
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg">
|
|
||||||
<defs
|
|
||||||
id="defs2" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="namedview2"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#000000"
|
|
||||||
borderopacity="0.25"
|
|
||||||
inkscape:showpageshadow="2"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pagecheckerboard="0"
|
|
||||||
inkscape:deskcolor="#d1d1d1"
|
|
||||||
inkscape:zoom="52.375"
|
|
||||||
inkscape:cx="8"
|
|
||||||
inkscape:cy="8"
|
|
||||||
inkscape:window-width="1236"
|
|
||||||
inkscape:window-height="1041"
|
|
||||||
inkscape:window-x="662"
|
|
||||||
inkscape:window-y="199"
|
|
||||||
inkscape:window-maximized="0"
|
|
||||||
inkscape:current-layer="svg2" />
|
|
||||||
<g
|
|
||||||
font-weight="400"
|
|
||||||
fill="#474747"
|
|
||||||
id="g2"
|
|
||||||
style="fill:#c0bfbc">
|
|
||||||
<path
|
|
||||||
d="M3.702 1C2.17 1 .984 2.32.984 3.844v8.344c0 1.524 1.185 2.843 2.718 2.843h8.58c1.532 0 2.75-1.32 2.75-2.844V3.845c0-1.525-1.218-2.844-2.75-2.844zm.782 1.031c3.526.256 5.317.134 7.047 0 .754-.058 1.532.616 1.532 1.438v7.375c0 .665-.532 1.095-1.188 1.187-2.836.397-4.753.44-7.673 0-.655-.099-1.187-.522-1.187-1.187V3.5c0-.822.714-1.524 1.469-1.469z"
|
|
||||||
style="line-height:normal;-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration-line:none;text-transform:none;marker:none;fill:#c0bfbc"
|
|
||||||
color="#bebebe"
|
|
||||||
font-family="Bitstream Vera Sans"
|
|
||||||
overflow="visible"
|
|
||||||
id="path1" />
|
|
||||||
<path
|
|
||||||
d="M10.564 5.977l-2.939.044.016 1 2.879-.043c.2.018.33.076.396.135.067.06.105.121.105.293l-.008.604H8.517l.037.002a1.457 1.457 0 00-1.164.43 1.558 1.558 0 00-.416 1.023c-.013.367.092.75.352 1.053.26.303.687.496 1.162.482h3.482l.051-3.59v-.004c0-.402-.16-.786-.435-1.035-.276-.249-.63-.364-.998-.393zM8.48 9.01h2.519l-.014.99H8.457c-.22.007-.302-.051-.371-.133a.553.553 0 01-.112-.367.587.587 0 01.141-.371c.079-.083.163-.134.363-.12zm2.862-5.985l-3 1 .316.95 3-1z"
|
|
||||||
style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none;fill:#c0bfbc"
|
|
||||||
color="#000"
|
|
||||||
font-family="sans-serif"
|
|
||||||
overflow="visible"
|
|
||||||
id="path2" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 21 KiB |
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<g fill="#2e3436">
|
|
||||||
<path d="m 3 0 c -1.644531 0 -3 1.355469 -3 3 v 10 c 0 1.644531 1.355469 3 3 3 h 10 c 1.644531 0 3 -1.355469 3 -3 v -10 c 0 -1.644531 -1.355469 -3 -3 -3 z m 0 2 h 10 c 0.570312 0 1 0.429688 1 1 v 10 c 0 0.570312 -0.429688 1 -1 1 h -10 c -0.570312 0 -1 -0.429688 -1 -1 v -10 c 0 -0.570312 0.429688 -1 1 -1 z m 0 0"/>
|
|
||||||
<path d="m 4 7 h 8 v 2 h -8 z m 0 0"/>
|
|
||||||
<path d="m 9 4 v 8 h -2 v -8 z m 0 0"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 585 B |
@@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="m 3 1 c -1.644531 0 -3 1.355469 -3 3 v 6 c 0 1.644531 1.355469 3 3 3 h 1 v 3 l 3 -3 h 6 c 1.644531 0 3 -1.355469 3 -3 v -6 c 0 -1.644531 -1.355469 -3 -3 -3 z m 0 0" fill="#2e3436"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 329 B |
@@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<path d="m 3 1 c -1.644531 0 -3 1.355469 -3 3 v 6 c 0 1.644531 1.355469 3 3 3 h 1 v 3 l 3 -3 h 6 c 1.644531 0 3 -1.355469 3 -3 v -6 c 0 -1.644531 -1.355469 -3 -3 -3 z m 0 2 h 10 c 0.554688 0 1 0.445312 1 1 v 6 c 0 0.554688 -0.445312 1 -1 1 h -10 c -0.570312 0 -1 -0.429688 -1 -1 v -6 c 0 -0.554688 0.445312 -1 1 -1 z m 0 0" fill="#2e3436" fill-opacity="0.34902"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 502 B |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 38 KiB |
@@ -1,37 +0,0 @@
|
|||||||
html {
|
|
||||||
/* Overwrite the white that is set by bulma.css */
|
|
||||||
body {
|
|
||||||
display: flex;
|
|
||||||
font-family: Noto Sans;
|
|
||||||
color: white;
|
|
||||||
overflow: hidden;
|
|
||||||
min-width: 1050px;
|
|
||||||
min-height: 600px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.frame {
|
|
||||||
border-radius: 10px;
|
|
||||||
background-color: #0f1933;
|
|
||||||
padding: 15px 15px 15px 15px;
|
|
||||||
width: 100%;
|
|
||||||
min-height: 600px;
|
|
||||||
position: absolute;
|
|
||||||
top: 0px;
|
|
||||||
bottom: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.applet a:link a:hover a:active {
|
|
||||||
color: yellow;
|
|
||||||
}
|
|
||||||
|
|
||||||
.applet {
|
|
||||||
width: 100%;
|
|
||||||
height: 470px;
|
|
||||||
bottom: 0px;
|
|
||||||
overflow-y: scroll;
|
|
||||||
overflow-x: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.radio:hover {
|
|
||||||
color: #f1f1f1;
|
|
||||||
}
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
html {
|
|
||||||
/* Overwrite the white that is set by bulma.css */
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
display: flex;
|
|
||||||
font-family: Sans; Roboto; Lato; Noto Sans;
|
|
||||||
color: white;
|
|
||||||
overflow: hidden;
|
|
||||||
min-width: 1050px;
|
|
||||||
min-height: 600px;
|
|
||||||
}
|
|
||||||
|
|
||||||
html, body {margin: 0; height: 100%; overflow: hidden;}
|
|
||||||
|
|
||||||
.frame {
|
|
||||||
border-radius: 10px;
|
|
||||||
background-color: #404040;
|
|
||||||
padding: 15px 15px 15px 15px;
|
|
||||||
width: 100%;
|
|
||||||
min-height: 600px;
|
|
||||||
position: absolute;
|
|
||||||
top: 0px;
|
|
||||||
bottom: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.applet a:link a:hover a:active {
|
|
||||||
color: yellow;
|
|
||||||
}
|
|
||||||
|
|
||||||
.applet {
|
|
||||||
width: 100%;
|
|
||||||
height: 442px;
|
|
||||||
overflow-y: scroll;
|
|
||||||
overflow-x: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.radio:hover {
|
|
||||||
color: #f1f1f1;
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
html {
|
|
||||||
/* Overwrite the white that is set by bulma.css */
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
display: flex;
|
|
||||||
font-family: Noto Sans;
|
|
||||||
color: white;
|
|
||||||
overflow: hidden;
|
|
||||||
min-width: 1050px;
|
|
||||||
min-height: 600px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.frame {
|
|
||||||
border-radius: 10px;
|
|
||||||
background-color: #e9e8e4;
|
|
||||||
padding: 15px;
|
|
||||||
max-width: 1050px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.applet a:link a:hover a:active {
|
|
||||||
color: yellow;
|
|
||||||
}
|
|
||||||
|
|
||||||
.applet {
|
|
||||||
color: #383838;
|
|
||||||
width: 1040px;
|
|
||||||
height: 470px;
|
|
||||||
overflow-y: scroll;
|
|
||||||
overflow-x: hidden;
|
|
||||||
padding-right: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.radio:hover {
|
|
||||||
color: #404040;
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
system-installer-dark.css
|
|
||||||
@@ -38,7 +38,7 @@ if DEV_MODE:
|
|||||||
for APP in APPS.split(" "):
|
for APP in APPS.split(" "):
|
||||||
print(f"Loading applet: {APP} ")
|
print(f"Loading applet: {APP} ")
|
||||||
# Dynamically import the blueprint module
|
# Dynamically import the blueprint module
|
||||||
module = importlib.import_module(f"applets.{APP}")
|
module = importlib.import_module(f"yasi_applets.{APP}")
|
||||||
# Get the blueprint (bp) from the imported module
|
# Get the blueprint (bp) from the imported module
|
||||||
bp = getattr(module, "bp")
|
bp = getattr(module, "bp")
|
||||||
# Register the blueprint with the app
|
# Register the blueprint with the app
|
||||||
|
|||||||
@@ -3,12 +3,11 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<link href="/static/bulma.css" rel="stylesheet">
|
<link href="/main/static/bulma.css" rel="stylesheet">
|
||||||
<link href="/static/system-installer.css" rel="stylesheet">
|
<link href="/main/static/system-installer.css" rel="stylesheet">
|
||||||
<link rel="shortcut icon" href="/static/icons/blippie.png" type="image/x-icon">
|
<link rel="shortcut icon" href="/main/static/icons/blippie.png" type="image/x-icon">
|
||||||
<link rel="stylesheet" href="/usr/share/fonts-fork-awesome/css/fork-awesome.css">
|
<link rel="stylesheet" href="/main/static/fork-awesome.css">
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fork-awesome@1.2.0/css/fork-awesome.min.css" integrity="sha256-XoaMnoYC5TH6/+ihMEnospgm0J1PM/nioxbOUdnM8HY=" crossorigin="anonymous">
|
<script src="/main/static/htmx.min.js" crossorigin="anonymous"></script>
|
||||||
<script src="/static/htmx.min.js" crossorigin="anonymous"></script>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
|
|||||||