mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2025-11-24 14:35:23 +00:00
Compare commits
15 Commits
remove-unu
...
MickLesk-p
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2fd303df8b | ||
|
|
ce9323ab17 | ||
|
|
279ed5325c | ||
|
|
b66fb43fff | ||
|
|
ff7b321065 | ||
|
|
6a5ad42279 | ||
|
|
4631f1c09e | ||
|
|
6bcf8b3097 | ||
|
|
7ac9023a57 | ||
|
|
07e46a4585 | ||
|
|
4003aad7d5 | ||
|
|
b9809d6768 | ||
|
|
70d59b825c | ||
|
|
72a39012b6 | ||
|
|
4134f68fb4 |
17
CHANGELOG.md
17
CHANGELOG.md
@@ -10,19 +10,36 @@
|
||||
> [!CAUTION]
|
||||
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
|
||||
|
||||
## 2025-11-24
|
||||
|
||||
## 2025-11-23
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- core: remove journal log rotation [@MickLesk](https://github.com/MickLesk) ([#9392](https://github.com/community-scripts/ProxmoxVE/pull/9392))
|
||||
- [LibreNMS] Correcting mariadb sed string for Debian 13 default in install/librenms-install.sh, website config for Debian 13 #9369 [@htmlspinnr](https://github.com/htmlspinnr) ([#9370](https://github.com/community-scripts/ProxmoxVE/pull/9370))
|
||||
- fix: Snipe-IT update check failure [@ruanmed](https://github.com/ruanmed) ([#9371](https://github.com/community-scripts/ProxmoxVE/pull/9371))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- PVE Kernel Clean: Add info about currently running kernel [@tremor021](https://github.com/tremor021) ([#9388](https://github.com/community-scripts/ProxmoxVE/pull/9388))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Update glpi-install.sh to remove install.php [@CrazyWolf13](https://github.com/CrazyWolf13) ([#9378](https://github.com/community-scripts/ProxmoxVE/pull/9378))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- fix: enhance back navigation in NotFoundPage component and remove unused deps [@BramSuurdje](https://github.com/BramSuurdje) ([#9341](https://github.com/community-scripts/ProxmoxVE/pull/9341))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- feat(frontend): add script disable functionality with visual indicators [@AlphaLawless](https://github.com/AlphaLawless) ([#9374](https://github.com/community-scripts/ProxmoxVE/pull/9374))
|
||||
|
||||
## 2025-11-22
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
850
frontend/bun.lock
generated
850
frontend/bun.lock
generated
File diff suppressed because it is too large
Load Diff
6
frontend/package.json
generated
6
frontend/package.json
generated
@@ -37,6 +37,7 @@
|
||||
"clsx": "^2.1.1",
|
||||
"cmdk": "^1.1.1",
|
||||
"date-fns": "^4.1.0",
|
||||
|
||||
"framer-motion": "^11.18.2",
|
||||
"fuse.js": "^7.1.0",
|
||||
"lucide-react": "^0.554.0",
|
||||
@@ -45,20 +46,15 @@
|
||||
"next": "15.5.2",
|
||||
"next-themes": "^0.4.4",
|
||||
"nuqs": "^2.4.1",
|
||||
"pocketbase": "^0.21.5",
|
||||
"prettier-plugin-organize-imports": "^4.1.0",
|
||||
"react": "19.0.0",
|
||||
"react-chartjs-2": "^5.3.0",
|
||||
"react-code-blocks": "^0.1.6",
|
||||
"react-datepicker": "^7.6.0",
|
||||
"react-day-picker": "^9.4.3",
|
||||
"react-dom": "19.0.0",
|
||||
"react-icons": "^5.5.0",
|
||||
"react-simple-typewriter": "^5.0.1",
|
||||
"react-use-measure": "^2.1.7",
|
||||
"recharts": "2.15.4",
|
||||
"sharp": "^0.33.5",
|
||||
"simple-icons": "^13.21.0",
|
||||
"sonner": "^1.7.4",
|
||||
"tailwind-merge": "^2.6.0",
|
||||
"zod": "^3.24.2"
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
"website": "https://github.com/plexguide/Huntarr.io",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/huntarr.webp",
|
||||
"description": "Huntarr is a tool that automates the search for missing or low-quality media content in your collection. It works seamlessly with applications like Sonarr, Radarr, Lidarr, Readarr, and Whisparr, enhancing their functionality with continuous background scans to identify and update missed or outdated content. Through a user-friendly web interface accessible on port 9705, Huntarr provides real-time statistics, log views, and extensive configuration options. The software is especially useful for users who want to keep their media library up to date by automatically searching for missing episodes or higher-quality versions. Huntarr is well-suited for self-hosted environments and can easily run in LXC containers or Docker setups.",
|
||||
"disable": true,
|
||||
"disable_description": "This script has been temporarily disabled due to ongoing installation failures caused by incompatible Python and build dependencies. PyYAML 6.0 fails to build on Debian 13 and under Python 3.12/3.13, making Huntarr currently non-installable in a reliable way. This issue originates upstream and is under investigation. The script will be re-enabled once a stable solution is available. For details, see: https://github.com/community-scripts/ProxmoxVE/issues/9196 or https://github.com/plexguide/Huntarr.io/issues/747",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
|
||||
43
frontend/public/json/opnsense-vm.json
Normal file
43
frontend/public/json/opnsense-vm.json
Normal file
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"name": "OPNsense",
|
||||
"slug": "opnsense-vm",
|
||||
"categories": [
|
||||
4,
|
||||
2
|
||||
],
|
||||
"date_created": "2025-11-23",
|
||||
"type": "vm",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 443,
|
||||
"documentation": "https://docs.opnsense.org/",
|
||||
"website": "https://opnsense.org/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/opnsense.webp",
|
||||
"config_path": "",
|
||||
"description": "OPNsense is an open-source firewall and routing platform based on FreeBSD. It provides advanced security features, including intrusion detection, VPN support, traffic shaping, and web filtering, with an intuitive web interface for easy management. Known for its reliability and regular updates, OPNsense is a popular choice for both businesses and home networks.",
|
||||
"disable": true,
|
||||
"disable_description": "This script has been temporarily disabled due to installation failures. The OPNsense bootstrap process was not completing successfully, resulting in a plain FreeBSD VM instead of a functional OPNsense installation. The issue is being investigated and the script will be re-enabled once resolved. For more details, see: https://github.com/community-scripts/ProxmoxVE/issues/6183",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "vm/opnsense-vm.sh",
|
||||
"resources": {
|
||||
"cpu": 4,
|
||||
"ram": 8192,
|
||||
"hdd": 10,
|
||||
"os": "FreeBSD",
|
||||
"version": "latest"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": "root",
|
||||
"password": "opnsense"
|
||||
},
|
||||
"notes": [
|
||||
{
|
||||
"text": "It will fail with default settings if there is no vmbr0 and vmbr1 on your node. Use advanced settings in this case.",
|
||||
"type": "warning"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,4 +1,99 @@
|
||||
[
|
||||
{
|
||||
"name": "silverbulletmd/silverbullet",
|
||||
"version": "2.3.0",
|
||||
"date": "2025-11-24T09:48:32Z"
|
||||
},
|
||||
{
|
||||
"name": "morpheus65535/bazarr",
|
||||
"version": "v1.5.3",
|
||||
"date": "2025-09-20T12:12:33Z"
|
||||
},
|
||||
{
|
||||
"name": "semaphoreui/semaphore",
|
||||
"version": "v2.17.0-beta22",
|
||||
"date": "2025-11-24T06:07:49Z"
|
||||
},
|
||||
{
|
||||
"name": "Jackett/Jackett",
|
||||
"version": "v0.24.348",
|
||||
"date": "2025-11-24T05:56:06Z"
|
||||
},
|
||||
{
|
||||
"name": "webmin/webmin",
|
||||
"version": "2.610",
|
||||
"date": "2025-11-24T04:28:30Z"
|
||||
},
|
||||
{
|
||||
"name": "firefly-iii/firefly-iii",
|
||||
"version": "v6.4.8",
|
||||
"date": "2025-11-13T04:42:27Z"
|
||||
},
|
||||
{
|
||||
"name": "open-webui/open-webui",
|
||||
"version": "v0.6.37",
|
||||
"date": "2025-11-24T03:10:18Z"
|
||||
},
|
||||
{
|
||||
"name": "jeedom/core",
|
||||
"version": "4.4.20",
|
||||
"date": "2025-11-24T00:27:05Z"
|
||||
},
|
||||
{
|
||||
"name": "steveiliop56/tinyauth",
|
||||
"version": "v4.1.0",
|
||||
"date": "2025-11-23T12:13:34Z"
|
||||
},
|
||||
{
|
||||
"name": "rcourtman/Pulse",
|
||||
"version": "v4.32.5",
|
||||
"date": "2025-11-23T22:53:33Z"
|
||||
},
|
||||
{
|
||||
"name": "raydak-labs/configarr",
|
||||
"version": "v1.18.0",
|
||||
"date": "2025-11-23T17:42:53Z"
|
||||
},
|
||||
{
|
||||
"name": "wavelog/wavelog",
|
||||
"version": "2.2",
|
||||
"date": "2025-11-23T17:32:38Z"
|
||||
},
|
||||
{
|
||||
"name": "verdaccio/verdaccio",
|
||||
"version": "v6.2.2",
|
||||
"date": "2025-11-23T16:54:07Z"
|
||||
},
|
||||
{
|
||||
"name": "crafty-controller/crafty-4",
|
||||
"version": "v4.6.1",
|
||||
"date": "2025-11-23T16:42:50Z"
|
||||
},
|
||||
{
|
||||
"name": "openhab/openhab-core",
|
||||
"version": "5.0.3",
|
||||
"date": "2025-11-23T14:22:13Z"
|
||||
},
|
||||
{
|
||||
"name": "readeck/readeck",
|
||||
"version": "0.21.2",
|
||||
"date": "2025-11-23T10:56:43Z"
|
||||
},
|
||||
{
|
||||
"name": "tobychui/zoraxy",
|
||||
"version": "v3.3.0-rc1",
|
||||
"date": "2025-11-23T05:42:35Z"
|
||||
},
|
||||
{
|
||||
"name": "hyperion-project/hyperion.ng",
|
||||
"version": "2.1.1",
|
||||
"date": "2025-06-14T17:45:06Z"
|
||||
},
|
||||
{
|
||||
"name": "BerriAI/litellm",
|
||||
"version": "v1.80.5.rc.2",
|
||||
"date": "2025-11-23T00:31:24Z"
|
||||
},
|
||||
{
|
||||
"name": "paperless-ngx/paperless-ngx",
|
||||
"version": "v2.20.0",
|
||||
@@ -39,6 +134,11 @@
|
||||
"version": "v14.2.0",
|
||||
"date": "2025-11-22T12:54:08Z"
|
||||
},
|
||||
{
|
||||
"name": "keycloak/keycloak",
|
||||
"version": "26.4.5",
|
||||
"date": "2025-11-12T15:24:23Z"
|
||||
},
|
||||
{
|
||||
"name": "pocketbase/pocketbase",
|
||||
"version": "v0.34.0",
|
||||
@@ -59,36 +159,16 @@
|
||||
"version": "1.1.5",
|
||||
"date": "2025-11-22T07:02:52Z"
|
||||
},
|
||||
{
|
||||
"name": "Jackett/Jackett",
|
||||
"version": "v0.24.339",
|
||||
"date": "2025-11-22T06:05:53Z"
|
||||
},
|
||||
{
|
||||
"name": "theonedev/onedev",
|
||||
"version": "v13.1.0",
|
||||
"date": "2025-11-22T04:29:25Z"
|
||||
},
|
||||
{
|
||||
"name": "jeedom/core",
|
||||
"version": "4.4.20",
|
||||
"date": "2025-11-22T00:27:05Z"
|
||||
},
|
||||
{
|
||||
"name": "steveiliop56/tinyauth",
|
||||
"version": "v4.0.1",
|
||||
"date": "2025-10-15T16:53:55Z"
|
||||
"date": "2025-11-18T00:06:49Z"
|
||||
},
|
||||
{
|
||||
"name": "TwiN/gatus",
|
||||
"version": "v5.33.0",
|
||||
"date": "2025-11-21T22:54:49Z"
|
||||
},
|
||||
{
|
||||
"name": "BerriAI/litellm",
|
||||
"version": "v1.78.5-stable-patch-1",
|
||||
"date": "2025-11-21T19:57:45Z"
|
||||
},
|
||||
{
|
||||
"name": "homarr-labs/homarr",
|
||||
"version": "v1.44.0",
|
||||
@@ -104,16 +184,6 @@
|
||||
"version": "v1.72.0",
|
||||
"date": "2025-11-21T18:20:58Z"
|
||||
},
|
||||
{
|
||||
"name": "keycloak/keycloak",
|
||||
"version": "26.4.5",
|
||||
"date": "2025-11-12T15:24:23Z"
|
||||
},
|
||||
{
|
||||
"name": "readeck/readeck",
|
||||
"version": "0.21.1",
|
||||
"date": "2025-11-21T17:17:52Z"
|
||||
},
|
||||
{
|
||||
"name": "mattermost/mattermost",
|
||||
"version": "v10.11.8",
|
||||
@@ -154,11 +224,6 @@
|
||||
"version": "v0.23.0-alpha.24",
|
||||
"date": "2025-11-21T12:16:39Z"
|
||||
},
|
||||
{
|
||||
"name": "rcourtman/Pulse",
|
||||
"version": "v4.32.3",
|
||||
"date": "2025-11-21T11:16:25Z"
|
||||
},
|
||||
{
|
||||
"name": "seriousm4x/UpSnap",
|
||||
"version": "5.2.4",
|
||||
@@ -189,11 +254,6 @@
|
||||
"version": "mariadb-12.1.2",
|
||||
"date": "2025-11-18T15:16:21Z"
|
||||
},
|
||||
{
|
||||
"name": "morpheus65535/bazarr",
|
||||
"version": "v1.5.3",
|
||||
"date": "2025-09-20T12:12:33Z"
|
||||
},
|
||||
{
|
||||
"name": "bluenviron/mediamtx",
|
||||
"version": "v1.15.4",
|
||||
@@ -359,11 +419,6 @@
|
||||
"version": "v1.143.0rc1",
|
||||
"date": "2025-11-19T00:09:31Z"
|
||||
},
|
||||
{
|
||||
"name": "hyperion-project/hyperion.ng",
|
||||
"version": "2.1.1",
|
||||
"date": "2025-06-14T17:45:06Z"
|
||||
},
|
||||
{
|
||||
"name": "gtsteffaniak/filebrowser",
|
||||
"version": "v1.0.1-stable",
|
||||
@@ -419,11 +474,6 @@
|
||||
"version": "pmm-6401-v1.130.0",
|
||||
"date": "2025-11-17T21:16:38Z"
|
||||
},
|
||||
{
|
||||
"name": "firefly-iii/firefly-iii",
|
||||
"version": "v6.4.8",
|
||||
"date": "2025-11-13T04:42:27Z"
|
||||
},
|
||||
{
|
||||
"name": "influxdata/telegraf",
|
||||
"version": "v1.36.4",
|
||||
@@ -529,11 +579,6 @@
|
||||
"version": "v4.7.0",
|
||||
"date": "2025-11-14T09:45:13Z"
|
||||
},
|
||||
{
|
||||
"name": "verdaccio/verdaccio",
|
||||
"version": "generator-verdaccio-plugin@6.0.0-next-8.25",
|
||||
"date": "2025-11-14T08:14:55Z"
|
||||
},
|
||||
{
|
||||
"name": "runtipi/runtipi",
|
||||
"version": "v4.6.5",
|
||||
@@ -574,11 +619,6 @@
|
||||
"version": "351",
|
||||
"date": "2025-11-12T11:28:06Z"
|
||||
},
|
||||
{
|
||||
"name": "webmin/webmin",
|
||||
"version": "2.600",
|
||||
"date": "2025-11-12T05:01:55Z"
|
||||
},
|
||||
{
|
||||
"name": "moghtech/komodo",
|
||||
"version": "v1.19.5",
|
||||
@@ -664,11 +704,6 @@
|
||||
"version": "3.5.1",
|
||||
"date": "2025-11-09T05:09:28Z"
|
||||
},
|
||||
{
|
||||
"name": "raydak-labs/configarr",
|
||||
"version": "v1.17.2",
|
||||
"date": "2025-11-08T22:47:58Z"
|
||||
},
|
||||
{
|
||||
"name": "hargata/lubelog",
|
||||
"version": "v1.5.4",
|
||||
@@ -684,11 +719,6 @@
|
||||
"version": "v7.13.0",
|
||||
"date": "2025-11-08T13:36:25Z"
|
||||
},
|
||||
{
|
||||
"name": "semaphoreui/semaphore",
|
||||
"version": "v2.16.45",
|
||||
"date": "2025-11-07T19:08:05Z"
|
||||
},
|
||||
{
|
||||
"name": "cloudflare/cloudflared",
|
||||
"version": "2025.11.1",
|
||||
@@ -704,11 +734,6 @@
|
||||
"version": "v4.52.0",
|
||||
"date": "2025-11-06T22:39:26Z"
|
||||
},
|
||||
{
|
||||
"name": "open-webui/open-webui",
|
||||
"version": "v0.6.36",
|
||||
"date": "2025-11-06T21:45:33Z"
|
||||
},
|
||||
{
|
||||
"name": "HabitRPG/habitica",
|
||||
"version": "v5.41.6",
|
||||
@@ -824,21 +849,11 @@
|
||||
"version": "v25.11.0",
|
||||
"date": "2025-11-04T00:32:21Z"
|
||||
},
|
||||
{
|
||||
"name": "silverbulletmd/silverbullet",
|
||||
"version": "2.2.1",
|
||||
"date": "2025-11-03T06:57:15Z"
|
||||
},
|
||||
{
|
||||
"name": "maxdorninger/MediaManager",
|
||||
"version": "v1.9.1",
|
||||
"date": "2025-11-02T21:14:50Z"
|
||||
},
|
||||
{
|
||||
"name": "tobychui/zoraxy",
|
||||
"version": "v3.2.9",
|
||||
"date": "2025-11-02T05:48:39Z"
|
||||
},
|
||||
{
|
||||
"name": "9001/copyparty",
|
||||
"version": "v1.19.20",
|
||||
@@ -909,11 +924,6 @@
|
||||
"version": "v3.0.0-beta.2",
|
||||
"date": "2025-10-28T10:16:29Z"
|
||||
},
|
||||
{
|
||||
"name": "openhab/openhab-core",
|
||||
"version": "5.1.0.M2",
|
||||
"date": "2025-10-26T14:38:02Z"
|
||||
},
|
||||
{
|
||||
"name": "ErsatzTV/ErsatzTV",
|
||||
"version": "v25.8.0",
|
||||
@@ -994,16 +1004,6 @@
|
||||
"version": "v0.14.1",
|
||||
"date": "2024-08-29T22:32:51Z"
|
||||
},
|
||||
{
|
||||
"name": "wavelog/wavelog",
|
||||
"version": "2.1.2",
|
||||
"date": "2025-10-15T06:51:32Z"
|
||||
},
|
||||
{
|
||||
"name": "crafty-controller/crafty-4",
|
||||
"version": "v4.5.5",
|
||||
"date": "2025-10-14T18:48:36Z"
|
||||
},
|
||||
{
|
||||
"name": "rogerfar/rdt-client",
|
||||
"version": "v2.0.119",
|
||||
|
||||
@@ -35,12 +35,22 @@ export const ScriptSchema = z.object({
|
||||
logo: z.string().url().nullable(),
|
||||
config_path: z.string(),
|
||||
description: z.string().min(1, "Description is required"),
|
||||
disable: z.boolean().optional(),
|
||||
disable_description: z.string().optional(),
|
||||
install_methods: z.array(InstallMethodSchema).min(1, "At least one install method is required"),
|
||||
default_credentials: z.object({
|
||||
username: z.string().nullable(),
|
||||
password: z.string().nullable(),
|
||||
}),
|
||||
notes: z.array(NoteSchema),
|
||||
}).refine((data) => {
|
||||
if (data.disable === true && !data.disable_description) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}, {
|
||||
message: "disable_description is required when disable is true",
|
||||
path: ["disable_description"],
|
||||
});
|
||||
|
||||
export type Script = z.infer<typeof ScriptSchema>;
|
||||
|
||||
@@ -42,6 +42,8 @@ const initialScript: Script = {
|
||||
website: null,
|
||||
logo: null,
|
||||
description: "",
|
||||
disable: undefined,
|
||||
disable_description: undefined,
|
||||
install_methods: [],
|
||||
default_credentials: {
|
||||
username: null,
|
||||
@@ -261,7 +263,25 @@ export default function JSONGenerator() {
|
||||
<Switch checked={script.privileged} onCheckedChange={checked => updateScript("privileged", checked)} />
|
||||
<label>Privileged</label>
|
||||
</div>
|
||||
<div className="flex items-center space-x-2">
|
||||
<Switch checked={script.disable || false} onCheckedChange={checked => updateScript("disable", checked)} />
|
||||
<label>Disabled</label>
|
||||
</div>
|
||||
</div>
|
||||
{script.disable && (
|
||||
<div>
|
||||
<Label>
|
||||
Disable Description
|
||||
{" "}
|
||||
<span className="text-red-500">*</span>
|
||||
</Label>
|
||||
<Textarea
|
||||
placeholder="Explain why this script is disabled..."
|
||||
value={script.disable_description || ""}
|
||||
onChange={e => updateScript("disable_description", e.target.value)}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
<Input
|
||||
placeholder="Interface Port"
|
||||
type="number"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
"use client";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { basePath } from "@/config/site-config";
|
||||
|
||||
export default function NotFoundPage() {
|
||||
return (
|
||||
@@ -12,7 +13,17 @@ export default function NotFoundPage() {
|
||||
Oops, the page you are looking for could not be found.
|
||||
</p>
|
||||
</div>
|
||||
<Button onClick={() => window.history.back()} variant="secondary">
|
||||
<Button
|
||||
onClick={() => {
|
||||
if (window.history.length > 1) {
|
||||
window.history.back();
|
||||
}
|
||||
else {
|
||||
window.location.href = `/${basePath}`;
|
||||
}
|
||||
}}
|
||||
variant="secondary"
|
||||
>
|
||||
Go Back
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
@@ -123,7 +123,7 @@ export default function ScriptAccordion({
|
||||
className={`flex cursor-pointer items-center justify-between gap-1 px-1 py-1 text-muted-foreground hover:rounded-lg hover:bg-accent/60 hover:dark:bg-accent/20 ${selectedScript === script.slug
|
||||
? "rounded-lg bg-accent font-semibold dark:bg-accent/30 dark:text-white"
|
||||
: ""
|
||||
}`}
|
||||
} ${script.disable ? "opacity-60" : ""}`}
|
||||
onClick={() => {
|
||||
handleSelected(script.slug);
|
||||
setSelectedCategory(category.name);
|
||||
@@ -143,7 +143,9 @@ export default function ScriptAccordion({
|
||||
alt={script.name}
|
||||
className="mr-1 w-4 h-4 rounded-full"
|
||||
/>
|
||||
<span className="flex items-center gap-2">{script.name}</span>
|
||||
<span className="flex items-center gap-2">
|
||||
{script.name}
|
||||
</span>
|
||||
</div>
|
||||
{formattedBadge(script.type)}
|
||||
</Link>
|
||||
|
||||
@@ -12,6 +12,7 @@ import { useVersions } from "@/hooks/use-versions";
|
||||
import { basePath } from "@/config/site-config";
|
||||
import { extractDate } from "@/lib/time";
|
||||
|
||||
import DisableDescription from "./script-items/disable-description";
|
||||
import { getDisplayValueFromType } from "./script-info-blocks";
|
||||
import DefaultPassword from "./script-items/default-password";
|
||||
import InstallCommand from "./script-items/install-command";
|
||||
@@ -146,9 +147,15 @@ export function ScriptItem({ item, setSelectedScript }: ScriptItemProps) {
|
||||
<ScriptHeader item={item} />
|
||||
</Suspense>
|
||||
|
||||
<Description item={item} />
|
||||
<Alerts item={item} />
|
||||
{item.disable && item.disable_description && (
|
||||
<DisableDescription item={item} />
|
||||
) }
|
||||
|
||||
{!item.disable && (
|
||||
<>
|
||||
<Description item={item} />
|
||||
|
||||
<Alerts item={item} />
|
||||
<div className="mt-4 rounded-lg border shadow-sm">
|
||||
<div className="flex gap-3 px-4 py-2 bg-accent/25">
|
||||
<h2 className="text-lg font-semibold">
|
||||
@@ -177,6 +184,8 @@ export function ScriptItem({ item, setSelectedScript }: ScriptItemProps) {
|
||||
</div>
|
||||
|
||||
<DefaultPassword item={item} />
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
import { AlertCircle } from "lucide-react";
|
||||
|
||||
import type { Script } from "@/lib/types";
|
||||
|
||||
import TextParseLinks from "@/components/text-parse-links";
|
||||
import { AlertColors } from "@/config/site-config";
|
||||
import { cn } from "@/lib/utils";
|
||||
|
||||
export default function DisableDescription({ item }: { item: Script }) {
|
||||
return (
|
||||
<div className="mt-4 flex flex-col shadow-sm gap-2">
|
||||
<div
|
||||
className={cn(
|
||||
"flex items-start gap-3 rounded-lg border p-4 text-sm",
|
||||
AlertColors.warning,
|
||||
)}
|
||||
>
|
||||
<AlertCircle className="h-5 min-h-5 w-5 min-w-5 mt-0.5" />
|
||||
<div className="flex flex-col gap-2">
|
||||
<h3 className="font-semibold text-base">Script Disabled</h3>
|
||||
<p>{TextParseLinks(item.disable_description!)}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
52
frontend/src/components/text-parse-links.tsx
Normal file
52
frontend/src/components/text-parse-links.tsx
Normal file
@@ -0,0 +1,52 @@
|
||||
import { ClipboardIcon, ExternalLink } from "lucide-react";
|
||||
import { Fragment } from "react";
|
||||
|
||||
import handleCopy from "./handle-copy";
|
||||
|
||||
const URL_PATTERN = /(https?:\/\/[^\s,]+)/;
|
||||
const CODE_PATTERN = /`([^`]*)`/;
|
||||
|
||||
export default function TextParseLinks(text: string) {
|
||||
const codeParts = text.split(CODE_PATTERN);
|
||||
|
||||
return codeParts.map((part: string, codeIndex: number) => {
|
||||
if (codeIndex % 2 === 1) {
|
||||
return (
|
||||
<span
|
||||
key={`code-${codeIndex}`}
|
||||
className="bg-secondary py-1 px-2 rounded-lg inline-flex items-center gap-2"
|
||||
>
|
||||
{part}
|
||||
<ClipboardIcon
|
||||
className="size-3 cursor-pointer"
|
||||
onClick={() => handleCopy("command", part)}
|
||||
/>
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
const urlParts = part.split(URL_PATTERN);
|
||||
|
||||
return (
|
||||
<Fragment key={`text-${codeIndex}`}>
|
||||
{urlParts.map((urlPart: string, urlIndex: number) => {
|
||||
if (urlIndex % 2 === 1) {
|
||||
return (
|
||||
<a
|
||||
key={`url-${codeIndex}-${urlIndex}`}
|
||||
href={urlPart}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="inline-flex items-center gap-1 text-blue-600 dark:text-blue-400 hover:underline font-medium transition-colors"
|
||||
>
|
||||
{urlPart}
|
||||
<ExternalLink className="size-3" />
|
||||
</a>
|
||||
);
|
||||
}
|
||||
return <Fragment key={`plain-${codeIndex}-${urlIndex}`}>{urlPart}</Fragment>;
|
||||
})}
|
||||
</Fragment>
|
||||
);
|
||||
});
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
"use client";
|
||||
|
||||
import { useInView, useMotionValue, useSpring } from "framer-motion";
|
||||
import { useInView, useMotionValue, useSpring } from "motion/react";
|
||||
import { useEffect, useRef } from "react";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
|
||||
@@ -5,7 +5,7 @@ import React from "react";
|
||||
import type { OperatingSystem } from "@/lib/types";
|
||||
|
||||
// eslint-disable-next-line node/no-process-env
|
||||
export const basePath = process.env.BASE_PATH || "";
|
||||
export const basePath = process.env.BASE_PATH || "ProxmoxVE";
|
||||
|
||||
export const navbarLinks = [
|
||||
{
|
||||
|
||||
@@ -14,6 +14,8 @@ export type Script = {
|
||||
logo: string | null;
|
||||
config_path: string;
|
||||
description: string;
|
||||
disable?: boolean;
|
||||
disable_description?: string;
|
||||
install_methods: {
|
||||
type: "default" | "alpine";
|
||||
script: string;
|
||||
|
||||
@@ -410,7 +410,6 @@ cleanup_lxc() {
|
||||
if command -v composer &>/dev/null; then $STD composer clear-cache || true; fi
|
||||
|
||||
if command -v journalctl &>/dev/null; then
|
||||
$STD journalctl --rotate || true
|
||||
$STD journalctl --vacuum-time=10m || true
|
||||
fi
|
||||
msg_ok "Cleaned"
|
||||
|
||||
@@ -33,6 +33,7 @@ if [ -z "$available_kernels" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo -e "${GN}Currently running kernel: ${current_kernel}${CL}"
|
||||
echo -e "${YW}Available kernels for removal:${CL}"
|
||||
echo "$available_kernels" | nl -w 2 -s '. '
|
||||
|
||||
|
||||
Reference in New Issue
Block a user