diff --git a/.github/DISCUSSION_TEMPLATE/request-script.yml b/.github/DISCUSSION_TEMPLATE/request-script.yml index 44ed9b147..2498b677c 100644 --- a/.github/DISCUSSION_TEMPLATE/request-script.yml +++ b/.github/DISCUSSION_TEMPLATE/request-script.yml @@ -1,4 +1,4 @@ -title: "[Script request] " +title: "[Script request]: " labels: ["enhancement"] body: - type: input diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index c38d4d6e9..fb99322a1 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,11 +1,11 @@ blank_issues_enabled: false contact_links: - - name: 🤔 Questions and Help - url: https://github.com/community-scripts/ProxmoxVE/discussions - about: For suggestions or questions, please use the Discussions section. - name: 🌟 new Script request url: https://github.com/community-scripts/ProxmoxVE/discussions/new?category=request-script about: For feature/script requests, please use the Discussions section. + - name: 🤔 Questions and Help + url: https://github.com/community-scripts/ProxmoxVE/discussions + about: For suggestions or questions, please use the Discussions section. - name: 💻 Discord url: https://discord.gg/UHrpNWGwkH about: Join our Discord server to chat with other users in the Proxmox Helper Scripts community. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 7f065275f..036904e38 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,5 +1,5 @@ name: "✨ Feature Request" -description: "Suggest a new feature or enhancement." +description: "Suggest a new feature or enhancement. (not for script requests)" labels: ["enhancement"] body: - type: markdown diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index d669ec78a..c21dca057 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -12,14 +12,5 @@ Before this PR can be reviewed, the following must be completed: - [] **Self-review performed** – Code follows established patterns and conventions. - [] **Testing performed** – Changes have been thoroughly tested and verified. -## 🛠️ Type of Change - -Select all that apply: - -- [] 🆕 **New script** – A fully functional and tested script or script set. -- [] 🐞 **Bug fix** – Resolves an issue without breaking functionality. -- [] ✨ **New feature** – Adds new, non-breaking functionality. -- [] 💥 **Breaking change** – Alters existing functionality in a way that may require updates. - ## 📋 Additional Information (optional) diff --git a/.gitignore b/.gitignore index de83e526a..0add16fed 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,4 @@ json/.vscode/ # Ignore repository metadata or Git itself .git/ .gitignore +.vscode/settings.json diff --git a/CHANGELOG.md b/CHANGELOG.md index ed11f62fc..4f0209237 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,11 +14,76 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-04-19 + +### 🆕 New Scripts + + - LXC Iptag [@DesertGamer](https://github.com/DesertGamer) ([#3531](https://github.com/community-scripts/ProxmoxVE/pull/3531)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - seelf: Add missing gpg dependency [@tremor021](https://github.com/tremor021) ([#3953](https://github.com/community-scripts/ProxmoxVE/pull/3953)) + +### 🌐 Website + + - #### 📝 Script Information + + - Tailscale: Clarify tailscale script instruction on website [@tremor021](https://github.com/tremor021) ([#3952](https://github.com/community-scripts/ProxmoxVE/pull/3952)) + +## 2025-04-18 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Changedetection: Increase connection timeout for older systems [@tremor021](https://github.com/tremor021) ([#3935](https://github.com/community-scripts/ProxmoxVE/pull/3935)) + +### 🌐 Website + + - #### 📝 Script Information + + - VaultWarden: Update json with additonal information [@uSlackr](https://github.com/uSlackr) ([#3929](https://github.com/community-scripts/ProxmoxVE/pull/3929)) + +## 2025-04-17 + +### 🚀 Updated Scripts + + - fix minor grammatical error in several scripts [@jordanpatton](https://github.com/jordanpatton) ([#3921](https://github.com/community-scripts/ProxmoxVE/pull/3921)) + + - #### 🐞 Bug Fixes + + - PeaNUT: Fix tar command [@tremor021](https://github.com/tremor021) ([#3925](https://github.com/community-scripts/ProxmoxVE/pull/3925)) + - GoMFT: Fix install and update process (final time) [@tremor021](https://github.com/tremor021) ([#3922](https://github.com/community-scripts/ProxmoxVE/pull/3922)) + +## 2025-04-15 + +### 🚀 Updated Scripts + + - [core] remove unneeded vars from shellcheck [@MickLesk](https://github.com/MickLesk) ([#3899](https://github.com/community-scripts/ProxmoxVE/pull/3899)) + + - #### 🐞 Bug Fixes + + - Outline: Installation and update fixes [@tremor021](https://github.com/tremor021) ([#3895](https://github.com/community-scripts/ProxmoxVE/pull/3895)) + - SABnzbd: Fix update error caused by externaly managed message [@tremor021](https://github.com/tremor021) ([#3892](https://github.com/community-scripts/ProxmoxVE/pull/3892)) + +### 🧰 Maintenance + + - #### 📡 API + + - Bump golang.org/x/crypto from 0.32.0 to 0.35.0 in /api [@dependabot[bot]](https://github.com/dependabot[bot]) ([#3887](https://github.com/community-scripts/ProxmoxVE/pull/3887)) + + - #### 📂 Github + + - shrink & minimalize report templates [@MickLesk](https://github.com/MickLesk) ([#3902](https://github.com/community-scripts/ProxmoxVE/pull/3902)) + ## 2025-04-14 ### 🆕 New Scripts - - Alpine-AdGuardHome [@MickLesk](https://github.com/MickLesk) ([#3875](https://github.com/community-scripts/ProxmoxVE/pull/3875)) + - openziti-controller ([#3880](https://github.com/community-scripts/ProxmoxVE/pull/3880)) +- Alpine-AdGuardHome [@MickLesk](https://github.com/MickLesk) ([#3875](https://github.com/community-scripts/ProxmoxVE/pull/3875)) ### 🚀 Updated Scripts diff --git a/api/go.mod b/api/go.mod index 0297b1a4f..9a800e283 100644 --- a/api/go.mod +++ b/api/go.mod @@ -2,31 +2,22 @@ module proxmox-api go 1.23.2 -require go.mongodb.org/mongo-driver v1.17.2 +require ( + github.com/gorilla/mux v1.8.1 + github.com/joho/godotenv v1.5.1 + github.com/rs/cors v1.11.1 + go.mongodb.org/mongo-driver v1.17.2 +) require ( - filippo.io/edwards25519 v1.1.0 // indirect - github.com/go-sql-driver/mysql v1.8.1 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/gorilla/mux v1.8.1 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/jackc/pgx/v5 v5.7.2 // indirect - github.com/jackc/puddle/v2 v2.2.2 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.5 // indirect - github.com/joho/godotenv v1.5.1 // indirect github.com/klauspost/compress v1.16.7 // indirect github.com/montanaflynn/stats v0.7.1 // indirect - github.com/rs/cors v1.11.1 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect - golang.org/x/crypto v0.32.0 // indirect - golang.org/x/sync v0.10.0 // indirect - golang.org/x/text v0.21.0 // indirect - gorm.io/driver/mysql v1.5.7 // indirect - gorm.io/driver/postgres v1.5.11 // indirect - gorm.io/gorm v1.25.12 // indirect + golang.org/x/crypto v0.35.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/text v0.22.0 // indirect ) diff --git a/api/go.sum b/api/go.sum index ea649ff6b..f0a92be40 100644 --- a/api/go.sum +++ b/api/go.sum @@ -1,37 +1,19 @@ -filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= -filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= -github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= -github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.7.2 h1:mLoDLV6sonKlvjIEsV56SkWNCnuNv531l94GaIzO+XI= -github.com/jackc/pgx/v5 v5.7.2/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= -github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= -github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= -github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= @@ -45,16 +27,16 @@ go.mongodb.org/mongo-driver v1.17.2 h1:gvZyk8352qSfzyZ2UMWcpDpMSGEr1eqE4T793Sqyh go.mongodb.org/mongo-driver v1.17.2/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -66,18 +48,9 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= -gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= -gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314= -gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= -gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= -gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= -gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= diff --git a/ct/alpine-wireguard.sh b/ct/alpine-wireguard.sh index ebf2b9d91..1f0d44acf 100644 --- a/ct/alpine-wireguard.sh +++ b/ct/alpine-wireguard.sh @@ -31,7 +31,7 @@ function update_script() { if [[ -d /etc/wgdashboard/src ]]; then msg_info "update WGDashboard" - cd /etc/wgdashboard/src || exit + cd /etc/wgdashboard/src $STD echo "y" | ./wgd.sh update $STD ./wgd.sh start msg_ok "WGDashboard updated" diff --git a/ct/bookstack.sh b/ct/bookstack.sh index f8ae1c635..40ff8f808 100644 --- a/ct/bookstack.sh +++ b/ct/bookstack.sh @@ -42,7 +42,7 @@ function update_script() { cp -r /opt/bookstack-backup/public/uploads/* /opt/bookstack/public/uploads/ || true cp -r /opt/bookstack-backup/storage/uploads/* /opt/bookstack/storage/uploads/ || true cp -r /opt/bookstack-backup/themes/* /opt/bookstack/themes/ || true - cd /opt/bookstack || exit + cd /opt/bookstack export COMPOSER_ALLOW_SUPERUSER=1 $STD composer install --no-dev $STD php artisan migrate --force diff --git a/ct/create_lxc.sh b/ct/create_lxc.sh index 7c1c2d4bf..03979b719 100644 --- a/ct/create_lxc.sh +++ b/ct/create_lxc.sh @@ -146,7 +146,7 @@ function select_storage() { local STORAGE 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 the ${CONTENT_LABEL,,}?\nTo make a selection, use the Spacebar.\n" \ + "Which storage pool would you like to use for the ${CONTENT_LABEL,,}?\nTo make a selection, use the Spacebar.\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ "${MENU[@]}" 3>&1 1>&2 2>&3) || { msg_error "Menu aborted." @@ -199,11 +199,11 @@ if qm status "$CTID" &>/dev/null || pct status "$CTID" &>/dev/null; then fi # Get template storage -TEMPLATE_STORAGE=$(select_storage template) || exit +TEMPLATE_STORAGE=$(select_storage template) msg_ok "Using ${BL}$TEMPLATE_STORAGE${CL} ${GN}for Template Storage." # Get container storage -CONTAINER_STORAGE=$(select_storage container) || exit +CONTAINER_STORAGE=$(select_storage container) msg_ok "Using ${BL}$CONTAINER_STORAGE${CL} ${GN}for Container Storage." # Get LXC template string @@ -297,4 +297,4 @@ if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[ exit 209 fi fi -msg_ok "LXC Container ${BL}$CTID${CL} ${GN}was successfully created." \ No newline at end of file +msg_ok "LXC Container ${BL}$CTID${CL} ${GN}was successfully created." diff --git a/ct/fenrus.sh b/ct/fenrus.sh index 8f607a26c..0f4448c7e 100644 --- a/ct/fenrus.sh +++ b/ct/fenrus.sh @@ -32,7 +32,7 @@ function update_script() { msg_info "Updating ${APP}" systemctl stop ${APP} git clone https://github.com/revenz/Fenrus.git - cd Fenrus || exit + cd Fenrus gitVersionNumber=$(git rev-parse HEAD) if [[ "${gitVersionNumber}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then diff --git a/ct/gomft.sh b/ct/gomft.sh index 7d9ec8f00..e13ecf7f3 100644 --- a/ct/gomft.sh +++ b/ct/gomft.sh @@ -50,12 +50,9 @@ function update_script() { curl -fsSL "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" tar -xzf "$temp_file" cp -rf "GoMFT-${RELEASE}"/* /opt/gomft/ - cd /opt/gomft || exit - rm -rf /opt/gomft/node_modules - $STD npm ci - $STD node build.js - $STD go mod download - $STD go get -u github.com/a-h/templ + cd /opt/gomft + $STD npm install + $STD npm run build $STD "$HOME"/go/bin/templ generate export CGO_ENABLED=1 export GOOS=linux diff --git a/ct/heimdall-dashboard.sh b/ct/heimdall-dashboard.sh index 1435e0a5f..d26fbeb81 100644 --- a/ct/heimdall-dashboard.sh +++ b/ct/heimdall-dashboard.sh @@ -43,14 +43,14 @@ function update_script() { tar xzf "${RELEASE}".tar.gz VER=$(curl -fsSL https://api.github.com/repos/linuxserver/Heimdall/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') cp -R Heimdall-"${VER}"/* /opt/Heimdall - cd /opt/Heimdall || exit + cd /opt/Heimdall $STD apt-get install -y composer export COMPOSER_ALLOW_SUPERUSER=1 $STD composer dump-autoload echo "${RELEASE}" >/opt/${APP}_version.txt msg_ok "Updated Heimdall Dashboard to ${RELEASE}" msg_info "Restoring Data" - cd ~ || exit + cd ~ cp -R database-backup/* /opt/Heimdall/database cp -R public-backup/* /opt/Heimdall/public sleep 1 diff --git a/ct/hoarder.sh b/ct/hoarder.sh index 6ff88b7d2..7c00837f3 100644 --- a/ct/hoarder.sh +++ b/ct/hoarder.sh @@ -40,7 +40,7 @@ function update_script() { if [[ "${PREV_RELEASE}" < 0.23.0 ]]; then $STD apt-get install -y graphicsmagick ghostscript fi - cd /opt || exit + cd /opt if [[ -f /opt/hoarder/.env ]] && [[ ! -f /etc/hoarder/hoarder.env ]]; then mkdir -p /etc/hoarder mv /opt/hoarder/.env /etc/hoarder/hoarder.env @@ -49,14 +49,14 @@ function update_script() { curl -fsSL "https://github.com/hoarder-app/hoarder/archive/refs/tags/v${RELEASE}.zip" -o "v${RELEASE}.zip" unzip -q v"${RELEASE}".zip mv karakeep-"${RELEASE}" /opt/hoarder - cd /opt/hoarder/apps/web || exit + cd /opt/hoarder/apps/web $STD pnpm install --frozen-lockfile $STD pnpm exec next build --experimental-build-mode compile cp -r /opt/hoarder/apps/web/.next/standalone/apps/web/server.js /opt/hoarder/apps/web - cd /opt/hoarder/apps/workers || exit + cd /opt/hoarder/apps/workers $STD pnpm install --frozen-lockfile export DATA_DIR=/opt/hoarder_data - cd /opt/hoarder/packages/db || exit + cd /opt/hoarder/packages/db $STD pnpm migrate sed -i "s/SERVER_VERSION=${PREV_RELEASE}/SERVER_VERSION=${RELEASE}/" /etc/hoarder/hoarder.env msg_ok "Updated ${APP} to v${RELEASE}" diff --git a/ct/karakeep.sh b/ct/karakeep.sh index e8d911bb7..f876fde4a 100644 --- a/ct/karakeep.sh +++ b/ct/karakeep.sh @@ -40,7 +40,7 @@ function update_script() { if [[ "${PREV_RELEASE}" < 0.23.0 ]]; then $STD apt-get install -y graphicsmagick ghostscript fi - cd /opt || exit + cd /opt if [[ -f /opt/karakeep/.env ]] && [[ ! -f /etc/karakeep/karakeep.env ]]; then mkdir -p /etc/karakeep mv /opt/karakeep/.env /etc/karakeep/karakeep.env @@ -49,14 +49,14 @@ function update_script() { curl -fsSL "https://github.com/karakeep-app/karakeep/archive/refs/tags/v${RELEASE}.zip" -o "v${RELEASE}.zip" unzip -q "v${RELEASE}.zip" mv karakeep-"${RELEASE}" /opt/karakeep - cd /opt/karakeep/apps/web || exit + cd /opt/karakeep/apps/web $STD pnpm install --frozen-lockfile $STD pnpm exec next build --experimental-build-mode compile cp -r /opt/karakeep/apps/web/.next/standalone/apps/web/server.js /opt/karakeep/apps/web - cd /opt/karakeep/apps/workers || exit + cd /opt/karakeep/apps/workers $STD pnpm install --frozen-lockfile export DATA_DIR=/opt/karakeep_data - cd /opt/karakeep/packages/db || exit + cd /opt/karakeep/packages/db $STD pnpm migrate sed -i "s/SERVER_VERSION=${PREV_RELEASE}/SERVER_VERSION=${RELEASE}/" /etc/karakeep/karakeep.env msg_ok "Updated ${APP} to v${RELEASE}" diff --git a/ct/kimai.sh b/ct/kimai.sh index 3d66f78da..5e765b3bc 100644 --- a/ct/kimai.sh +++ b/ct/kimai.sh @@ -66,7 +66,7 @@ function update_script() { [ -f "$BACKUP_DIR/.env" ] && cp "$BACKUP_DIR/.env" /opt/kimai/ [ -f "$BACKUP_DIR/local.yaml" ] && cp "$BACKUP_DIR/local.yaml" /opt/kimai/config/packages/ rm -rf "$BACKUP_DIR" - cd /opt/kimai || exit + cd /opt/kimai $STD composer install --no-dev --optimize-autoloader $STD bin/console kimai:update echo "${RELEASE}" >/opt/${APP}_version.txt diff --git a/ct/nginxproxymanager.sh b/ct/nginxproxymanager.sh index 879ad2c39..1e7dd1193 100644 --- a/ct/nginxproxymanager.sh +++ b/ct/nginxproxymanager.sh @@ -52,7 +52,7 @@ function update_script() { msg_info "Downloading NPM v${RELEASE}" curl -fsSL "https://codeload.github.com/NginxProxyManager/nginx-proxy-manager/tar.gz/v${RELEASE}" | tar -xz - cd nginx-proxy-manager-"${RELEASE}" || exit + cd nginx-proxy-manager-"${RELEASE}" msg_ok "Downloaded NPM v${RELEASE}" msg_info "Setting up Enviroment" @@ -103,7 +103,7 @@ function update_script() { msg_ok "Setup Enviroment" msg_info "Building Frontend" - cd ./frontend || exit + cd ./frontend $STD pnpm install $STD pnpm upgrade $STD pnpm run build @@ -128,7 +128,7 @@ function update_script() { } EOF fi - cd /app || exit + cd /app $STD pnpm install msg_ok "Initialized Backend" diff --git a/ct/npmplus.sh b/ct/npmplus.sh index 3695d254b..9c6c115f4 100644 --- a/ct/npmplus.sh +++ b/ct/npmplus.sh @@ -28,27 +28,26 @@ function update_script() { header_info "$APP" case "$UPD" in - "1") - msg_info "Updating Alpine OS" - apk update && apk upgrade - msg_ok "System updated" - exit - ;; - "2") - msg_info "Updating NPMplus Container" - cd /opt || exit 1 - msg_info "Pulling latest container image" - $STD docker compose pull - msg_info "Recreating container" - $STD docker compose up -d - msg_ok "NPMplus container updated" - exit - ;; + "1") + msg_info "Updating Alpine OS" + apk update && apk upgrade + msg_ok "System updated" + exit + ;; + "2") + msg_info "Updating NPMplus Container" + cd /opt + msg_info "Pulling latest container image" + $STD docker compose pull + msg_info "Recreating container" + $STD docker compose up -d + msg_ok "NPMplus container updated" + exit + ;; esac exit 0 } - start build_container description @@ -56,4 +55,4 @@ 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}https://${IP}:81${CL}" \ No newline at end of file +echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:81${CL}" diff --git a/ct/omada.sh b/ct/omada.sh index e4711e182..6a1738339 100644 --- a/ct/omada.sh +++ b/ct/omada.sh @@ -8,7 +8,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/mis APP="Omada" var_tags="${var_tags:-tp-link;controller}" var_cpu="${var_cpu:-2}" -var_ram="${var_ram:-2048}" +var_ram="${var_ram:-3072}" var_disk="${var_disk:-8}" var_os="${var_os:-debian}" var_version="${var_version:-12}" @@ -53,17 +53,18 @@ function update_script() { fi msg_info "Updating Omada Controller" - latest_url=$(curl -fsSL "https://support.omadanetworks.com/en/download/software/omada-controller/" | grep -o 'https://static\.tp-link\.com/upload/software/[^"]*linux_x64[^"]*\.deb' | head -n 1) - latest_version=$(basename "$latest_url") - if [ -z "${latest_version}" ]; then - msg_error "It seems that the server (tp-link.com) might be down. Please try again at a later time." - exit + OMADA_URL=$(curl -fsSL "https://support.omadanetworks.com/en/download/software/omada-controller/" | + grep -o 'https://static\.tp-link\.com/upload/software/[^"]*linux_x64[^"]*\.deb' | + head -n1) + OMADA_PKG=$(basename "$OMADA_URL") + if [ -z "$OMADA_PKG" ]; then + msg_error "Could not retrieve Omada package – server may be down." + exit 1 fi - - curl -fsSL "${latest_url}" -O + curl -fsSL "$OMADA_URL" -o "$OMADA_PKG" export DEBIAN_FRONTEND=noninteractive - $STD dpkg -i ${latest_version} - rm -rf ${latest_version} + $STD dpkg -i "$OMADA_PKG" + rm -f "$OMADA_PKG" msg_ok "Updated Omada Controller" } diff --git a/ct/outline.sh b/ct/outline.sh index aed56a6f4..3cd6233a0 100644 --- a/ct/outline.sh +++ b/ct/outline.sh @@ -20,45 +20,48 @@ color catch_errors function update_script() { - header_info - check_container_storage - check_container_resources - if [[ ! -d /opt/outline ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - RELEASE=$(curl -fsSL https://api.github.com/repos/outline/outline/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then - msg_info "Stopping Services" - systemctl stop outline - msg_ok "Services Stopped" - - msg_info "Updating ${APP} to ${RELEASE}" - temp_file=$(mktemp) - rm -rf /opt/outline/node_modules -curl -fsSL "https://github.com/outline/outline/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" - tar zxf $temp_file - cp -rf outline-${RELEASE}/* /opt/outline - cd /opt/outline - export NODE_OPTIONS="--max-old-space-size=3584" - $STD yarn install --frozen-lockfile - $STD yarn build - echo "${RELEASE}" >/opt/${APP}_version.txt - msg_ok "Updated ${APP}" - - msg_info "Starting Services" - systemctl start outline - msg_ok "Started Services" - - msg_info "Cleaning Up" - rm -rf $temp_file - rm -rf $HOME/outline-${RELEASE} - msg_ok "Cleaned" - msg_ok "Updated Successfully" - else - msg_ok "No update required. ${APP} is already at ${RELEASE}" - fi + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/outline ]]; then + msg_error "No ${APP} Installation Found!" exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/outline/outline/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + msg_info "Stopping Services" + systemctl stop outline + msg_ok "Services Stopped" + + msg_info "Updating ${APP} to ${RELEASE}" + temp_file=$(mktemp) + cp /opt/outline/.env /opt + rm -rf /opt/outline + curl -fsSL "https://github.com/outline/outline/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" + tar zxf "$temp_file" + mv outline-"${RELEASE}" /opt/outline + cd /opt/outline + export NODE_ENV=development + export NODE_OPTIONS="--max-old-space-size=3584" + $STD yarn install --frozen-lockfile + $STD yarn build + mv /opt/.env /opt/outline + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ${APP}" + + msg_info "Starting Services" + systemctl start outline + msg_ok "Started Services" + + msg_info "Cleaning Up" + rm -rf "$temp_file" + rm -rf "$HOME"/outline-"${RELEASE}" + msg_ok "Cleaned" + msg_ok "Updated Successfully" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" + fi + exit } start @@ -68,4 +71,4 @@ 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}:3000${CL}" \ No newline at end of file +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/ct/paymenter.sh b/ct/paymenter.sh index 8c785c90a..3810393f5 100644 --- a/ct/paymenter.sh +++ b/ct/paymenter.sh @@ -47,7 +47,7 @@ function update_script() { if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then msg_info "Updating ${APP} to ${RELEASE}" echo "${RELEASE}" >/opt/${APP}_version.txt - cd /opt/paymenter || exit + cd /opt/paymenter $STD php artisan p:upgrade --no-interaction msg_ok "Updated Successfully" else diff --git a/ct/peanut.sh b/ct/peanut.sh index 888295961..6364ff3e4 100644 --- a/ct/peanut.sh +++ b/ct/peanut.sh @@ -32,7 +32,7 @@ function update_script() { msg_info "Updating $APP to ${RELEASE}" systemctl stop peanut curl -fsSL "https://api.github.com/repos/Brandawg93/PeaNUT/tarball/${RELEASE}" -o "peanut.tar.gz" - tar -xzf peanut.tar.gz -C /opt/peanut --strip-components 1 + tar -xzf peanut.tar.gz -C /opt/peanut --strip-components=1 rm peanut.tar.gz cd /opt/peanut $STD pnpm i diff --git a/ct/pelican-panel.sh b/ct/pelican-panel.sh index 32800d80e..c36ccf9a7 100644 --- a/ct/pelican-panel.sh +++ b/ct/pelican-panel.sh @@ -27,7 +27,7 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2) + CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2) if [[ "$CURRENT_PHP" != "8.4" ]]; then msg_info "Migrating PHP $CURRENT_PHP to 8.4" @@ -47,7 +47,7 @@ function update_script() { RELEASE=$(curl -fsSL https://api.github.com/repos/pelican-dev/panel/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then msg_info "Stopping Service" - cd /opt/pelican-panel || exit + cd /opt/pelican-panel $STD php artisan down msg_ok "Stopped Service" diff --git a/ct/pterodactyl-panel.sh b/ct/pterodactyl-panel.sh index 9496c43df..07456dd32 100644 --- a/ct/pterodactyl-panel.sh +++ b/ct/pterodactyl-panel.sh @@ -47,7 +47,7 @@ function update_script() { RELEASE=$(curl -fsSL https://api.github.com/repos/pterodactyl/panel/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then msg_info "Stopping Service" - cd /opt/pterodactyl-panel || exit + cd /opt/pterodactyl-panel $STD php artisan down msg_ok "Stopped Service" diff --git a/ct/sabnzbd.sh b/ct/sabnzbd.sh index aabfc4d5b..fd0c52fba 100644 --- a/ct/sabnzbd.sh +++ b/ct/sabnzbd.sh @@ -20,29 +20,30 @@ color catch_errors function update_script() { - header_info - check_container_storage - check_container_resources - if [[ ! -d /opt/sabnzbd ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - RELEASE=$(curl -fsSL https://api.github.com/repos/sabnzbd/sabnzbd/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then - msg_info "Updating $APP to ${RELEASE}" - systemctl stop sabnzbd.service - tar zxvf <(curl -fsSL https://github.com/sabnzbd/sabnzbd/releases/download/$RELEASE/SABnzbd-${RELEASE}-src.tar.gz) - cp -rf SABnzbd-${RELEASE}/* /opt/sabnzbd - rm -rf SABnzbd-${RELEASE} - cd /opt/sabnzbd - $STD python3 -m pip install -r requirements.txt - echo "${RELEASE}" >/opt/${APP}_version.txt - systemctl start sabnzbd.service - msg_ok "Updated ${APP} to ${RELEASE}" - else - msg_ok "No update required. ${APP} is already at ${RELEASE}" - fi - exit + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/sabnzbd ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/sabnzbd/sabnzbd/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + msg_info "Updating $APP to ${RELEASE}" + rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED + systemctl stop sabnzbd.service + tar zxvf <(curl -fsSL https://github.com/sabnzbd/sabnzbd/releases/download/$RELEASE/SABnzbd-${RELEASE}-src.tar.gz) + cp -rf SABnzbd-${RELEASE}/* /opt/sabnzbd + rm -rf SABnzbd-${RELEASE} + cd /opt/sabnzbd + $STD python3 -m pip install -r requirements.txt + echo "${RELEASE}" >/opt/${APP}_version.txt + systemctl start sabnzbd.service + msg_ok "Updated ${APP} to ${RELEASE}" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" + fi + exit } start diff --git a/ct/snipeit.sh b/ct/snipeit.sh index 73dca5364..015f80592 100644 --- a/ct/snipeit.sh +++ b/ct/snipeit.sh @@ -44,7 +44,7 @@ function update_script() { cp /opt/snipe-it-backup/.env /opt/snipe-it/.env cp -r /opt/snipe-it-backup/public/uploads/ /opt/snipe-it/public/uploads/ cp -r /opt/snipe-it-backup/storage/private_uploads /opt/snipe-it/storage/private_uploads - cd /opt/snipe-it/ || exit + cd /opt/snipe-it/ export COMPOSER_ALLOW_SUPERUSER=1 $STD composer install --no-dev --optimize-autoloader --no-interaction $STD composer dump-autoload diff --git a/ct/tandoor.sh b/ct/tandoor.sh index 5cf9d9830..81ba8fee2 100644 --- a/ct/tandoor.sh +++ b/ct/tandoor.sh @@ -36,15 +36,15 @@ function update_script() { else msg_info "Updating ${APP} (Patience)" export $(cat /opt/tandoor/.env | grep "^[^#]" | xargs) - cd /opt/tandoor/ || exit + cd /opt/tandoor/ $STD pip3 install -r requirements.txt $STD /usr/bin/python3 /opt/tandoor/manage.py migrate $STD /usr/bin/python3 /opt/tandoor/manage.py collectstatic --no-input $STD /usr/bin/python3 /opt/tandoor/manage.py collectstatic_js_reverse - cd /opt/tandoor/vue || exit + cd /opt/tandoor/vue $STD yarn install $STD yarn build - cd /opt/tandoor || exit + cd /opt/tandoor $STD python3 version.py systemctl restart gunicorn_tandoor msg_ok "Updated ${APP}" diff --git a/ct/zabbix.sh b/ct/zabbix.sh index bbac277f4..f0febae41 100644 --- a/ct/zabbix.sh +++ b/ct/zabbix.sh @@ -38,7 +38,7 @@ function update_script() { cp -R /usr/share/zabbix/ /opt/zabbix-backup/ #cp -R /usr/share/zabbix-* /opt/zabbix-backup/ Remove temporary rm -Rf /etc/apt/sources.list.d/zabbix.list - cd /tmp || exit + cd /tmp curl -fsSL "$(curl -fsSL https://repo.zabbix.com/zabbix/ | grep -oP '(?<=href=")[0-9]+\.[0-9]+(?=/")' | sort -V | tail -n1 | xargs -I{} echo "https://repo.zabbix.com/zabbix/{}/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian12_all.deb")" \ diff --git a/ct/zitadel.sh b/ct/zitadel.sh index e3c5d81e2..f4ad2b0ac 100644 --- a/ct/zitadel.sh +++ b/ct/zitadel.sh @@ -34,7 +34,7 @@ function update_script() { msg_ok "Stopped $APP" msg_info "Updating $APP to ${RELEASE}" - cd /tmp || exit + cd /tmp curl -fsSL "https://github.com/zitadel/zitadel/releases/download/v$RELEASE/zitadel-linux-amd64.tar.gz" | tar -xz mv zitadel-linux-amd64/zitadel /usr/local/bin $STD zitadel setup --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml --init-projections=true diff --git a/frontend/public/json/add-tailscale-lxc.json b/frontend/public/json/add-tailscale-lxc.json index be5f0220e..4d2870d86 100644 --- a/frontend/public/json/add-tailscale-lxc.json +++ b/frontend/public/json/add-tailscale-lxc.json @@ -1,7 +1,9 @@ { "name": "Tailscale", "slug": "add-tailscale-lxc", - "categories": [1], + "categories": [ + 1 + ], "date_created": "2024-05-02", "type": "addon", "updateable": false, @@ -38,7 +40,7 @@ "type": "info" }, { - "text": "Execute within the Proxmox shell", + "text": "Execute within the Proxmox host shell", "type": "info" } ], diff --git a/frontend/public/json/omada.json b/frontend/public/json/omada.json index b28517be2..b7961a410 100644 --- a/frontend/public/json/omada.json +++ b/frontend/public/json/omada.json @@ -19,7 +19,7 @@ "script": "ct/omada.sh", "resources": { "cpu": 2, - "ram": 2048, + "ram": 3072, "hdd": 8, "os": "debian", "version": "12" @@ -32,4 +32,4 @@ }, "notes": [], "status": "✅" -} \ No newline at end of file +} diff --git a/frontend/public/json/vaultwarden.json b/frontend/public/json/vaultwarden.json index d83003e0f..8bed16b24 100644 --- a/frontend/public/json/vaultwarden.json +++ b/frontend/public/json/vaultwarden.json @@ -43,7 +43,7 @@ }, "notes": [ { - "text": "Vaultwarden needs to be behind a proxy (Nginx Proxy Manager) to obtain HTTPS and to allow clients to connect.", + "text": "Vaultwarden needs to be behind a proxy (Nginx Proxy Manager, Caddy, etc) to obtain HTTPS and to allow clients to connect. If you try to open the web page directly on the new container, the web site will not load", "type": "warning" }, { diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index bcc32a47a..412566a15 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,8 +1,373 @@ [ + { + "name": "fhem/fhem-mirror", + "version": "6.2", + "date": "2025-04-20T10:33:19Z" + }, + { + "name": "karakeep-app/karakeep", + "version": "extension/v1.2.5", + "date": "2025-04-20T10:19:06Z" + }, + { + "name": "firefly-iii/firefly-iii", + "version": "v6.2.11", + "date": "2025-04-20T06:28:44Z" + }, + { + "name": "MediaBrowser/Emby.Releases", + "version": "4.8.11.0", + "date": "2025-03-10T06:39:11Z" + }, + { + "name": "morpheus65535/bazarr", + "version": "v1.5.1", + "date": "2025-01-01T16:15:52Z" + }, + { + "name": "Readarr/Readarr", + "version": "v2.0.0.4645", + "date": "2017-03-07T18:56:06Z" + }, + { + "name": "Radarr/Radarr", + "version": "v5.21.1.9799", + "date": "2025-03-24T15:52:12Z" + }, + { + "name": "Jackett/Jackett", + "version": "v0.22.1797", + "date": "2025-04-20T05:53:57Z" + }, + { + "name": "paperless-ngx/paperless-ngx", + "version": "v2.15.3", + "date": "2025-04-19T23:02:17Z" + }, + { + "name": "semaphoreui/semaphore", + "version": "v2.13.14", + "date": "2025-04-19T20:39:23Z" + }, { "name": "ellite/Wallos", - "version": "v2.49.1", - "date": "2025-04-13T22:36:24Z" + "version": "v2.52.0", + "date": "2025-04-19T20:36:50Z" + }, + { + "name": "msgbyte/tianji", + "version": "v1.20.7", + "date": "2025-04-19T20:35:09Z" + }, + { + "name": "TasmoAdmin/TasmoAdmin", + "version": "v4.2.3", + "date": "2025-02-09T23:07:48Z" + }, + { + "name": "cross-seed/cross-seed", + "version": "v6.11.2", + "date": "2025-02-26T14:54:49Z" + }, + { + "name": "YunoHost/yunohost", + "version": "debian/12.1.5", + "date": "2025-04-19T15:39:18Z" + }, + { + "name": "theonedev/onedev", + "version": "v11.8.7", + "date": "2025-04-19T11:19:29Z" + }, + { + "name": "home-assistant/core", + "version": "2025.4.3", + "date": "2025-04-19T10:23:38Z" + }, + { + "name": "runtipi/runtipi", + "version": "v3.10.0-beta.9", + "date": "2025-04-17T11:46:08Z" + }, + { + "name": "moghtech/komodo", + "version": "v1.17.2", + "date": "2025-04-19T06:56:25Z" + }, + { + "name": "ollama/ollama", + "version": "v0.6.6-rc1", + "date": "2025-04-17T01:56:29Z" + }, + { + "name": "caddyserver/caddy", + "version": "v2.10.0", + "date": "2025-04-18T20:46:28Z" + }, + { + "name": "homarr-labs/homarr", + "version": "v1.17.0", + "date": "2025-04-18T19:14:57Z" + }, + { + "name": "pocket-id/pocket-id", + "version": "v0.48.0", + "date": "2025-04-18T16:34:56Z" + }, + { + "name": "Paymenter/Paymenter", + "version": "v1.0.4", + "date": "2025-04-18T16:08:02Z" + }, + { + "name": "prometheus/prometheus", + "version": "v3.3.0", + "date": "2025-04-18T13:46:38Z" + }, + { + "name": "dgtlmoon/changedetection.io", + "version": "0.49.15", + "date": "2025-04-18T12:58:26Z" + }, + { + "name": "traefik/traefik", + "version": "v3.3.6", + "date": "2025-04-18T09:28:22Z" + }, + { + "name": "Kareadita/Kavita", + "version": "v0.8.6.1", + "date": "2025-04-18T12:30:53Z" + }, + { + "name": "TandoorRecipes/recipes", + "version": "1.5.34", + "date": "2025-03-27T16:17:38Z" + }, + { + "name": "Luligu/matterbridge", + "version": "2.2.9", + "date": "2025-04-18T10:05:52Z" + }, + { + "name": "HabitRPG/habitica", + "version": "v5.35.4", + "date": "2025-04-17T21:18:55Z" + }, + { + "name": "tailscale/tailscale", + "version": "v1.82.5", + "date": "2025-04-17T20:59:15Z" + }, + { + "name": "TriliumNext/Notes", + "version": "v0.93.0", + "date": "2025-04-17T20:05:25Z" + }, + { + "name": "keycloak/keycloak", + "version": "26.2.0", + "date": "2025-04-11T12:48:27Z" + }, + { + "name": "AdguardTeam/AdGuardHome", + "version": "v0.107.60", + "date": "2025-04-14T11:46:19Z" + }, + { + "name": "coder/code-server", + "version": "v4.99.3", + "date": "2025-04-17T18:33:11Z" + }, + { + "name": "VictoriaMetrics/VictoriaMetrics", + "version": "v1.19.0-victorialogs", + "date": "2025-04-17T18:26:31Z" + }, + { + "name": "duplicati/duplicati", + "version": "v2.1.0.116-2.1.0.116_canary_2025-04-17", + "date": "2025-04-17T17:52:31Z" + }, + { + "name": "benzino77/tasmocompiler", + "version": "v12.6.1", + "date": "2025-04-17T17:35:02Z" + }, + { + "name": "docker/compose", + "version": "v2.35.1", + "date": "2025-04-17T14:29:11Z" + }, + { + "name": "influxdata/influxdb", + "version": "v3.0.1", + "date": "2025-04-17T14:06:09Z" + }, + { + "name": "documenso/documenso", + "version": "v1.10.0-rc.5", + "date": "2025-04-17T13:01:43Z" + }, + { + "name": "prometheus-pve/prometheus-pve-exporter", + "version": "v3.5.3", + "date": "2025-04-17T10:40:47Z" + }, + { + "name": "IceWhaleTech/CasaOS", + "version": "v0.4.15", + "date": "2024-12-19T03:19:49Z" + }, + { + "name": "esphome/esphome", + "version": "2025.4.0", + "date": "2025-04-17T00:55:34Z" + }, + { + "name": "docmost/docmost", + "version": "v0.10.2", + "date": "2025-04-16T20:43:40Z" + }, + { + "name": "forgejo/forgejo", + "version": "v11.0.0", + "date": "2025-04-16T19:25:53Z" + }, + { + "name": "openobserve/openobserve", + "version": "v0.14.6-rc4", + "date": "2025-04-16T18:28:51Z" + }, + { + "name": "element-hq/synapse", + "version": "v1.129.0rc1", + "date": "2025-04-16T15:18:13Z" + }, + { + "name": "nzbgetcom/nzbget", + "version": "v24.8", + "date": "2025-03-18T07:33:51Z" + }, + { + "name": "n8n-io/n8n", + "version": "n8n@1.86.1", + "date": "2025-04-09T09:20:55Z" + }, + { + "name": "jenkinsci/jenkins", + "version": "jenkins-2.506", + "date": "2025-04-15T15:40:50Z" + }, + { + "name": "wazuh/wazuh", + "version": "coverity-w16-4.12.0", + "date": "2025-04-15T08:25:08Z" + }, + { + "name": "pocketbase/pocketbase", + "version": "v0.27.0", + "date": "2025-04-16T04:54:37Z" + }, + { + "name": "icereed/paperless-gpt", + "version": "v0.15.0", + "date": "2025-04-16T03:58:02Z" + }, + { + "name": "Checkmk/checkmk", + "version": "v2.4.0b5", + "date": "2025-04-15T17:59:06Z" + }, + { + "name": "rabbitmq/rabbitmq-server", + "version": "v4.1.0", + "date": "2025-04-15T16:18:29Z" + }, + { + "name": "Brandawg93/PeaNUT", + "version": "v5.7.2", + "date": "2025-04-15T15:44:49Z" + }, + { + "name": "WordPress/WordPress", + "version": "6.8", + "date": "2025-04-15T15:41:16Z" + }, + { + "name": "Stirling-Tools/Stirling-PDF", + "version": "v0.45.6", + "date": "2025-04-15T14:16:52Z" + }, + { + "name": "mattermost/mattermost", + "version": "v10.6.2", + "date": "2025-04-15T08:14:23Z" + }, + { + "name": "zabbix/zabbix", + "version": "7.0.12rc1", + "date": "2025-04-15T08:00:11Z" + }, + { + "name": "slskd/slskd", + "version": "0.22.5", + "date": "2025-04-15T02:52:26Z" + }, + { + "name": "blakeblackshear/frigate", + "version": "v0.14.1", + "date": "2024-08-29T22:32:51Z" + }, + { + "name": "netbox-community/netbox", + "version": "v4.2.7", + "date": "2025-04-10T20:08:13Z" + }, + { + "name": "OliveTin/OliveTin", + "version": "2025.4.14", + "date": "2025-04-14T16:53:53Z" + }, + { + "name": "home-assistant/operating-system", + "version": "15.2", + "date": "2025-04-14T15:37:12Z" + }, + { + "name": "stackblitz-labs/bolt.diy", + "version": "v0.0.7-hf1", + "date": "2025-03-10T20:49:39Z" + }, + { + "name": "Graylog2/graylog2-server", + "version": "6.2.0-rc.1", + "date": "2025-04-14T11:26:18Z" + }, + { + "name": "bluenviron/mediamtx", + "version": "v1.12.0", + "date": "2025-04-14T10:36:04Z" + }, + { + "name": "open-webui/open-webui", + "version": "v0.6.5", + "date": "2025-04-14T09:13:36Z" + }, + { + "name": "zwave-js/zwave-js-ui", + "version": "v10.2.0", + "date": "2025-04-14T08:53:44Z" + }, + { + "name": "evcc-io/evcc", + "version": "0.203.1", + "date": "2025-04-14T07:23:02Z" + }, + { + "name": "glanceapp/glance", + "version": "v0.7.12", + "date": "2025-04-14T00:16:15Z" }, { "name": "rogerfar/rdt-client", @@ -14,41 +379,16 @@ "version": "v1.61.0", "date": "2025-04-13T21:14:40Z" }, - { - "name": "fhem/fhem-mirror", - "version": "6.2", - "date": "2025-04-13T20:28:55Z" - }, { "name": "Ombi-app/Ombi", "version": "v4.47.1", "date": "2025-01-05T21:14:23Z" }, - { - "name": "pocket-id/pocket-id", - "version": "v0.46.0", - "date": "2025-04-13T18:31:13Z" - }, - { - "name": "glanceapp/glance", - "version": "v0.7.11", - "date": "2025-04-13T16:22:22Z" - }, - { - "name": "karakeep-app/karakeep", - "version": "mcp/v0.23.4", - "date": "2025-04-13T14:09:19Z" - }, { "name": "syncthing/syncthing", "version": "v2.0.0-beta.9", "date": "2025-04-12T13:58:29Z" }, - { - "name": "evcc-io/evcc", - "version": "0.203.0", - "date": "2025-04-13T11:49:39Z" - }, { "name": "qbittorrent/qBittorrent", "version": "release-5.0.5", @@ -59,41 +399,11 @@ "version": "v2.10.3.4602", "date": "2025-03-23T11:00:37Z" }, - { - "name": "Readarr/Readarr", - "version": "v2.0.0.4645", - "date": "2017-03-07T18:56:06Z" - }, { "name": "Prowlarr/Prowlarr", "version": "v1.33.3.5008", "date": "2025-04-09T17:58:37Z" }, - { - "name": "Radarr/Radarr", - "version": "v5.21.1.9799", - "date": "2025-03-24T15:52:12Z" - }, - { - "name": "morpheus65535/bazarr", - "version": "v1.5.1", - "date": "2025-01-01T16:15:52Z" - }, - { - "name": "open-webui/open-webui", - "version": "v0.6.4", - "date": "2025-04-13T06:01:32Z" - }, - { - "name": "Jackett/Jackett", - "version": "v0.22.1773", - "date": "2025-04-13T05:56:23Z" - }, - { - "name": "slskd/slskd", - "version": "0.22.4", - "date": "2025-04-13T00:14:13Z" - }, { "name": "Tautulli/Tautulli", "version": "v2.15.2", @@ -104,76 +414,16 @@ "version": "v0.2.11", "date": "2025-04-12T21:13:08Z" }, - { - "name": "semaphoreui/semaphore", - "version": "v2.14.0-beta1", - "date": "2025-04-12T20:14:09Z" - }, - { - "name": "MediaBrowser/Emby.Releases", - "version": "4.8.11.0", - "date": "2025-03-10T06:39:11Z" - }, - { - "name": "home-assistant/core", - "version": "2025.4.2", - "date": "2025-04-12T09:46:22Z" - }, { "name": "readeck/readeck", "version": "0.18.0", "date": "2025-04-12T08:55:32Z" }, - { - "name": "runtipi/runtipi", - "version": "v3.10.0", - "date": "2025-03-15T14:38:16Z" - }, { "name": "Bubka/2FAuth", "version": "v5.5.2", "date": "2025-04-11T22:00:06Z" }, - { - "name": "homarr-labs/homarr", - "version": "v1.16.0", - "date": "2025-04-11T19:15:24Z" - }, - { - "name": "rabbitmq/rabbitmq-server", - "version": "v4.0.8", - "date": "2025-04-03T05:11:15Z" - }, - { - "name": "firefly-iii/firefly-iii", - "version": "v6.2.10", - "date": "2025-03-22T13:02:26Z" - }, - { - "name": "tailscale/tailscale", - "version": "v1.82.4", - "date": "2025-04-11T17:58:09Z" - }, - { - "name": "coder/code-server", - "version": "v4.99.2", - "date": "2025-04-11T17:57:47Z" - }, - { - "name": "keycloak/keycloak", - "version": "26.2.0", - "date": "2025-04-11T12:48:27Z" - }, - { - "name": "duplicati/duplicati", - "version": "v2.1.0.113-2.1.0.113_canary_2025-04-11", - "date": "2025-04-11T16:57:07Z" - }, - { - "name": "TriliumNext/Notes", - "version": "v0.0.0", - "date": "2025-04-11T14:18:00Z" - }, { "name": "emqx/emqx", "version": "e5.9.0-beta.3", @@ -184,51 +434,16 @@ "version": "release-1.23.0rc2", "date": "2025-04-11T13:24:25Z" }, - { - "name": "docmost/docmost", - "version": "v0.10.1", - "date": "2025-04-11T12:42:08Z" - }, - { - "name": "dgtlmoon/changedetection.io", - "version": "0.49.13", - "date": "2025-04-11T11:48:06Z" - }, { "name": "sabnzbd/sabnzbd", "version": "4.5.1", "date": "2025-04-11T09:57:47Z" }, - { - "name": "Stirling-Tools/Stirling-PDF", - "version": "v0.45.4", - "date": "2025-04-11T08:45:04Z" - }, - { - "name": "home-assistant/operating-system", - "version": "15.1", - "date": "2025-03-31T13:42:20Z" - }, { "name": "outline/outline", "version": "v0.83.0", "date": "2025-04-11T03:53:10Z" }, - { - "name": "openobserve/openobserve", - "version": "v0.14.6-rc3", - "date": "2025-04-11T03:08:28Z" - }, - { - "name": "Luligu/matterbridge", - "version": "2.2.8", - "date": "2025-04-10T20:30:49Z" - }, - { - "name": "netbox-community/netbox", - "version": "v4.2.7", - "date": "2025-04-10T20:08:13Z" - }, { "name": "gristlabs/grist-core", "version": "v1.5.1", @@ -239,81 +454,31 @@ "version": "cassandra-5.0.4", "date": "2025-04-10T16:32:00Z" }, - { - "name": "VictoriaMetrics/VictoriaMetrics", - "version": "v1.18.0-victorialogs", - "date": "2025-04-10T15:05:20Z" - }, { "name": "NodeBB/NodeBB", "version": "v4.2.1", "date": "2025-04-10T14:03:47Z" }, - { - "name": "Paymenter/Paymenter", - "version": "v1.0.3", - "date": "2025-04-10T13:57:39Z" - }, - { - "name": "docker/compose", - "version": "v2.35.0", - "date": "2025-04-10T13:45:22Z" - }, - { - "name": "n8n-io/n8n", - "version": "n8n@1.86.1", - "date": "2025-04-09T09:20:55Z" - }, { "name": "mongodb/mongo", "version": "r8.0.5-rc2", "date": "2025-04-09T22:37:52Z" }, - { - "name": "paperless-ngx/paperless-ngx", - "version": "v2.15.1", - "date": "2025-04-09T22:26:39Z" - }, { "name": "jupyter/notebook", "version": "v7.4.0", "date": "2025-04-09T17:36:14Z" }, - { - "name": "Brandawg93/PeaNUT", - "version": "v5.7.1", - "date": "2025-04-09T15:06:49Z" - }, { "name": "glpi-project/glpi", "version": "10.0.18", "date": "2025-02-12T11:07:02Z" }, - { - "name": "HabitRPG/habitica", - "version": "v5.35.2", - "date": "2025-04-09T13:46:58Z" - }, { "name": "zitadel/zitadel", "version": "v2.69.10", "date": "2025-04-09T12:16:51Z" }, - { - "name": "YunoHost/yunohost", - "version": "debian/12.0.14", - "date": "2025-04-09T10:09:00Z" - }, - { - "name": "esphome/esphome", - "version": "2025.3.3", - "date": "2025-03-31T22:07:05Z" - }, - { - "name": "OliveTin/OliveTin", - "version": "2025.4.8", - "date": "2025-04-08T22:02:50Z" - }, { "name": "minio/minio", "version": "RELEASE.2025-04-08T15-41-24Z", @@ -324,36 +489,11 @@ "version": "version/2025.2.4", "date": "2025-04-08T18:39:57Z" }, - { - "name": "influxdata/influxdb", - "version": "v1.12.0rc1", - "date": "2025-04-08T17:35:21Z" - }, - { - "name": "jenkinsci/jenkins", - "version": "jenkins-2.505", - "date": "2025-04-08T15:46:42Z" - }, - { - "name": "AdguardTeam/AdGuardHome", - "version": "v0.107.59", - "date": "2025-03-21T11:11:39Z" - }, - { - "name": "element-hq/synapse", - "version": "v1.128.0", - "date": "2025-04-08T14:27:55Z" - }, { "name": "linkwarden/linkwarden", "version": "v2.10.0", "date": "2025-04-08T12:33:57Z" }, - { - "name": "prometheus/prometheus", - "version": "v0.303.0-rc.1", - "date": "2025-04-07T04:39:38Z" - }, { "name": "pelican-dev/panel", "version": "v1.0.0-beta19", @@ -374,56 +514,21 @@ "version": "v1.23.7", "date": "2025-04-07T19:27:52Z" }, - { - "name": "Checkmk/checkmk", - "version": "v2.4.0b4", - "date": "2025-04-07T19:14:53Z" - }, - { - "name": "wazuh/wazuh", - "version": "coverity-w15-4.12.0", - "date": "2025-04-07T17:50:14Z" - }, { "name": "thomiceli/opengist", "version": "v1.10.0", "date": "2025-04-07T14:32:15Z" }, - { - "name": "Graylog2/graylog2-server", - "version": "6.2.0-beta.4", - "date": "2025-04-07T11:28:13Z" - }, { "name": "fallenbagel/jellyseerr", "version": "preview-back-to-axios", "date": "2025-04-07T09:23:08Z" }, - { - "name": "zwave-js/zwave-js-ui", - "version": "v10.1.5", - "date": "2025-04-07T09:19:35Z" - }, { "name": "redis/redis", "version": "8.0-rc1-int2", "date": "2025-04-02T19:05:08Z" }, - { - "name": "zabbix/zabbix", - "version": "7.4.0beta1", - "date": "2025-04-07T08:14:13Z" - }, - { - "name": "nzbgetcom/nzbget", - "version": "v24.8", - "date": "2025-03-18T07:33:51Z" - }, - { - "name": "mattermost/mattermost", - "version": "server/public/v0.1.11", - "date": "2025-03-28T14:04:31Z" - }, { "name": "Dolibarr/dolibarr", "version": "21.0.1", @@ -439,21 +544,6 @@ "version": "2.0.3", "date": "2025-04-06T17:35:41Z" }, - { - "name": "TandoorRecipes/recipes", - "version": "1.5.34", - "date": "2025-03-27T16:17:38Z" - }, - { - "name": "stackblitz-labs/bolt.diy", - "version": "v0.0.7-hf1", - "date": "2025-03-10T20:49:39Z" - }, - { - "name": "msgbyte/tianji", - "version": "v1.19.7", - "date": "2025-04-06T14:22:44Z" - }, { "name": "TechnitiumSoftware/DnsServer", "version": "v13.5.0", @@ -469,11 +559,6 @@ "version": "0.17.10", "date": "2025-04-06T05:31:49Z" }, - { - "name": "ollama/ollama", - "version": "v0.6.5", - "date": "2025-04-06T00:15:39Z" - }, { "name": "jellyfin/jellyfin", "version": "v10.10.7", @@ -519,11 +604,6 @@ "version": "5.7.0", "date": "2025-04-04T18:10:16Z" }, - { - "name": "icereed/paperless-gpt", - "version": "v0.14.4", - "date": "2025-04-04T14:18:53Z" - }, { "name": "apache/tomcat", "version": "9.0.104", @@ -559,11 +639,6 @@ "version": "v2.31.0", "date": "2025-04-01T18:12:45Z" }, - { - "name": "theonedev/onedev", - "version": "v11.8.6", - "date": "2025-04-01T13:52:03Z" - }, { "name": "neo4j/neo4j", "version": "5.26.5", @@ -580,14 +655,9 @@ "date": "2025-03-31T21:31:48Z" }, { - "name": "traefik/traefik", - "version": "v3.3.5", - "date": "2025-03-31T08:55:12Z" - }, - { - "name": "documenso/documenso", - "version": "v1.10.0-rc.4", - "date": "2025-03-31T09:02:22Z" + "name": "mysql/mysql-server", + "version": "mysql-cluster-9.3.0", + "date": "2025-03-31T07:42:45Z" }, { "name": "louislam/dockge", @@ -609,11 +679,6 @@ "version": "4.3.4", "date": "2025-03-30T13:32:38Z" }, - { - "name": "pocketbase/pocketbase", - "version": "v0.26.6", - "date": "2025-03-30T08:02:19Z" - }, { "name": "aceberg/WatchYourLAN", "version": "2.1.2-alpine", @@ -634,11 +699,6 @@ "version": "v1.6.1", "date": "2025-03-15T17:29:17Z" }, - { - "name": "TasmoAdmin/TasmoAdmin", - "version": "v4.2.3", - "date": "2025-02-09T23:07:48Z" - }, { "name": "grocy/grocy", "version": "v4.5.0", @@ -669,11 +729,6 @@ "version": "2025.2", "date": "2025-03-27T19:21:13Z" }, - { - "name": "forgejo/forgejo", - "version": "v12.0.0-dev", - "date": "2025-03-26T09:58:55Z" - }, { "name": "sct/overseerr", "version": "v1.34.0", @@ -704,11 +759,6 @@ "version": "v1.6.8", "date": "2025-03-25T13:33:10Z" }, - { - "name": "caddyserver/caddy", - "version": "v2.9.1", - "date": "2025-01-08T15:22:53Z" - }, { "name": "ZoeyVid/NPMplus", "version": "2025-03-24-r2", @@ -724,11 +774,6 @@ "version": "v2.5.307", "date": "2025-03-24T01:33:31Z" }, - { - "name": "moghtech/komodo", - "version": "v1.17.0", - "date": "2025-03-24T00:46:32Z" - }, { "name": "nicolargo/glances", "version": "v4.3.1", @@ -784,11 +829,6 @@ "version": "v2.20.0", "date": "2025-03-17T22:44:56Z" }, - { - "name": "Kareadita/Kavita", - "version": "v0.8.5.11", - "date": "2025-03-17T19:25:25Z" - }, { "name": "Sonarr/Sonarr", "version": "v4.0.14.2939", @@ -875,7 +915,7 @@ "date": "2025-03-05T21:41:29Z" }, { - "name": "snipe/snipe-it", + "name": "grokability/snipe-it", "version": "v8.0.4", "date": "2025-03-05T17:12:03Z" }, @@ -899,11 +939,6 @@ "version": "v1.5.7", "date": "2025-02-27T20:04:08Z" }, - { - "name": "cross-seed/cross-seed", - "version": "v6.11.2", - "date": "2025-02-26T14:54:49Z" - }, { "name": "silverbulletmd/silverbullet", "version": "0.10.4", @@ -914,11 +949,6 @@ "version": "v0.25.1", "date": "2025-02-25T17:30:48Z" }, - { - "name": "benzino77/tasmocompiler", - "version": "v12.5.0", - "date": "2025-02-25T14:55:50Z" - }, { "name": "schlagmichdoch/PairDrop", "version": "v1.11.2", @@ -939,11 +969,6 @@ "version": "v1.1.05", "date": "2025-02-24T11:53:12Z" }, - { - "name": "prometheus-pve/prometheus-pve-exporter", - "version": "v3.5.2", - "date": "2025-02-18T16:43:41Z" - }, { "name": "typesense/typesense", "version": "v28.0", @@ -984,11 +1009,6 @@ "version": "mariadb-11.7.2", "date": "2025-02-13T04:13:46Z" }, - { - "name": "WordPress/WordPress", - "version": "6.7.2", - "date": "2025-02-11T16:13:18Z" - }, { "name": "homebridge/homebridge", "version": "v1.9.0", @@ -999,16 +1019,6 @@ "version": "1.33.2", "date": "2025-02-09T17:54:59Z" }, - { - "name": "blakeblackshear/frigate", - "version": "v0.15.0", - "date": "2025-02-08T18:45:30Z" - }, - { - "name": "bluenviron/mediamtx", - "version": "v1.11.3", - "date": "2025-02-07T19:29:19Z" - }, { "name": "apache/tika", "version": "2.9.3", @@ -1079,16 +1089,6 @@ "version": "v0.24.6", "date": "2024-12-22T20:24:35Z" }, - { - "name": "IceWhaleTech/CasaOS", - "version": "v0.4.15", - "date": "2024-12-19T03:19:49Z" - }, - { - "name": "mysql/mysql-server", - "version": "mysql-cluster-7.6.33", - "date": "2024-12-16T11:55:50Z" - }, { "name": "ArchiveBox/ArchiveBox", "version": "v0.7.3", diff --git a/install/alpine-wireguard-install.sh b/install/alpine-wireguard-install.sh index 8ef7be7c4..fb770d542 100644 --- a/install/alpine-wireguard-install.sh +++ b/install/alpine-wireguard-install.sh @@ -61,7 +61,7 @@ if [[ "$INSTALL_WGD" =~ ^[Yy]$ ]]; then msg_ok "Installed additional dependencies for WGDashboard" msg_info "Installing WGDashboard" git clone -q https://github.com/donaldzou/WGDashboard.git /etc/wgdashboard - cd /etc/wgdashboard/src || exit + cd /etc/wgdashboard/src chmod u+x wgd.sh $STD ./wgd.sh install msg_ok "Installed WGDashboard" @@ -79,7 +79,7 @@ depend() { start() { ebegin "Starting WGDashboard" - cd /etc/wgdashboard/src/ || exit 1 + cd /etc/wgdashboard/src/ ./wgd.sh start & eend $? } diff --git a/install/changedetection-install.sh b/install/changedetection-install.sh index f78fa1d2b..80a04e6c9 100644 --- a/install/changedetection-install.sh +++ b/install/changedetection-install.sh @@ -137,6 +137,7 @@ cat </etc/systemd/system/browserless.service Description=browserless service After=network.target [Service] +Environment=CONNECTION_TIMEOUT=60000 WorkingDirectory=/opt/browserless ExecStart=/opt/browserless/scripts/start.sh SyslogIdentifier=browserless diff --git a/install/gomft-install.sh b/install/gomft-install.sh index aed94bf5b..ffebfdeb4 100644 --- a/install/gomft-install.sh +++ b/install/gomft-install.sh @@ -47,19 +47,13 @@ msg_ok "Installed Node.js" msg_info "Setup ${APPLICATION} (Patience)" temp_file=$(mktemp) RELEASE=$(curl -fsSL https://api.github.com/repos/StarFleetCPTN/GoMFT/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -curl -fsSL "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -o $temp_file -tar -xzf $temp_file -mv GoMFT-${RELEASE}/ /opt/gomft +curl -fsSL "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" +tar -xzf "$temp_file" +mv GoMFT-"${RELEASE}"/ /opt/gomft cd /opt/gomft -$STD npm ci -$STD node build.js -$STD go mod download $STD go install github.com/a-h/templ/cmd/templ@latest -$STD go get -u github.com/a-h/templ -$STD $HOME/go/bin/templ generate -export CGO_ENABLED=1 -export GOOS=linux -$STD go build -o gomft +$STD "$HOME"/go/bin/templ generate +$STD go build -o gomft main.go chmod +x /opt/gomft/gomft JWT_SECRET_KEY=$(openssl rand -base64 24 | tr -d '/+=') @@ -83,7 +77,7 @@ EMAIL_USERNAME=smtp_username EMAIL_PASSWORD=smtp_password EOF -echo "${RELEASE}" >/opt/${APPLICATION}_version.txt +echo "${RELEASE}" >/opt/"${APPLICATION}"_version.txt msg_ok "Setup ${APPLICATION}" msg_info "Creating Service" @@ -109,7 +103,7 @@ motd_ssh customize msg_info "Cleaning up" -rm -f $temp_file +rm -f "$temp_file" $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/heimdall-dashboard-install.sh b/install/heimdall-dashboard-install.sh index 7ecadaa5c..da1e0eba7 100644 --- a/install/heimdall-dashboard-install.sh +++ b/install/heimdall-dashboard-install.sh @@ -27,7 +27,7 @@ tar xzf "${RELEASE}".tar.gz VER=$(curl -fsSL https://api.github.com/repos/linuxserver/Heimdall/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') rm -rf "${RELEASE}".tar.gz mv Heimdall-"${VER}" /opt/Heimdall -cd /opt/Heimdall || exit +cd /opt/Heimdall cp .env.example .env $STD php artisan key:generate msg_ok "Installed Heimdall Dashboard ${RELEASE}" diff --git a/install/karakeep-install.sh b/install/karakeep-install.sh index 499736281..d0548fff7 100644 --- a/install/karakeep-install.sh +++ b/install/karakeep-install.sh @@ -34,7 +34,7 @@ chmod +x /usr/bin/yt-dlp msg_ok "Installed Additional Tools" msg_info "Installing Meilisearch" -cd /tmp || exit +cd /tmp curl -fsSL "https://github.com/meilisearch/meilisearch/releases/latest/download/meilisearch-aarch64.deb" -o "meilisearch.deb" $STD dpkg -i meilisearch.deb curl -fsSL "https://raw.githubusercontent.com/meilisearch/meilisearch/latest/config.toml" -o "/etc/meilisearch.toml" @@ -59,21 +59,21 @@ $STD npm install -g corepack@0.31.0 msg_ok "Installed Node.js" msg_info "Installing karakeep" -cd /opt || exit +cd /opt RELEASE=$(curl -fsSL https://api.github.com/repos/karakeep-app/karakeep/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') curl -fsSL "https://github.com/karakeep-app/karakeep/archive/refs/tags/v${RELEASE}.zip" -o "v${RELEASE}.zip" unzip -q "v${RELEASE}.zip" mv karakeep-"${RELEASE}" /opt/karakeep -cd /opt/karakeep || exit +cd /opt/karakeep corepack enable export PUPPETEER_SKIP_DOWNLOAD="true" export NEXT_TELEMETRY_DISABLED=1 export CI="true" -cd /opt/karakeep/apps/web || exit +cd /opt/karakeep/apps/web $STD pnpm install --frozen-lockfile $STD pnpm exec next build --experimental-build-mode compile cp -r /opt/karakeep/apps/web/.next/standalone/apps/web/server.js /opt/karakeep/apps/web -cd /opt/karakeep/apps/workers || exit +cd /opt/karakeep/apps/workers $STD pnpm install --frozen-lockfile export DATA_DIR=/opt/karakeep_data @@ -103,7 +103,7 @@ msg_ok "Installed karakeep" msg_info "Running Database Migration" mkdir -p ${DATA_DIR} -cd /opt/karakeep/packages/db || exit +cd /opt/karakeep/packages/db $STD pnpm migrate msg_ok "Database Migration Completed" diff --git a/install/kimai-install.sh b/install/kimai-install.sh index 1d6459b0b..a65789f36 100644 --- a/install/kimai-install.sh +++ b/install/kimai-install.sh @@ -60,7 +60,7 @@ RELEASE=$(curl -fsSL https://api.github.com/repos/kimai/kimai/releases/latest | curl -fsSL "https://github.com/kimai/kimai/archive/refs/tags/${RELEASE}.zip" -o $(basename "https://github.com/kimai/kimai/archive/refs/tags/${RELEASE}.zip") unzip -q "${RELEASE}".zip mv kimai-"${RELEASE}" /opt/kimai -cd /opt/kimai || exit +cd /opt/kimai echo "export COMPOSER_ALLOW_SUPERUSER=1" >>~/.bashrc source ~/.bashrc $STD composer install --no-dev --optimize-autoloader --no-interaction diff --git a/install/omada-install.sh b/install/omada-install.sh index 6f116da8b..e299aa28e 100644 --- a/install/omada-install.sh +++ b/install/omada-install.sh @@ -19,20 +19,17 @@ msg_ok "Installed Dependencies" msg_info "Checking CPU Features" if lscpu | grep -q 'avx'; then - USE_AVX=true MONGODB_VERSION="7.0" msg_ok "AVX detected: Using MongoDB 7.0" else - USE_AVX=false - MONGODB_VERSION="4.4" msg_error "No AVX detected: TP-Link Canceled Support for Old MongoDB for Debian 12\n https://www.tp-link.com/baltic/support/faq/4160/" - exit 1 + exit 0 fi msg_info "Installing Azul Zulu Java" curl -fsSL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xB1998361219BD9C9" -o "/etc/apt/trusted.gpg.d/zulu-repo.asc" -curl -fsSL "https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb" -o $(basename "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 +curl -fsSL "https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb" -o zulu-repo.deb +$STD dpkg -i zulu-repo.deb $STD apt-get update $STD apt-get -y install zulu21-jre-headless msg_ok "Installed Azul Zulu Java" @@ -43,8 +40,6 @@ if ! dpkg -l | grep -q 'libssl1.1'; then $STD dpkg -i /tmp/libssl.deb rm -f /tmp/libssl.deb msg_ok "Installed libssl1.1" -else - msg_ok "libssl1.1 already installed" fi msg_info "Installing MongoDB $MONGODB_VERSION" @@ -55,18 +50,19 @@ $STD apt-get install -y mongodb-org msg_ok "Installed MongoDB $MONGODB_VERSION" msg_info "Installing Omada Controller" -latest_url=$(curl -fsSL "https://support.omadanetworks.com/en/download/software/omada-controller/" | grep -o 'https://static\.tp-link\.com/upload/software/[^"]*linux_x64[^"]*\.deb' | head -n 1) -latest_version=$(basename "$latest_url") - -curl -fsSL "${latest_url}" -O -$STD dpkg -i ${latest_version} +OMADA_URL=$(curl -fsSL "https://support.omadanetworks.com/en/download/software/omada-controller/" | + grep -o 'https://static\.tp-link\.com/upload/software/[^"]*linux_x64[^"]*\.deb' | + head -n1) +OMADA_PKG=$(basename "$OMADA_URL") +curl -fsSL "$OMADA_URL" -o "$OMADA_PKG" +$STD dpkg -i "$OMADA_PKG" msg_ok "Installed Omada Controller" motd_ssh customize msg_info "Cleaning up" -rm -rf ${latest_version} zulu-repo_1.0.0-3_all.deb +rm -rf "$OMADA_PKG" zulu-repo.deb $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/outline-install.sh b/install/outline-install.sh index 236b7b14e..541b2e1d1 100644 --- a/install/outline-install.sh +++ b/install/outline-install.sh @@ -15,10 +15,10 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - gnupg \ - mkcert \ - git \ - redis + gnupg \ + mkcert \ + git \ + redis msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" @@ -43,7 +43,6 @@ $STD apt-get install -y postgresql-16 DB_NAME="outline" DB_USER="outline" DB_PASS="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)" -SECRET_KEY="$(openssl rand -hex 32)" $STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';" $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER ENCODING 'UTF8' TEMPLATE template0;" $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET client_encoding TO 'utf8';" @@ -52,6 +51,7 @@ $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC';" msg_ok "Set up PostgreSQL" msg_info "Setup Outline (Patience)" +SECRET_KEY="$(openssl rand -hex 32)" temp_file=$(mktemp) LOCAL_IP="$(hostname -I | awk '{print $1}')" RELEASE=$(curl -fsSL https://api.github.com/repos/outline/outline/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') @@ -60,6 +60,7 @@ tar zxf $temp_file mv outline-${RELEASE} /opt/outline cd /opt/outline cp .env.sample .env +export NODE_ENV=development sed -i 's/NODE_ENV=production/NODE_ENV=development/g' /opt/outline/.env sed -i "s/generate_a_new_key/${SECRET_KEY}/g" /opt/outline/.env sed -i "s/user:pass@postgres/${DB_USER}:${DB_PASS}@localhost/g" /opt/outline/.env @@ -70,6 +71,7 @@ $STD yarn install --frozen-lockfile export NODE_OPTIONS="--max-old-space-size=3584" $STD yarn build sed -i 's/NODE_ENV=development/NODE_ENV=production/g' /opt/outline/.env +export NODE_ENV=production echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" msg_ok "Setup Outline" @@ -83,7 +85,7 @@ After=network.target Type=simple User=root WorkingDirectory=/opt/outline -ExecStart=/usr/bin/node ./build/server/index.js +ExecStart=/usr/bin/yarn start Restart=always EnvironmentFile=/opt/outline/.env diff --git a/install/paperless-ngx-install.sh b/install/paperless-ngx-install.sh index 3e166f3f8..eca7c094a 100644 --- a/install/paperless-ngx-install.sh +++ b/install/paperless-ngx-install.sh @@ -58,10 +58,10 @@ $STD apt-get install -y \ tesseract-ocr \ tesseract-ocr-eng -cd /tmp || exit +cd /tmp curl -fsSL "https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10040/ghostscript-10.04.0.tar.gz" -o $(basename "https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10040/ghostscript-10.04.0.tar.gz") $STD tar -xzf ghostscript-10.04.0.tar.gz -cd ghostscript-10.04.0 || exit +cd ghostscript-10.04.0 $STD ./configure $STD make $STD sudo make install @@ -69,7 +69,7 @@ msg_ok "Installed OCR Dependencies" msg_info "Installing JBIG2" $STD git clone https://github.com/ie13/jbig2enc /opt/jbig2enc -cd /opt/jbig2enc || exit +cd /opt/jbig2enc $STD bash ./autogen.sh $STD bash ./configure $STD make @@ -79,12 +79,12 @@ msg_ok "Installed JBIG2" msg_info "Installing Paperless-ngx (Patience)" Paperlessngx=$(curl -fsSL "https://github.com/paperless-ngx/paperless-ngx/releases/latest" | grep "title>Release" | cut -d " " -f 5) -cd /opt || exit +cd /opt $STD curl -fsSL "https://github.com/paperless-ngx/paperless-ngx/releases/download/$Paperlessngx/paperless-ngx-$Paperlessngx.tar.xz" -o "paperless-ngx-$Paperlessngx.tar.xz" $STD tar -xf "paperless-ngx-$Paperlessngx.tar.xz" -C /opt/ mv paperless-ngx paperless rm "paperless-ngx-$Paperlessngx.tar.xz" -cd /opt/paperless || exit +cd /opt/paperless $STD pip install --upgrade pip $STD pip install -r requirements.txt curl -fsSL "https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/paperless.conf.example" -o /opt/paperless/paperless.conf @@ -121,7 +121,7 @@ sed -i -e "s|#PAPERLESS_DBNAME=paperless|PAPERLESS_DBNAME=$DB_NAME|" /opt/paperl sed -i -e "s|#PAPERLESS_DBUSER=paperless|PAPERLESS_DBUSER=$DB_USER|" /opt/paperless/paperless.conf sed -i -e "s|#PAPERLESS_DBPASS=paperless|PAPERLESS_DBPASS=$DB_PASS|" /opt/paperless/paperless.conf sed -i -e "s|#PAPERLESS_SECRET_KEY=change-me|PAPERLESS_SECRET_KEY=$SECRET_KEY|" /opt/paperless/paperless.conf -cd /opt/paperless/src || exit +cd /opt/paperless/src $STD python3 manage.py migrate msg_ok "Set up PostgreSQL database" diff --git a/install/paymenter-install.sh b/install/paymenter-install.sh index ebded291b..d2d17f857 100644 --- a/install/paymenter-install.sh +++ b/install/paymenter-install.sh @@ -47,7 +47,7 @@ msg_info "Installing Paymenter" RELEASE=$(curl -fsSL https://api.github.com/repos/paymenter/paymenter/releases/latest | grep '"tag_name"' | sed -E 's/.*"tag_name": "([^"]+)".*/\1/') echo "${RELEASE}" >/opt/"${APPLICATION}"_version.txt mkdir -p /opt/paymenter -cd /opt/paymenter || exit +cd /opt/paymenter curl -fsSL "https://github.com/paymenter/paymenter/releases/download/${RELEASE}/paymenter.tar.gz" -o paymenter.tar.gz $STD tar -xzvf paymenter.tar.gz chmod -R 755 storage/* bootstrap/cache/ diff --git a/install/peanut-install.sh b/install/peanut-install.sh index 0e3367380..ee9bfe4ea 100644 --- a/install/peanut-install.sh +++ b/install/peanut-install.sh @@ -34,7 +34,7 @@ msg_info "Installing Peanut" RELEASE=$(curl -fsSL https://api.github.com/repos/Brandawg93/PeaNUT/releases/latest | grep '"tag_name":' | cut -d'"' -f4) curl -fsSL "https://api.github.com/repos/Brandawg93/PeaNUT/tarball/${RELEASE}" -o "peanut.tar.gz" mkdir -p /opt/peanut -tar -xzf peanut.tar.gz -C /opt/peanut --strip-components 1 +tar -xzf peanut.tar.gz -C /opt/peanut --strip-components=1 rm peanut.tar.gz cd /opt/peanut $STD npm install -g pnpm diff --git a/install/pelican-panel-install.sh b/install/pelican-panel-install.sh index 1c7342dc3..2ddea5993 100644 --- a/install/pelican-panel-install.sh +++ b/install/pelican-panel-install.sh @@ -55,7 +55,7 @@ msg_ok "Set up MariaDB" msg_info "Installing Pelican Panel" RELEASE=$(curl -fsSL https://api.github.com/repos/pelican-dev/panel/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') mkdir /opt/pelican-panel -cd /opt/pelican-panel || exit +cd /opt/pelican-panel curl -fsSL "https://github.com/pelican-dev/panel/releases/download/v${RELEASE}/panel.tar.gz" -o $(basename "https://github.com/pelican-dev/panel/releases/download/v${RELEASE}/panel.tar.gz") tar -xzf "panel.tar.gz" $STD composer install --no-dev --optimize-autoloader --no-interaction diff --git a/install/prowlarr-install.sh b/install/prowlarr-install.sh index e48fed94a..aa1c60b46 100644 --- a/install/prowlarr-install.sh +++ b/install/prowlarr-install.sh @@ -21,7 +21,7 @@ msg_info "Installing Prowlarr" temp_file="$(mktemp)" mkdir -p /var/lib/prowlarr/ chmod 775 /var/lib/prowlarr/ -cd /var/lib/prowlarr/ || exit +cd /var/lib/prowlarr/ RELEASE=$(curl -fsSL https://api.github.com/repos/Prowlarr/Prowlarr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') curl -fsSL "https://github.com/Prowlarr/Prowlarr/releases/download/v${RELEASE}/Prowlarr.master.${RELEASE}.linux-core-arm64.tar.gz" -o "$temp_file" $STD tar -xvzf "$temp_file" diff --git a/install/pterodactyl-panel-install.sh b/install/pterodactyl-panel-install.sh index bb3cb11fd..30ae73078 100644 --- a/install/pterodactyl-panel-install.sh +++ b/install/pterodactyl-panel-install.sh @@ -60,7 +60,7 @@ read -p "Enter your Last Name: " NAME_LAST msg_info "Installing pterodactyl Panel" RELEASE=$(curl -fsSL https://api.github.com/repos/pterodactyl/panel/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') mkdir /opt/pterodactyl-panel -cd /opt/pterodactyl-panel || exit +cd /opt/pterodactyl-panel curl -fsSL "https://github.com/pterodactyl/panel/releases/download/v${RELEASE}/panel.tar.gz" -o $(basename "https://github.com/pterodactyl/panel/releases/download/v${RELEASE}/panel.tar.gz") tar -xzf "panel.tar.gz" cp .env.example .env diff --git a/install/radarr-install.sh b/install/radarr-install.sh index da029e6fa..71b645ce4 100644 --- a/install/radarr-install.sh +++ b/install/radarr-install.sh @@ -23,7 +23,7 @@ msg_info "Installing Radarr" temp_file="$(mktemp)" mkdir -p /var/lib/radarr/ chmod 775 /var/lib/radarr/ -cd /var/lib/radarr/ || exit +cd /var/lib/radarr/ RELEASE=$(curl -fsSL https://api.github.com/repos/Radarr/Radarr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') curl -fsSL "https://github.com/Radarr/Radarr/releases/download/v${RELEASE}/Radarr.master.${RELEASE}.linux-core-arm64.tar.gz" -o "$temp_file" $STD tar -xvzf "$temp_file" diff --git a/install/seelf-install.sh b/install/seelf-install.sh index e4cb6e19f..f38c5d930 100644 --- a/install/seelf-install.sh +++ b/install/seelf-install.sh @@ -16,7 +16,8 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ make \ - gcc + gcc \ + gpg msg_ok "Installed Dependencies" msg_info "Installing Golang" @@ -43,8 +44,8 @@ msg_ok "Installed Node.js" msg_info "Setting up seelf. Patience" RELEASE=$(curl -fsSL https://api.github.com/repos/YuukanOO/seelf/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') curl -fsSL "https://github.com/YuukanOO/seelf/archive/refs/tags/v${RELEASE}.tar.gz" -o $(basename "https://github.com/YuukanOO/seelf/archive/refs/tags/v${RELEASE}.tar.gz") -tar -xzf v${RELEASE}.tar.gz -mv seelf-${RELEASE}/ /opt/seelf +tar -xzf v"${RELEASE}".tar.gz +mv seelf-"${RELEASE}"/ /opt/seelf cd /opt/seelf $STD make build PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) @@ -84,11 +85,11 @@ customize # Cleanup msg_info "Cleaning up" -rm -f ~/v${RELEASE}.tar.gz -rm -f $temp_file +rm -f ~/v"${RELEASE}".tar.gz +rm -f "$temp_file" $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" motd_ssh -customize \ No newline at end of file +customize diff --git a/install/zabbix-install.sh b/install/zabbix-install.sh index 78693aa60..f8ae2ae5e 100644 --- a/install/zabbix-install.sh +++ b/install/zabbix-install.sh @@ -14,7 +14,7 @@ network_check update_os msg_info "Installing Zabbix" -cd /tmp || exit +cd /tmp curl -fsSL "$(curl -fsSL https://repo.zabbix.com/zabbix/ | grep -oP '(?<=href=")[0-9]+\.[0-9]+(?=/")' | sort -V | tail -n1 | xargs -I{} echo "https://repo.zabbix.com/zabbix/{}/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian12_all.deb")" \ diff --git a/misc/add-iptag.sh b/misc/add-iptag.sh new file mode 100644 index 000000000..c3bf88cf9 --- /dev/null +++ b/misc/add-iptag.sh @@ -0,0 +1,867 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (Canbiz) && Desert_Gamer +# License: MIT +# Source: https://github.com/gitsang/iptag + +function header_info { + clear + cat <<"EOF" + ___ ____ _____ +|_ _| _ \ _ |_ _|_ _ __ _ + | || |_) (_) | |/ _` |/ _` | + | || __/ _ | | (_| | (_| | +|___|_| (_) |_|\__,_|\__, | + |___/ +EOF +} + +clear +header_info +APP="IP-Tag" +hostname=$(hostname) + +# Farbvariablen +YW=$(echo "\033[33m") +GN=$(echo "\033[1;92m") +RD=$(echo "\033[01;31m") +CL=$(echo "\033[m") +BFR="\\r\\033[K" +HOLD=" " +CM=" ✔️ ${CL}" +CROSS=" ✖️ ${CL}" + +# This function enables error handling in the script by setting options and defining a trap for the ERR signal. +catch_errors() { + set -Eeuo pipefail + trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +} + +# This function is called when an error occurs. It receives the exit code, line number, and command that caused the error, and displays an error message. +error_handler() { + if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then + kill $SPINNER_PID >/dev/null + fi + printf "\e[?25h" + 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" +} + +# This function displays a spinner. +spinner() { + local frames=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏') + local spin_i=0 + local interval=0.1 + printf "\e[?25l" + + local color="${YWB}" + + while true; do + printf "\r ${color}%s${CL}" "${frames[spin_i]}" + spin_i=$(((spin_i + 1) % ${#frames[@]})) + sleep "$interval" + done +} + +# This function displays an informational message with a yellow color. +msg_info() { + local msg="$1" + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" + spinner & + SPINNER_PID=$! +} + +# This function displays a success message with a green color. +msg_ok() { + if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then + kill $SPINNER_PID >/dev/null + fi + printf "\e[?25h" + local msg="$1" + echo -e "${BFR}${CM}${GN}${msg}${CL}" +} + +# This function displays a error message with a red color. +msg_error() { + if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then + kill $SPINNER_PID >/dev/null + fi + printf "\e[?25h" + local msg="$1" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" +} + +# Check if service exists +check_service_exists() { + if systemctl is-active --quiet iptag.service; then + return 0 + else + return 1 + fi +} + +# Migrate configuration from old path to new +migrate_config() { + local old_config="/opt/lxc-iptag" + local new_config="/opt/iptag/iptag.conf" + + if [[ -f "$old_config" ]]; then + msg_info "Migrating configuration from old path" + if cp "$old_config" "$new_config" &>/dev/null; then + rm -rf "$old_config" &>/dev/null + msg_ok "Configuration migrated and old config removed" + else + msg_error "Failed to migrate configuration" + fi + fi +} + +# Update existing installation +update_installation() { + msg_info "Updating IP-Tag Scripts" + systemctl stop iptag.service &>/dev/null + + # Create directory if it doesn't exist + if [[ ! -d "/opt/iptag" ]]; then + mkdir -p /opt/iptag + fi + + # Migrate config if needed + migrate_config + + # Update main script + cat <<'EOF' >/opt/iptag/iptag +#!/bin/bash +# =============== CONFIGURATION =============== # +readonly CONFIG_FILE="/opt/iptag/iptag.conf" +readonly DEFAULT_TAG_FORMAT="full" +readonly DEFAULT_CHECK_INTERVAL=60 + +# Load the configuration file if it exists +if [ -f "$CONFIG_FILE" ]; then + # shellcheck source=./iptag.conf + source "$CONFIG_FILE" +fi + +# Convert IP to integer for comparison +ip_to_int() { + local ip="$1" + local a b c d + IFS=. read -r a b c d <<< "${ip}" + echo "$((a << 24 | b << 16 | c << 8 | d))" +} + +# Check if IP is in CIDR +ip_in_cidr() { + local ip="$1" cidr="$2" + ipcalc -c "$ip" "$cidr" >/dev/null 2>&1 || return 1 + + local network prefix ip_parts net_parts + network=$(echo "$cidr" | cut -d/ -f1) + prefix=$(echo "$cidr" | cut -d/ -f2) + IFS=. read -r -a ip_parts <<< "$ip" + IFS=. read -r -a net_parts <<< "$network" + + case $prefix in + 8) [[ "${ip_parts[0]}" == "${net_parts[0]}" ]] ;; + 16) [[ "${ip_parts[0]}.${ip_parts[1]}" == "${net_parts[0]}.${net_parts[1]}" ]] ;; + 24) [[ "${ip_parts[0]}.${ip_parts[1]}.${ip_parts[2]}" == "${net_parts[0]}.${net_parts[1]}.${net_parts[2]}" ]] ;; + 32) [[ "$ip" == "$network" ]] ;; + *) return 1 ;; + esac +} + +# Format IP address according to the configuration +format_ip_tag() { + local ip="$1" + local format="${TAG_FORMAT:-$DEFAULT_TAG_FORMAT}" + + case "$format" in + "last_octet") echo "${ip##*.}" ;; + "last_two_octets") echo "${ip#*.*.}" ;; + *) echo "$ip" ;; + esac +} + +# Check if IP is in any CIDRs +ip_in_cidrs() { + local ip="$1" cidrs="$2" + [[ -z "$cidrs" ]] && return 1 + local IFS=' ' + for cidr in $cidrs; do ip_in_cidr "$ip" "$cidr" && return 0; done + return 1 +} + +# Check if IP is valid +is_valid_ipv4() { + local ip="$1" + [[ "$ip" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] || return 1 + + local IFS='.' parts + read -ra parts <<< "$ip" + for part in "${parts[@]}"; do + (( part >= 0 && part <= 255 )) || return 1 + done + return 0 +} + +lxc_status_changed() { + current_lxc_status=$(pct list 2>/dev/null) + if [ "${last_lxc_status}" == "${current_lxc_status}" ]; then + return 1 + else + last_lxc_status="${current_lxc_status}" + return 0 + fi +} + +vm_status_changed() { + current_vm_status=$(qm list 2>/dev/null) + if [ "${last_vm_status}" == "${current_vm_status}" ]; then + return 1 + else + last_vm_status="${current_vm_status}" + return 0 + fi +} + +fw_net_interface_changed() { + current_net_interface=$(ifconfig | grep "^fw") + if [ "${last_net_interface}" == "${current_net_interface}" ]; then + return 1 + else + last_net_interface="${current_net_interface}" + return 0 + fi +} + +# Get VM IPs using MAC addresses and ARP table +get_vm_ips() { + local vmid=$1 ips="" macs found_ip=false + qm status "$vmid" 2>/dev/null | grep -q "status: running" || return + + macs=$(qm config "$vmid" 2>/dev/null | grep -E 'net[0-9]+' | grep -oE '[a-fA-F0-9]{2}(:[a-fA-F0-9]{2}){5}') + [[ -z "$macs" ]] && return + + for mac in $macs; do + local ip + ip=$(arp -an 2>/dev/null | grep -i "$mac" | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}') + [[ -n "$ip" ]] && { ips+="$ip "; found_ip=true; } + done + + if ! $found_ip; then + local agent_ip + agent_ip=$(qm agent "$vmid" network-get-interfaces 2>/dev/null | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' || true) + [[ -n "$agent_ip" ]] && ips+="$agent_ip " + fi + + echo "${ips% }" +} + +# Update tags +update_tags() { + local type="$1" vmid="$2" config_cmd="pct" + [[ "$type" == "vm" ]] && config_cmd="qm" + + local current_ips_full + if [[ "$type" == "lxc" ]]; then + current_ips_full=$(lxc-info -n "${vmid}" -i 2>/dev/null | grep -E "^IP:" | awk '{print $2}') + else + current_ips_full=$(get_vm_ips "${vmid}") + fi + [[ -z "$current_ips_full" ]] && return + + local current_tags=() next_tags=() current_ip_tags=() + mapfile -t current_tags < <($config_cmd config "${vmid}" 2>/dev/null | grep tags | awk '{print $2}' | sed 's/;/\n/g') + + # Separate IP and non-IP tags + for tag in "${current_tags[@]}"; do + if is_valid_ipv4 "${tag}" || [[ "$tag" =~ ^[0-9]+(\.[0-9]+)*$ ]]; then + current_ip_tags+=("${tag}") + else + next_tags+=("${tag}") + fi + done + + local formatted_ips=() needs_update=false added_ips=() + for ip in ${current_ips_full}; do + if is_valid_ipv4 "$ip" && ip_in_cidrs "$ip" "${CIDR_LIST[*]}"; then + local formatted_ip=$(format_ip_tag "$ip") + formatted_ips+=("$formatted_ip") + if [[ ! " ${current_ip_tags[*]} " =~ " ${formatted_ip} " ]]; then + needs_update=true + added_ips+=("$formatted_ip") + next_tags+=("$formatted_ip") + fi + fi + done + + [[ ${#formatted_ips[@]} -eq 0 ]] && return + + # Add existing IP tags that are still valid + for tag in "${current_ip_tags[@]}"; do + if [[ " ${formatted_ips[*]} " =~ " ${tag} " ]]; then + if [[ ! " ${next_tags[*]} " =~ " ${tag} " ]]; then + next_tags+=("$tag") + fi + fi + done + + if [[ "$needs_update" == true ]]; then + echo "${type^} ${vmid}: adding IP tags: ${added_ips[*]}" + $config_cmd set "${vmid}" -tags "$(IFS=';'; echo "${next_tags[*]}")" &>/dev/null + elif [[ ${#current_ip_tags[@]} -gt 0 ]]; then + echo "${type^} ${vmid}: IP tags already set: ${current_ip_tags[*]}" + else + echo "${type^} ${vmid}: setting initial IP tags: ${formatted_ips[*]}" + $config_cmd set "${vmid}" -tags "$(IFS=';'; echo "${formatted_ips[*]}")" &>/dev/null + fi +} + +# Check if status changed +check_status() { + local type="$1" current + case "$type" in + "lxc") current=$(pct list 2>/dev/null | grep -v VMID) ;; + "vm") current=$(qm list 2>/dev/null | grep -v VMID) ;; + "fw") current=$(ifconfig 2>/dev/null | grep "^fw") ;; + esac + local last_var="last_${type}_status" + [[ "${!last_var}" == "$current" ]] && return 1 + eval "$last_var='$current'" + return 0 +} + +# Update all instances +update_all() { + local type="$1" list_cmd="pct" vmids count=0 + [[ "$type" == "vm" ]] && list_cmd="qm" + + vmids=$($list_cmd list 2>/dev/null | grep -v VMID | awk '{print $1}') + for vmid in $vmids; do ((count++)); done + + echo "Found ${count} running ${type}s" + [[ $count -eq 0 ]] && return + + for vmid in $vmids; do + update_tags "$type" "$vmid" + done +} + +# Main check function +check() { + local current_time changes_detected=false + current_time=$(date +%s) + + for type in "lxc" "vm"; do + local interval_var="${type^^}_STATUS_CHECK_INTERVAL" + local last_check_var="last_${type}_check_time" + local last_update_var="last_update_${type}_time" + + if [[ "${!interval_var}" -gt 0 ]] && (( current_time - ${!last_check_var} >= ${!interval_var} )); then + echo "Checking ${type^^} status..." + eval "${last_check_var}=\$current_time" + if check_status "$type"; then + changes_detected=true + update_all "$type" + eval "${last_update_var}=\$current_time" + fi + fi + + if (( current_time - ${!last_update_var} >= FORCE_UPDATE_INTERVAL )); then + echo "Force updating ${type} tags..." + changes_detected=true + update_all "$type" + eval "${last_update_var}=\$current_time" + fi + done + + if [[ "${FW_NET_INTERFACE_CHECK_INTERVAL}" -gt 0 ]] && \ + (( current_time - last_fw_check_time >= FW_NET_INTERFACE_CHECK_INTERVAL )); then + echo "Checking network interfaces..." + last_fw_check_time=$current_time + if check_status "fw"; then + changes_detected=true + update_all "lxc" + update_all "vm" + last_update_lxc_time=$current_time + last_update_vm_time=$current_time + fi + fi + + $changes_detected || echo "No changes detected in system status" +} + +# Initialize time variables +declare -g last_lxc_status="" last_vm_status="" last_fw_status="" +declare -g last_lxc_check_time=0 last_vm_check_time=0 last_fw_check_time=0 +declare -g last_update_lxc_time=0 last_update_vm_time=0 + +# Main loop +main() { + while true; do + check + sleep "${LOOP_INTERVAL:-$DEFAULT_CHECK_INTERVAL}" + done +} + +main +EOF + chmod +x /opt/iptag/iptag + + # Update service file + cat </lib/systemd/system/iptag.service +[Unit] +Description=IP-Tag service +After=network.target + +[Service] +Type=simple +ExecStart=/opt/iptag/iptag +Restart=always + +[Install] +WantedBy=multi-user.target +EOF + + systemctl daemon-reload &>/dev/null + systemctl enable -q --now iptag.service &>/dev/null + msg_ok "Updated IP-Tag Scripts" +} + +# Main installation process +if check_service_exists; then + while true; do + read -p "IP-Tag service is already installed. Do you want to update it? (y/n): " yn + case $yn in + [Yy]*) + update_installation + exit 0 + ;; + [Nn]*) + msg_error "Installation cancelled." + exit 0 + ;; + *) + msg_error "Please answer yes or no." + ;; + esac + done +fi + +while true; do + read -p "This will install ${APP} on ${hostname}. Proceed? (y/n): " yn + case $yn in + [Yy]*) + break + ;; + [Nn]*) + msg_error "Installation cancelled." + exit + ;; + *) + msg_error "Please answer yes or no." + ;; + esac +done + +if ! pveversion | grep -Eq "pve-manager/8\.[0-4](\.[0-9]+)*"; then + msg_error "This version of Proxmox Virtual Environment is not supported" + msg_error "⚠️ Requires Proxmox Virtual Environment Version 8.0 or later." + msg_error "Exiting..." + sleep 2 + exit +fi + +FILE_PATH="/usr/local/bin/iptag" +if [[ -f "$FILE_PATH" ]]; then + msg_info "The file already exists: '$FILE_PATH'. Skipping installation." + exit 0 +fi + +msg_info "Installing Dependencies" +apt-get update &>/dev/null +apt-get install -y ipcalc net-tools &>/dev/null +msg_ok "Installed Dependencies" + +msg_info "Setting up IP-Tag Scripts" +mkdir -p /opt/iptag +msg_ok "Setup IP-Tag Scripts" + +# Migrate config if needed +migrate_config + +msg_info "Setup Default Config" +if [[ ! -f /opt/iptag/iptag.conf ]]; then + cat </opt/iptag/iptag.conf +# Configuration file for LXC IP tagging + +# List of allowed CIDRs +CIDR_LIST=( + 192.168.0.0/16 + 172.16.0.0/12 + 10.0.0.0/8 + 100.64.0.0/10 +) + +# Tag format options: +# - "full": full IP address (e.g., 192.168.0.100) +# - "last_octet": only the last octet (e.g., 100) +# - "last_two_octets": last two octets (e.g., 0.100) +TAG_FORMAT="full" + +# Interval settings (in seconds) +LOOP_INTERVAL=60 +VM_STATUS_CHECK_INTERVAL=60 +FW_NET_INTERFACE_CHECK_INTERVAL=60 +LXC_STATUS_CHECK_INTERVAL=60 +FORCE_UPDATE_INTERVAL=1800 +EOF + msg_ok "Setup default config" +else + msg_ok "Default config already exists" +fi + +msg_info "Setup Main Function" +if [[ ! -f /opt/iptag/iptag ]]; then + cat <<'EOF' >/opt/iptag/iptag +#!/bin/bash +# =============== CONFIGURATION =============== # +CONFIG_FILE="/opt/iptag/iptag.conf" + +# Load the configuration file if it exists +if [ -f "$CONFIG_FILE" ]; then + # shellcheck source=./iptag.conf + source "$CONFIG_FILE" +fi + +# Convert IP to integer for comparison +ip_to_int() { + local ip="$1" + local a b c d + IFS=. read -r a b c d <<< "${ip}" + echo "$((a << 24 | b << 16 | c << 8 | d))" +} + +# Check if IP is in CIDR +ip_in_cidr() { + local ip="$1" + local cidr="$2" + + # Use ipcalc with the -c option (check), which returns 0 if the IP is in the network + if ipcalc -c "$ip" "$cidr" >/dev/null 2>&1; then + # Get network address and mask from CIDR + local network prefix + network=$(echo "$cidr" | cut -d/ -f1) + prefix=$(echo "$cidr" | cut -d/ -f2) + + # Check if IP is in the network + local ip_a ip_b ip_c ip_d net_a net_b net_c net_d + IFS=. read -r ip_a ip_b ip_c ip_d <<< "$ip" + IFS=. read -r net_a net_b net_c net_d <<< "$network" + + # Check octets match based on prefix length + local result=0 + if (( prefix >= 8 )); then + [[ "$ip_a" != "$net_a" ]] && result=1 + fi + if (( prefix >= 16 )); then + [[ "$ip_b" != "$net_b" ]] && result=1 + fi + if (( prefix >= 24 )); then + [[ "$ip_c" != "$net_c" ]] && result=1 + fi + + return $result + fi + + return 1 +} + +# Format IP address according to the configuration +format_ip_tag() { + local ip="$1" + local format="${TAG_FORMAT:-full}" + + case "$format" in + "last_octet") + echo "${ip##*.}" + ;; + "last_two_octets") + echo "${ip#*.*.}" + ;; + *) + echo "$ip" + ;; + esac +} + +# Check if IP is in any CIDRs +ip_in_cidrs() { + local ip="$1" + local cidrs="$2" + + # Check that cidrs is not empty + [[ -z "$cidrs" ]] && return 1 + + local IFS=' ' + for cidr in $cidrs; do + ip_in_cidr "$ip" "$cidr" && return 0 + done + return 1 +} + +# Check if IP is valid +is_valid_ipv4() { + local ip="$1" + [[ "$ip" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] || return 1 + local IFS='.' + read -ra parts <<< "$ip" + for part in "${parts[@]}"; do + [[ "$part" =~ ^[0-9]+$ ]] && ((part >= 0 && part <= 255)) || return 1 + done + return 0 +} + +lxc_status_changed() { + current_lxc_status=$(pct list 2>/dev/null) + if [ "${last_lxc_status}" == "${current_lxc_status}" ]; then + return 1 + else + last_lxc_status="${current_lxc_status}" + return 0 + fi +} + +vm_status_changed() { + current_vm_status=$(qm list 2>/dev/null) + if [ "${last_vm_status}" == "${current_vm_status}" ]; then + return 1 + else + last_vm_status="${current_vm_status}" + return 0 + fi +} + +fw_net_interface_changed() { + current_net_interface=$(ifconfig | grep "^fw") + if [ "${last_net_interface}" == "${current_net_interface}" ]; then + return 1 + else + last_net_interface="${current_net_interface}" + return 0 + fi +} + +# Get VM IPs using MAC addresses and ARP table +get_vm_ips() { + local vmid=$1 + local ips="" + + # Check if VM is running + qm status "$vmid" 2>/dev/null | grep -q "status: running" || return + + # Get MAC addresses from VM configuration + local macs + macs=$(qm config "$vmid" 2>/dev/null | grep -E 'net[0-9]+' | grep -o -E '[a-fA-F0-9]{2}(:[a-fA-F0-9]{2}){5}') + + # Look up IPs from ARP table using MAC addresses + for mac in $macs; do + local ip + ip=$(arp -an 2>/dev/null | grep -i "$mac" | grep -o -E '([0-9]{1,3}\.){3}[0-9]{1,3}') + if [ -n "$ip" ]; then + ips+="$ip " + fi + done + + echo "$ips" +} + +# Update tags for container or VM +update_tags() { + local type="$1" + local vmid="$2" + local config_cmd="pct" + [[ "$type" == "vm" ]] && config_cmd="qm" + + # Get current IPs + local current_ips_full + if [[ "$type" == "lxc" ]]; then + # Redirect error output to suppress AppArmor warnings + current_ips_full=$(lxc-info -n "${vmid}" -i 2>/dev/null | grep -E "^IP:" | awk '{print $2}') + else + current_ips_full=$(get_vm_ips "${vmid}") + fi + + # Parse current tags and get valid IPs + local current_tags=() + local next_tags=() + mapfile -t current_tags < <($config_cmd config "${vmid}" 2>/dev/null | grep tags | awk '{print $2}' | sed 's/;/\n/g') + + for tag in "${current_tags[@]}"; do + # Skip tag if it looks like an IP (full or partial) + if ! is_valid_ipv4 "${tag}" && ! [[ "$tag" =~ ^[0-9]+(\.[0-9]+)*$ ]]; then + next_tags+=("${tag}") + fi + done + + # Add valid IPs to tags + local added_ips=() + local skipped_ips=() + + for ip in ${current_ips_full}; do + if is_valid_ipv4 "${ip}"; then + if ip_in_cidrs "${ip}" "${CIDR_LIST[*]}"; then + local formatted_ip=$(format_ip_tag "$ip") + next_tags+=("${formatted_ip}") + added_ips+=("${formatted_ip}") + else + skipped_ips+=("${ip}") + fi + fi + done + + # Log only if there are changes + if [ ${#added_ips[@]} -gt 0 ]; then + echo "${type^} ${vmid}: added IP tags: ${added_ips[*]}" + fi + + # Update if changed + if [[ "$(IFS=';'; echo "${current_tags[*]}")" != "$(IFS=';'; echo "${next_tags[*]}")" ]]; then + $config_cmd set "${vmid}" -tags "$(IFS=';'; echo "${next_tags[*]}")" &>/dev/null + fi +} + +# Check if status changed +check_status_changed() { + local type="$1" + local current_status + + case "$type" in + "lxc") + current_status=$(pct list 2>/dev/null | grep -v VMID) + [[ "${last_lxc_status}" == "${current_status}" ]] && return 1 + last_lxc_status="${current_status}" + ;; + "vm") + current_status=$(qm list 2>/dev/null | grep -v VMID) + [[ "${last_vm_status}" == "${current_status}" ]] && return 1 + last_vm_status="${current_status}" + ;; + "fw") + current_status=$(ifconfig 2>/dev/null | grep "^fw") + [[ "${last_net_interface}" == "${current_status}" ]] && return 1 + last_net_interface="${current_status}" + ;; + esac + return 0 +} + +check() { + current_time=$(date +%s) + + # Check LXC status + time_since_last_lxc_status_check=$((current_time - last_lxc_status_check_time)) + if [[ "${LXC_STATUS_CHECK_INTERVAL}" -gt 0 ]] \ + && [[ "${time_since_last_lxc_status_check}" -ge "${LXC_STATUS_CHECK_INTERVAL}" ]]; then + echo "Checking LXC status..." + last_lxc_status_check_time=${current_time} + if check_status_changed "lxc"; then + update_all_tags "lxc" + last_update_lxc_time=${current_time} + fi + fi + + # Check VM status + time_since_last_vm_status_check=$((current_time - last_vm_status_check_time)) + if [[ "${VM_STATUS_CHECK_INTERVAL}" -gt 0 ]] \ + && [[ "${time_since_last_vm_status_check}" -ge "${VM_STATUS_CHECK_INTERVAL}" ]]; then + echo "Checking VM status..." + last_vm_status_check_time=${current_time} + if check_status_changed "vm"; then + update_all_tags "vm" + last_update_vm_time=${current_time} + fi + fi + + # Check network interface changes + time_since_last_fw_net_interface_check=$((current_time - last_fw_net_interface_check_time)) + if [[ "${FW_NET_INTERFACE_CHECK_INTERVAL}" -gt 0 ]] \ + && [[ "${time_since_last_fw_net_interface_check}" -ge "${FW_NET_INTERFACE_CHECK_INTERVAL}" ]]; then + echo "Checking network interfaces..." + last_fw_net_interface_check_time=${current_time} + if check_status_changed "fw"; then + update_all_tags "lxc" + update_all_tags "vm" + last_update_lxc_time=${current_time} + last_update_vm_time=${current_time} + fi + fi + + # Force update if needed + for type in "lxc" "vm"; do + local last_update_var="last_update_${type}_time" + local time_since_last_update=$((current_time - ${!last_update_var})) + if [ ${time_since_last_update} -ge ${FORCE_UPDATE_INTERVAL} ]; then + echo "Force updating ${type} tags..." + update_all_tags "$type" + eval "${last_update_var}=${current_time}" + fi + done +} + +# Initialize time variables +last_lxc_status_check_time=0 +last_vm_status_check_time=0 +last_fw_net_interface_check_time=0 +last_update_lxc_time=0 +last_update_vm_time=0 + +# main: Set the IP tags for all LXC containers and VMs +main() { + while true; do + check + sleep "${LOOP_INTERVAL}" + done +} + +main +EOF + msg_ok "Setup Main Function" +else + msg_ok "Main Function already exists" +fi +chmod +x /opt/iptag/iptag + +msg_info "Creating Service" +if [[ ! -f /lib/systemd/system/iptag.service ]]; then + cat </lib/systemd/system/iptag.service +[Unit] +Description=IP-Tag service +After=network.target + +[Service] +Type=simple +ExecStart=/opt/iptag/iptag +Restart=always + +[Install] +WantedBy=multi-user.target +EOF + msg_ok "Created Service" +else + msg_ok "Service already exists." +fi + +msg_ok "Setup IP-Tag Scripts" + +msg_info "Starting Service" +systemctl daemon-reload &>/dev/null +systemctl enable -q --now iptag.service &>/dev/null +msg_ok "Started Service" +SPINNER_PID="" +echo -e "\n${APP} installation completed successfully! ${CL}\n" diff --git a/misc/build.func b/misc/build.func index 8265e7686..fb78fcc36 100644 --- a/misc/build.func +++ b/misc/build.func @@ -1336,7 +1336,7 @@ build_container() { $PW " # This executes create_lxc.sh and creates the container and .conf file - bash -c "$(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/ct/create_lxc.sh)" || exit $? + bash -c "$(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/ct/create_lxc.sh)" $? LXC_CONFIG=/etc/pve/lxc/${CTID}.conf if [ "$CT_TYPE" == "0" ]; then @@ -1398,7 +1398,7 @@ http://dl-cdn.alpinelinux.org/alpine/latest-stable/community EOF' pct exec "$CTID" -- ash -c "apk add bash >/dev/null" fi - lxc-attach -n "$CTID" -- bash -c "$(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/install/"$var_install".sh)" || exit $? + lxc-attach -n "$CTID" -- bash -c "$(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/install/"$var_install".sh)" $? } diff --git a/tools/addon/add-netbird-lxc.sh b/tools/addon/add-netbird-lxc.sh index 430ea63a0..0ca45f3ba 100644 --- a/tools/addon/add-netbird-lxc.sh +++ b/tools/addon/add-netbird-lxc.sh @@ -51,7 +51,7 @@ while [ -z "${CTID:+x}" ]; do CTID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Containers on $NODE" --radiolist \ "\nSelect a container to add NetBird to:\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done LXC_STATUS=$(pct status "$CTID" | awk '{print $2}') @@ -84,7 +84,7 @@ curl -fsSL "https://pkgs.netbird.io/debian/public.key" | gpg --dearmor >/usr/sha echo "deb [signed-by=/usr/share/keyrings/netbird-archive-keyring.gpg] https://pkgs.netbird.io/debian stable main" >/etc/apt/sources.list.d/netbird.list apt-get update &>/dev/null apt-get install -y netbird-ui &>/dev/null -' || exit +' msg "\e[1;32m ✔ Installed NetBird.\e[0m" sleep 2 msg "\e[1;31m Reboot ${CTID} LXC to apply the changes, then run netbird up in the LXC console\e[0m" diff --git a/tools/addon/add-tailscale-lxc.sh b/tools/addon/add-tailscale-lxc.sh index 5183a5b4f..e2f0cf748 100644 --- a/tools/addon/add-tailscale-lxc.sh +++ b/tools/addon/add-tailscale-lxc.sh @@ -49,7 +49,7 @@ while [ -z "${CTID:+x}" ]; do CTID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Containers on $NODE" --radiolist \ "\nSelect a container to add Tailscale to:\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done CTID_CONFIG_PATH=/etc/pve/lxc/${CTID}.conf @@ -66,7 +66,7 @@ curl -fsSL https://pkgs.tailscale.com/stable/$ID/$VER.noarmor.gpg | tee /usr/sha echo "deb [signed-by=/usr/share/keyrings/tailscale-archive-keyring.gpg] https://pkgs.tailscale.com/stable/$ID $VER main" >/etc/apt/sources.list.d/tailscale.list apt-get update &>/dev/null apt-get install -y tailscale &>/dev/null -' || exit +' TAGS=$(awk -F': ' '/^tags:/ {print $2}' /etc/pve/lxc/${CTID}.conf) TAGS="${TAGS:+$TAGS; }tailscale" pct set "$CTID" -tags "${TAGS}" diff --git a/tools/addon/all-templates.sh b/tools/addon/all-templates.sh index 80f8c807c..fd7cc288c 100644 --- a/tools/addon/all-templates.sh +++ b/tools/addon/all-templates.sh @@ -58,7 +58,7 @@ fi header_info echo "Loading..." pveam update >/dev/null 2>&1 -whiptail --backtitle "Proxmox VE Helper Scripts" --title "All Templates" --yesno "This will allow for the creation of one of the many Template LXC Containers. Proceed?" 10 68 || exit +whiptail --backtitle "Proxmox VE Helper Scripts" --title "All Templates" --yesno "This will allow for the creation of one of the many Template LXC Containers. Proceed?" 10 68 TEMPLATE_MENU=() MSG_MAX_LENGTH=0 while read -r TAG ITEM; do @@ -66,7 +66,7 @@ while read -r TAG ITEM; do ((${#ITEM} + OFFSET > MSG_MAX_LENGTH)) && MSG_MAX_LENGTH=${#ITEM}+OFFSET TEMPLATE_MENU+=("$ITEM" "$TAG " "OFF") done < <(pveam available) -TEMPLATE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "All Template LXCs" --radiolist "\nSelect a Template LXC to create:\n" 16 $((MSG_MAX_LENGTH + 58)) 10 "${TEMPLATE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') || exit +TEMPLATE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "All Template LXCs" --radiolist "\nSelect a Template LXC to create:\n" 16 $((MSG_MAX_LENGTH + 58)) 10 "${TEMPLATE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') [ -z "$TEMPLATE" ] && { whiptail --backtitle "Proxmox VE Helper Scripts" --title "No Template LXC Selected" --msgbox "It appears that no Template LXC container was selected" 10 68 msg "Done" @@ -133,7 +133,7 @@ function select_storage() { local STORAGE 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 the ${CONTENT_LABEL,,}?\n\n" \ + "Which storage pool would you like to use for the ${CONTENT_LABEL,,}?\n\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ "${MENU[@]}" 3>&1 1>&2 2>&3) || die "Menu aborted." done @@ -142,11 +142,11 @@ function select_storage() { } header_info # Get template storage -TEMPLATE_STORAGE=$(select_storage template) || exit +TEMPLATE_STORAGE=$(select_storage template) info "Using '$TEMPLATE_STORAGE' for template storage." # Get container storage -CONTAINER_STORAGE=$(select_storage container) || exit +CONTAINER_STORAGE=$(select_storage container) info "Using '$CONTAINER_STORAGE' for container storage." # Download template diff --git a/tools/addon/webmin.sh b/tools/addon/webmin.sh index 2502699ef..f62ded036 100644 --- a/tools/addon/webmin.sh +++ b/tools/addon/webmin.sh @@ -38,7 +38,7 @@ msg_ok() { header_info -whiptail --backtitle "Proxmox VE Helper Scripts" --title "Webmin Installer" --yesno "This Will Install Webmin on this LXC Container. Proceed?" 10 58 || exit +whiptail --backtitle "Proxmox VE Helper Scripts" --title "Webmin Installer" --yesno "This Will Install Webmin on this LXC Container. Proceed?" 10 58 msg_info "Installing Prerequisites" apt update &>/dev/null diff --git a/tools/copy-data/home-assistant-container-copy-data-home-assistant-container.sh b/tools/copy-data/home-assistant-container-copy-data-home-assistant-container.sh index 0b872b519..acf2b380a 100644 --- a/tools/copy-data/home-assistant-container-copy-data-home-assistant-container.sh +++ b/tools/copy-data/home-assistant-container-copy-data-home-assistant-container.sh @@ -74,13 +74,13 @@ while [ -z "${CTID_FROM:+x}" ]; do CTID_FROM=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$TITLE" --radiolist \ "\nWhich HA LXC would you like to copy FROM?\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done while [ -z "${CTID_TO:+x}" ]; do CTID_TO=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$TITLE" --radiolist \ "\nWhich HA LXC would you like to copy TO?\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done for i in ${!CTID_MENU[@]}; do [ "${CTID_MENU[$i]}" == "$CTID_FROM" ] && @@ -91,7 +91,7 @@ done whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "$TITLE" --yesno \ "Are you sure you want to copy data between the following LXCs? $CTID_FROM (${CTID_FROM_HOSTNAME}) -> $CTID_TO (${CTID_TO_HOSTNAME}) -Version: 2022.01.23" 13 50 || exit +Version: 2022.01.23" 13 50 info "Home Assistant Data from '$CTID_FROM' to '$CTID_TO'" if [ $(pct status "$CTID_TO" | sed 's/.* //') == 'running' ]; then msg "Stopping '$CTID_TO'..." diff --git a/tools/copy-data/home-assistant-container-copy-data-home-assistant-core.sh b/tools/copy-data/home-assistant-container-copy-data-home-assistant-core.sh index cafdc35d8..cea3814c8 100644 --- a/tools/copy-data/home-assistant-container-copy-data-home-assistant-core.sh +++ b/tools/copy-data/home-assistant-container-copy-data-home-assistant-core.sh @@ -72,13 +72,13 @@ while [ -z "${CTID_FROM:+x}" ]; do CTID_FROM=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$TITLE" --radiolist \ "\nWhich HA Container LXC would you like to copy FROM?\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done while [ -z "${CTID_TO:+x}" ]; do CTID_TO=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$TITLE" --radiolist \ "\nWhich HA Core LXC would you like to copy TO?\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done for i in ${!CTID_MENU[@]}; do [ "${CTID_MENU[$i]}" == "$CTID_FROM" ] && @@ -89,7 +89,7 @@ done whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "$TITLE" --yesno \ "Are you sure you want to copy data between the following LXCs? $CTID_FROM (${CTID_FROM_HOSTNAME}) -> $CTID_TO (${CTID_TO_HOSTNAME}) -Version: 2022.10.02" 13 50 || exit +Version: 2022.10.02" 13 50 info "Home Assistant Data from '$CTID_FROM' to '$CTID_TO'" if [ $(pct status $CTID_TO | sed 's/.* //') == 'running' ]; then msg "Stopping '$CTID_TO'..." diff --git a/tools/copy-data/home-assistant-container-copy-data-podman-home-assistant.sh b/tools/copy-data/home-assistant-container-copy-data-podman-home-assistant.sh index 1e46f0503..9f13acca6 100644 --- a/tools/copy-data/home-assistant-container-copy-data-podman-home-assistant.sh +++ b/tools/copy-data/home-assistant-container-copy-data-podman-home-assistant.sh @@ -74,13 +74,13 @@ while [ -z "${CTID_FROM:+x}" ]; do CTID_FROM=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$TITLE" --radiolist \ "\nWhich HA LXC would you like to copy FROM?\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done while [ -z "${CTID_TO:+x}" ]; do CTID_TO=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$TITLE" --radiolist \ "\nWhich HA Podman LXC would you like to copy TO?\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done for i in ${!CTID_MENU[@]}; do [ "${CTID_MENU[$i]}" == "$CTID_FROM" ] && @@ -91,7 +91,7 @@ done whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "$TITLE" --yesno \ "Are you sure you want to copy data between the following LXCs? $CTID_FROM (${CTID_FROM_HOSTNAME}) -> $CTID_TO (${CTID_TO_HOSTNAME}) -Version: 2022.02.12" 13 50 || exit +Version: 2022.02.12" 13 50 info "Home Assistant Data from '$CTID_FROM' to '$CTID_TO'" if [ $(pct status $CTID_TO | sed 's/.* //') == 'running' ]; then msg "Stopping '$CTID_TO'..." diff --git a/tools/copy-data/home-assistant-core-copy-data-home-assistant-container.sh b/tools/copy-data/home-assistant-core-copy-data-home-assistant-container.sh index 4cf019c5b..25591ae2d 100644 --- a/tools/copy-data/home-assistant-core-copy-data-home-assistant-container.sh +++ b/tools/copy-data/home-assistant-core-copy-data-home-assistant-container.sh @@ -72,13 +72,13 @@ while [ -z "${CTID_FROM:+x}" ]; do CTID_FROM=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$TITLE" --radiolist \ "\nWhich HA Core LXC would you like to copy FROM?\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done while [ -z "${CTID_TO:+x}" ]; do CTID_TO=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$TITLE" --radiolist \ "\nWhich HA Container LXC would you like to copy TO?\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done for i in ${!CTID_MENU[@]}; do [ "${CTID_MENU[$i]}" == "$CTID_FROM" ] && @@ -89,7 +89,7 @@ done whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "$TITLE" --yesno \ "Are you sure you want to copy data between the following LXCs? $CTID_FROM (${CTID_FROM_HOSTNAME}) -> $CTID_TO (${CTID_TO_HOSTNAME}) -Version: 2022.10.02" 13 50 || exit +Version: 2022.10.02" 13 50 info "Home Assistant Data from '$CTID_FROM' to '$CTID_TO'" if [ $(pct status $CTID_TO | sed 's/.* //') == 'running' ]; then msg "Stopping '$CTID_TO'..." diff --git a/tools/copy-data/home-assistant-core-copy-data-home-assistant-core.sh b/tools/copy-data/home-assistant-core-copy-data-home-assistant-core.sh index 64332c5e2..30347709a 100644 --- a/tools/copy-data/home-assistant-core-copy-data-home-assistant-core.sh +++ b/tools/copy-data/home-assistant-core-copy-data-home-assistant-core.sh @@ -67,13 +67,13 @@ while [ -z "${CTID_FROM:+x}" ]; do CTID_FROM=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$TITLE" --radiolist \ "\nWhich HA Core LXC would you like to copy FROM?\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done while [ -z "${CTID_TO:+x}" ]; do CTID_TO=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$TITLE" --radiolist \ "\nWhich HA Core LXC would you like to copy TO?\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done for i in ${!CTID_MENU[@]}; do [ "${CTID_MENU[$i]}" == "$CTID_FROM" ] && @@ -84,7 +84,7 @@ done whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "$TITLE" --yesno \ "Are you sure you want to copy data between the following LXCs? $CTID_FROM (${CTID_FROM_HOSTNAME}) -> $CTID_TO (${CTID_TO_HOSTNAME}) -Version: 2022.10.03" 13 50 || exit +Version: 2022.10.03" 13 50 info "Home Assistant Data from '$CTID_FROM' to '$CTID_TO'" if [ $(pct status $CTID_FROM | sed 's/.* //') == 'running' ]; then msg "Stopping '$CTID_FROM'..." diff --git a/tools/copy-data/plex-copy-data-plex.sh b/tools/copy-data/plex-copy-data-plex.sh index 3c8e85633..987eda933 100644 --- a/tools/copy-data/plex-copy-data-plex.sh +++ b/tools/copy-data/plex-copy-data-plex.sh @@ -74,13 +74,13 @@ while [ -z "${CTID_FROM:+x}" ]; do CTID_FROM=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$TITLE" --radiolist \ "\nWhich Plex Media Server LXC would you like to copy FROM?\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done while [ -z "${CTID_TO:+x}" ]; do CTID_TO=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$TITLE" --radiolist \ "\nWhich Plex Media Server LXC would you like to copy TO?\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done for i in ${!CTID_MENU[@]}; do [ "${CTID_MENU[$i]}" == "$CTID_FROM" ] && @@ -91,7 +91,7 @@ done whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "$TITLE" --yesno \ "Are you sure you want to copy data between the following LXCs? $CTID_FROM (${CTID_FROM_HOSTNAME}) -> $CTID_TO (${CTID_TO_HOSTNAME}) -Version: 2022.01.24" 13 50 || exit +Version: 2022.01.24" 13 50 info "Plex Media Server Data from '$CTID_FROM' to '$CTID_TO'" if [ $(pct status $CTID_TO | sed 's/.* //') == 'running' ]; then msg "Stopping '$CTID_TO'..." diff --git a/tools/copy-data/podman-home-assistant-copy-data-home-assistant-container.sh b/tools/copy-data/podman-home-assistant-copy-data-home-assistant-container.sh index 19c05ed84..a0aef23e8 100644 --- a/tools/copy-data/podman-home-assistant-copy-data-home-assistant-container.sh +++ b/tools/copy-data/podman-home-assistant-copy-data-home-assistant-container.sh @@ -74,13 +74,13 @@ while [ -z "${CTID_FROM:+x}" ]; do CTID_FROM=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$TITLE" --radiolist \ "\nWhich HA Podman LXC would you like to copy FROM?\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done while [ -z "${CTID_TO:+x}" ]; do CTID_TO=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$TITLE" --radiolist \ "\nWhich HA LXC would you like to copy TO?\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done for i in ${!CTID_MENU[@]}; do [ "${CTID_MENU[$i]}" == "$CTID_FROM" ] && @@ -91,7 +91,7 @@ done whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "$TITLE" --yesno \ "Are you sure you want to copy data between the following LXCs? $CTID_FROM (${CTID_FROM_HOSTNAME}) -> $CTID_TO (${CTID_TO_HOSTNAME}) -Version: 2022.03.31" 13 50 || exit +Version: 2022.03.31" 13 50 info "Home Assistant Data from '$CTID_FROM' to '$CTID_TO'" if [ $(pct status $CTID_TO | sed 's/.* //') == 'running' ]; then msg "Stopping '$CTID_TO'..." diff --git a/tools/copy-data/z2m-copy-data-z2m.sh b/tools/copy-data/z2m-copy-data-z2m.sh index d0cc4e271..785251bc0 100644 --- a/tools/copy-data/z2m-copy-data-z2m.sh +++ b/tools/copy-data/z2m-copy-data-z2m.sh @@ -74,13 +74,13 @@ while [ -z "${CTID_FROM:+x}" ]; do CTID_FROM=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$TITLE" --radiolist \ "\nWhich Zigbee2MQTT LXC would you like to copy FROM?\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done while [ -z "${CTID_TO:+x}" ]; do CTID_TO=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$TITLE" --radiolist \ "\nWhich Zigbee2MQTT LXC would you like to copy TO?\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done for i in ${!CTID_MENU[@]}; do [ "${CTID_MENU[$i]}" == "$CTID_FROM" ] && @@ -91,7 +91,7 @@ done whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "$TITLE" --yesno \ "Are you sure you want to copy data between the following LXCs? $CTID_FROM (${CTID_FROM_HOSTNAME}) -> $CTID_TO (${CTID_TO_HOSTNAME}) -Version: 2022.01.23" 13 50 || exit +Version: 2022.01.23" 13 50 info "Zigbee2MQTT Data from '$CTID_FROM' to '$CTID_TO'" if [ $(pct status $CTID_TO | sed 's/.* //') == 'running' ]; then msg "Stopping '$CTID_TO'..." diff --git a/tools/copy-data/zwavejs2mqtt-copy-data-zwavejsui.sh b/tools/copy-data/zwavejs2mqtt-copy-data-zwavejsui.sh index 9d675cb76..af39a58ff 100644 --- a/tools/copy-data/zwavejs2mqtt-copy-data-zwavejsui.sh +++ b/tools/copy-data/zwavejs2mqtt-copy-data-zwavejsui.sh @@ -75,13 +75,13 @@ while [ -z "${CTID_FROM:+x}" ]; do CTID_FROM=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$TITLE" --radiolist \ "\nWhich Zwavejs2MQTT LXC would you like to copy FROM?\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done while [ -z "${CTID_TO:+x}" ]; do CTID_TO=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$TITLE" --radiolist \ "\nWhich Z-wave JS UI LXC would you like to copy TO?\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done for i in ${!CTID_MENU[@]}; do [ "${CTID_MENU[$i]}" == "$CTID_FROM" ] && @@ -92,7 +92,7 @@ done whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "$TITLE" --yesno \ "Are you sure you want to copy data between the following LXCs? $CTID_FROM (${CTID_FROM_HOSTNAME}) -> $CTID_TO (${CTID_TO_HOSTNAME}) -Version: 2022.09.21" 13 50 || exit +Version: 2022.09.21" 13 50 info "Zwavejs2MQTT Data from '$CTID_FROM' to '$CTID_TO'" if [ $(pct status "$CTID_TO" | sed 's/.* //') == 'running' ]; then msg "Stopping '$CTID_TO'..." diff --git a/tools/pve/clean-lxcs.sh b/tools/pve/clean-lxcs.sh index 195210167..1c8cfe173 100644 --- a/tools/pve/clean-lxcs.sh +++ b/tools/pve/clean-lxcs.sh @@ -23,7 +23,7 @@ GN=$(echo "\033[1;92m") CL=$(echo "\033[m") header_info echo "Loading..." -whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Updater" --yesno "This Will Clean logs, cache and update apt lists on selected LXC Containers. Proceed?" 10 58 || exit +whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Updater" --yesno "This Will Clean logs, cache and update apt lists on selected LXC Containers. Proceed?" 10 58 NODE=$(hostname) EXCLUDE_MENU=() MSG_MAX_LENGTH=0 @@ -33,7 +33,7 @@ while read -r TAG ITEM; do EXCLUDE_MENU+=("$TAG" "$ITEM " "OFF") done < <(pct list | awk 'NR>1') excluded_containers=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Containers on $NODE" --checklist "\nSelect containers to skip from cleaning:\n" \ - 16 $((MSG_MAX_LENGTH + 23)) 6 "${EXCLUDE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') || exit + 16 $((MSG_MAX_LENGTH + 23)) 6 "${EXCLUDE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') function clean_container() { container=$1 diff --git a/tools/pve/frigate-support.sh b/tools/pve/frigate-support.sh index 3ca5ae2ca..5c8ec6bff 100644 --- a/tools/pve/frigate-support.sh +++ b/tools/pve/frigate-support.sh @@ -74,7 +74,7 @@ while [ -z "${CTID:+x}" ]; do CTID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Containers on $NODE" --radiolist \ "\nSelect a container to add support:\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${CTID_MENU[@]}" 3>&1 1>&2 2>&3) done # Add autodev settings diff --git a/tools/pve/fstrim.sh b/tools/pve/fstrim.sh index 1e8fe3ffa..308ead01d 100644 --- a/tools/pve/fstrim.sh +++ b/tools/pve/fstrim.sh @@ -34,7 +34,7 @@ if [ "$ROOT_FS" != "ext4" ]; then fi whiptail --backtitle "Proxmox VE Helper Scripts" \ --title "Proxmox VE LXC Filesystem Trim" \ - --yesno "The LXC containers will undergo the fstrim command. Proceed?" 10 58 || exit + --yesno "The LXC containers will undergo the fstrim command. Proceed?" 10 58 NODE=$(hostname) EXCLUDE_MENU=() diff --git a/tools/pve/hw-acceleration.sh b/tools/pve/hw-acceleration.sh index 2a21fd39a..996fa1c53 100644 --- a/tools/pve/hw-acceleration.sh +++ b/tools/pve/hw-acceleration.sh @@ -49,7 +49,7 @@ if ! pveversion | grep -Eq "pve-manager/8\.[0-4](\.[0-9]+)*"; then exit fi -whiptail --backtitle "Proxmox VE Helper Scripts" --title "Add Intel HW Acceleration" --yesno "This Will Add Intel HW Acceleration to an existing LXC Container. Proceed?" 8 72 || exit +whiptail --backtitle "Proxmox VE Helper Scripts" --title "Add Intel HW Acceleration" --yesno "This Will Add Intel HW Acceleration to an existing LXC Container. Proceed?" 8 72 NODE=$(hostname) PREV_MENU=() MSG_MAX_LENGTH=0 @@ -66,7 +66,7 @@ while read -r TAG ITEM; do PREV_MENU+=("$TAG" "$ITEM " "OFF") done < <(echo "$privileged_containers") -privileged_container=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Privileged Containers on $NODE" --checklist "\nSelect a Container To Add Intel HW Acceleration:\n" 16 $((MSG_MAX_LENGTH + 23)) 6 "${PREV_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') || exit +privileged_container=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Privileged Containers on $NODE" --checklist "\nSelect a Container To Add Intel HW Acceleration:\n" 16 $((MSG_MAX_LENGTH + 23)) 6 "${PREV_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') header_info read -r -p "Verbose mode? " prompt if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then diff --git a/tools/pve/kernel-pin.sh b/tools/pve/kernel-pin.sh index 4ba86ae12..347e6fb0d 100644 --- a/tools/pve/kernel-pin.sh +++ b/tools/pve/kernel-pin.sh @@ -37,7 +37,7 @@ function msg_ok() { echo -e "${BFR} ${CM} ${GN}${msg}${CL}" } -whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE Kernel Pin" --yesno "This will Pin/Unpin Kernel Images, Proceed?" 10 68 || exit +whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE Kernel Pin" --yesno "This will Pin/Unpin Kernel Images, Proceed?" 10 68 KERNEL_MENU=() MSG_MAX_LENGTH=0 @@ -47,7 +47,7 @@ while read -r TAG ITEM; do KERNEL_MENU+=("$TAG" "$ITEM " "OFF") done < <(echo "$available_kernels") -pin_kernel=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Current Kernel $current_kernel" --radiolist "\nSelect Kernel to pin:\nCancel to Unpin any Kernel" 16 $((MSG_MAX_LENGTH + 58)) 6 "${KERNEL_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') || exit +pin_kernel=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Current Kernel $current_kernel" --radiolist "\nSelect Kernel to pin:\nCancel to Unpin any Kernel" 16 $((MSG_MAX_LENGTH + 58)) 6 "${KERNEL_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') [ -z "$pin_kernel" ] && { whiptail --backtitle "Proxmox VE Helper Scripts" --title "No Kernel Selected" --msgbox "It appears that no Kernel was selected\nUnpinning any pinned Kernel" 10 68 msg_info "Unpinning any Kernel" @@ -59,7 +59,7 @@ pin_kernel=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Current K echo -e "${RD} REBOOT${CL}" exit } -whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE Kernel Pin" --yesno "Would you like to pin the $pin_kernel Kernel?" 10 68 || exit +whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE Kernel Pin" --yesno "Would you like to pin the $pin_kernel Kernel?" 10 68 msg_info "Pinning $pin_kernel" proxmox-boot-tool kernel pin $pin_kernel &>/dev/null diff --git a/tools/pve/lxc-delete.sh b/tools/pve/lxc-delete.sh index 99a7e0871..1dde1868e 100644 --- a/tools/pve/lxc-delete.sh +++ b/tools/pve/lxc-delete.sh @@ -40,7 +40,7 @@ CM="${TAB}✔️${TAB}${CL}" header_info echo "Loading..." -whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Deletion" --yesno "This will delete LXC containers. Proceed?" 10 58 || exit +whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Deletion" --yesno "This will delete LXC containers. Proceed?" 10 58 NODE=$(hostname) containers=$(pct list | tail -n +2 | awk '{print $0 " " $4}') diff --git a/tools/pve/microcode.sh b/tools/pve/microcode.sh index 385eb88cf..de81af429 100644 --- a/tools/pve/microcode.sh +++ b/tools/pve/microcode.sh @@ -61,7 +61,7 @@ intel() { MICROCODE_MENU+=("$TAG" "$ITEM " "OFF") done < <(echo "$intel_microcode") - microcode=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Current Microcode revision:${current_microcode}" --radiolist "\nSelect a microcode package to install:\n" 16 $((MSG_MAX_LENGTH + 58)) 6 "${MICROCODE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') || exit + microcode=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Current Microcode revision:${current_microcode}" --radiolist "\nSelect a microcode package to install:\n" 16 $((MSG_MAX_LENGTH + 58)) 6 "${MICROCODE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') [ -z "$microcode" ] && { whiptail --backtitle "Proxmox VE Helper Scripts" --title "No Microcode Selected" --msgbox "It appears that no microcode packages were selected" 10 68 @@ -105,7 +105,7 @@ amd() { MICROCODE_MENU+=("$TAG" "$ITEM " "OFF") done < <(echo "$amd_microcode") - microcode=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Current Microcode revision:${current_microcode}" --radiolist "\nSelect a microcode package to install:\n" 16 $((MSG_MAX_LENGTH + 58)) 6 "${MICROCODE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') || exit + microcode=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Current Microcode revision:${current_microcode}" --radiolist "\nSelect a microcode package to install:\n" 16 $((MSG_MAX_LENGTH + 58)) 6 "${MICROCODE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') [ -z "$microcode" ] && { whiptail --backtitle "Proxmox VE Helper Scripts" --title "No Microcode Selected" --msgbox "It appears that no microcode packages were selected" 10 68 @@ -135,7 +135,7 @@ if ! command -v pveversion >/dev/null 2>&1; then exit fi -whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE Processor Microcode" --yesno "This will check for CPU microcode packages with the option to install. Proceed?" 10 58 || exit +whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE Processor Microcode" --yesno "This will check for CPU microcode packages with the option to install. Proceed?" 10 58 msg_info "Checking CPU Vendor" cpu=$(lscpu | grep -oP 'Vendor ID:\s*\K\S+' | head -n 1) diff --git a/tools/pve/pbs_microcode.sh b/tools/pve/pbs_microcode.sh index 694649e35..07f32b311 100644 --- a/tools/pve/pbs_microcode.sh +++ b/tools/pve/pbs_microcode.sh @@ -78,7 +78,7 @@ intel() { microcode=$(whiptail --backtitle "Proxmox Backup Server Helper Scripts" \ --title "Current Microcode Revision: ${current_microcode}" \ --radiolist "\nSelect a microcode package to install:\n" \ - 16 $((MSG_MAX_LENGTH + 58)) 6 "${MICROCODE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') || exit + 16 $((MSG_MAX_LENGTH + 58)) 6 "${MICROCODE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') [ -z "$microcode" ] && { whiptail --backtitle "Proxmox Backup Server Helper Scripts" --title "No Microcode Selected" --msgbox "No microcode package was selected." 10 68 @@ -125,7 +125,7 @@ amd() { microcode=$(whiptail --backtitle "Proxmox Backup Server Helper Scripts" \ --title "Current Microcode Revision: ${current_microcode}" \ --radiolist "\nSelect a microcode package to install:\n" \ - 16 $((MSG_MAX_LENGTH + 58)) 6 "${MICROCODE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') || exit + 16 $((MSG_MAX_LENGTH + 58)) 6 "${MICROCODE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') [ -z "$microcode" ] && { whiptail --backtitle "Proxmox Backup Server Helper Scripts" --title "No Microcode Selected" --msgbox "No microcode package was selected." 10 68 @@ -158,7 +158,7 @@ fi whiptail --backtitle "Proxmox Backup Server Helper Scripts" \ --title "Proxmox Backup Server Processor Microcode" \ - --yesno "This script searches for CPU microcode packages and offers the option to install them.\nProceed?" 10 68 || exit + --yesno "This script searches for CPU microcode packages and offers the option to install them.\nProceed?" 10 68 msg_info "Checking CPU vendor" cpu=$(lscpu | grep -oP 'Vendor ID:\s*\K\S+' | head -n 1) diff --git a/tools/pve/scaling-governor.sh b/tools/pve/scaling-governor.sh index 29cff8d76..86b4a9b57 100644 --- a/tools/pve/scaling-governor.sh +++ b/tools/pve/scaling-governor.sh @@ -15,7 +15,7 @@ header_info() { EOF } header_info -whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU Scaling Governors" --yesno "View/Change CPU Scaling Governors. Proceed?" 10 58 || exit +whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU Scaling Governors" --yesno "View/Change CPU Scaling Governors. Proceed?" 10 58 current_governor=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor) GOVERNORS_MENU=() MSG_MAX_LENGTH=0 @@ -24,7 +24,7 @@ while read -r TAG ITEM; do ((${#ITEM} + OFFSET > MSG_MAX_LENGTH)) && MSG_MAX_LENGTH=${#ITEM}+OFFSET GOVERNORS_MENU+=("$TAG" "$ITEM " "OFF") done < <(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors | tr ' ' '\n' | grep -v "$current_governor") -scaling_governor=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Current CPU Scaling Governor is set to $current_governor" --checklist "\nSelect the Scaling Governor to use:\n" 16 $((MSG_MAX_LENGTH + 58)) 6 "${GOVERNORS_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') || exit +scaling_governor=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Current CPU Scaling Governor is set to $current_governor" --checklist "\nSelect the Scaling Governor to use:\n" 16 $((MSG_MAX_LENGTH + 58)) 6 "${GOVERNORS_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') [ -z "$scaling_governor" ] && { whiptail --backtitle "Proxmox VE Helper Scripts" --title "No CPU Scaling Governor Selected" --msgbox "It appears that no CPU Scaling Governor was selected" 10 68 clear diff --git a/tools/pve/update-lxcs.sh b/tools/pve/update-lxcs.sh index 973e5973d..4aa41b1ac 100644 --- a/tools/pve/update-lxcs.sh +++ b/tools/pve/update-lxcs.sh @@ -26,7 +26,7 @@ GN=$(echo "\033[1;92m") CL=$(echo "\033[m") header_info echo "Loading..." -whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Updater" --yesno "This Will Update LXC Containers. Proceed?" 10 58 || exit +whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Updater" --yesno "This Will Update LXC Containers. Proceed?" 10 58 NODE=$(hostname) EXCLUDE_MENU=() MSG_MAX_LENGTH=0 @@ -35,7 +35,7 @@ while read -r TAG ITEM; do ((${#ITEM} + OFFSET > MSG_MAX_LENGTH)) && MSG_MAX_LENGTH=${#ITEM}+OFFSET EXCLUDE_MENU+=("$TAG" "$ITEM " "OFF") done < <(pct list | awk 'NR>1') -excluded_containers=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Containers on $NODE" --checklist "\nSelect containers to skip from updates:\n" 16 $((MSG_MAX_LENGTH + 23)) 6 "${EXCLUDE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') || exit +excluded_containers=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Containers on $NODE" --checklist "\nSelect containers to skip from updates:\n" 16 $((MSG_MAX_LENGTH + 23)) 6 "${EXCLUDE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') function needs_reboot() { local container=$1 diff --git a/turnkey/turnkey.sh b/turnkey/turnkey.sh index 0e71dcad3..71cfca81d 100644 --- a/turnkey/turnkey.sh +++ b/turnkey/turnkey.sh @@ -56,7 +56,7 @@ if systemctl is-active -q ping-instances.service; then systemctl stop ping-instances.service fi header_info -whiptail --backtitle "Proxmox VE Helper Scripts" --title "TurnKey LXCs" --yesno "This will allow for the creation of one of the many TurnKey LXC Containers. Proceed?" 10 68 || exit +whiptail --backtitle "Proxmox VE Helper Scripts" --title "TurnKey LXCs" --yesno "This will allow for the creation of one of the many TurnKey LXC Containers. Proceed?" 10 68 TURNKEY_MENU=() MSG_MAX_LENGTH=0 while read -r TAG ITEM; do @@ -88,7 +88,7 @@ wordpress Wordpress zoneminder ZoneMinder EOF ) -turnkey=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "TurnKey LXCs" --radiolist "\nSelect a TurnKey LXC to create:\n" 16 $((MSG_MAX_LENGTH + 58)) 6 "${TURNKEY_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') || exit +turnkey=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "TurnKey LXCs" --radiolist "\nSelect a TurnKey LXC to create:\n" 16 $((MSG_MAX_LENGTH + 58)) 6 "${TURNKEY_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') [ -z "$turnkey" ] && { whiptail --backtitle "Proxmox VE Helper Scripts" --title "No TurnKey LXC Selected" --msgbox "It appears that no TurnKey LXC container was selected" 10 68 msg "Done" @@ -154,7 +154,7 @@ function select_storage() { local STORAGE 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 the ${CONTENT_LABEL,,}?\n\n" \ + "Which storage pool would you like to use for the ${CONTENT_LABEL,,}?\n\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ "${MENU[@]}" 3>&1 1>&2 2>&3) || die "Menu aborted." done @@ -163,11 +163,11 @@ function select_storage() { } # Get template storage -TEMPLATE_STORAGE=$(select_storage template) || exit +TEMPLATE_STORAGE=$(select_storage template) info "Using '$TEMPLATE_STORAGE' for template storage." # Get container storage -CONTAINER_STORAGE=$(select_storage container) || exit +CONTAINER_STORAGE=$(select_storage container) info "Using '$CONTAINER_STORAGE' for container storage." # Update LXC template list @@ -238,4 +238,4 @@ info "Proceed to the LXC console to complete the setup." echo info "login: root" info "password: $PASS" -echo \ No newline at end of file +echo diff --git a/vm/archlinux-vm.sh b/vm/archlinux-vm.sh index 0c7b4bdb1..e749c49f3 100644 --- a/vm/archlinux-vm.sh +++ b/vm/archlinux-vm.sh @@ -6,7 +6,6 @@ source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) - function header_info { clear cat <<"EOF" @@ -65,7 +64,7 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT +trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM function error_handler() { local exit_code="$?" @@ -94,7 +93,7 @@ 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 + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit fi function msg_info() { @@ -123,7 +122,7 @@ function check_root() { } function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; then + if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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..." @@ -228,7 +227,7 @@ function advanced_settings() { 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 @@ -243,7 +242,7 @@ function advanced_settings() { 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 \ @@ -414,9 +413,9 @@ elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then 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" \ + "Which storage pool would you 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 + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) done fi msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." @@ -495,11 +494,11 @@ 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 + 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 + 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})" diff --git a/vm/debian-vm.sh b/vm/debian-vm.sh index 4599ea2ca..0345438d4 100644 --- a/vm/debian-vm.sh +++ b/vm/debian-vm.sh @@ -63,7 +63,7 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT +trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM function error_handler() { local exit_code="$?" @@ -93,7 +93,7 @@ pushd $TEMP_DIR >/dev/null if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Debian 12 VM" --yesno "This will create a New Debian 12 VM. Proceed?" 10 58; then : else - header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit fi function msg_info() { @@ -122,7 +122,7 @@ function check_root() { } function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; then + if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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..." @@ -227,7 +227,7 @@ function advanced_settings() { 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 @@ -414,9 +414,9 @@ elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then 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" \ + "Which storage pool would you 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 + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) done fi msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." diff --git a/vm/docker-vm.sh b/vm/docker-vm.sh index eaecdd4f7..bbac79ebd 100644 --- a/vm/docker-vm.sh +++ b/vm/docker-vm.sh @@ -44,7 +44,7 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT +trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM function error_handler() { local exit_code="$?" @@ -102,13 +102,13 @@ function check_root() { } function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; then + if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; then msg_error "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 + fi } function arch_check() { @@ -377,9 +377,9 @@ elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then 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" \ + "Which storage pool would you 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 + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) done fi msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." @@ -421,14 +421,13 @@ msg_ok "Installed libguestfs-tools successfully" msg_info "Adding Docker and Docker Compose Plugin to Debian 12 Qcow2 Disk Image" virt-customize -q -a "${FILE}" --install qemu-guest-agent,apt-transport-https,ca-certificates,curl,gnupg,software-properties-common,lsb-release >/dev/null && -virt-customize -q -a "${FILE}" --run-command "mkdir -p /etc/apt/keyrings && curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg" >/dev/null && -virt-customize -q -a "${FILE}" --run-command "echo 'deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable' > /etc/apt/sources.list.d/docker.list" >/dev/null && -virt-customize -q -a "${FILE}" --run-command "apt-get update -qq && apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin" >/dev/null && -virt-customize -q -a "${FILE}" --run-command "systemctl enable docker" >/dev/null && -virt-customize -q -a "${FILE}" --run-command "echo -n > /etc/machine-id" >/dev/null + virt-customize -q -a "${FILE}" --run-command "mkdir -p /etc/apt/keyrings && curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg" >/dev/null && + virt-customize -q -a "${FILE}" --run-command "echo 'deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable' > /etc/apt/sources.list.d/docker.list" >/dev/null && + virt-customize -q -a "${FILE}" --run-command "apt-get update -qq && apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin" >/dev/null && + virt-customize -q -a "${FILE}" --run-command "systemctl enable docker" >/dev/null && + virt-customize -q -a "${FILE}" --run-command "echo -n > /etc/machine-id" >/dev/null msg_ok "Added Docker and Docker Compose Plugin to Debian 12 Qcow2 Disk Image successfully" - msg_info "Creating a Docker 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-script,debian12,docker -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci @@ -442,7 +441,8 @@ qm set $VMID \ qm resize $VMID scsi0 8G >/dev/null qm set $VMID --agent enabled=1 >/dev/null - DESCRIPTION=$(cat < Logo diff --git a/vm/haos-vm.sh b/vm/haos-vm.sh index ab06a7d1a..da74cc906 100644 --- a/vm/haos-vm.sh +++ b/vm/haos-vm.sh @@ -7,7 +7,6 @@ source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) - function header_info { clear cat <<"EOF" @@ -51,11 +50,11 @@ SPINNER_PID="" set -Eeuo pipefail trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT +trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM function error_handler() { - if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi + if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi printf "\e[?25h" local exit_code="$?" local line_number="$1" @@ -87,13 +86,13 @@ else fi function spinner() { - local chars="/-\|" - local spin_i=0 - printf "\e[?25l" - while true; do - printf "\r \e[36m%s\e[0m" "${chars:spin_i++%${#chars}:1}" - sleep 0.1 - done + local chars="/-\|" + local spin_i=0 + printf "\e[?25l" + while true; do + printf "\r \e[36m%s\e[0m" "${chars:spin_i++%${#chars}:1}" + sleep 0.1 + done } function msg_info() { @@ -104,14 +103,14 @@ function msg_info() { } function msg_ok() { - if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi + if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi printf "\e[?25h" local msg="$1" echo -e "${BFR} ${CM} ${GN}${msg}${CL}" } function msg_error() { - if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi + if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi printf "\e[?25h" local msg="$1" echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" @@ -134,7 +133,7 @@ function pve_check() { echo -e "Exiting..." sleep 2 exit -fi + fi } function arch_check() { @@ -393,7 +392,6 @@ pve_check ssh_check start_script - post_to_api_vm msg_info "Validating Storage" @@ -416,12 +414,12 @@ elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then STORAGE=${STORAGE_MENU[0]} else while [ -z "${STORAGE:+x}" ]; do - if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi + if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi printf "\e[?25h" 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" \ + "Which storage pool would you 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 + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) done fi msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." @@ -485,5 +483,3 @@ if [ "$START_VM" == "yes" ]; then fi post_update_to_api "done" "none" msg_ok "Completed Successfully!\n" - - diff --git a/vm/mikrotik-routeros.sh b/vm/mikrotik-routeros.sh index 16533bdc0..730a74c28 100644 --- a/vm/mikrotik-routeros.sh +++ b/vm/mikrotik-routeros.sh @@ -7,7 +7,6 @@ source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) - function header_info { cat <<"EOF" __ ____ __ __ _ __ ____ __ ____ _____ ________ ______ @@ -50,7 +49,7 @@ shopt -s expand_aliases alias die='EXIT=$? LINE=$LINENO error_exit' trap die ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT +trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM function error_exit() { trap - ERR @@ -242,9 +241,9 @@ elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then 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 the Mikrotik RouterOS CHR VM?\n\n" \ + "Which storage pool would you like to use for the Mikrotik RouterOS CHR VM?\n\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) done fi msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." diff --git a/vm/nextcloud-vm.sh b/vm/nextcloud-vm.sh index 3eb8fe911..8bbbb5c5d 100644 --- a/vm/nextcloud-vm.sh +++ b/vm/nextcloud-vm.sh @@ -46,7 +46,7 @@ THIN="discard=on,ssd=1" set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT +trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM function error_handler() { local exit_code="$?" @@ -110,7 +110,7 @@ function pve_check() { echo -e "Exiting..." sleep 2 exit -fi + fi } function arch_check() { @@ -378,9 +378,9 @@ elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then 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" \ + "Which storage pool would you 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 + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) done fi msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." diff --git a/vm/openwrt.sh b/vm/openwrt.sh index 0b4ceccc5..26a747647 100644 --- a/vm/openwrt.sh +++ b/vm/openwrt.sh @@ -49,7 +49,7 @@ CROSS="${RD}✗${CL}" set -Eeo pipefail trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT +trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM function error_handler() { local exit_code="$?" @@ -176,7 +176,7 @@ function pve_check() { echo -e "Exiting..." sleep 2 exit -fi + fi } function arch_check() { @@ -438,9 +438,9 @@ elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then 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 the OpenWrt VM?\n\n" \ + "Which storage pool would you like to use for the OpenWrt VM?\n\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) done fi msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." diff --git a/vm/opnsense-vm.sh b/vm/opnsense-vm.sh index 8ec543388..1f811da0e 100644 --- a/vm/opnsense-vm.sh +++ b/vm/opnsense-vm.sh @@ -8,7 +8,7 @@ source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-sc function header_info { clear - cat <<"EOF" + cat <<"EOF" ____ ____ _ __ / __ \/ __ \/ | / /_______ ____ ________ / / / / /_/ / |/ / ___/ _ \/ __ \/ ___/ _ \ @@ -230,8 +230,8 @@ function default_settings() { echo -e "${DGN}Allocated Cores: ${BGN}${CORE_COUNT}${CL}" echo -e "${DGN}Allocated RAM: ${BGN}${RAM_SIZE}${CL}" if ! grep -q "^iface ${BRG}" /etc/network/interfaces; then - msg_error "Bridge '${BRG}' does not exist in /etc/network/interfaces" - exit + msg_error "Bridge '${BRG}' does not exist in /etc/network/interfaces" + exit else echo -e "${DGN}Using LAN Bridge: ${BGN}${BRG}${CL}" fi @@ -516,9 +516,9 @@ elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then 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" \ + "Which storage pool would you 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 + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) done fi msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." @@ -530,7 +530,7 @@ msg_ok "${CL}${BL}${URL}${CL}" curl -f#SL -o "$(basename "$URL")" "$URL" echo -en "\e[1A\e[0K" FILE=Fressbsd.qcow2 -unxz -cv $(basename $URL) > ${FILE} +unxz -cv $(basename $URL) >${FILE} msg_ok "Downloaded ${CL}${BL}${FILE}${CL}" STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') @@ -564,10 +564,11 @@ qm set $VMID \ -efidisk0 ${DISK0_REF}${FORMAT} \ -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=2G \ -boot order=scsi0 \ - -serial0 socket >/dev/null \ - -tags community-script + -serial0 socket \ + -tags community-script >/dev/null qm resize $VMID scsi0 10G >/dev/null - DESCRIPTION=$(cat < Logo @@ -596,76 +597,76 @@ qm resize $VMID scsi0 10G >/dev/null EOF ) - qm set "$VMID" -description "$DESCRIPTION" >/dev/null +qm set "$VMID" -description "$DESCRIPTION" >/dev/null msg_info "Bridge interfaces are being added." qm set $VMID \ -net0 virtio,bridge=${BRG},macaddr=${MAC}${VLAN}${MTU} 2>/dev/null msg_ok "Bridge interfaces have been successfully added." - -msg_ok "Created a OPNsense VM ${CL}${BL}(${HN})" - msg_ok "Starting OPNsense VM (Patience this takes 20-30 minutes)" - qm start $VMID - sleep 90 - send_line_to_vm "root" - send_line_to_vm "fetch https://raw.githubusercontent.com/opnsense/update/master/src/bootstrap/opnsense-bootstrap.sh.in" - qm set $VMID \ - -net1 virtio,bridge=${WAN_BRG},macaddr=${WAN_MAC} &>/dev/null - sleep 10 - send_line_to_vm "sh ./opnsense-bootstrap.sh.in -y -f -r 25.1" - msg_ok "OPNsense VM is being installed, do not close the terminal, or the installation will fail." - #We need to wait for the OPNsense build proccess to finish, this takes a few minutes - sleep 1000 - send_line_to_vm "root" - send_line_to_vm "opnsense" - send_line_to_vm "2" - if [ "$IP_ADDR" != "" ]; then - send_line_to_vm "1" - send_line_to_vm "n" - send_line_to_vm "${IP_ADDR}" - send_line_to_vm "${NETMASK}" - send_line_to_vm "${LAN_GW}" - send_line_to_vm "n" - send_line_to_vm " " - send_line_to_vm "n" - send_line_to_vm "n" - send_line_to_vm " " - send_line_to_vm "n" - send_line_to_vm "n" - send_line_to_vm "n" - send_line_to_vm "n" - send_line_to_vm "n" - else - send_line_to_vm "1" - send_line_to_vm "y" - send_line_to_vm "n" - send_line_to_vm "n" - send_line_to_vm " " - send_line_to_vm "n" - send_line_to_vm "n" - send_line_to_vm "n" - fi - #we need to wait for the Config changes to be saved - sleep 20 - if [ "$WAN_IP_ADDR" != "" ]; then - send_line_to_vm "2" - send_line_to_vm "2" - send_line_to_vm "n" - send_line_to_vm "${WAN_IP_ADDR}" - send_line_to_vm "${NETMASK}" - send_line_to_vm "${LAN_GW}" - send_line_to_vm "n" - send_line_to_vm " " - send_line_to_vm "n" - send_line_to_vm " " - send_line_to_vm "n" - send_line_to_vm "n" - send_line_to_vm "n" - fi - sleep 10 - send_line_to_vm "0" - msg_ok "Started OPNsense VM" +msg_ok "Created a OPNsense VM ${CL}${BL}(${HN})" +msg_ok "Starting OPNsense VM (Patience this takes 20-30 minutes)" +qm start $VMID +sleep 90 +send_line_to_vm "root" +send_line_to_vm "fetch https://raw.githubusercontent.com/opnsense/update/master/src/bootstrap/opnsense-bootstrap.sh.in" +qm set $VMID \ + -net1 virtio,bridge=${WAN_BRG},macaddr=${WAN_MAC} &>/dev/null +sleep 10 +send_line_to_vm "sh ./opnsense-bootstrap.sh.in -y -f -r 25.1" +msg_ok "OPNsense VM is being installed, do not close the terminal, or the installation will fail." +#We need to wait for the OPNsense build proccess to finish, this takes a few minutes +sleep 1000 +send_line_to_vm "root" +send_line_to_vm "opnsense" +send_line_to_vm "2" + +if [ "$IP_ADDR" != "" ]; then + send_line_to_vm "1" + send_line_to_vm "n" + send_line_to_vm "${IP_ADDR}" + send_line_to_vm "${NETMASK}" + send_line_to_vm "${LAN_GW}" + send_line_to_vm "n" + send_line_to_vm " " + send_line_to_vm "n" + send_line_to_vm "n" + send_line_to_vm " " + send_line_to_vm "n" + send_line_to_vm "n" + send_line_to_vm "n" + send_line_to_vm "n" + send_line_to_vm "n" +else + send_line_to_vm "1" + send_line_to_vm "y" + send_line_to_vm "n" + send_line_to_vm "n" + send_line_to_vm " " + send_line_to_vm "n" + send_line_to_vm "n" + send_line_to_vm "n" +fi +#we need to wait for the Config changes to be saved +sleep 20 +if [ "$WAN_IP_ADDR" != "" ]; then + send_line_to_vm "2" + send_line_to_vm "2" + send_line_to_vm "n" + send_line_to_vm "${WAN_IP_ADDR}" + send_line_to_vm "${NETMASK}" + send_line_to_vm "${LAN_GW}" + send_line_to_vm "n" + send_line_to_vm " " + send_line_to_vm "n" + send_line_to_vm " " + send_line_to_vm "n" + send_line_to_vm "n" + send_line_to_vm "n" +fi +sleep 10 +send_line_to_vm "0" +msg_ok "Started OPNsense VM" msg_ok "Completed Successfully!\n" if [ "$IP_ADDR" != "" ]; then diff --git a/vm/owncloud-vm.sh b/vm/owncloud-vm.sh index 9a05d0481..29b0e34eb 100644 --- a/vm/owncloud-vm.sh +++ b/vm/owncloud-vm.sh @@ -46,7 +46,7 @@ THIN="discard=on,ssd=1" set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT +trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM function error_handler() { local exit_code="$?" @@ -104,13 +104,13 @@ function check_root() { } function pve_check() { -if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; then + if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; then msg_error "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 + fi } function arch_check() { @@ -378,9 +378,9 @@ elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then 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" \ + "Which storage pool would you 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 + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) done fi msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." diff --git a/vm/pimox-haos-vm.sh b/vm/pimox-haos-vm.sh index cf0c18453..ab9a9e43b 100644 --- a/vm/pimox-haos-vm.sh +++ b/vm/pimox-haos-vm.sh @@ -58,7 +58,7 @@ shopt -s expand_aliases alias die='EXIT=$? LINE=$LINENO error_exit' trap die ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT +trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM function error_exit() { trap - ERR @@ -84,10 +84,10 @@ function cleanup() { } TEMP_DIR=$(mktemp -d) pushd $TEMP_DIR >/dev/null -if ! command -v whiptail &> /dev/null; then - echo "Installing whiptail..." - apt-get update &>/dev/null - apt-get install -y whiptail &>/dev/null +if ! command -v whiptail &>/dev/null; then + echo "Installing whiptail..." + apt-get update &>/dev/null + apt-get install -y whiptail &>/dev/null fi if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "PiMox HAOS VM" --yesno "This will create a New PiMox HAOS VM. Proceed?" 10 58); then echo "User selected Yes" @@ -285,9 +285,9 @@ elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then 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 the HAOS VM?\n\n" \ + "Which storage pool would you like to use for the HAOS VM?\n\n" \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \ - "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) done fi msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." diff --git a/vm/ubuntu2204-vm.sh b/vm/ubuntu2204-vm.sh index 82c57bd9c..fa35fe34e 100644 --- a/vm/ubuntu2204-vm.sh +++ b/vm/ubuntu2204-vm.sh @@ -63,7 +63,7 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT +trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM function error_handler() { local exit_code="$?" @@ -92,7 +92,7 @@ pushd $TEMP_DIR >/dev/null if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Ubuntu 22.04 VM" --yesno "This will create a New Ubuntu 22.04 VM. Proceed?" 10 58; then : else - header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit fi function msg_info() { @@ -226,7 +226,7 @@ function advanced_settings() { 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 @@ -241,7 +241,7 @@ function advanced_settings() { 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 \ @@ -412,9 +412,9 @@ elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then 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" \ + "Which storage pool would you 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 + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) done fi msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." diff --git a/vm/ubuntu2404-vm.sh b/vm/ubuntu2404-vm.sh index a8978a6f8..9f6bf4b33 100644 --- a/vm/ubuntu2404-vm.sh +++ b/vm/ubuntu2404-vm.sh @@ -29,7 +29,7 @@ var_os="ubuntu" var_version="2404" YW=$(echo "\033[33m") -BL=$(echo "\033[36m") +BL=$(echo "\033[36m") RD=$(echo "\033[01;31m") BGN=$(echo "\033[4;92m") GN=$(echo "\033[1;92m") @@ -64,7 +64,7 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT +trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM function error_handler() { local exit_code="$?" @@ -93,7 +93,7 @@ pushd $TEMP_DIR >/dev/null if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Ubuntu 24.04 VM" --yesno "This will create a New Ubuntu 24.04 VM. Proceed?" 10 58; then : else - header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit fi function msg_info() { @@ -122,7 +122,7 @@ function check_root() { } function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; then + if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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..." @@ -227,7 +227,7 @@ function advanced_settings() { 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 @@ -242,7 +242,7 @@ function advanced_settings() { 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 \ @@ -412,9 +412,9 @@ elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then 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" \ + "Which storage pool would you 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 + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) done fi msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." diff --git a/vm/ubuntu2410-vm.sh b/vm/ubuntu2410-vm.sh index 1d43839a1..ffd30741b 100644 --- a/vm/ubuntu2410-vm.sh +++ b/vm/ubuntu2410-vm.sh @@ -63,7 +63,7 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT +trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM function error_handler() { local exit_code="$?" @@ -92,7 +92,7 @@ pushd $TEMP_DIR >/dev/null if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Ubuntu 24.10 VM" --yesno "This will create a New Ubuntu 24.10 VM. Proceed?" 10 58; then : else - header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit fi function msg_info() { @@ -121,7 +121,7 @@ function check_root() { } function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; then + if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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..." @@ -226,7 +226,7 @@ function advanced_settings() { 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 @@ -241,7 +241,7 @@ function advanced_settings() { 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 \ @@ -412,9 +412,9 @@ elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then 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" \ + "Which storage pool would you 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 + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) done fi msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location."