Terminal: Das prompt, dprompt and dbanner (0.9.1)
build / build (push) Successful in 38m26s

- das-shell 0.1.0: the Das two-line bash prompt by default (replaces the
  PS1 of Void's skel .bashrc once), dprompt (Textual prompt builder with
  presets and live preview) and dbanner (SSH login banner editor: canvas
  tools, fields with values, widgets, das-banner service for cached ones,
  Das OS logo and tryzub pictures). Python tests in make test.
- das-server 0.3.0 depends on das-shell; the server installer mentions
  dprompt and dbanner; the desktop image includes it.
- run-qemu.sh forwards the guest's SSH to localhost:2222.
- Hardware fixes: Ventoy menu icon, boot menu titles "Das OS <version>".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
das
2026-10-21 09:17:10 +03:00
co-authored by Claude Opus 5.5
parent 66ea614e0d
commit a2bffc7fe9
72 changed files with 5506 additions and 23 deletions
@@ -0,0 +1,248 @@
{
"name": "blocks",
"title": {
"uk": "Логотип Das OS і відомості про систему",
"en": "Das OS logo and system facts"
},
"local": false,
"vars": {
"url": ""
},
"fields": [
{
"x": 26,
"y": 0,
"width": 50,
"align": "left",
"text": "{user}@{hostname}",
"style": "j"
},
{
"x": 26,
"y": 1,
"width": 50,
"align": "left",
"text": "──────────────────────────────",
"style": "i"
},
{
"x": 26,
"y": 2,
"width": 9,
"align": "left",
"text": "[[ОС|OS]]",
"style": "k"
},
{
"x": 35,
"y": 2,
"width": 41,
"align": "left",
"text": "{os}",
"style": "l"
},
{
"x": 26,
"y": 3,
"width": 9,
"align": "left",
"text": "[[Ядро|Kernel]]",
"style": "k"
},
{
"x": 35,
"y": 3,
"width": 41,
"align": "left",
"text": "{kernel}",
"style": "l"
},
{
"x": 26,
"y": 4,
"width": 9,
"align": "left",
"text": "[[Працює|Uptime]]",
"style": "k"
},
{
"x": 35,
"y": 4,
"width": 41,
"align": "left",
"text": "{uptime}",
"style": "l"
},
{
"x": 26,
"y": 5,
"width": 9,
"align": "left",
"text": "CPU",
"style": "k"
},
{
"x": 35,
"y": 5,
"width": 41,
"align": "left",
"text": "{cpu}",
"style": "l"
},
{
"x": 26,
"y": 6,
"width": 9,
"align": "left",
"text": "[[Пам'ять|Memory]]",
"style": "k"
},
{
"x": 35,
"y": 6,
"width": 41,
"align": "left",
"text": "{mem}",
"style": "l"
},
{
"x": 26,
"y": 7,
"width": 9,
"align": "left",
"text": "IP",
"style": "k"
},
{
"x": 35,
"y": 7,
"width": 41,
"align": "left",
"text": "{ips}",
"style": "l"
},
{
"x": 26,
"y": 8,
"width": 9,
"align": "left",
"text": "[[Вхід|Users]]",
"style": "k"
},
{
"x": 35,
"y": 8,
"width": 41,
"align": "left",
"text": "{users}",
"style": "l"
},
{
"x": 26,
"y": 10,
"width": 50,
"align": "left",
"text": "{url}",
"style": "g"
}
],
"widgets_position": "below",
"widgets": [
{
"type": "builtin",
"name": "disks"
}
],
"styles": {
"a": {
"fg": "bright_yellow",
"bg": null,
"bold": false
},
"b": {
"fg": "blue",
"bg": "bright_yellow",
"bold": false
},
"c": {
"fg": "bright_blue",
"bg": "bright_yellow",
"bold": false
},
"d": {
"fg": "bright_blue",
"bg": "yellow",
"bold": false
},
"e": {
"fg": "bright_yellow",
"bg": "bright_blue",
"bold": false
},
"f": {
"fg": "yellow",
"bg": "bright_blue",
"bold": false
},
"g": {
"fg": "yellow",
"bg": null,
"bold": false
},
"h": {
"fg": "bright_yellow",
"bg": "blue",
"bold": false
},
"i": {
"fg": "bright_blue",
"bg": null,
"bold": false
},
"j": {
"fg": "bright_cyan",
"bg": null,
"bold": true
},
"k": {
"fg": "bright_blue",
"bg": null,
"bold": true
},
"l": {
"fg": "white",
"bg": null,
"bold": false
}
},
"lines": [
"",
" ██",
" ▄▄ ▄▀▀▄ ▄▄",
" ▀█▀▀██████▀▀█▀",
" █▀▀██████▀▀█",
" ▄▄▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄▄▄",
" ▀▀█▀▀▀▀▀▀▀▀▀▀▀▀▀▀█▀▀",
" █▀▀██████▀▀█",
" ▄█▀▀██████▀▀█▄",
" ▀▀ ▀▀▀▀ ▀▀",
" ██"
],
"style_map": [
"",
" ii",
" aa iddi aa",
" aahhaiggiahhaa",
" abbaaiiaabba",
" iiidddeeecceeedddiii",
" iiifffccceecccfffiii",
" ahhaaiiaahha",
" aabbaiggiabbaa",
" aa iffi aa",
" ii"
],
"canvas": {
"width": 76,
"height": 12
}
}
@@ -0,0 +1,105 @@
{
"name": "das-classic",
"title": {
"uk": "Das класичний: рамка з #, назва, IP, посилання",
"en": "Das classic: # frame, name, IP, link"
},
"local": false,
"vars": {
"title": "Das OS",
"url": "https://das.org.ua/"
},
"fields": [
{
"x": 2,
"y": 1,
"width": 35,
"align": "center",
"text": "-=:dAs:=- {title}",
"style": "c"
},
{
"x": 18,
"y": 2,
"width": 19,
"align": "left",
"text": "{ip}",
"style": "d"
},
{
"x": 13,
"y": 3,
"width": 24,
"align": "left",
"text": "{url}",
"style": "d"
}
],
"widgets_position": "below",
"widgets": [
{
"type": "builtin",
"name": "uptime"
},
{
"type": "builtin",
"name": "disks"
},
{
"type": "builtin",
"name": "memory"
},
{
"type": "builtin",
"name": "docker"
},
{
"type": "builtin",
"name": "services"
},
{
"type": "builtin",
"name": "updates"
}
],
"styles": {
"a": {
"fg": "blue",
"bg": null,
"bold": false
},
"b": {
"fg": "red",
"bg": null,
"bold": true
},
"c": {
"fg": "white",
"bg": null,
"bold": true
},
"d": {
"fg": "cyan",
"bg": null,
"bold": true
}
},
"lines": [
"#######################################",
"# #",
"# Server IP: #",
"# Link: #",
"#######################################"
],
"style_map": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"a a",
"a bbbbbbbbbb a",
"a bbbbb a",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
],
"canvas": {
"width": 39,
"height": 5
}
}
@@ -0,0 +1,103 @@
{
"name": "dashboard",
"title": {
"uk": "Панель: усі віджети під заголовком",
"en": "Dashboard: every widget under a header"
},
"local": false,
"vars": {
"url": "",
"city": "Kyiv"
},
"fields": [
{
"x": 2,
"y": 1,
"width": 66,
"align": "center",
"text": "{hostname} · {ip} · {url}",
"style": "b"
}
],
"widgets_position": "below",
"widgets": [
{
"type": "builtin",
"name": "uptime"
},
{
"type": "builtin",
"name": "load"
},
{
"type": "builtin",
"name": "memory"
},
{
"type": "builtin",
"name": "disks"
},
{
"type": "builtin",
"name": "network"
},
{
"type": "builtin",
"name": "docker"
},
{
"type": "builtin",
"name": "updates"
},
{
"type": "builtin",
"name": "weather"
},
{
"type": "builtin",
"name": "smart"
},
{
"type": "builtin",
"name": "services"
},
{
"type": "builtin",
"name": "fail2ban"
},
{
"type": "builtin",
"name": "snapshots"
},
{
"type": "builtin",
"name": "lastlog"
}
],
"styles": {
"a": {
"fg": "bright_blue",
"bg": null,
"bold": false
},
"b": {
"fg": "bright_white",
"bg": null,
"bold": true
}
},
"lines": [
"╭────────────────────────────────────────────────────────────────────╮",
"│ │",
"╰────────────────────────────────────────────────────────────────────╯"
],
"style_map": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"a a",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
],
"canvas": {
"width": 70,
"height": 3
}
}
@@ -0,0 +1,130 @@
{
"name": "double",
"title": {
"uk": "Подвійна рамка з великим ім'ям сервера",
"en": "Double frame with the server name in big letters"
},
"local": false,
"vars": {
"title": "Das OS Server",
"url": ""
},
"fields": [
{
"x": 2,
"y": 1,
"width": 60,
"align": "center",
"text": "{hostname}",
"style": "c",
"font": "small"
},
{
"x": 2,
"y": 5,
"width": 60,
"align": "center",
"text": "{title}",
"style": "d"
},
{
"x": 2,
"y": 6,
"width": 60,
"align": "center",
"text": "{url}",
"style": "e"
},
{
"x": 2,
"y": 8,
"width": 60,
"align": "center",
"text": "IP {ip} · {os} · {kernel}",
"style": "f"
}
],
"widgets_position": "below",
"widgets": [
{
"type": "builtin",
"name": "uptime"
},
{
"type": "builtin",
"name": "load"
},
{
"type": "builtin",
"name": "memory"
},
{
"type": "builtin",
"name": "disks"
},
{
"type": "builtin",
"name": "services"
}
],
"styles": {
"a": {
"fg": "cyan",
"bg": null,
"bold": true
},
"b": {
"fg": "bright_black",
"bg": null,
"bold": false
},
"c": {
"fg": "bright_white",
"bg": null,
"bold": true
},
"d": {
"fg": "yellow",
"bg": null,
"bold": true
},
"e": {
"fg": "cyan",
"bg": null,
"bold": false
},
"f": {
"fg": "white",
"bg": null,
"bold": false
}
},
"lines": [
"╔══════════════════════════════════════════════════════════════╗",
"║ ║",
"║ ║",
"║ ║",
"║ ║",
"║ ║",
"║ ║",
"║──────────────────────────────────────────────────────────────║",
"║ ║",
"╚══════════════════════════════════════════════════════════════╝"
],
"style_map": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"a a",
"a a",
"a a",
"a a",
"a a",
"a a",
"abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba",
"a a",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
],
"canvas": {
"width": 64,
"height": 10
}
}
@@ -0,0 +1,34 @@
{
"name": "minimal",
"title": {
"uk": "Мінімальний: один рядок",
"en": "Minimal: one line"
},
"local": false,
"vars": {},
"fields": [
{
"x": 0,
"y": 0,
"width": 70,
"align": "left",
"text": "{hostname} · {ip} · [[працює|up]] {uptime} · {load}",
"style": "a"
}
],
"widgets_position": "below",
"widgets": [],
"styles": {
"a": {
"fg": "bright_cyan",
"bg": null,
"bold": true
}
},
"lines": [],
"style_map": [],
"canvas": {
"width": 70,
"height": 1
}
}
@@ -0,0 +1,107 @@
{
"name": "tryzub",
"title": {
"uk": "Малий тризуб з іменем і IP",
"en": "Small tryzub with name and IP"
},
"local": false,
"vars": {
"url": ""
},
"fields": [
{
"x": 17,
"y": 2,
"width": 43,
"align": "left",
"text": "{hostname}",
"style": "b"
},
{
"x": 17,
"y": 3,
"width": 43,
"align": "left",
"text": "{ip}",
"style": "c"
},
{
"x": 17,
"y": 5,
"width": 43,
"align": "left",
"text": "[[Працює|Uptime]]: {uptime}",
"style": "d"
},
{
"x": 17,
"y": 6,
"width": 43,
"align": "left",
"text": "{url}",
"style": "e"
}
],
"widgets_position": "below",
"widgets": [
{
"type": "builtin",
"name": "disks"
}
],
"styles": {
"a": {
"fg": "bright_yellow",
"bg": null,
"bold": false
},
"b": {
"fg": "bright_yellow",
"bg": null,
"bold": true
},
"c": {
"fg": "bright_blue",
"bg": null,
"bold": true
},
"d": {
"fg": "white",
"bg": null,
"bold": false
},
"e": {
"fg": "bright_blue",
"bg": null,
"bold": false
}
},
"lines": [
"",
" ▄ ██ ▄",
" █▀▄ ██ ▄▀█",
" █ █ ██ █ █",
" █ ▄ ██ ▄ █",
" █▄▄▀ ██ ▀▄▄█",
" █▀█▄█ █▄█▀█",
" █▄ ██████ ▄█",
" ▀▀▀████▀▀▀",
" ▀██▀"
],
"style_map": [
"",
" a aa a",
" aaa aa aaa",
" a a aa a a",
" a a aa a a",
" aaaa aa aaaa",
" aaaaa aaaaa",
" aa aaaaaa aa",
" aaaaaaaaaa",
" aaaa"
],
"canvas": {
"width": 60,
"height": 11
}
}
@@ -0,0 +1,191 @@
{
"name": "ukraine",
"title": {
"uk": "Тризуб: малий герб України і дані сервера",
"en": "Tryzub: Ukrainian coat of arms and server facts"
},
"local": false,
"vars": {
"url": ""
},
"fields": [
{
"x": 26,
"y": 1,
"width": 54,
"align": "left",
"text": "{hostname}",
"style": "e",
"font": "small"
},
{
"x": 26,
"y": 6,
"width": 54,
"align": "left",
"text": "[[Слава Україні!|Glory to Ukraine!]]",
"style": "f"
},
{
"x": 26,
"y": 8,
"width": 9,
"align": "left",
"text": "IP",
"style": "f"
},
{
"x": 35,
"y": 8,
"width": 45,
"align": "left",
"text": "{ip}",
"style": "a"
},
{
"x": 26,
"y": 9,
"width": 9,
"align": "left",
"text": "[[Сайт|Site]]",
"style": "f"
},
{
"x": 35,
"y": 9,
"width": 45,
"align": "left",
"text": "{url}",
"style": "a"
},
{
"x": 26,
"y": 10,
"width": 9,
"align": "left",
"text": "[[Працює|Uptime]]",
"style": "f"
},
{
"x": 35,
"y": 10,
"width": 45,
"align": "left",
"text": "{uptime}",
"style": "a"
},
{
"x": 26,
"y": 11,
"width": 9,
"align": "left",
"text": "[[Пам'ять|Memory]]",
"style": "f"
},
{
"x": 35,
"y": 11,
"width": 45,
"align": "left",
"text": "{mem}",
"style": "a"
},
{
"x": 26,
"y": 12,
"width": 9,
"align": "left",
"text": "[[ОС|OS]]",
"style": "f"
},
{
"x": 35,
"y": 12,
"width": 45,
"align": "left",
"text": "{os}",
"style": "a"
}
],
"widgets_position": "below",
"widgets": [
{
"type": "builtin",
"name": "disks"
},
{
"type": "builtin",
"name": "services"
}
],
"styles": {
"a": {
"fg": "bright_yellow",
"bg": null,
"bold": false
},
"b": {
"fg": "blue",
"bg": "bright_yellow",
"bold": false
},
"c": {
"fg": "bright_yellow",
"bg": "blue",
"bold": false
},
"d": {
"fg": "blue",
"bg": null,
"bold": false
},
"e": {
"fg": "bright_yellow",
"bg": null,
"bold": true
},
"f": {
"fg": "bright_blue",
"bg": null,
"bold": true
}
},
"lines": [
"██████████████████████",
"██████████████████████",
"████▀████████████▀████",
"████▀█▀████████▀█▀████",
"██████████████████████",
"███████▀██████▀███████",
"██████████████████████",
"█████▀█▀█▀██▀█▀█▀█████",
"██████▀█▀████▀█▀██████",
"██████▀███▀▀███▀██████",
"████▀▀▀██▀██▀██▀▀▀████",
"███▀▀▀▀▀█▀██▀█▀▀▀▀▀███",
" ▀██████▀████▀██████▀",
" ▀▀▀████▀▀████▀▀▀",
" ▀▀██▀▀"
],
"style_map": [
"dddddddddddddddddddddd",
"ddddddddddaadddddddddd",
"dddabdddddaadddddbaddd",
"dddacabdddaadddbacaddd",
"dddaddadddaadddaddaddd",
"dddaddabddaaddbaddaddd",
"dddaddaaddaaddaaddaddd",
"dddadbacdbaabdcabdaddd",
"dddaaabdbaddabdbaaaddd",
"dddaddcaaabbaaacddaddd",
"dddabbbaabaabaabbbaddd",
"dddcccccacaacacccccddd",
" dddddddcaaaacddddddd",
" dddddddccddddddd",
" dddddd"
],
"canvas": {
"width": 80,
"height": 15
}
}