diff --git a/CHANGELOG.md b/CHANGELOG.md index 443239b2..bd2b7bb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,22 @@ All LXC instances created using this repository come pre-installed with Midnight Do not break established syntax in this file, as it is automatically updated by a Github Workflow +## 2025-01-26 + +### Changed + +### 🚀 Updated Scripts + +- Fix jellyfin update command [@jcisio](https://github.com/jcisio) ([#1771](https://github.com/community-scripts/ProxmoxVE/pull/1771)) +- openHAB - Use https and include doc url [@moodyblue](https://github.com/moodyblue) ([#1766](https://github.com/community-scripts/ProxmoxVE/pull/1766)) +- Jellyfin: Fix default logging level [@tremor021](https://github.com/tremor021) ([#1768](https://github.com/community-scripts/ProxmoxVE/pull/1768)) +- Calibre-Web: added installation of calibre binaries [@tremor021](https://github.com/tremor021) ([#1763](https://github.com/community-scripts/ProxmoxVE/pull/1763)) +- Added environment variable to accept EULA for SQLServer2022 [@tremor021](https://github.com/tremor021) ([#1755](https://github.com/community-scripts/ProxmoxVE/pull/1755)) + +### 🌐 Website + +- The Lounge: Fix the command to create new users [@tremor021](https://github.com/tremor021) ([#1762](https://github.com/community-scripts/ProxmoxVE/pull/1762)) + ## 2025-01-24 ### Changed @@ -27,6 +43,7 @@ Do not break established syntax in this file, as it is automatically updated by ### 🚀 Updated Scripts +- openHAB - Update to Zulu21 [@moodyblue](https://github.com/moodyblue) ([#1734](https://github.com/community-scripts/ProxmoxVE/pull/1734)) - Feature: Filebrowser Script > Redesign | Update Logic | Remove Logic [@MickLesk](https://github.com/MickLesk) ([#1716](https://github.com/community-scripts/ProxmoxVE/pull/1716)) - Feature: Ubuntu 22.04 VM > Redesign | Optional HDD-Size Prompt [@MickLesk](https://github.com/MickLesk) ([#1712](https://github.com/community-scripts/ProxmoxVE/pull/1712)) - Feature: Ubuntu 24.04 VM > Redesign | Optional HDD-Size Prompt | cifs support [@MickLesk](https://github.com/MickLesk) ([#1714](https://github.com/community-scripts/ProxmoxVE/pull/1714)) diff --git a/ct/actualbudget.sh b/ct/actualbudget.sh index 2680b56a..c6895d6b 100644 --- a/ct/actualbudget.sh +++ b/ct/actualbudget.sh @@ -47,6 +47,7 @@ function update_script() { mkdir -p /opt/actualbudget/ tar -xzf v${RELEASE}.tar.gz >/dev/null 2>&1 mv *ctual-server-*/* /opt/actualbudget + rm -rf /opt/actualbudget/.env mv /opt/actualbudget_bak/.env /opt/actualbudget mv /opt/actualbudget_bak/server-files /opt/actualbudget/server-files cd /opt/actualbudget diff --git a/ct/headers/2fauth b/ct/headers/2fauth new file mode 100644 index 00000000..b6421719 --- /dev/null +++ b/ct/headers/2fauth @@ -0,0 +1,6 @@ + ___ _________ __ __ + |__ \ / ____/ | __ __/ /_/ /_ + __/ // /_ / /| |/ / / / __/ __ \ + / __// __/ / ___ / /_/ / /_/ / / / +/____/_/ /_/ |_\__,_/\__/_/ /_/ + diff --git a/ct/headers/5etools b/ct/headers/5etools new file mode 100644 index 00000000..1556067f --- /dev/null +++ b/ct/headers/5etools @@ -0,0 +1,6 @@ + ______ __ __ + / ____/__ / /_____ ____ / /____ + /___ \/ _ \/ __/ __ \/ __ \/ / ___/ + ____/ / __/ /_/ /_/ / /_/ / (__ ) +/_____/\___/\__/\____/\____/_/____/ + diff --git a/ct/headers/actualbudget b/ct/headers/actualbudget new file mode 100644 index 00000000..db7f3093 --- /dev/null +++ b/ct/headers/actualbudget @@ -0,0 +1,6 @@ + ___ __ __ ____ __ __ + / | _____/ /___ ______ _/ / / __ )__ ______/ /___ ____ / /_ + / /| |/ ___/ __/ / / / __ `/ / / __ / / / / __ / __ `/ _ \/ __/ + / ___ / /__/ /_/ /_/ / /_/ / / / /_/ / /_/ / /_/ / /_/ / __/ /_ +/_/ |_\___/\__/\__,_/\__,_/_/ /_____/\__,_/\__,_/\__, /\___/\__/ + /____/ diff --git a/ct/headers/adguard b/ct/headers/adguard new file mode 100644 index 00000000..2332df17 --- /dev/null +++ b/ct/headers/adguard @@ -0,0 +1,6 @@ + ___ __ __ + / | ____/ /___ ___ ______ __________/ / + / /| |/ __ / __ `/ / / / __ `/ ___/ __ / + / ___ / /_/ / /_/ / /_/ / /_/ / / / /_/ / +/_/ |_\__,_/\__, /\__,_/\__,_/_/ \__,_/ + /____/ diff --git a/ct/headers/adventurelog b/ct/headers/adventurelog new file mode 100644 index 00000000..8e3c88d1 --- /dev/null +++ b/ct/headers/adventurelog @@ -0,0 +1,6 @@ + ___ __ __ __ + / | ____/ / _____ ____ / /___ __________ / / ____ ____ _ + / /| |/ __ / | / / _ \/ __ \/ __/ / / / ___/ _ \/ / / __ \/ __ `/ + / ___ / /_/ /| |/ / __/ / / / /_/ /_/ / / / __/ /___/ /_/ / /_/ / +/_/ |_\__,_/ |___/\___/_/ /_/\__/\__,_/_/ \___/_____/\____/\__, / + /____/ diff --git a/ct/headers/agentdvr b/ct/headers/agentdvr new file mode 100644 index 00000000..dfe67792 --- /dev/null +++ b/ct/headers/agentdvr @@ -0,0 +1,6 @@ + ___ __ ____ _ ______ + / | ____ ____ ____ / /_/ __ \ | / / __ \ + / /| |/ __ `/ _ \/ __ \/ __/ / / / | / / /_/ / + / ___ / /_/ / __/ / / / /_/ /_/ /| |/ / _, _/ +/_/ |_\__, /\___/_/ /_/\__/_____/ |___/_/ |_| + /____/ diff --git a/ct/headers/alpine b/ct/headers/alpine new file mode 100644 index 00000000..ecf1e055 --- /dev/null +++ b/ct/headers/alpine @@ -0,0 +1,6 @@ + ___ __ _ + / | / /___ (_)___ ___ + / /| | / / __ \/ / __ \/ _ \ + / ___ |/ / /_/ / / / / / __/ +/_/ |_/_/ .___/_/_/ /_/\___/ + /_/ diff --git a/ct/headers/alpine-docker b/ct/headers/alpine-docker new file mode 100644 index 00000000..7fd1b265 --- /dev/null +++ b/ct/headers/alpine-docker @@ -0,0 +1,6 @@ + ___ __ _ ____ __ + / | / /___ (_)___ ___ / __ \____ _____/ /_____ _____ + / /| | / / __ \/ / __ \/ _ \______/ / / / __ \/ ___/ //_/ _ \/ ___/ + / ___ |/ / /_/ / / / / / __/_____/ /_/ / /_/ / /__/ ,< / __/ / +/_/ |_/_/ .___/_/_/ /_/\___/ /_____/\____/\___/_/|_|\___/_/ + /_/ diff --git a/ct/headers/alpine-grafana b/ct/headers/alpine-grafana new file mode 100644 index 00000000..3fe493c9 --- /dev/null +++ b/ct/headers/alpine-grafana @@ -0,0 +1,6 @@ + ___ __ _ ______ ____ + / | / /___ (_)___ ___ / ____/________ _/ __/___ _____ ____ _ + / /| | / / __ \/ / __ \/ _ \______/ / __/ ___/ __ `/ /_/ __ `/ __ \/ __ `/ + / ___ |/ / /_/ / / / / / __/_____/ /_/ / / / /_/ / __/ /_/ / / / / /_/ / +/_/ |_/_/ .___/_/_/ /_/\___/ \____/_/ \__,_/_/ \__,_/_/ /_/\__,_/ + /_/ diff --git a/ct/headers/alpine-nextcloud b/ct/headers/alpine-nextcloud new file mode 100644 index 00000000..b27eb0ca --- /dev/null +++ b/ct/headers/alpine-nextcloud @@ -0,0 +1,12 @@ + ___ __ _ _ __ __ __ + / | / /___ (_)___ ___ / | / /__ _ __/ /______/ /___ __ __ + / /| | / / __ \/ / __ \/ _ \______/ |/ / _ \| |/_/ __/ ___/ / __ \/ / / / + / ___ |/ / /_/ / / / / / __/_____/ /| / __/> < +/_/ |_/_/ \___/_/ /_/_/ |___/\___/_____/\____/_/|_| + diff --git a/ct/headers/aria2 b/ct/headers/aria2 new file mode 100644 index 00000000..3080e17b --- /dev/null +++ b/ct/headers/aria2 @@ -0,0 +1,6 @@ + ___ _ ___ + / | _____(_)___ |__ \ + / /| | / ___/ / __ `/_/ / + / ___ |/ / / / /_/ / __/ +/_/ |_/_/ /_/\__,_/____/ + diff --git a/ct/headers/audiobookshelf b/ct/headers/audiobookshelf new file mode 100644 index 00000000..5e249a85 --- /dev/null +++ b/ct/headers/audiobookshelf @@ -0,0 +1,6 @@ + ___ __ __ __ ______ + ____ ___ ______/ (_)___ / /_ ____ ____ / /_______/ /_ ___ / / __/ + / __ `/ / / / __ / / __ \/ __ \/ __ \/ __ \/ //_/ ___/ __ \/ _ \/ / /_ +/ /_/ / /_/ / /_/ / / /_/ / /_/ / /_/ / /_/ / ,< (__ ) / / / __/ / __/ +\__,_/\__,_/\__,_/_/\____/_.___/\____/\____/_/|_/____/_/ /_/\___/_/_/ + diff --git a/ct/headers/authentik b/ct/headers/authentik new file mode 100644 index 00000000..f609964e --- /dev/null +++ b/ct/headers/authentik @@ -0,0 +1,6 @@ + ___ __ __ __ _ __ + / | __ __/ /_/ /_ ___ ____ / /_(_) /__ + / /| |/ / / / __/ __ \/ _ \/ __ \/ __/ / //_/ + / ___ / /_/ / /_/ / / / __/ / / / /_/ / ,< +/_/ |_\__,_/\__/_/ /_/\___/_/ /_/\__/_/_/|_| + diff --git a/ct/headers/autobrr b/ct/headers/autobrr new file mode 100644 index 00000000..56322d59 --- /dev/null +++ b/ct/headers/autobrr @@ -0,0 +1,6 @@ + ___ __ __ + / | __ __/ /_____ / /_ __________ + / /| |/ / / / __/ __ \/ __ \/ ___/ ___/ + / ___ / /_/ / /_/ /_/ / /_/ / / / / +/_/ |_\__,_/\__/\____/_.___/_/ /_/ + diff --git a/ct/headers/bazarr b/ct/headers/bazarr new file mode 100644 index 00000000..e487a77d --- /dev/null +++ b/ct/headers/bazarr @@ -0,0 +1,6 @@ + ____ + / __ )____ _____ ____ ___________ + / __ / __ `/_ / / __ `/ ___/ ___/ + / /_/ / /_/ / / /_/ /_/ / / / / +/_____/\__,_/ /___/\__,_/_/ /_/ + diff --git a/ct/headers/beszel b/ct/headers/beszel new file mode 100644 index 00000000..dcb0d38d --- /dev/null +++ b/ct/headers/beszel @@ -0,0 +1,6 @@ + ____ __ + / __ )___ _________ ___ / / + / __ / _ \/ ___/_ / / _ \/ / + / /_/ / __(__ ) / /_/ __/ / +/_____/\___/____/ /___/\___/_/ + diff --git a/ct/headers/blocky b/ct/headers/blocky new file mode 100644 index 00000000..3bd089ba --- /dev/null +++ b/ct/headers/blocky @@ -0,0 +1,6 @@ + ____ __ __ + / __ )/ /___ _____/ /____ __ + / __ / / __ \/ ___/ //_/ / / / + / /_/ / / /_/ / /__/ ,< / /_/ / +/_____/_/\____/\___/_/|_|\__, / + /____/ diff --git a/ct/headers/bookstack b/ct/headers/bookstack new file mode 100644 index 00000000..f6864666 --- /dev/null +++ b/ct/headers/bookstack @@ -0,0 +1,6 @@ + ____ __ __ __ + / __ )____ ____ / /_______/ /_____ ______/ /__ + / __ / __ \/ __ \/ //_/ ___/ __/ __ `/ ___/ //_/ + / /_/ / /_/ / /_/ / ,< (__ ) /_/ /_/ / /__/ ,< +/_____/\____/\____/_/|_/____/\__/\__,_/\___/_/|_| + diff --git a/ct/headers/bunkerweb b/ct/headers/bunkerweb new file mode 100644 index 00000000..188677c4 --- /dev/null +++ b/ct/headers/bunkerweb @@ -0,0 +1,6 @@ + ____ __ _ __ __ + / __ )__ ______ / /_____ ____| | / /__ / /_ + / __ / / / / __ \/ //_/ _ \/ ___/ | /| / / _ \/ __ \ + / /_/ / /_/ / / / / ,< / __/ / | |/ |/ / __/ /_/ / +/_____/\__,_/_/ /_/_/|_|\___/_/ |__/|__/\___/_.___/ + diff --git a/ct/headers/caddy b/ct/headers/caddy new file mode 100644 index 00000000..6f47f962 --- /dev/null +++ b/ct/headers/caddy @@ -0,0 +1,6 @@ + ______ __ __ + / ____/___ _____/ /___/ /_ __ + / / / __ `/ __ / __ / / / / +/ /___/ /_/ / /_/ / /_/ / /_/ / +\____/\__,_/\__,_/\__,_/\__, / + /____/ diff --git a/ct/headers/calibre-web b/ct/headers/calibre-web new file mode 100644 index 00000000..ae9dc037 --- /dev/null +++ b/ct/headers/calibre-web @@ -0,0 +1,6 @@ + ______ ___ __ _ __ __ + / ____/___ _/ (_) /_ ________ | | / /__ / /_ + / / / __ `/ / / __ \/ ___/ _ \_____| | /| / / _ \/ __ \ +/ /___/ /_/ / / / /_/ / / / __/_____/ |/ |/ / __/ /_/ / +\____/\__,_/_/_/_.___/_/ \___/ |__/|__/\___/_.___/ + diff --git a/ct/headers/casaos b/ct/headers/casaos new file mode 100644 index 00000000..4af563a2 --- /dev/null +++ b/ct/headers/casaos @@ -0,0 +1,6 @@ + ______ ____ _____ + / ____/___ __________ _/ __ \/ ___/ + / / / __ `/ ___/ __ `/ / / /\__ \ +/ /___/ /_/ (__ ) /_/ / /_/ /___/ / +\____/\__,_/____/\__,_/\____//____/ + diff --git a/ct/headers/changedetection b/ct/headers/changedetection new file mode 100644 index 00000000..bf9fefb4 --- /dev/null +++ b/ct/headers/changedetection @@ -0,0 +1,12 @@ + ________ + / ____/ /_ ____ _____ ____ ____ + / / / __ \/ __ `/ __ \/ __ `/ _ \ +/ /___/ / / / /_/ / / / / /_/ / __/ +\____/_/ /_/\__,_/_/ /_/\__, /\___/ + /____/ + ____ __ __ _ + / __ \___ / /____ _____/ /_(_)___ ____ + / / / / _ \/ __/ _ \/ ___/ __/ / __ \/ __ \ + / /_/ / __/ /_/ __/ /__/ /_/ / /_/ / / / / +/_____/\___/\__/\___/\___/\__/_/\____/_/ /_/ + diff --git a/ct/headers/channels b/ct/headers/channels new file mode 100644 index 00000000..7600b6e4 --- /dev/null +++ b/ct/headers/channels @@ -0,0 +1,6 @@ + ________ __ + / ____/ /_ ____ _____ ____ ___ / /____ + / / / __ \/ __ `/ __ \/ __ \/ _ \/ / ___/ +/ /___/ / / / /_/ / / / / / / / __/ (__ ) +\____/_/ /_/\__,_/_/ /_/_/ /_/\___/_/____/ + diff --git a/ct/headers/checkmk b/ct/headers/checkmk new file mode 100644 index 00000000..ff80000c --- /dev/null +++ b/ct/headers/checkmk @@ -0,0 +1,6 @@ + __ __ __ + _____/ /_ ___ _____/ /______ ___ / /__ + / ___/ __ \/ _ \/ ___/ //_/ __ `__ \/ //_/ +/ /__/ / / / __/ /__/ ,< / / / / / / ,< +\___/_/ /_/\___/\___/_/|_/_/ /_/ /_/_/|_| + diff --git a/ct/headers/cloudflared b/ct/headers/cloudflared new file mode 100644 index 00000000..8011c2c2 --- /dev/null +++ b/ct/headers/cloudflared @@ -0,0 +1,6 @@ + ________ ________ __ + / ____/ /___ __ ______/ / __/ /___ _________ ____/ / + / / / / __ \/ / / / __ / /_/ / __ `/ ___/ _ \/ __ / +/ /___/ / /_/ / /_/ / /_/ / __/ / /_/ / / / __/ /_/ / +\____/_/\____/\__,_/\__,_/_/ /_/\__,_/_/ \___/\__,_/ + diff --git a/ct/headers/cockpit b/ct/headers/cockpit new file mode 100644 index 00000000..8eb04a26 --- /dev/null +++ b/ct/headers/cockpit @@ -0,0 +1,6 @@ + ______ __ _ __ + / ____/___ _____/ /______ (_) /_ + / / / __ \/ ___/ //_/ __ \/ / __/ +/ /___/ /_/ / /__/ ,< / /_/ / / /_ +\____/\____/\___/_/|_/ .___/_/\__/ + /_/ diff --git a/ct/headers/commafeed b/ct/headers/commafeed new file mode 100644 index 00000000..06beb9a5 --- /dev/null +++ b/ct/headers/commafeed @@ -0,0 +1,6 @@ + ______ ______ __ + / ____/___ ____ ___ ____ ___ ____ _/ ____/__ ___ ____/ / + / / / __ \/ __ `__ \/ __ `__ \/ __ `/ /_ / _ \/ _ \/ __ / +/ /___/ /_/ / / / / / / / / / / / /_/ / __/ / __/ __/ /_/ / +\____/\____/_/ /_/ /_/_/ /_/ /_/\__,_/_/ \___/\___/\__,_/ + diff --git a/ct/headers/cronicle b/ct/headers/cronicle new file mode 100644 index 00000000..6d6f7cfc --- /dev/null +++ b/ct/headers/cronicle @@ -0,0 +1,6 @@ + ______ _ __ + / ____/________ ____ (_)____/ /__ + / / / ___/ __ \/ __ \/ / ___/ / _ \ +/ /___/ / / /_/ / / / / / /__/ / __/ +\____/_/ \____/_/ /_/_/\___/_/\___/ + diff --git a/ct/headers/daemonsync b/ct/headers/daemonsync new file mode 100644 index 00000000..53207237 --- /dev/null +++ b/ct/headers/daemonsync @@ -0,0 +1,6 @@ + ____ _____ + / __ \____ ____ ____ ___ ____ ____ / ___/__ ______ _____ + / / / / __ `/ _ \/ __ `__ \/ __ \/ __ \ \__ \/ / / / __ \/ ___/ + / /_/ / /_/ / __/ / / / / / /_/ / / / / ___/ / /_/ / / / / /__ +/_____/\__,_/\___/_/ /_/ /_/\____/_/ /_/ /____/\__, /_/ /_/\___/ + /____/ diff --git a/ct/headers/dashy b/ct/headers/dashy new file mode 100644 index 00000000..330f9e3d --- /dev/null +++ b/ct/headers/dashy @@ -0,0 +1,6 @@ + ____ __ + / __ \____ ______/ /_ __ __ + / / / / __ `/ ___/ __ \/ / / / + / /_/ / /_/ (__ ) / / / /_/ / +/_____/\__,_/____/_/ /_/\__, / + /____/ diff --git a/ct/headers/debian b/ct/headers/debian new file mode 100644 index 00000000..a6f474d4 --- /dev/null +++ b/ct/headers/debian @@ -0,0 +1,6 @@ + ____ __ _ + / __ \___ / /_ (_)___ _____ + / / / / _ \/ __ \/ / __ `/ __ \ + / /_/ / __/ /_/ / / /_/ / / / / +/_____/\___/_.___/_/\__,_/_/ /_/ + diff --git a/ct/headers/deconz b/ct/headers/deconz new file mode 100644 index 00000000..fcfceb28 --- /dev/null +++ b/ct/headers/deconz @@ -0,0 +1,6 @@ + __ __________ _ _______ + ____/ /__ / ____/ __ \/ | / /__ / + / __ / _ \/ / / / / / |/ / / / +/ /_/ / __/ /___/ /_/ / /| / / /__ +\__,_/\___/\____/\____/_/ |_/ /____/ + diff --git a/ct/headers/deluge b/ct/headers/deluge new file mode 100644 index 00000000..6dc49d04 --- /dev/null +++ b/ct/headers/deluge @@ -0,0 +1,6 @@ + ____ __ + / __ \___ / /_ ______ ____ + / / / / _ \/ / / / / __ `/ _ \ + / /_/ / __/ / /_/ / /_/ / __/ +/_____/\___/_/\__,_/\__, /\___/ + /____/ diff --git a/ct/headers/docker b/ct/headers/docker new file mode 100644 index 00000000..907ffbae --- /dev/null +++ b/ct/headers/docker @@ -0,0 +1,6 @@ + ____ __ + / __ \____ _____/ /_____ _____ + / / / / __ \/ ___/ //_/ _ \/ ___/ + / /_/ / /_/ / /__/ ,< / __/ / +/_____/\____/\___/_/|_|\___/_/ + diff --git a/ct/headers/dockge b/ct/headers/dockge new file mode 100644 index 00000000..040b66ac --- /dev/null +++ b/ct/headers/dockge @@ -0,0 +1,6 @@ + ____ __ + / __ \____ _____/ /______ ____ + / / / / __ \/ ___/ //_/ __ `/ _ \ + / /_/ / /_/ / /__/ ,< / /_/ / __/ +/_____/\____/\___/_/|_|\__, /\___/ + /____/ diff --git a/ct/headers/dotnetaspwebapi b/ct/headers/dotnetaspwebapi new file mode 100644 index 00000000..f00b63ca --- /dev/null +++ b/ct/headers/dotnetaspwebapi @@ -0,0 +1,12 @@ + ____ __ __ ___ _____ ____ _ __ __ + / __ \____ / /_____ ___ / /_ / | / ___// __ \ | | / /__ / /_ + / / / / __ \/ __/ __ \/ _ \/ __/ / /| | \__ \/ /_/ / | | /| / / _ \/ __ \ + / /_/ / /_/ / /_/ / / / __/ /_ / ___ |___/ / ____/ | |/ |/ / __/ /_/ / +/_____/\____/\__/_/ /_/\___/\__/ /_/ |_/____/_/ |__/|__/\___/_.___/ + + ___ ____ ____ + / | / __ \/ _/ + / /| | / /_/ // / + / ___ |/ ____// / +/_/ |_/_/ /___/ + diff --git a/ct/headers/emby b/ct/headers/emby new file mode 100644 index 00000000..84afb1d6 --- /dev/null +++ b/ct/headers/emby @@ -0,0 +1,6 @@ + ______ __ + / ____/___ ___ / /_ __ __ + / __/ / __ `__ \/ __ \/ / / / + / /___/ / / / / / /_/ / /_/ / +/_____/_/ /_/ /_/_.___/\__, / + /____/ diff --git a/ct/headers/emqx b/ct/headers/emqx new file mode 100644 index 00000000..f6cb5038 --- /dev/null +++ b/ct/headers/emqx @@ -0,0 +1,6 @@ + ________ _______ _ __ + / ____/ |/ / __ \ | |/ / + / __/ / /|_/ / / / / | / + / /___/ / / / /_/ / / | +/_____/_/ /_/\___\_\/_/|_| + diff --git a/ct/headers/ersatztv b/ct/headers/ersatztv new file mode 100644 index 00000000..f47317c3 --- /dev/null +++ b/ct/headers/ersatztv @@ -0,0 +1,6 @@ + ______ __ _______ __ + / ____/_____________ _/ /_____/_ __/ | / / + / __/ / ___/ ___/ __ `/ __/_ / / / | | / / + / /___/ / (__ ) /_/ / /_ / /_/ / | |/ / +/_____/_/ /____/\__,_/\__/ /___/_/ |___/ + diff --git a/ct/headers/esphome b/ct/headers/esphome new file mode 100644 index 00000000..5c9e86c6 --- /dev/null +++ b/ct/headers/esphome @@ -0,0 +1,6 @@ + ___________ ____ __ __ + / ____/ ___// __ \/ / / /___ ____ ___ ___ + / __/ \__ \/ /_/ / /_/ / __ \/ __ `__ \/ _ \ + / /___ ___/ / ____/ __ / /_/ / / / / / / __/ +/_____//____/_/ /_/ /_/\____/_/ /_/ /_/\___/ + diff --git a/ct/headers/evcc b/ct/headers/evcc new file mode 100644 index 00000000..9317a541 --- /dev/null +++ b/ct/headers/evcc @@ -0,0 +1,6 @@ + + ___ _ ____________ + / _ \ | / / ___/ ___/ +/ __/ |/ / /__/ /__ +\___/|___/\___/\___/ + diff --git a/ct/headers/fenrus b/ct/headers/fenrus new file mode 100644 index 00000000..95e073aa --- /dev/null +++ b/ct/headers/fenrus @@ -0,0 +1,6 @@ + ______ + / ____/__ ____ _______ _______ + / /_ / _ \/ __ \/ ___/ / / / ___/ + / __/ / __/ / / / / / /_/ (__ ) +/_/ \___/_/ /_/_/ \__,_/____/ + diff --git a/ct/headers/fhem b/ct/headers/fhem new file mode 100644 index 00000000..fe0a80c4 --- /dev/null +++ b/ct/headers/fhem @@ -0,0 +1,6 @@ + ________ __________ ___ + / ____/ / / / ____/ |/ / + / /_ / /_/ / __/ / /|_/ / + / __/ / __ / /___/ / / / +/_/ /_/ /_/_____/_/ /_/ + diff --git a/ct/headers/firefly b/ct/headers/firefly new file mode 100644 index 00000000..3aabc10c --- /dev/null +++ b/ct/headers/firefly @@ -0,0 +1,6 @@ + _______ ______ + / ____(_)_______ / __/ /_ __ + / /_ / / ___/ _ \/ /_/ / / / / + / __/ / / / / __/ __/ / /_/ / +/_/ /_/_/ \___/_/ /_/\__, / + /____/ diff --git a/ct/headers/flaresolverr b/ct/headers/flaresolverr new file mode 100644 index 00000000..a710dd62 --- /dev/null +++ b/ct/headers/flaresolverr @@ -0,0 +1,6 @@ + ________ _____ __ + / ____/ /___ _________ / ___/____ / / _____ __________ + / /_ / / __ `/ ___/ _ \\__ \/ __ \/ / | / / _ \/ ___/ ___/ + / __/ / / /_/ / / / __/__/ / /_/ / /| |/ / __/ / / / +/_/ /_/\__,_/_/ \___/____/\____/_/ |___/\___/_/ /_/ + diff --git a/ct/headers/flowiseai b/ct/headers/flowiseai new file mode 100644 index 00000000..7011f22b --- /dev/null +++ b/ct/headers/flowiseai @@ -0,0 +1,6 @@ + ________ _ ___ ____ + / ____/ /___ _ __(_)_______ / | / _/ + / /_ / / __ \ | /| / / / ___/ _ \/ /| | / / + / __/ / / /_/ / |/ |/ / (__ ) __/ ___ |_/ / +/_/ /_/\____/|__/|__/_/____/\___/_/ |_/___/ + diff --git a/ct/headers/forgejo b/ct/headers/forgejo new file mode 100644 index 00000000..4fb3af69 --- /dev/null +++ b/ct/headers/forgejo @@ -0,0 +1,6 @@ + ______ _ + / ____/___ _________ ____ (_)___ + / /_ / __ \/ ___/ __ `/ _ \ / / __ \ + / __/ / /_/ / / / /_/ / __/ / / /_/ / +/_/ \____/_/ \__, /\___/_/ /\____/ + /____/ /___/ diff --git a/ct/headers/frigate b/ct/headers/frigate new file mode 100644 index 00000000..94ffd3a7 --- /dev/null +++ b/ct/headers/frigate @@ -0,0 +1,6 @@ + ______ _ __ + / ____/____(_)___ _____ _/ /____ + / /_ / ___/ / __ `/ __ `/ __/ _ \ + / __/ / / / / /_/ / /_/ / /_/ __/ +/_/ /_/ /_/\__, /\__,_/\__/\___/ + /____/ diff --git a/ct/headers/ghost b/ct/headers/ghost new file mode 100644 index 00000000..c16e83b8 --- /dev/null +++ b/ct/headers/ghost @@ -0,0 +1,6 @@ + ________ __ + / ____/ /_ ____ _____/ /_ + / / __/ __ \/ __ \/ ___/ __/ +/ /_/ / / / / /_/ (__ ) /_ +\____/_/ /_/\____/____/\__/ + diff --git a/ct/headers/gitea b/ct/headers/gitea new file mode 100644 index 00000000..7826ac30 --- /dev/null +++ b/ct/headers/gitea @@ -0,0 +1,6 @@ + _______ __ + / ____(_) /____ ____ _ + / / __/ / __/ _ \/ __ `/ +/ /_/ / / /_/ __/ /_/ / +\____/_/\__/\___/\__,_/ + diff --git a/ct/headers/glance b/ct/headers/glance new file mode 100644 index 00000000..abaaa8af --- /dev/null +++ b/ct/headers/glance @@ -0,0 +1,6 @@ + ________ + / ____/ /___ _____ ________ + / / __/ / __ `/ __ \/ ___/ _ \ +/ /_/ / / /_/ / / / / /__/ __/ +\____/_/\__,_/_/ /_/\___/\___/ + diff --git a/ct/headers/glpi b/ct/headers/glpi new file mode 100644 index 00000000..789b6259 --- /dev/null +++ b/ct/headers/glpi @@ -0,0 +1,6 @@ + ________ ____ ____ + / ____/ / / __ \/ _/ + / / __/ / / /_/ // / +/ /_/ / /___/ ____// / +\____/_____/_/ /___/ + diff --git a/ct/headers/go2rtc b/ct/headers/go2rtc new file mode 100644 index 00000000..3a3e8bf8 --- /dev/null +++ b/ct/headers/go2rtc @@ -0,0 +1,6 @@ + ___ __ + ____ _____ |__ \ _____/ /______ + / __ `/ __ \__/ // ___/ __/ ___/ + / /_/ / /_/ / __// / / /_/ /__ + \__, /\____/____/_/ \__/\___/ +/____/ diff --git a/ct/headers/gokapi b/ct/headers/gokapi new file mode 100644 index 00000000..c612c9fa --- /dev/null +++ b/ct/headers/gokapi @@ -0,0 +1,6 @@ + ______ __ _ + / ____/___ / /______ _____ (_) + / / __/ __ \/ //_/ __ `/ __ \/ / +/ /_/ / /_/ / ,< / /_/ / /_/ / / +\____/\____/_/|_|\__,_/ .___/_/ + /_/ diff --git a/ct/headers/gotify b/ct/headers/gotify new file mode 100644 index 00000000..8532f9ef --- /dev/null +++ b/ct/headers/gotify @@ -0,0 +1,6 @@ + ______ __ _ ____ + / ____/___ / /_(_) __/_ __ + / / __/ __ \/ __/ / /_/ / / / +/ /_/ / /_/ / /_/ / __/ /_/ / +\____/\____/\__/_/_/ \__, / + /____/ diff --git a/ct/headers/grafana b/ct/headers/grafana new file mode 100644 index 00000000..9eb8a245 --- /dev/null +++ b/ct/headers/grafana @@ -0,0 +1,6 @@ + ______ ____ + / ____/________ _/ __/___ _____ ____ _ + / / __/ ___/ __ `/ /_/ __ `/ __ \/ __ `/ +/ /_/ / / / /_/ / __/ /_/ / / / / /_/ / +\____/_/ \__,_/_/ \__,_/_/ /_/\__,_/ + diff --git a/ct/headers/grist b/ct/headers/grist new file mode 100644 index 00000000..f82ced4f --- /dev/null +++ b/ct/headers/grist @@ -0,0 +1,6 @@ + ______ _ __ + / ____/____(_)____/ /_ + / / __/ ___/ / ___/ __/ +/ /_/ / / / (__ ) /_ +\____/_/ /_/____/\__/ + diff --git a/ct/headers/grocy b/ct/headers/grocy new file mode 100644 index 00000000..2aad01d4 --- /dev/null +++ b/ct/headers/grocy @@ -0,0 +1,6 @@ + + ____ __________ _______ __ + / __ `/ ___/ __ \/ ___/ / / / + / /_/ / / / /_/ / /__/ /_/ / + \__, /_/ \____/\___/\__, / +/____/ /____/ diff --git a/ct/headers/headscale b/ct/headers/headscale new file mode 100644 index 00000000..ff8ca514 --- /dev/null +++ b/ct/headers/headscale @@ -0,0 +1,6 @@ + __ __ __ __ + / / / /__ ____ _____/ /_____________ _/ /__ + / /_/ / _ \/ __ `/ __ / ___/ ___/ __ `/ / _ \ + / __ / __/ /_/ / /_/ (__ ) /__/ /_/ / / __/ +/_/ /_/\___/\__,_/\__,_/____/\___/\__,_/_/\___/ + diff --git a/ct/headers/heimdall-dashboard b/ct/headers/heimdall-dashboard new file mode 100644 index 00000000..245902b7 --- /dev/null +++ b/ct/headers/heimdall-dashboard @@ -0,0 +1,12 @@ + __ __ _ __ ____ ____ __ __ + / / / /__ (_)___ ___ ____/ /___ _/ / / / __ \____ ______/ /_ / /_ + / /_/ / _ \/ / __ `__ \/ __ / __ `/ / /_____/ / / / __ `/ ___/ __ \/ __ \ + / __ / __/ / / / / / / /_/ / /_/ / / /_____/ /_/ / /_/ (__ ) / / / /_/ / +/_/ /_/\___/_/_/ /_/ /_/\__,_/\__,_/_/_/ /_____/\__,_/____/_/ /_/_.___/ + + __ + ____ ____ __________/ / + / __ \/ __ `/ ___/ __ / +/ /_/ / /_/ / / / /_/ / +\____/\__,_/_/ \__,_/ + diff --git a/ct/headers/hivemq b/ct/headers/hivemq new file mode 100644 index 00000000..ac5216a7 --- /dev/null +++ b/ct/headers/hivemq @@ -0,0 +1,6 @@ + __ ___ __ _______ + / / / (_) _____ / |/ / __ \ + / /_/ / / | / / _ \/ /|_/ / / / / + / __ / /| |/ / __/ / / / /_/ / +/_/ /_/_/ |___/\___/_/ /_/\___\_\ + diff --git a/ct/headers/hoarder b/ct/headers/hoarder new file mode 100644 index 00000000..c09416d4 --- /dev/null +++ b/ct/headers/hoarder @@ -0,0 +1,6 @@ + __ __ __ + / / / /___ ____ __________/ /__ _____ + / /_/ / __ \/ __ `/ ___/ __ / _ \/ ___/ + / __ / /_/ / /_/ / / / /_/ / __/ / +/_/ /_/\____/\__,_/_/ \__,_/\___/_/ + diff --git a/ct/headers/homarr b/ct/headers/homarr new file mode 100644 index 00000000..1bd7a939 --- /dev/null +++ b/ct/headers/homarr @@ -0,0 +1,6 @@ + __ __ + / / / /___ ____ ___ ____ ___________ + / /_/ / __ \/ __ `__ \/ __ `/ ___/ ___/ + / __ / /_/ / / / / / / /_/ / / / / +/_/ /_/\____/_/ /_/ /_/\__,_/_/ /_/ + diff --git a/ct/headers/homeassistant b/ct/headers/homeassistant new file mode 100644 index 00000000..a88730f4 --- /dev/null +++ b/ct/headers/homeassistant @@ -0,0 +1,6 @@ + __ __ ___ _ __ __ + / / / /___ ____ ___ ___ / | __________(_)____/ /_____ _____ / /_ + / /_/ / __ \/ __ `__ \/ _ \ / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/ + / __ / /_/ / / / / / / __/ / ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_ +/_/ /_/\____/_/ /_/ /_/\___/ /_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/ + diff --git a/ct/headers/homeassistant-core b/ct/headers/homeassistant-core new file mode 100644 index 00000000..efbc1643 --- /dev/null +++ b/ct/headers/homeassistant-core @@ -0,0 +1,12 @@ + __ __ + / / / /___ ____ ___ ___ + / /_/ / __ \/ __ `__ \/ _ \ + / __ / /_/ / / / / / / __/ +/_/ /_/\____/_/ /_/ /_/\___/ + + ___ _ __ __ ______ + / | __________(_)____/ /_____ _____ / /_ / ____/___ ________ + / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/_____/ / / __ \/ ___/ _ \ + / ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_/_____/ /___/ /_/ / / / __/ +/_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/ \____/\____/_/ \___/ + diff --git a/ct/headers/homebox b/ct/headers/homebox new file mode 100644 index 00000000..da717216 --- /dev/null +++ b/ct/headers/homebox @@ -0,0 +1,6 @@ + __ __ ____ + / / / /___ ____ ___ ___ / __ )____ _ __ + / /_/ / __ \/ __ `__ \/ _ \/ __ / __ \| |/_/ + / __ / /_/ / / / / / / __/ /_/ / /_/ /> < +/_/ /_/\____/_/ /_/ /_/\___/_____/\____/_/|_| + diff --git a/ct/headers/homebridge b/ct/headers/homebridge new file mode 100644 index 00000000..a3da0240 --- /dev/null +++ b/ct/headers/homebridge @@ -0,0 +1,6 @@ + __ __ __ _ __ + / / / /___ ____ ___ ___ / /_ _____(_)___/ /___ ____ + / /_/ / __ \/ __ `__ \/ _ \/ __ \/ ___/ / __ / __ `/ _ \ + / __ / /_/ / / / / / / __/ /_/ / / / / /_/ / /_/ / __/ +/_/ /_/\____/_/ /_/ /_/\___/_.___/_/ /_/\__,_/\__, /\___/ + /____/ diff --git a/ct/headers/homepage b/ct/headers/homepage new file mode 100644 index 00000000..4ff42a16 --- /dev/null +++ b/ct/headers/homepage @@ -0,0 +1,6 @@ + __ __ + / / / /___ ____ ___ ___ ____ ____ _____ ____ + / /_/ / __ \/ __ `__ \/ _ \/ __ \/ __ `/ __ `/ _ \ + / __ / /_/ / / / / / / __/ /_/ / /_/ / /_/ / __/ +/_/ /_/\____/_/ /_/ /_/\___/ .___/\__,_/\__, /\___/ + /_/ /____/ diff --git a/ct/headers/homer b/ct/headers/homer new file mode 100644 index 00000000..80e4281a --- /dev/null +++ b/ct/headers/homer @@ -0,0 +1,6 @@ + __ __ + / / / /___ ____ ___ ___ _____ + / /_/ / __ \/ __ `__ \/ _ \/ ___/ + / __ / /_/ / / / / / / __/ / +/_/ /_/\____/_/ /_/ /_/\___/_/ + diff --git a/ct/headers/hyperhdr b/ct/headers/hyperhdr new file mode 100644 index 00000000..cbbcfc57 --- /dev/null +++ b/ct/headers/hyperhdr @@ -0,0 +1,6 @@ + __ __ __ ______ ____ + / / / /_ ______ ___ _____/ / / / __ \/ __ \ + / /_/ / / / / __ \/ _ \/ ___/ /_/ / / / / /_/ / + / __ / /_/ / /_/ / __/ / / __ / /_/ / _, _/ +/_/ /_/\__, / .___/\___/_/ /_/ /_/_____/_/ |_| + /____/_/ diff --git a/ct/headers/hyperion b/ct/headers/hyperion new file mode 100644 index 00000000..2c0f7972 --- /dev/null +++ b/ct/headers/hyperion @@ -0,0 +1,6 @@ + __ __ _ + / / / /_ ______ ___ _____(_)___ ____ + / /_/ / / / / __ \/ _ \/ ___/ / __ \/ __ \ + / __ / /_/ / /_/ / __/ / / / /_/ / / / / +/_/ /_/\__, / .___/\___/_/ /_/\____/_/ /_/ + /____/_/ diff --git a/ct/headers/influxdb b/ct/headers/influxdb new file mode 100644 index 00000000..b8efea54 --- /dev/null +++ b/ct/headers/influxdb @@ -0,0 +1,6 @@ + ____ ______ ____ ____ + / _/___ / __/ /_ ___ __/ __ \/ __ ) + / // __ \/ /_/ / / / / |/_/ / / / __ | + _/ // / / / __/ / /_/ /> < +/_/ |_/\___/\__/_____/\____/_/|_| + diff --git a/ct/headers/nextcloudpi b/ct/headers/nextcloudpi new file mode 100644 index 00000000..9aa8b594 --- /dev/null +++ b/ct/headers/nextcloudpi @@ -0,0 +1,6 @@ + _ __ __ ________ ______ _ + / | / /__ _ __/ /_/ ____/ /___ __ ______/ / __ \(_) + / |/ / _ \| |/_/ __/ / / / __ \/ / / / __ / /_/ / / + / /| / __/> < / ____/ / / /_/ /> < +/_/ \__,_/ .___/\___/_/ /_/\___/____/____/ /_/ /_/\__, /_/|_| + /_/ /____/ diff --git a/ct/headers/part-db b/ct/headers/part-db new file mode 100644 index 00000000..fe325550 --- /dev/null +++ b/ct/headers/part-db @@ -0,0 +1,6 @@ + ____ __ ____ ____ + / __ \____ ______/ /_ / __ \/ __ ) + / /_/ / __ `/ ___/ __/_____/ / / / __ | + / ____/ /_/ / / / /_/_____/ /_/ / /_/ / +/_/ \__,_/_/ \__/ /_____/_____/ + diff --git a/ct/headers/pbs b/ct/headers/pbs new file mode 100644 index 00000000..785d90a8 --- /dev/null +++ b/ct/headers/pbs @@ -0,0 +1,6 @@ + ____ ____ _____ + / __ \/ __ ) ___/ + / /_/ / __ \__ \ + / ____/ /_/ /__/ / +/_/ /_____/____/ + diff --git a/ct/headers/peanut b/ct/headers/peanut new file mode 100644 index 00000000..11a2cd5c --- /dev/null +++ b/ct/headers/peanut @@ -0,0 +1,6 @@ + ____ _ ____ ________ + / __ \___ ____ _/ | / / / / /_ __/ + / /_/ / _ \/ __ `/ |/ / / / / / / + / ____/ __/ /_/ / /| / /_/ / / / +/_/ \___/\__,_/_/ |_/\____/ /_/ + diff --git a/ct/headers/petio b/ct/headers/petio new file mode 100644 index 00000000..d8deb745 --- /dev/null +++ b/ct/headers/petio @@ -0,0 +1,6 @@ + ____ __ _ + / __ \___ / /_(_)___ + / /_/ / _ \/ __/ / __ \ + / ____/ __/ /_/ / /_/ / +/_/ \___/\__/_/\____/ + diff --git a/ct/headers/pf2etools b/ct/headers/pf2etools new file mode 100644 index 00000000..b6f7cb10 --- /dev/null +++ b/ct/headers/pf2etools @@ -0,0 +1,6 @@ + ____ _______ ______ __ + / __ \/ __/__ \ ___/_ __/___ ____ / /____ + / /_/ / /_ __/ // _ \/ / / __ \/ __ \/ / ___/ + / ____/ __// __// __/ / / /_/ / /_/ / (__ ) +/_/ /_/ /____/\___/_/ \____/\____/_/____/ + diff --git a/ct/headers/photoprism b/ct/headers/photoprism new file mode 100644 index 00000000..a8a9cabe --- /dev/null +++ b/ct/headers/photoprism @@ -0,0 +1,6 @@ + ____ __ __ ____ _ + / __ \/ /_ ____ / /_____ / __ \_____(_)________ ___ + / /_/ / __ \/ __ \/ __/ __ \/ /_/ / ___/ / ___/ __ `__ \ + / ____/ / / / /_/ / /_/ /_/ / ____/ / / (__ ) / / / / / +/_/ /_/ /_/\____/\__/\____/_/ /_/ /_/____/_/ /_/ /_/ + diff --git a/ct/headers/phpipam b/ct/headers/phpipam new file mode 100644 index 00000000..51ba79de --- /dev/null +++ b/ct/headers/phpipam @@ -0,0 +1,6 @@ + __ ________ ___ __ ___ + ____ / /_ ____ / _/ __ \/ | / |/ / + / __ \/ __ \/ __ \ / // /_/ / /| | / /|_/ / + / /_/ / / / / /_/ // // ____/ ___ |/ / / / + / .___/_/ /_/ .___/___/_/ /_/ |_/_/ /_/ +/_/ /_/ diff --git a/ct/headers/pialert b/ct/headers/pialert new file mode 100644 index 00000000..07f2474c --- /dev/null +++ b/ct/headers/pialert @@ -0,0 +1,6 @@ + ____ _ ___ __ __ + / __ \(_) | / /__ _____/ /_ + / /_/ / / /| | / / _ \/ ___/ __/ + / ____/ / ___ |/ / __/ / / /_ +/_/ /_/_/ |_/_/\___/_/ \__/ + diff --git a/ct/headers/pihole b/ct/headers/pihole new file mode 100644 index 00000000..9a727b22 --- /dev/null +++ b/ct/headers/pihole @@ -0,0 +1,6 @@ + ____ _ __ __ + / __ \(_) /_ ____ / /__ + / /_/ / / __ \/ __ \/ / _ \ + / ____/ / / / / /_/ / / __/ +/_/ /_/_/ /_/\____/_/\___/ + diff --git a/ct/headers/pingvin b/ct/headers/pingvin new file mode 100644 index 00000000..8177f817 --- /dev/null +++ b/ct/headers/pingvin @@ -0,0 +1,6 @@ + ____ _ _ + / __ \(_)___ ____ __ __(_)___ + / /_/ / / __ \/ __ `/ | / / / __ \ + / ____/ / / / / /_/ /| |/ / / / / / +/_/ /_/_/ /_/\__, / |___/_/_/ /_/ + /____/ diff --git a/ct/headers/plex b/ct/headers/plex new file mode 100644 index 00000000..2e27d0b8 --- /dev/null +++ b/ct/headers/plex @@ -0,0 +1,6 @@ + ____ __ + / __ \/ /__ _ __ + / /_/ / / _ \| |/_/ + / ____/ / __/> < +/_/ /_/\___/_/|_| + diff --git a/ct/headers/pocketbase b/ct/headers/pocketbase new file mode 100644 index 00000000..5eea8625 --- /dev/null +++ b/ct/headers/pocketbase @@ -0,0 +1,6 @@ + ____ __ __ __ + / __ \____ _____/ /_____ / /_/ /_ ____ _________ + / /_/ / __ \/ ___/ //_/ _ \/ __/ __ \/ __ `/ ___/ _ \ + / ____/ /_/ / /__/ ,< / __/ /_/ /_/ / /_/ (__ ) __/ +/_/ \____/\___/_/|_|\___/\__/_.___/\__,_/____/\___/ + diff --git a/ct/headers/podman b/ct/headers/podman new file mode 100644 index 00000000..2f81f14a --- /dev/null +++ b/ct/headers/podman @@ -0,0 +1,6 @@ + ____ __ + / __ \____ ____/ /___ ___ ____ _____ + / /_/ / __ \/ __ / __ `__ \/ __ `/ __ \ + / ____/ /_/ / /_/ / / / / / / /_/ / / / / +/_/ \____/\__,_/_/ /_/ /_/\__,_/_/ /_/ + diff --git a/ct/headers/podman-homeassistant b/ct/headers/podman-homeassistant new file mode 100644 index 00000000..c1241da4 --- /dev/null +++ b/ct/headers/podman-homeassistant @@ -0,0 +1,12 @@ + ____ __ __ __ + / __ \____ ____/ /___ ___ ____ _____ / / / /___ ____ ___ ___ + / /_/ / __ \/ __ / __ `__ \/ __ `/ __ \______/ /_/ / __ \/ __ `__ \/ _ \ + / ____/ /_/ / /_/ / / / / / / /_/ / / / /_____/ __ / /_/ / / / / / / __/ +/_/ \____/\__,_/_/ /_/ /_/\__,_/_/ /_/ /_/ /_/\____/_/ /_/ /_/\___/ + + ___ _ __ __ + / | __________(_)____/ /_____ _____ / /_ + / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/ + / ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_ +/_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/ + diff --git a/ct/headers/postgresql b/ct/headers/postgresql new file mode 100644 index 00000000..8297b0ad --- /dev/null +++ b/ct/headers/postgresql @@ -0,0 +1,6 @@ + ____ __ _____ ____ __ + / __ \____ _____/ /_____ _________ / ___// __ \ / / + / /_/ / __ \/ ___/ __/ __ `/ ___/ _ \\__ \/ / / / / / + / ____/ /_/ (__ ) /_/ /_/ / / / __/__/ / /_/ / / /___ +/_/ \____/____/\__/\__, /_/ \___/____/\___\_\/_____/ + /____/ diff --git a/ct/headers/projectsend b/ct/headers/projectsend new file mode 100644 index 00000000..c388eb72 --- /dev/null +++ b/ct/headers/projectsend @@ -0,0 +1,6 @@ + ____ _ __ _____ __ + / __ \_________ (_)__ _____/ /_/ ___/___ ____ ____/ / + / /_/ / ___/ __ \ / / _ \/ ___/ __/\__ \/ _ \/ __ \/ __ / + / ____/ / / /_/ / / / __/ /__/ /_ ___/ / __/ / / / /_/ / +/_/ /_/ \____/_/ /\___/\___/\__//____/\___/_/ /_/\__,_/ + /___/ diff --git a/ct/headers/prometheus b/ct/headers/prometheus new file mode 100644 index 00000000..f5a9cccc --- /dev/null +++ b/ct/headers/prometheus @@ -0,0 +1,6 @@ + ____ __ __ + / __ \_________ ____ ___ ___ / /_/ /_ ___ __ _______ + / /_/ / ___/ __ \/ __ `__ \/ _ \/ __/ __ \/ _ \/ / / / ___/ + / ____/ / / /_/ / / / / / / __/ /_/ / / / __/ /_/ (__ ) +/_/ /_/ \____/_/ /_/ /_/\___/\__/_/ /_/\___/\__,_/____/ + diff --git a/ct/headers/prometheus-alertmanager b/ct/headers/prometheus-alertmanager new file mode 100644 index 00000000..43a4876b --- /dev/null +++ b/ct/headers/prometheus-alertmanager @@ -0,0 +1,12 @@ + ____ __ __ ___ __ + / __ \_________ ____ ___ ___ / /_/ /_ ___ __ _______ / | / / + / /_/ / ___/ __ \/ __ `__ \/ _ \/ __/ __ \/ _ \/ / / / ___/_____/ /| | / / + / ____/ / / /_/ / / / / / / __/ /_/ / / / __/ /_/ (__ )_____/ ___ |/ / +/_/ /_/ \____/_/ /_/ /_/\___/\__/_/ /_/\___/\__,_/____/ /_/ |_/_/ + + __ + ___ _____/ /_____ ___ ____ _____ ____ _____ ____ _____ + / _ \/ ___/ __/ __ `__ \/ __ `/ __ \/ __ `/ __ `/ _ \/ ___/ +/ __/ / / /_/ / / / / / /_/ / / / / /_/ / /_/ / __/ / +\___/_/ \__/_/ /_/ /_/\__,_/_/ /_/\__,_/\__, /\___/_/ + /____/ diff --git a/ct/headers/prowlarr b/ct/headers/prowlarr new file mode 100644 index 00000000..10255b7a --- /dev/null +++ b/ct/headers/prowlarr @@ -0,0 +1,6 @@ + ____ __ + / __ \_________ _ __/ /___ ___________ + / /_/ / ___/ __ \ | /| / / / __ `/ ___/ ___/ + / ____/ / / /_/ / |/ |/ / / /_/ / / / / +/_/ /_/ \____/|__/|__/_/\__,_/_/ /_/ + diff --git a/ct/headers/proxmox-datacenter-manager b/ct/headers/proxmox-datacenter-manager new file mode 100644 index 00000000..bd181cc9 --- /dev/null +++ b/ct/headers/proxmox-datacenter-manager @@ -0,0 +1,18 @@ + __ __ + ____ _________ _ ______ ___ ____ _ __ ____/ /___ _/ /_____ _ + / __ \/ ___/ __ \| |/_/ __ `__ \/ __ \| |/_/_____/ __ / __ `/ __/ __ `/ + / /_/ / / / /_/ /> < +/____/\__,_/_.___/_.___/_/_/|_| + diff --git a/ct/headers/zammad b/ct/headers/zammad new file mode 100644 index 00000000..eb9999df --- /dev/null +++ b/ct/headers/zammad @@ -0,0 +1,6 @@ + _____ __ +/__ / ____ _____ ___ ____ ___ ____ _____/ / + / / / __ `/ __ `__ \/ __ `__ \/ __ `/ __ / + / /__/ /_/ / / / / / / / / / / / /_/ / /_/ / +/____/\__,_/_/ /_/ /_/_/ /_/ /_/\__,_/\__,_/ + diff --git a/ct/headers/zigbee2mqtt b/ct/headers/zigbee2mqtt new file mode 100644 index 00000000..f6925a01 --- /dev/null +++ b/ct/headers/zigbee2mqtt @@ -0,0 +1,6 @@ + _____ _ __ ___ __ _______ ____________ +/__ / (_)___ _/ /_ ___ ___ |__ \ / |/ / __ \/_ __/_ __/ + / / / / __ `/ __ \/ _ \/ _ \__/ // /|_/ / / / / / / / / + / /__/ / /_/ / /_/ / __/ __/ __// / / / /_/ / / / / / +/____/_/\__, /_.___/\___/\___/____/_/ /_/\___\_\/_/ /_/ + /____/ diff --git a/ct/headers/zipline b/ct/headers/zipline new file mode 100644 index 00000000..ce2b4b91 --- /dev/null +++ b/ct/headers/zipline @@ -0,0 +1,6 @@ + _____ _ ___ +/__ / (_)___ / (_)___ ___ + / / / / __ \/ / / __ \/ _ \ + / /__/ / /_/ / / / / / / __/ +/____/_/ .___/_/_/_/ /_/\___/ + /_/ diff --git a/ct/headers/zoraxy b/ct/headers/zoraxy new file mode 100644 index 00000000..f93198af --- /dev/null +++ b/ct/headers/zoraxy @@ -0,0 +1,6 @@ + _____ +/__ / ____ _________ __ ____ __ + / / / __ \/ ___/ __ `/ |/_/ / / / + / /__/ /_/ / / / /_/ /> /dev/null apt-get -y upgrade &>/dev/null - apt-get --with-new-pkgs upgrade jellyfin jellyfin-server &>/dev/null + apt-get -y --with-new-pkgs upgrade jellyfin jellyfin-server &>/dev/null msg_ok "Updated ${APP} LXC" exit } diff --git a/ct/openhab.sh b/ct/openhab.sh index 79e24984..35c407f8 100644 --- a/ct/openhab.sh +++ b/ct/openhab.sh @@ -45,5 +45,6 @@ description msg_ok "Completed Successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Access it using the following URL:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}" \ No newline at end of file +echo -e "${INFO}${YW} Access it using one of the following URLs:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:8443${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}" diff --git a/frontend/src/app/category-view/page.tsx b/frontend/src/app/category-view/page.tsx index 6050f4ae..95b7388f 100644 --- a/frontend/src/app/category-view/page.tsx +++ b/frontend/src/app/category-view/page.tsx @@ -4,15 +4,32 @@ import React, { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import { Card, CardContent } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; +import { Badge } from "@/components/ui/badge"; +import { ChevronLeft, ChevronRight } from "lucide-react"; import { Category } from "@/lib/types"; const defaultLogo = "/default-logo.png"; // Fallback logo path - const MAX_DESCRIPTION_LENGTH = 100; // Set max length for description +const MAX_LOGOS = 5; // Max logos to display at once + +const formattedBadge = (type: string) => { + switch (type) { + case "vm": + return VM; + case "ct": + return ( + LXC + ); + case "misc": + return MISC; + } + return null; +}; const CategoryView = () => { const [categories, setCategories] = useState([]); - const [selectedCategory, setSelectedCategory] = useState(null); + const [selectedCategoryIndex, setSelectedCategoryIndex] = useState(null); + const [logoIndices, setLogoIndices] = useState<{ [key: string]: number }>({}); const router = useRouter(); useEffect(() => { @@ -26,6 +43,13 @@ const CategoryView = () => { const data = await response.json(); console.log("Fetched categories:", data); // Debugging setCategories(data); + + // Initialize logo indices + const initialLogoIndices: { [key: string]: number } = {}; + data.forEach((category: any) => { + initialLogoIndices[category.name] = 0; + }); + setLogoIndices(initialLogoIndices); } catch (error) { console.error("Error fetching categories:", error); } @@ -34,91 +58,190 @@ const CategoryView = () => { fetchCategories(); }, []); - const handleCategoryClick = (category: Category) => { - setSelectedCategory(category); + const handleCategoryClick = (index: number) => { + setSelectedCategoryIndex(index); }; const handleBackClick = () => { - setSelectedCategory(null); + setSelectedCategoryIndex(null); }; const handleScriptClick = (scriptSlug: string) => { router.push(`/scripts?id=${scriptSlug}`); }; + const navigateCategory = (direction: "prev" | "next") => { + if (selectedCategoryIndex !== null) { + const newIndex = + direction === "prev" + ? (selectedCategoryIndex - 1 + categories.length) % categories.length + : (selectedCategoryIndex + 1) % categories.length; + setSelectedCategoryIndex(newIndex); + } + }; + + const switchLogos = (categoryName: string, direction: "prev" | "next") => { + setLogoIndices((prev) => { + const currentIndex = prev[categoryName] || 0; + const category = categories.find((cat) => cat.name === categoryName); + if (!category || !category.scripts) return prev; + + const totalLogos = category.scripts.length; + const newIndex = + direction === "prev" + ? (currentIndex - MAX_LOGOS + totalLogos) % totalLogos + : (currentIndex + MAX_LOGOS) % totalLogos; + + return { ...prev, [categoryName]: newIndex }; + }); + }; + const truncateDescription = (text: string) => { return text.length > MAX_DESCRIPTION_LENGTH ? `${text.slice(0, MAX_DESCRIPTION_LENGTH)}...` : text; }; + const renderResources = (script: any) => { + const cpu = script.install_methods[0]?.resources.cpu; + const ram = script.install_methods[0]?.resources.ram; + const hdd = script.install_methods[0]?.resources.hdd; + + const resourceParts = []; + if (cpu) resourceParts.push(CPU: {cpu}vCPU); + if (ram) resourceParts.push(RAM: {ram}MB); + if (hdd) resourceParts.push(HDD: {hdd}GB); + + return resourceParts.length > 0 ? ( +
+ {resourceParts.map((part, index) => ( + + {part} + {index < resourceParts.length - 1 && " | "} + + ))} +
+ ) : null; + }; + return ( -
+
{categories.length === 0 && (

No categories available. Please check the API endpoint.

)} - {selectedCategory ? ( + {selectedCategoryIndex !== null ? (
- -

{selectedCategory.name}

-
- {selectedCategory.scripts + {/* Header with Navigation */} +
+ +

{categories[selectedCategoryIndex].name}

+ +
+ + {/* Scripts Grid */} +
+ {categories[selectedCategoryIndex].scripts .sort((a, b) => a.name.localeCompare(b.name)) .map((script) => ( - handleScriptClick(script.slug)}> + handleScriptClick(script.slug)} + > -
- {script.name} -
-

{script.name}

-

Created at: {script.date_created || "No date available"}

-

- {truncateDescription(script.description || "No description available.")} -

-
-
-
- CPU: {script.install_methods[0]?.resources.cpu || "N/A"}vCPU | RAM: {script.install_methods[0]?.resources.ram || "N/A"}MB | HDD: {script.install_methods[0]?.resources.hdd || "N/A"}GB +
+

{script.name}

+ {formattedBadge(script.type || "misc")}
+

+ Created at: {script.date_created || "No date available"} +

+

+ {truncateDescription(script.description || "No description available.")} +

+ {renderResources(script)} ))}
+ + {/* Back to Categories Button */} +
+ +
) : (
-
-

Categories

+ {/* Categories Grid */} +
+

Categories

- {categories.reduce((acc, cat) => acc + (cat.scripts?.length || 0), 0)} Total scripts + {new Set(categories.flatMap((cat) => cat.scripts.map((s) => s.slug))).size} Total scripts

-
- {categories.map((category) => ( +
+ {categories.map((category, index) => ( handleCategoryClick(category)} - className="cursor-pointer hover:shadow-lg flex flex-col items-center justify-center" + onClick={() => handleCategoryClick(index)} + className="cursor-pointer hover:shadow-lg flex flex-col items-center justify-center py-6" > -
- {category.scripts && category.scripts.slice(0, 4).map((script, index) => ( - {script.name - ))} +

{category.name}

+
+ + {category.scripts && + category.scripts + .slice(logoIndices[category.name] || 0, (logoIndices[category.name] || 0) + MAX_LOGOS) + .map((script, i) => ( + {script.name { + e.stopPropagation(); + handleScriptClick(script.slug); + }} + /> + ))} +
-

{category.name}

-

+

{(category as any).description || "No description available."}

@@ -131,4 +254,4 @@ const CategoryView = () => { ); }; -export default CategoryView; \ No newline at end of file +export default CategoryView; diff --git a/install/calibre-web-install.sh b/install/calibre-web-install.sh index 1cff7bf0..a091fb41 100644 --- a/install/calibre-web-install.sh +++ b/install/calibre-web-install.sh @@ -35,6 +35,7 @@ msg_ok "Installed Kepubify" msg_info "Installing Calibre-Web" mkdir -p /opt/calibre-web +$STD apt-get install -y calibre $STD wget https://github.com/janeczku/calibre-web/raw/master/library/metadata.db -P /opt/calibre-web $STD pip install calibreweb $STD pip install jsonschema diff --git a/install/jellyfin-install.sh b/install/jellyfin-install.sh index 3f3f1a61..038fa83b 100644 --- a/install/jellyfin-install.sh +++ b/install/jellyfin-install.sh @@ -51,6 +51,7 @@ EOF # Install Jellyfin using the metapackage (which will fetch jellyfin-server, jellyfin-web, and jellyfin-ffmpeg5) $STD apt-get update $STD apt-get install -y jellyfin +sed -i 's/"MinimumLevel": "Information"/"MinimumLevel": "Error"/g' /etc/jellyfin/logging.json chown -R jellyfin:adm /etc/jellyfin sleep 10 systemctl restart jellyfin diff --git a/install/openhab-install.sh b/install/openhab-install.sh index 37c90316..675a30e6 100644 --- a/install/openhab-install.sh +++ b/install/openhab-install.sh @@ -21,13 +21,13 @@ $STD apt-get install -y gnupg $STD apt-get install -y apt-transport-https msg_ok "Installed Dependencies" -msg_info "Installing Azul Zulu" +msg_info "Installing Azul Zulu21" wget -qO /etc/apt/trusted.gpg.d/zulu-repo.asc "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xB1998361219BD9C9" wget -q https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb $STD dpkg -i zulu-repo_1.0.0-3_all.deb $STD apt-get update -$STD apt-get -y install zulu17-jdk -msg_ok "Installed Azul Zulu" +$STD apt-get -y install zulu21-jdk +msg_ok "Installed Azul Zulu21" msg_info "Installing openHAB" curl -fsSL "https://openhab.jfrog.io/artifactory/api/gpg/key/public" | gpg --dearmor >openhab.gpg diff --git a/install/sqlserver2022-install.sh b/install/sqlserver2022-install.sh index 82ceeec9..7e06fe03 100644 --- a/install/sqlserver2022-install.sh +++ b/install/sqlserver2022-install.sh @@ -33,6 +33,7 @@ msg_ok "Setup Server 2022" msg_info "Installing SQL Server Tools" export DEBIAN_FRONTEND=noninteractive +export ACCEPT_EULA=Y curl https://packages.microsoft.com/keys/microsoft.asc | tee /etc/apt/trusted.gpg.d/microsoft.asc curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list | tee /etc/apt/sources.list.d/mssql-release.list $STD apt-get update diff --git a/json/archlinux-vm.json b/json/archlinux-vm.json new file mode 100644 index 00000000..ddd91067 --- /dev/null +++ b/json/archlinux-vm.json @@ -0,0 +1,39 @@ +{ + "name": "Arch Linux", + "slug": "archlinux-vm", + "categories": [ + 2 + ], + "date_created": "2025-01-27", + "type": "vm", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://raw.githubusercontent.com/ArchLinuxStudio/ArchLinuxTutorial/refs/heads/master/docs/arch_seo.png", + "description": "Arch Linux is a highly customizable, independent Linux distribution that gives users complete control over their system. Known for its rolling release model, Arch Linux is always up-to-date with the latest software. It's favored by experienced users who appreciate its minimalist approach, demanding a hands-on installation and configuration process. This level of control and flexibility makes it a popular choice for those who want to tailor their Linux system to their exact needs.", + "install_methods": [ + { + "type": "default", + "script": "vm/archlinux-vm.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "doesnt work with lvm and lvmthin disks!", + "type": "warning" + } + ] +} diff --git a/json/metadata.json b/json/metadata.json index 78ac3e87..e25f0ee7 100644 --- a/json/metadata.json +++ b/json/metadata.json @@ -1,30 +1,30 @@ { "categories": [ - { "name": "Proxmox & Virtualization", "id": 1, "sort_order": 1.0 }, - { "name": "Operating Systems", "id": 2, "sort_order": 2.0 }, - { "name": "Containers & Docker", "id": 3, "sort_order": 3.0 }, - { "name": "Network & Firewall", "id": 4, "sort_order": 4.0 }, - { "name": "Adblock & DNS", "id": 5, "sort_order": 5.0 }, - { "name": "Authentication & Security", "id": 6, "sort_order": 6.0 }, - { "name": "Backup & Recovery", "id": 7, "sort_order": 7.0 }, - { "name": "Databases", "id": 8, "sort_order": 8.0 }, - { "name": "Monitoring & Analytics", "id": 9, "sort_order": 9.0 }, - { "name": "Dashboards & Frontends", "id": 10, "sort_order": 10.0 }, - { "name": "Files & Downloads", "id": 11, "sort_order": 11.0 }, - { "name": "Documents & Notes", "id": 12, "sort_order": 12.0 }, - { "name": "Media & Streaming", "id": 13, "sort_order": 13.0 }, - { "name": "*Arr Suite", "id": 14, "sort_order": 14.0 }, - { "name": "NVR & Cameras", "id": 15, "sort_order": 15.0 }, - { "name": "IoT & Smart Home", "id": 16, "sort_order": 16.0 }, - { "name": "ZigBee, Z-Wave & Matter", "id": 17, "sort_order": 17.0 }, - { "name": "MQTT & Messaging", "id": 18, "sort_order": 18.0 }, - { "name": "Automation & Scheduling", "id": 19, "sort_order": 19.0 }, - { "name": "AI / Coding & Dev-Tools", "id": 20, "sort_order": 20.0 }, - { "name": "Webservers & Proxies", "id": 21, "sort_order": 21.0 }, - { "name": "Bots & ChatOps", "id": 22, "sort_order": 22.0 }, - { "name": "Finance & Budgeting", "id": 23, "sort_order": 23.0 }, - { "name": "Gaming & Leisure", "id": 24, "sort_order": 24.0 }, - { "name": "Business & ERP", "id": 25, "sort_order": 25.0 }, - { "name": "Miscellaneous", "id": 0, "sort_order": 99.0 } + { "name": "Proxmox & Virtualization", "id": 1, "sort_order": 1.0, "description": "Tools and scripts to manage Proxmox VE and virtualization platforms effectively." }, + { "name": "Operating Systems", "id": 2, "sort_order": 2.0, "description": "Scripts for deploying and managing various operating systems." }, + { "name": "Containers & Docker", "id": 3, "sort_order": 3.0, "description": "Solutions for containerization using Docker and related technologies." }, + { "name": "Network & Firewall", "id": 4, "sort_order": 4.0, "description": "Enhance network security and configure firewalls with ease." }, + { "name": "Adblock & DNS", "id": 5, "sort_order": 5.0, "description": "Optimize your network with DNS and ad-blocking solutions." }, + { "name": "Authentication & Security", "id": 6, "sort_order": 6.0, "description": "Secure your infrastructure with authentication and security tools." }, + { "name": "Backup & Recovery", "id": 7, "sort_order": 7.0, "description": "Reliable backup and recovery scripts to protect your data." }, + { "name": "Databases", "id": 8, "sort_order": 8.0, "description": "Deploy and manage robust database systems with ease." }, + { "name": "Monitoring & Analytics", "id": 9, "sort_order": 9.0, "description": "Monitor system performance and analyze data seamlessly." }, + { "name": "Dashboards & Frontends", "id": 10, "sort_order": 10.0, "description": "Create interactive dashboards and user-friendly frontends." }, + { "name": "Files & Downloads", "id": 11, "sort_order": 11.0, "description": "Manage file sharing and downloading solutions efficiently." }, + { "name": "Documents & Notes", "id": 12, "sort_order": 12.0, "description": "Organize and manage documents and note-taking tools." }, + { "name": "Media & Streaming", "id": 13, "sort_order": 13.0, "description": "Stream and manage media effortlessly across devices." }, + { "name": "*Arr Suite", "id": 14, "sort_order": 14.0, "description": "Automated media management with the popular *Arr suite tools." }, + { "name": "NVR & Cameras", "id": 15, "sort_order": 15.0, "description": "Manage network video recorders and camera setups." }, + { "name": "IoT & Smart Home", "id": 16, "sort_order": 16.0, "description": "Control and automate IoT devices and smart home systems." }, + { "name": "ZigBee, Z-Wave & Matter", "id": 17, "sort_order": 17.0, "description": "Solutions for ZigBee, Z-Wave, and Matter-based device management." }, + { "name": "MQTT & Messaging", "id": 18, "sort_order": 18.0, "description": "Set up reliable messaging and MQTT-based communication systems." }, + { "name": "Automation & Scheduling", "id": 19, "sort_order": 19.0, "description": "Automate tasks and manage scheduling with powerful tools." }, + { "name": "AI / Coding & Dev-Tools", "id": 20, "sort_order": 20.0, "description": "Leverage AI and developer tools for smarter coding workflows." }, + { "name": "Webservers & Proxies", "id": 21, "sort_order": 21.0, "description": "Deploy and configure web servers and proxy solutions." }, + { "name": "Bots & ChatOps", "id": 22, "sort_order": 22.0, "description": "Enhance collaboration with bots and ChatOps integrations." }, + { "name": "Finance & Budgeting", "id": 23, "sort_order": 23.0, "description": "Track expenses and manage budgets efficiently." }, + { "name": "Gaming & Leisure", "id": 24, "sort_order": 24.0, "description": "Scripts for gaming servers and leisure-related tools." }, + { "name": "Business & ERP", "id": 25, "sort_order": 25.0, "description": "Streamline business operations with ERP and management tools." }, + { "name": "Miscellaneous", "id": 0, "sort_order": 99.0, "description": "General scripts and tools that don't fit into other categories." } ] } diff --git a/json/openhab.json b/json/openhab.json index 7c5364ef..1eadbc92 100644 --- a/json/openhab.json +++ b/json/openhab.json @@ -8,8 +8,8 @@ "type": "ct", "updateable": false, "privileged": false, - "interface_port": 8080, - "documentation": null, + "interface_port": 8443, + "documentation": "https://www.openhab.org/docs/", "website": "https://www.openhab.org/", "logo": "https://www.coxprod.org/domotique/wp-content/uploads/2019/01/openhab-logo-square.png", "description": "openHAB is a popular open-source home automation platform that provides a vendor and technology agnostic solution for integrating and automating various smart home devices and services. It supports a wide range of devices and protocols, making it easy to bring together different systems and devices into a unified smart home ecosystem. With its user-friendly interface and powerful automation capabilities, openHAB makes it easy to create custom automations and monitor and control your smart home devices and systems, all from a single interface.", @@ -31,4 +31,4 @@ "password": null }, "notes": [] -} \ No newline at end of file +} diff --git a/json/the-lounge.json b/json/the-lounge.json index 46c86554..a504bea0 100644 --- a/json/the-lounge.json +++ b/json/the-lounge.json @@ -32,7 +32,7 @@ }, "notes": [ { - "text": "The Lounge is running in private mode. Use `sudo -u thelounge thelounge add name` to create users.", + "text": "The Lounge is running in private mode. Use `runuser -u thelounge -- thelounge add usernamehere` to create users.", "type": "info" } ] diff --git a/misc/post-pmg-install.sh b/misc/post-pmg-install.sh index d29fbf2a..c5f4ed30 100644 --- a/misc/post-pmg-install.sh +++ b/misc/post-pmg-install.sh @@ -120,8 +120,11 @@ EOF yes) whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58 msg_info "Disabling subscription nag" + # Normal GUI: echo "DPkg::Post-Invoke { \"dpkg -V proxmox-widget-toolkit | grep -q '/proxmoxlib\.js$'; if [ \$? -eq 1 ]; then { echo 'Removing subscription nag from UI...'; sed -i '/data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; }; fi\"; };" >/etc/apt/apt.conf.d/no-nag-script - apt --reinstall install proxmox-widget-toolkit &>/dev/null + # JS-Library used when accessing via mobile device browser + echo "DPkg::Post-Invoke { \"dpkg -V pmg-gui | grep -q '/pmgmanagerlib-mobile\.js$'; if [ \$? -eq 1 ]; then { echo 'Removing subscription nag from Mobile UI...'; sed -i '/data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js; }; fi\"; };" >/etc/apt/apt.conf.d/no-nag-script + apt --reinstall install proxmox-widget-toolkit pmg-gui &>/dev/null msg_ok "Disabled subscription nag (Delete browser cache)" ;; no) diff --git a/vm/archlinux-vm.sh b/vm/archlinux-vm.sh new file mode 100644 index 00000000..6f08a002 --- /dev/null +++ b/vm/archlinux-vm.sh @@ -0,0 +1,497 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +function header_info { + clear + cat <<"EOF" + ___ __ __ _ _ ____ ___ + / | __________/ /_ / / (_)___ __ ___ __ | | / / |/ / + / /| | / ___/ ___/ __ \ / / / / __ \/ / / / |/_/ | | / / /|_/ / + / ___ |/ / / /__/ / / / / /___/ / / / / /_/ /> < | |/ / / / / +/_/ |_/_/ \___/_/ /_/ /_____/_/_/ /_/\__,_/_/|_| |___/_/ /_/ + +EOF +} +header_info +echo -e "\n Loading..." +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +NEXTID=$(pvesh get /cluster/nextid) + +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") + +CL=$(echo "\033[m") +BOLD=$(echo "\033[1m") +BFR="\\r\\033[K" +HOLD=" " +TAB=" " + +CM="${TAB}✔️${TAB}${CL}" +CROSS="${TAB}✖️${TAB}${CL}" +INFO="${TAB}💡${TAB}${CL}" +OS="${TAB}🖥️${TAB}${CL}" +CONTAINERTYPE="${TAB}📦${TAB}${CL}" +DISKSIZE="${TAB}💾${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}🛠️${TAB}${CL}" +CONTAINERID="${TAB}🆔${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}🌉${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}⚙️${TAB}${CL}" +MACADDRESS="${TAB}🔗${TAB}${CL}" +VLANTAG="${TAB}🏷️${TAB}${CL}" +CREATING="${TAB}🚀${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" + +THIN="discard=on,ssd=1," +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +function error_handler() { + local exit_code="$?" + local line_number="$1" + local command="$2" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + echo -e "\n$error_message\n" + cleanup_vmid +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + popd >/dev/null + rm -rf $TEMP_DIR +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Arch Linux VM" --yesno "This will create a New Arch Linux VM. Proceed?" 10 58; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR}${CM}${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" +} + +function check_root() { + if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then + clear + msg_error "Please run this script as root." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +function pve_check() { + if ! pveversion | grep -Eq "pve-manager/8.[1-3]"; then + msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported" + echo -e "Requires Proxmox Virtual Environment Version 8.1 or later." + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + exit +} + +function default_settings() { + VMID="$NEXTID" + FORMAT=",efitype=4m" + MACHINE="" + DISK_SIZE="4G" + DISK_CACHE="" + HN="arch-linux" + CPU_TYPE="" + CORE_COUNT="1" + RAM_SIZE="1024" + BRG="vmbr0" + MAC="$GEN_MAC" + VLAN="" + MTU="" + START_VM="yes" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Arch Linux VM using the above default settings${CL}" +} + +function advanced_settings() { + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID="$NEXTID" + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit-script + fi + done + + if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ + "i440fx" "Machine i440fx" ON \ + "q35" "Machine q35" OFF \ + 3>&1 1>&2 2>&3); then + if [ $MACH = q35 ]; then + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT="" + MACHINE=" -machine q35" + else + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT=",efitype=4m" + MACHINE="" + fi + else + exit-script + fi + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" + exit-script + fi + else + exit-script + fi + + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "None (Default)" ON \ + "1" "Write Through" OFF \ + 3>&1 1>&2 2>&3); then + if [ $DISK_CACHE = "1" ]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" + DISK_CACHE="cache=writethrough," + else + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + DISK_CACHE="" + fi + else + exit-script + fi + + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 arch-linux --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VM_NAME ]; then + HN="arch-linux" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + else + HN=$(echo ${VM_NAME,,} | tr -d ' ') + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + fi + else + exit-script + fi + + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "KVM64 (Default)" ON \ + "1" "Host" OFF \ + 3>&1 1>&2 2>&3); then + if [ $CPU_TYPE1 = "1" ]; then + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + CPU_TYPE=" -cpu host" + else + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + fi + else + exit-script + fi + + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $CORE_COUNT ]; then + CORE_COUNT="2" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + else + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + fi + else + exit-script + fi + + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $RAM_SIZE ]; then + RAM_SIZE="2048" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + else + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + fi + else + exit-script + fi + + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $BRG ]; then + BRG="vmbr0" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + else + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + fi + else + exit-script + fi + + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC1 ]; then + MAC="$GEN_MAC" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" + else + MAC="$MAC1" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" + fi + else + exit-script + fi + + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VLAN1 ]; then + VLAN1="Default" + VLAN="" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + else + VLAN=",tag=$VLAN1" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + fi + else + exit-script + fi + + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MTU1 ]; then + MTU1="Default" + MTU="" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + else + MTU=",mtu=$MTU1" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + fi + else + exit-script + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Arch Linux VM?" --no-button Do-Over 10 58); then + echo -e "${CREATING}${BOLD}${DGN}Creating a Arch Linux VM using the above advanced settings${CL}" + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +check_root +arch_check +pve_check +ssh_check +start_script + +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo $line | awk '{print $1}') + TYPE=$(echo $line | awk '{printf "%-10s", $2}') + FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + msg_error "Unable to detect a valid storage location." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + while [ -z "${STORAGE:+x}" ]; do + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "Which storage pool you would like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." +msg_info "Retrieving the URL for the Arch Linux .iso File" +URL=https://geo.mirror.pkgbuild.com/iso/latest/archlinux-x86_64.iso +sleep 2 +msg_ok "${CL}${BL}${URL}${CL}" +wget -q --show-progress $URL +echo -en "\e[1A\e[0K" +FILE=$(basename $URL) +msg_ok "Downloaded ${CL}${BL}${FILE}${CL}" + +STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') +case $STORAGE_TYPE in +nfs | dir | cifs) + DISK_EXT=".qcow2" + DISK_REF="$VMID/" + DISK_IMPORT="-format qcow2" + THIN="" + ;; +btrfs) + DISK_EXT=".raw" + DISK_REF="$VMID/" + DISK_IMPORT="-format raw" + FORMAT=",efitype=4m" + THIN="" + ;; +esac +for i in {0,1}; do + disk="DISK$i" + eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-} + eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk} +done + +msg_info "Creating a Arch Linux VM" +qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ + -name $HN -tags community-scripts -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci +pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null +qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null +qm set $VMID \ + -efidisk0 ${DISK0_REF}${FORMAT} \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \ + -ide2 ${STORAGE}:cloudinit \ + -boot order=scsi0 \ + -serial0 socket >/dev/null +DESCRIPTION=$( + cat < + + Logo + + +

Arch Linux VM

+ +

+ + spend Coffee + +

+ + + + GitHub + + + + Discussions + + + + Issues + +
+EOF +) +qm set "$VMID" -description "$DESCRIPTION" >/dev/null +if [ -n "$DISK_SIZE" ]; then + msg_info "Resizing disk to $DISK_SIZE GB" + qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null +else + msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB" + qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null +fi + +msg_ok "Created a Arch Linux VM ${CL}${BL}(${HN})" +if [ "$START_VM" == "yes" ]; then + msg_info "Starting Arch Linux VM" + qm start $VMID + msg_ok "Started Arch Linux VM" +fi + +msg_ok "Completed Successfully!\n"