commit 67f7a95fef1f19dd8ccdb509159d2d89666cf871
Author: PowLu <1144983626@qq.com>
Date: Tue Apr 21 15:38:57 2026 +0800
add:初次提交
diff --git a/apps/apps.css.gz b/apps/apps.css.gz
new file mode 100644
index 0000000..dfc833f
Binary files /dev/null and b/apps/apps.css.gz differ
diff --git a/apps/apps.min.js.gz b/apps/apps.min.js.gz
new file mode 100644
index 0000000..bc8484e
Binary files /dev/null and b/apps/apps.min.js.gz differ
diff --git a/apps/default.png b/apps/default.png
new file mode 100644
index 0000000..bfb53d5
Binary files /dev/null and b/apps/default.png differ
diff --git a/apps/index.html.gz b/apps/index.html.gz
new file mode 100644
index 0000000..eb32871
Binary files /dev/null and b/apps/index.html.gz differ
diff --git a/apps/manifest.json b/apps/manifest.json
new file mode 100644
index 0000000..64622b7
--- /dev/null
+++ b/apps/manifest.json
@@ -0,0 +1,25 @@
+{
+ "version": "215",
+ "requires": {
+ "cockpit": "122"
+ },
+
+ "tools": {
+ "index": {
+ "label": "Applications",
+ "keywords": [
+ {
+ "matches": ["plugin", "apps", "addon", "add-on", "install", "extension"]
+ }
+ ]
+ }
+ },
+
+ "content-security-policy": "img-src *",
+
+ "config": {
+ "appstream_config_packages": [ "appstream" ],
+ "appstream_data_packages": []
+ }
+
+}
diff --git a/apps/po.ca.js.gz b/apps/po.ca.js.gz
new file mode 100644
index 0000000..44fffb2
Binary files /dev/null and b/apps/po.ca.js.gz differ
diff --git a/apps/po.cs.js.gz b/apps/po.cs.js.gz
new file mode 100644
index 0000000..ea71eea
Binary files /dev/null and b/apps/po.cs.js.gz differ
diff --git a/apps/po.de.js.gz b/apps/po.de.js.gz
new file mode 100644
index 0000000..8cca6cf
Binary files /dev/null and b/apps/po.de.js.gz differ
diff --git a/apps/po.es.js.gz b/apps/po.es.js.gz
new file mode 100644
index 0000000..3ed2950
Binary files /dev/null and b/apps/po.es.js.gz differ
diff --git a/apps/po.fr.js.gz b/apps/po.fr.js.gz
new file mode 100644
index 0000000..4ab9f0c
Binary files /dev/null and b/apps/po.fr.js.gz differ
diff --git a/apps/po.it.js.gz b/apps/po.it.js.gz
new file mode 100644
index 0000000..49cf0ac
Binary files /dev/null and b/apps/po.it.js.gz differ
diff --git a/apps/po.ja.js.gz b/apps/po.ja.js.gz
new file mode 100644
index 0000000..a97e9b0
Binary files /dev/null and b/apps/po.ja.js.gz differ
diff --git a/apps/po.js.gz b/apps/po.js.gz
new file mode 100644
index 0000000..45247c1
Binary files /dev/null and b/apps/po.js.gz differ
diff --git a/apps/po.ko.js.gz b/apps/po.ko.js.gz
new file mode 100644
index 0000000..c8b7abd
Binary files /dev/null and b/apps/po.ko.js.gz differ
diff --git a/apps/po.nl.js.gz b/apps/po.nl.js.gz
new file mode 100644
index 0000000..9e5c3c0
Binary files /dev/null and b/apps/po.nl.js.gz differ
diff --git a/apps/po.pl.js.gz b/apps/po.pl.js.gz
new file mode 100644
index 0000000..853c93b
Binary files /dev/null and b/apps/po.pl.js.gz differ
diff --git a/apps/po.pt_BR.js.gz b/apps/po.pt_BR.js.gz
new file mode 100644
index 0000000..d8b1941
Binary files /dev/null and b/apps/po.pt_BR.js.gz differ
diff --git a/apps/po.ru.js.gz b/apps/po.ru.js.gz
new file mode 100644
index 0000000..3af59a7
Binary files /dev/null and b/apps/po.ru.js.gz differ
diff --git a/apps/po.sv.js.gz b/apps/po.sv.js.gz
new file mode 100644
index 0000000..f2524ea
Binary files /dev/null and b/apps/po.sv.js.gz differ
diff --git a/apps/po.uk.js.gz b/apps/po.uk.js.gz
new file mode 100644
index 0000000..fb6e6a7
Binary files /dev/null and b/apps/po.uk.js.gz differ
diff --git a/apps/po.zh_CN.js.gz b/apps/po.zh_CN.js.gz
new file mode 100644
index 0000000..6149377
Binary files /dev/null and b/apps/po.zh_CN.js.gz differ
diff --git a/apps/po.zh_TW.js.gz b/apps/po.zh_TW.js.gz
new file mode 100644
index 0000000..63ec6a0
Binary files /dev/null and b/apps/po.zh_TW.js.gz differ
diff --git a/base1/cockpit.min.css.gz b/base1/cockpit.min.css.gz
new file mode 100644
index 0000000..2bf6ee1
Binary files /dev/null and b/base1/cockpit.min.css.gz differ
diff --git a/base1/cockpit.min.js.gz b/base1/cockpit.min.js.gz
new file mode 100644
index 0000000..e8e09c3
Binary files /dev/null and b/base1/cockpit.min.js.gz differ
diff --git a/base1/fonts/fontawesome.woff b/base1/fonts/fontawesome.woff
new file mode 100644
index 0000000..400014a
Binary files /dev/null and b/base1/fonts/fontawesome.woff differ
diff --git a/base1/fonts/glyphicons.woff b/base1/fonts/glyphicons.woff
new file mode 100644
index 0000000..9e61285
Binary files /dev/null and b/base1/fonts/glyphicons.woff differ
diff --git a/base1/fonts/patternfly.woff b/base1/fonts/patternfly.woff
new file mode 100644
index 0000000..f019b7f
Binary files /dev/null and b/base1/fonts/patternfly.woff differ
diff --git a/base1/jquery.min.js.gz b/base1/jquery.min.js.gz
new file mode 100644
index 0000000..0ba4f33
Binary files /dev/null and b/base1/jquery.min.js.gz differ
diff --git a/base1/manifest.json b/base1/manifest.json
new file mode 100644
index 0000000..7340608
--- /dev/null
+++ b/base1/manifest.json
@@ -0,0 +1,14 @@
+{
+ "version": "@VERSION@",
+ "priority": -1,
+ "bridges": [
+ {
+ "match": { "superuser": "require" },
+ "problem": "access-denied"
+ },
+ {
+ "match": { "superuser": true },
+ "problem": "access-denied"
+ }
+ ]
+}
diff --git a/base1/mustache.min.js.gz b/base1/mustache.min.js.gz
new file mode 100644
index 0000000..0e59034
Binary files /dev/null and b/base1/mustache.min.js.gz differ
diff --git a/base1/patternfly.min.css.gz b/base1/patternfly.min.css.gz
new file mode 100644
index 0000000..5a4e3ff
Binary files /dev/null and b/base1/patternfly.min.css.gz differ
diff --git a/branding/debian/branding.css b/branding/debian/branding.css
new file mode 100644
index 0000000..b80e861
--- /dev/null
+++ b/branding/debian/branding.css
@@ -0,0 +1,26 @@
+body.login-pf {
+ background: url("bg-plain.jpg") no-repeat 50% 0;
+ background-size: cover;
+ background-color: #101010;
+}
+
+#badge {
+ width: 80px;
+ height: 80px;
+ background-image: url("logo.png");
+ background-size: contain;
+ background-repeat: no-repeat;
+}
+
+#brand {
+ font-size: 18pt;
+ text-transform: uppercase;
+}
+
+#brand:before {
+ content: "${NAME}";
+}
+
+#index-brand:before {
+ content: "${NAME}";
+}
diff --git a/branding/debian/favicon.ico b/branding/debian/favicon.ico
new file mode 120000
index 0000000..a27c064
--- /dev/null
+++ b/branding/debian/favicon.ico
@@ -0,0 +1 @@
+../../../pixmaps/debian-logo.png
\ No newline at end of file
diff --git a/branding/debian/logo.png b/branding/debian/logo.png
new file mode 120000
index 0000000..a27c064
--- /dev/null
+++ b/branding/debian/logo.png
@@ -0,0 +1 @@
+../../../pixmaps/debian-logo.png
\ No newline at end of file
diff --git a/branding/default/apple-touch-icon.png b/branding/default/apple-touch-icon.png
new file mode 100644
index 0000000..9f101e9
Binary files /dev/null and b/branding/default/apple-touch-icon.png differ
diff --git a/branding/default/bg-login.jpg b/branding/default/bg-login.jpg
new file mode 100644
index 0000000..b8374b0
Binary files /dev/null and b/branding/default/bg-login.jpg differ
diff --git a/branding/default/bg-plain.jpg b/branding/default/bg-plain.jpg
new file mode 100644
index 0000000..5c4528a
Binary files /dev/null and b/branding/default/bg-plain.jpg differ
diff --git a/branding/default/brand-large.png b/branding/default/brand-large.png
new file mode 100644
index 0000000..178a439
Binary files /dev/null and b/branding/default/brand-large.png differ
diff --git a/branding/default/branding.css b/branding/default/branding.css
new file mode 100644
index 0000000..d3ae615
--- /dev/null
+++ b/branding/default/branding.css
@@ -0,0 +1,33 @@
+
+.login-note {
+ color: transparent;
+ position: relative;
+}
+
+body.login-pf {
+ background: url("bg-login.jpg") no-repeat 50% 0;
+ background-size: cover;
+ background-color: #101010;
+}
+
+#badge {
+ width: 73px;
+ height: 69px;
+ background-image: url("logo.png");
+ background-repeat: no-repeat;
+}
+
+#brand {
+ width: 121px;
+ height: 18px;
+ background-image: url("brand-large.png");
+ background-repeat: no-repeat;
+}
+
+#index-brand {
+ font-weight: bold;
+}
+
+#index-brand:before {
+ content: "Cockpit";
+}
diff --git a/branding/default/favicon.ico b/branding/default/favicon.ico
new file mode 100644
index 0000000..0b0c855
Binary files /dev/null and b/branding/default/favicon.ico differ
diff --git a/branding/default/logo.png b/branding/default/logo.png
new file mode 100644
index 0000000..bf72f2f
Binary files /dev/null and b/branding/default/logo.png differ
diff --git a/branding/kubernetes/branding.css b/branding/kubernetes/branding.css
new file mode 100644
index 0000000..80a7821
--- /dev/null
+++ b/branding/kubernetes/branding.css
@@ -0,0 +1,30 @@
+body.login-pf {
+ background: url("bg-plain.jpg") no-repeat 50% 0;
+ background-size: cover;
+ background-color: #101010;
+}
+
+#badge {
+ width: 225px;
+ height: 80px;
+ background-image: url("logo.png");
+ background-size: contain;
+ background-repeat: no-repeat;
+}
+
+#brand {
+ font-size: 18pt;
+ text-transform: uppercase;
+}
+
+#brand:before {
+ content: "${NAME}";
+}
+
+#index-brand {
+ font-weight: bold;
+}
+
+#index-brand:before {
+ content: "${NAME}";
+}
diff --git a/branding/registry/branding.css b/branding/registry/branding.css
new file mode 100644
index 0000000..80a7821
--- /dev/null
+++ b/branding/registry/branding.css
@@ -0,0 +1,30 @@
+body.login-pf {
+ background: url("bg-plain.jpg") no-repeat 50% 0;
+ background-size: cover;
+ background-color: #101010;
+}
+
+#badge {
+ width: 225px;
+ height: 80px;
+ background-image: url("logo.png");
+ background-size: contain;
+ background-repeat: no-repeat;
+}
+
+#brand {
+ font-size: 18pt;
+ text-transform: uppercase;
+}
+
+#brand:before {
+ content: "${NAME}";
+}
+
+#index-brand {
+ font-weight: bold;
+}
+
+#index-brand:before {
+ content: "${NAME}";
+}
diff --git a/branding/ubuntu/branding.css b/branding/ubuntu/branding.css
new file mode 100644
index 0000000..e3f6a70
--- /dev/null
+++ b/branding/ubuntu/branding.css
@@ -0,0 +1,30 @@
+body.login-pf {
+ background: url("bg-plain.jpg") no-repeat 50% 0;
+ background-size: cover;
+ background-color: #101010;
+}
+
+#badge {
+ width: 220px;
+ height: 80px;
+ background-image: url("logo.png");
+ background-size: contain;
+ background-repeat: no-repeat;
+}
+
+#brand {
+ font-size: 18pt;
+ text-transform: uppercase;
+}
+
+#brand:before {
+ content: "${PRETTY_NAME}";
+}
+
+#index-brand {
+ content: "${NAME}";
+}
+
+#index-brand:before {
+ content: "${NAME}";
+}
diff --git a/branding/ubuntu/favicon.ico b/branding/ubuntu/favicon.ico
new file mode 100644
index 0000000..add4927
Binary files /dev/null and b/branding/ubuntu/favicon.ico differ
diff --git a/branding/ubuntu/logo.png b/branding/ubuntu/logo.png
new file mode 100644
index 0000000..08c9aa8
Binary files /dev/null and b/branding/ubuntu/logo.png differ
diff --git a/dashboard/dashboard.css.gz b/dashboard/dashboard.css.gz
new file mode 100644
index 0000000..6012e7f
Binary files /dev/null and b/dashboard/dashboard.css.gz differ
diff --git a/dashboard/dashboard.min.js.gz b/dashboard/dashboard.min.js.gz
new file mode 100644
index 0000000..62d23f9
Binary files /dev/null and b/dashboard/dashboard.min.js.gz differ
diff --git a/dashboard/index.html.gz b/dashboard/index.html.gz
new file mode 100644
index 0000000..a44217a
Binary files /dev/null and b/dashboard/index.html.gz differ
diff --git a/dashboard/manifest.json b/dashboard/manifest.json
new file mode 100644
index 0000000..82eb0b5
--- /dev/null
+++ b/dashboard/manifest.json
@@ -0,0 +1,21 @@
+{
+ "version": "215",
+ "requires": {
+ "cockpit": "138"
+ },
+
+ "dashboard": {
+ "index": {
+ "label": "Dashboard",
+ "docs": [
+ {
+ "label": "Managing remote systems",
+ "url": "https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_systems_using_the_rhel_8_web_console/managing-remote-systems-in-the-web-console_system-management-using-the-rhel-8-web-console"
+ }
+ ],
+ "order": 10,
+ "wants": "multiple-machines",
+ "icon": "fa-tachometer"
+ }
+ }
+}
diff --git a/dashboard/po.ca.js.gz b/dashboard/po.ca.js.gz
new file mode 100644
index 0000000..a53fb35
Binary files /dev/null and b/dashboard/po.ca.js.gz differ
diff --git a/dashboard/po.cs.js.gz b/dashboard/po.cs.js.gz
new file mode 100644
index 0000000..f5ab775
Binary files /dev/null and b/dashboard/po.cs.js.gz differ
diff --git a/dashboard/po.de.js.gz b/dashboard/po.de.js.gz
new file mode 100644
index 0000000..603fa33
Binary files /dev/null and b/dashboard/po.de.js.gz differ
diff --git a/dashboard/po.es.js.gz b/dashboard/po.es.js.gz
new file mode 100644
index 0000000..ee66977
Binary files /dev/null and b/dashboard/po.es.js.gz differ
diff --git a/dashboard/po.fr.js.gz b/dashboard/po.fr.js.gz
new file mode 100644
index 0000000..19ab41f
Binary files /dev/null and b/dashboard/po.fr.js.gz differ
diff --git a/dashboard/po.it.js.gz b/dashboard/po.it.js.gz
new file mode 100644
index 0000000..52f766e
Binary files /dev/null and b/dashboard/po.it.js.gz differ
diff --git a/dashboard/po.ja.js.gz b/dashboard/po.ja.js.gz
new file mode 100644
index 0000000..8ec3ebf
Binary files /dev/null and b/dashboard/po.ja.js.gz differ
diff --git a/dashboard/po.js.gz b/dashboard/po.js.gz
new file mode 100644
index 0000000..45247c1
Binary files /dev/null and b/dashboard/po.js.gz differ
diff --git a/dashboard/po.ko.js.gz b/dashboard/po.ko.js.gz
new file mode 100644
index 0000000..d1f9ba2
Binary files /dev/null and b/dashboard/po.ko.js.gz differ
diff --git a/dashboard/po.nl.js.gz b/dashboard/po.nl.js.gz
new file mode 100644
index 0000000..c573ca0
Binary files /dev/null and b/dashboard/po.nl.js.gz differ
diff --git a/dashboard/po.pl.js.gz b/dashboard/po.pl.js.gz
new file mode 100644
index 0000000..10844d6
Binary files /dev/null and b/dashboard/po.pl.js.gz differ
diff --git a/dashboard/po.pt_BR.js.gz b/dashboard/po.pt_BR.js.gz
new file mode 100644
index 0000000..e2a2b82
Binary files /dev/null and b/dashboard/po.pt_BR.js.gz differ
diff --git a/dashboard/po.ru.js.gz b/dashboard/po.ru.js.gz
new file mode 100644
index 0000000..8ef79b3
Binary files /dev/null and b/dashboard/po.ru.js.gz differ
diff --git a/dashboard/po.sv.js.gz b/dashboard/po.sv.js.gz
new file mode 100644
index 0000000..95fd4c6
Binary files /dev/null and b/dashboard/po.sv.js.gz differ
diff --git a/dashboard/po.uk.js.gz b/dashboard/po.uk.js.gz
new file mode 100644
index 0000000..b34e8ab
Binary files /dev/null and b/dashboard/po.uk.js.gz differ
diff --git a/dashboard/po.zh_CN.js.gz b/dashboard/po.zh_CN.js.gz
new file mode 100644
index 0000000..bdc0be3
Binary files /dev/null and b/dashboard/po.zh_CN.js.gz differ
diff --git a/dashboard/po.zh_TW.js.gz b/dashboard/po.zh_TW.js.gz
new file mode 100644
index 0000000..cf40cb5
Binary files /dev/null and b/dashboard/po.zh_TW.js.gz differ
diff --git a/lj360/lj360.css b/lj360/lj360.css
new file mode 100644
index 0000000..bcda7f3
--- /dev/null
+++ b/lj360/lj360.css
@@ -0,0 +1,257 @@
+/* Cockpit 风格样式 - 无内联样式 */
+
+body.pf-m-redhat-font {
+ background-color: #f5f5f5;
+ margin: 0;
+ padding: 0;
+ font-family: 'RedHatText', 'Overpass', 'Segoe UI', Helvetica, Arial, sans-serif;
+}
+
+.cockpit-service-page {
+ padding: 24px 30px;
+ max-width: 1200px;
+}
+
+/* 卡片样式 */
+.pf-c-card {
+ background: #ffffff;
+ border: 1px solid #e6e9ed;
+ border-radius: 3px;
+ box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);
+ margin-bottom: 25px;
+}
+
+.pf-c-card__header {
+ padding: 15px 20px;
+ border-bottom: 1px solid #e6e9ed;
+ background-color: #fafbfc;
+ font-weight: 600;
+ font-size: 16px;
+ display: flex;
+ align-items: center;
+}
+
+.pf-c-card__header i {
+ margin-right: 10px;
+ color: #0066cc;
+}
+
+.pf-c-card__body {
+ padding: 20px;
+}
+
+/* 状态面板 */
+.status-panel {
+ background: #fafbfc;
+ border-left: 4px solid #73bcf7;
+ padding: 12px 16px;
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ font-size: 14px;
+ margin-bottom: 20px;
+ border-radius: 2px;
+}
+
+.status-icon {
+ font-size: 18px;
+}
+
+.status-text {
+ font-weight: 500;
+ color: #151515;
+}
+
+/* Cockpit 风格开关 */
+.cockpit-switch {
+ position: relative;
+ display: inline-block;
+ width: 48px;
+ height: 26px;
+}
+
+.cockpit-switch input {
+ opacity: 0;
+ width: 0;
+ height: 0;
+}
+
+.cockpit-switch .slider {
+ position: absolute;
+ cursor: pointer;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-color: #b8bbbf;
+ transition: 0.2s;
+ border-radius: 34px;
+}
+
+.cockpit-switch .slider:before {
+ position: absolute;
+ content: "";
+ height: 20px;
+ width: 20px;
+ left: 3px;
+ bottom: 3px;
+ background-color: white;
+ transition: 0.2s;
+ border-radius: 50%;
+}
+
+.cockpit-switch input:checked + .slider {
+ background-color: #0066cc;
+}
+
+.cockpit-switch input:focus + .slider {
+ box-shadow: 0 0 1px #0066cc;
+}
+
+.cockpit-switch input:checked + .slider:before {
+ transform: translateX(22px);
+}
+
+/* 设置行 */
+.setting-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 16px 0;
+ border-bottom: 1px solid #eaeef2;
+ margin-bottom: 16px;
+}
+
+.setting-label label {
+ font-weight: 600;
+ color: #151515;
+ font-size: 14px;
+ margin-bottom: 4px;
+ display: block;
+}
+
+.setting-description {
+ font-size: 12px;
+ color: #72767b;
+ margin-top: 2px;
+}
+
+.setting-control {
+ flex-shrink: 0;
+}
+
+/* 操作按钮组 */
+.action-bar {
+ display: flex;
+ gap: 12px;
+ flex-wrap: wrap;
+ margin: 16px 0;
+}
+
+.pf-c-button {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ padding: 8px 16px;
+ font-size: 13px;
+ font-weight: 500;
+ border-radius: 3px;
+ cursor: pointer;
+ border: 1px solid transparent;
+ transition: all 0.15s;
+ background: none;
+}
+
+.pf-c-button i {
+ font-size: 13px;
+}
+
+.pf-c-button.pf-m-primary {
+ background-color: #0066cc;
+ color: white;
+ border-color: #0066cc;
+}
+
+.pf-c-button.pf-m-primary:hover {
+ background-color: #005cbb;
+ border-color: #005cbb;
+}
+
+.pf-c-button.pf-m-secondary {
+ background-color: #ffffff;
+ color: #0066cc;
+ border-color: #b8bbbf;
+}
+
+.pf-c-button.pf-m-secondary:hover {
+ background-color: #f5f5f5;
+ border-color: #0066cc;
+}
+
+/* 分隔线 */
+.separator {
+ height: 1px;
+ background: #eaeef2;
+ margin: 20px 0 16px 0;
+}
+
+/* 单独测试区域 */
+.testing-section {
+ margin: 8px 0 16px 0;
+}
+
+.testing-title {
+ font-size: 13px;
+ font-weight: 600;
+ color: #72767b;
+ margin-bottom: 12px;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.testing-title i {
+ color: #6ca100;
+}
+
+/* 输出区域 */
+.output-section {
+ margin-top: 20px;
+}
+
+.output-label {
+ font-size: 13px;
+ font-weight: 600;
+ color: #4d5258;
+ margin-bottom: 8px;
+ display: flex;
+ align-items: center;
+ gap: 6px;
+}
+
+.log-box {
+ background: #1e1e1e;
+ color: #d4d4d4;
+ padding: 14px;
+ border-radius: 4px;
+ font-family: 'Menlo', 'Monaco', 'Consolas', monospace;
+ font-size: 12px;
+ height: 280px;
+ overflow-y: auto;
+ white-space: pre-wrap;
+ word-break: break-all;
+ border: 1px solid #3c3f41;
+}
+
+/* 状态颜色变化 */
+.status-panel.status-success {
+ border-left-color: #3f9c35;
+}
+
+.status-panel.status-danger {
+ border-left-color: #c00;
+}
+
+.status-panel.status-warning {
+ border-left-color: #ec7a08;
+}
\ No newline at end of file
diff --git a/lj360/lj360.html b/lj360/lj360.html
new file mode 100644
index 0000000..2629800
--- /dev/null
+++ b/lj360/lj360.html
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启动服务
+
+
+ 停止服务
+
+
+ 重启服务
+
+
+ 刷新状态
+
+
+ 查看日志
+
+
+
+
+
+
+
+ 单独测试
+
+
+
+ 单次测试启动
+
+
+ 单次测试停止
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lj360/lj360.js b/lj360/lj360.js
new file mode 100644
index 0000000..cc81040
--- /dev/null
+++ b/lj360/lj360.js
@@ -0,0 +1,233 @@
+const SCRIPT = "/home/ztl/LJ360/bash/video_tool.sh";
+const SERVICE = "lj360_camera";
+const LOG_FILE = "/home/ztl/LJ360/lj360_camera_keepalive.log";
+const WEBPY = "/home/ztl/LJ360/web.py";
+
+// DOM 元素
+let statusIcon, statusText, outputBox, autostartSwitch;
+
+function initElements() {
+ statusIcon = document.getElementById("status-icon");
+ statusText = document.getElementById("status-text");
+ outputBox = document.getElementById("output");
+ autostartSwitch = document.getElementById("autostart-switch");
+}
+
+function setOutput(text) {
+ if (outputBox) {
+ outputBox.textContent = text;
+ outputBox.scrollTop = outputBox.scrollHeight;
+ }
+}
+
+function setStatus(text, isActive) {
+ if (statusText) {
+ statusText.textContent = text;
+ }
+ const panel = document.getElementById("status-panel");
+ if (panel) {
+ // 移除现有状态类
+ panel.classList.remove("status-success", "status-danger", "status-warning");
+ if (isActive === true) {
+ panel.classList.add("status-success");
+ } else if (isActive === false) {
+ panel.classList.add("status-danger");
+ } else if (isActive === undefined) {
+ panel.classList.add("status-warning");
+ }
+ }
+ if (statusIcon) {
+ if (isActive === true) {
+ statusIcon.innerHTML = ' ';
+ } else if (isActive === false) {
+ statusIcon.innerHTML = ' ';
+ } else {
+ statusIcon.innerHTML = ' ';
+ }
+ }
+}
+
+function runCommand(args, callback) {
+ const proc = cockpit.spawn(args, { superuser: "require", err: "out" });
+ let output = "";
+ proc.stream(data => { output += data; });
+ proc.then(() => callback(output, null));
+ proc.catch(err => callback(output, err));
+}
+
+// 获取服务状态和开机自启状态
+function refreshStatus() {
+ setStatus("正在获取服务状态...", undefined);
+ setOutput("⏳ 正在刷新状态...");
+
+ // 获取服务运行状态
+ runCommand(["systemctl", "is-active", SERVICE + ".service"], (outActive, errActive) => {
+ const isRunning = (outActive.trim() === "active");
+
+ // 获取开机自启状态
+ runCommand(["systemctl", "is-enabled", SERVICE + ".service"], (outEnabled, errEnabled) => {
+ let isEnabled = false;
+ if (!errEnabled) {
+ const enabledOut = outEnabled.trim();
+ isEnabled = (enabledOut === "enabled" || enabledOut === "static");
+ }
+
+ // 更新开关状态(不触发change事件)
+ if (autostartSwitch) {
+ autostartSwitch.checked = isEnabled;
+ }
+
+ // 更新状态文本
+ if (isRunning) {
+ setStatus("服务正在运行" + (isEnabled ? " (开机自启已启用)" : " (开机自启未启用)"), true);
+ } else {
+ setStatus("服务未运行" + (isEnabled ? " (开机自启已启用但未运行)" : " (开机自启未启用)"), false);
+ }
+
+ // 获取详细状态输出
+ runCommand(["systemctl", "status", SERVICE + ".service", "--no-pager", "-l"], (outDetail) => {
+ setOutput(outDetail || "无状态信息");
+ });
+ });
+ });
+}
+
+// 设置开机自启(通过开关)
+function setAutostart(enabled) {
+ setOutput("⏳ " + (enabled ? "正在启用开机自启..." : "正在禁用开机自启..."));
+ const action = enabled ? "enable_autostart" : "disable_autostart";
+ runCommand(["bash", SCRIPT, action], (out, err) => {
+ if (err) {
+ setOutput("❌ 错误: " + (err.message || err) + "\n" + (out || ""));
+ // 恢复开关状态
+ setTimeout(() => refreshStatus(), 500);
+ } else {
+ setOutput((enabled ? "✅ 开机自启已启用" : "✅ 开机自启已禁用") + "\n" + (out || ""));
+ setTimeout(() => refreshStatus(), 300);
+ }
+ });
+}
+
+// 启动服务
+function startService() {
+ setOutput("⏳ 正在启动服务...");
+ runCommand(["systemctl", "start", SERVICE + ".service"], (out, err) => {
+ if (err) {
+ setOutput("❌ 启动失败: " + (err.message || err) + "\n" + out);
+ } else {
+ setOutput("✅ 服务已启动\n" + out);
+ }
+ setTimeout(() => refreshStatus(), 500);
+ });
+}
+
+// 停止服务
+function stopService() {
+ setOutput("⏳ 正在停止服务...");
+ runCommand(["systemctl", "stop", SERVICE + ".service"], (out, err) => {
+ if (err) {
+ setOutput("❌ 停止失败: " + (err.message || err) + "\n" + out);
+ } else {
+ setOutput("✅ 服务已停止\n" + out);
+ }
+ setTimeout(() => refreshStatus(), 500);
+ });
+}
+
+// 重启服务
+function restartService() {
+ setOutput("⏳ 正在重启服务...");
+ runCommand(["systemctl", "restart", SERVICE + ".service"], (out, err) => {
+ if (err) {
+ setOutput("❌ 重启失败: " + (err.message || err) + "\n" + out);
+ } else {
+ setOutput("✅ 服务已重启\n" + out);
+ }
+ setTimeout(() => refreshStatus(), 800);
+ });
+}
+
+// 查看日志
+function viewLog() {
+ setOutput("⏳ 读取日志文件...");
+ runCommand(["tail", "-n", "80", LOG_FILE], (out, err) => {
+ if (err) {
+ setOutput("❌ 无法读取日志: " + (err.message || err) + "\n尝试查看服务日志...");
+ // 备用:查看 journalctl
+ runCommand(["journalctl", "-u", SERVICE + ".service", "-n", "50", "--no-pager"], (out2, err2) => {
+ if (err2) {
+ setOutput("📭 日志为空或无法读取\n" + (out2 || ""));
+ } else {
+ setOutput("📋 系统日志 (journalctl):\n" + (out2 || "无日志"));
+ }
+ });
+ } else {
+ setOutput("📋 服务日志 (最近80行):\n" + (out || "日志为空"));
+ }
+ });
+}
+
+// 单独启动 web.py
+function startWebPy() {
+ setOutput("⏳ 正在启动 web.py...");
+ runCommand([
+ "bash", "-c",
+ "export DISPLAY=:0 && cd /home/ztl/LJ360 && sudo -u ztl python3 /home/ztl/LJ360/web.py >> /home/ztl/LJ360/web.log 2>&1 &"
+ ], (out, err) => {
+ if (err) {
+ setOutput("❌ 启动 web.py 失败: " + (err.message || err));
+ } else {
+ setOutput("✅ web.py 已在后台启动\n可通过 'ps aux | grep web.py' 查看进程");
+ }
+ });
+}
+
+// 停止 web.py
+function stopWebPy() {
+ setOutput("⏳ 正在关闭 web.py...");
+ runCommand(["bash", "-c", "pkill -f /home/ztl/LJ360/web.py"], (out, err) => {
+ if (err) {
+ // pkill 没有找到进程也会返回错误,这是正常的
+ if (err.message && err.message.includes("exit code 1")) {
+ setOutput("⚠️ 未找到运行中的 web.py 进程");
+ } else {
+ setOutput("❌ 关闭失败: " + (err.message || err));
+ }
+ } else {
+ setOutput("✅ web.py 已关闭");
+ }
+ });
+}
+
+// 事件绑定
+function bindEvents() {
+ const btnStart = document.getElementById("btn-start");
+ const btnStop = document.getElementById("btn-stop");
+ const btnRestart = document.getElementById("btn-restart");
+ const btnStatus = document.getElementById("btn-status");
+ const btnLog = document.getElementById("btn-log");
+ const btnPyon = document.getElementById("btn-pyon");
+ const btnPyoff = document.getElementById("btn-pyoff");
+
+ if (btnStart) btnStart.addEventListener("click", startService);
+ if (btnStop) btnStop.addEventListener("click", stopService);
+ if (btnRestart) btnRestart.addEventListener("click", restartService);
+ if (btnStatus) btnStatus.addEventListener("click", refreshStatus);
+ if (btnLog) btnLog.addEventListener("click", viewLog);
+ if (btnPyon) btnPyon.addEventListener("click", startWebPy);
+ if (btnPyoff) btnPyoff.addEventListener("click", stopWebPy);
+
+ // 开关事件:开机自启变更
+ if (autostartSwitch) {
+ autostartSwitch.addEventListener("change", function(e) {
+ setAutostart(e.target.checked);
+ });
+ }
+}
+
+// 页面初始化
+document.addEventListener("DOMContentLoaded", function() {
+ initElements();
+ bindEvents();
+ refreshStatus();
+});
\ No newline at end of file
diff --git a/lj360/lj360_config.css b/lj360/lj360_config.css
new file mode 100644
index 0000000..236112e
--- /dev/null
+++ b/lj360/lj360_config.css
@@ -0,0 +1,420 @@
+/* ===== 标签页 ===== */
+.pf-c-tabs {
+ margin-bottom: 0;
+ border-bottom: 1px solid #d2d2d2;
+ background: #fff;
+ padding: 0 24px;
+}
+
+.pf-c-tabs__list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ gap: 0;
+}
+
+.pf-c-tabs__item {
+ margin: 0;
+}
+
+.pf-c-tabs__link {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ padding: 14px 20px;
+ font-size: 14px;
+ font-weight: 500;
+ color: #6a6e73;
+ border: none;
+ border-bottom: 3px solid transparent;
+ background: none;
+ cursor: pointer;
+ transition: all 0.15s;
+ margin-bottom: -1px;
+}
+
+.pf-c-tabs__link:hover {
+ color: #0066cc;
+ background-color: #f5f5f5;
+}
+
+.pf-c-tabs__item.pf-m-current .pf-c-tabs__link {
+ color: #0066cc;
+ border-bottom-color: #0066cc;
+ font-weight: 600;
+}
+
+/* ===== 内容面板 ===== */
+.tab-panel {
+ margin-top: 20px;
+}
+
+.tab-panel.hidden {
+ display: none;
+}
+
+/* ===== 区域标题 ===== */
+.section-title {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-size: 14px;
+ font-weight: 600;
+ color: #151515;
+ margin-bottom: 14px;
+}
+
+.section-title i {
+ color: #0066cc;
+}
+
+.section-hint {
+ font-size: 12px;
+ font-weight: 400;
+ color: #72767b;
+ margin-left: 8px;
+}
+
+.warning-hint {
+ color: #ec7a08 !important;
+}
+
+.warning-hint i {
+ color: #ec7a08 !important;
+}
+
+/* ===== Logo 预览 ===== */
+.logo-preview-container {
+ display: flex;
+ align-items: flex-start;
+ gap: 20px;
+ margin-bottom: 8px;
+}
+
+.logo-preview-box {
+ width: 320px;
+ height: 160px;
+ border: 2px dashed #d2d2d2;
+ border-radius: 6px;
+ background: #1e1e1e;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ overflow: hidden;
+ flex-shrink: 0;
+ position: relative;
+}
+
+.logo-preview-placeholder {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 8px;
+ color: #5a5a5a;
+ font-size: 12px;
+}
+
+.logo-preview-placeholder i {
+ font-size: 32px;
+ color: #444;
+}
+
+.logo-preview-img {
+ max-width: 100%;
+ max-height: 100%;
+ object-fit: contain;
+}
+
+.logo-preview-actions {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ padding-top: 4px;
+}
+
+/* ===== 上传区域 ===== */
+.upload-area {
+ border: 2px dashed #b8bbbf;
+ border-radius: 6px;
+ padding: 28px 20px;
+ text-align: center;
+ background: #fafbfc;
+ transition: all 0.2s;
+ cursor: pointer;
+ margin-bottom: 14px;
+}
+
+.upload-area:hover,
+.upload-area.drag-over {
+ border-color: #0066cc;
+ background: #f0f7ff;
+}
+
+.upload-icon {
+ font-size: 36px;
+ color: #b8bbbf;
+ margin-bottom: 10px;
+}
+
+.upload-area:hover .upload-icon,
+.upload-area.drag-over .upload-icon {
+ color: #0066cc;
+}
+
+.upload-text {
+ font-size: 14px;
+ color: #4d5258;
+ margin-bottom: 6px;
+}
+
+.upload-link {
+ color: #0066cc;
+ cursor: pointer;
+ text-decoration: underline;
+ font-weight: 500;
+}
+
+.upload-hint {
+ font-size: 12px;
+ color: #72767b;
+}
+
+.upload-status {
+ padding: 10px 14px;
+ border-radius: 4px;
+ font-size: 13px;
+ margin-bottom: 14px;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.upload-status.success {
+ background: #ecf7ec;
+ border: 1px solid #3f9c35;
+ color: #1e4620;
+}
+
+.upload-status.error {
+ background: #fff0ee;
+ border: 1px solid #c00;
+ color: #7d1d1d;
+}
+
+.upload-status.uploading {
+ background: #e7f1fa;
+ border: 1px solid #73bcf7;
+ color: #004080;
+}
+
+/* ===== Logo 文件列表 ===== */
+.logo-list-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ font-size: 13px;
+ font-weight: 600;
+ color: #4d5258;
+ margin-bottom: 10px;
+}
+
+.btn-sm {
+ padding: 5px 10px !important;
+ font-size: 12px !important;
+}
+
+.logo-list {
+ border: 1px solid #e6e9ed;
+ border-radius: 4px;
+ overflow: hidden;
+ margin-bottom: 8px;
+ min-height: 60px;
+}
+
+.logo-list-empty {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+ padding: 28px;
+ color: #72767b;
+ font-size: 13px;
+}
+
+.logo-list-empty i {
+ font-size: 18px;
+}
+
+.logo-list-item {
+ display: flex;
+ align-items: center;
+ padding: 10px 14px;
+ border-bottom: 1px solid #f0f0f0;
+ transition: background 0.1s;
+ gap: 12px;
+}
+
+.logo-list-item:last-child {
+ border-bottom: none;
+}
+
+.logo-list-item:hover {
+ background: #f5f9ff;
+}
+
+.logo-item-thumb {
+ width: 48px;
+ height: 28px;
+ background: #1e1e1e;
+ border-radius: 3px;
+ overflow: hidden;
+ flex-shrink: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.logo-item-thumb img {
+ max-width: 100%;
+ max-height: 100%;
+ object-fit: contain;
+}
+
+.logo-item-thumb-placeholder {
+ color: #555;
+ font-size: 10px;
+}
+
+.logo-item-info {
+ flex: 1;
+ min-width: 0;
+}
+
+.logo-item-name {
+ font-size: 13px;
+ font-weight: 500;
+ color: #151515;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.logo-item-meta {
+ font-size: 11px;
+ color: #72767b;
+ margin-top: 2px;
+}
+
+.logo-item-actions {
+ display: flex;
+ gap: 8px;
+ flex-shrink: 0;
+}
+
+/* ===== 烧写区域 ===== */
+.flash-area {
+ background: #fffbf0;
+ border: 1px solid #f5e6c8;
+ border-radius: 4px;
+ padding: 16px;
+ margin-bottom: 16px;
+}
+
+.flash-select-row {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ margin-bottom: 12px;
+ flex-wrap: wrap;
+}
+
+.flash-label {
+ font-size: 13px;
+ font-weight: 500;
+ color: #4d5258;
+ white-space: nowrap;
+}
+
+.pf-c-form-control {
+ flex: 1;
+ min-width: 200px;
+ padding: 7px 10px;
+ border: 1px solid #b8bbbf;
+ border-radius: 3px;
+ font-size: 13px;
+ background: #fff;
+ color: #151515;
+ outline: none;
+}
+
+.pf-c-form-control:focus {
+ border-color: #0066cc;
+ box-shadow: 0 0 0 2px rgba(0, 102, 204, 0.2);
+}
+
+.flash-note {
+ font-size: 12px;
+ color: #72767b;
+ line-height: 1.6;
+}
+
+.flash-note code {
+ background: #f0f0f0;
+ padding: 1px 5px;
+ border-radius: 3px;
+ font-family: 'Menlo', 'Monaco', 'Consolas', monospace;
+ color: #c00;
+ font-size: 11px;
+}
+
+/* 危险按钮 */
+.pf-c-button.pf-m-danger {
+ background-color: #c00;
+ color: white;
+ border-color: #c00;
+}
+
+.pf-c-button.pf-m-danger:hover:not(:disabled) {
+ background-color: #a30000;
+ border-color: #a30000;
+}
+
+.pf-c-button:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+}
+
+/* ===== 空状态占位 ===== */
+.empty-placeholder {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 60px 20px;
+ color: #72767b;
+ text-align: center;
+}
+
+.empty-placeholder > i {
+ font-size: 48px;
+ color: #d2d2d2;
+ margin-bottom: 16px;
+}
+
+.empty-title {
+ font-size: 16px;
+ font-weight: 600;
+ color: #4d5258;
+ margin-bottom: 8px;
+}
+
+.empty-desc {
+ font-size: 13px;
+ color: #72767b;
+}
+
+/* ===== 通用 ===== */
+.hidden {
+ display: none !important;
+}
diff --git a/lj360/lj360_config.html b/lj360/lj360_config.html
new file mode 100644
index 0000000..032d8eb
--- /dev/null
+++ b/lj360/lj360_config.html
@@ -0,0 +1,152 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 开机 Logo
+
+
+
+
+ 通讯参数
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 当前 Logo 预览
+
+
+
+
+
+ 点击"读取当前Logo"加载预览
+
+
+
+
+
+ 读取当前 Logo
+
+
+
+
+
+
+
+
+ Logo 库
+ 存储目录:/home/ztl/LJ360/config/logos/
+
+
+
+
+
+
+
+
+ 拖拽 BMP 文件到此处,或
+ 点击选择文件
+
+
仅支持 .bmp 格式,建议分辨率与屏幕一致
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 烧写到设备
+
+ 此操作将直接写入 logo 分区,请谨慎操作
+
+
+
+
+
选择要烧写的 Logo:
+
+ -- 请先选择 Logo 文件 --
+
+
+ 烧写到设备
+
+
+
+
+ 烧写命令说明:将选定的 logo.bmp 与 logo_kernel.bmp 合并写入
+ /dev/disk/by-partlabel/logo 分区
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
暂未配置
+
通讯参数配置功能正在开发中,敬请期待
+
+
+
+
+
+
+
+
+
diff --git a/lj360/lj360_config.js b/lj360/lj360_config.js
new file mode 100644
index 0000000..de131f6
--- /dev/null
+++ b/lj360/lj360_config.js
@@ -0,0 +1,486 @@
+// ===================== 常量配置 =====================
+const CONFIG_DIR = "/home/ztl/LJ360/config";
+const LOGO_DIR = CONFIG_DIR + "/logos";
+const FLASH_SCRIPT = "/home/ztl/LJ360/bash/flash_logo.sh";
+
+// ===================== 工具函数 =====================
+function runCmd(args, callback) {
+ const proc = cockpit.spawn(args, { superuser: "require", err: "out" });
+ let output = "";
+ proc.stream(data => { output += data; });
+ proc.then(() => callback(output, null));
+ proc.catch(err => callback(output, err));
+}
+
+function setLogoOutput(text) {
+ const box = document.getElementById("logo-output");
+ if (box) {
+ box.textContent = text;
+ box.scrollTop = box.scrollHeight;
+ }
+}
+
+function appendLogoOutput(text) {
+ const box = document.getElementById("logo-output");
+ if (box) {
+ box.textContent += text;
+ box.scrollTop = box.scrollHeight;
+ }
+}
+
+function showUploadStatus(msg, type) {
+ const el = document.getElementById("upload-status");
+ if (!el) return;
+ el.textContent = msg;
+ el.className = "upload-status " + type;
+ el.classList.remove("hidden");
+ if (type === "success") {
+ setTimeout(() => el.classList.add("hidden"), 4000);
+ }
+}
+
+// ===================== 标签页切换 =====================
+function initTabs() {
+ const tabItems = document.querySelectorAll(".pf-c-tabs__item");
+ tabItems.forEach(item => {
+ const btn = item.querySelector(".pf-c-tabs__link");
+ btn.addEventListener("click", () => {
+ // 切换激活样式
+ tabItems.forEach(i => i.classList.remove("pf-m-current"));
+ item.classList.add("pf-m-current");
+
+ // 切换内容面板
+ const targetId = item.getAttribute("data-tab");
+ document.querySelectorAll(".tab-panel").forEach(panel => {
+ panel.classList.add("hidden");
+ });
+ const target = document.getElementById(targetId);
+ if (target) target.classList.remove("hidden");
+ });
+ });
+}
+
+// ===================== 确保目录存在 =====================
+function ensureDir(callback) {
+ runCmd(["mkdir", "-p", LOGO_DIR], (out, err) => {
+ if (err) {
+ setLogoOutput("❌ 无法创建配置目录: " + (err.message || err));
+ } else {
+ if (callback) callback();
+ }
+ });
+}
+
+// ===================== Logo 列表 =====================
+let logoFiles = []; // 缓存当前文件列表
+
+function refreshLogoList() {
+ const listEl = document.getElementById("logo-list");
+ const selectEl = document.getElementById("flash-logo-select");
+
+ listEl.innerHTML = ' 正在加载...
';
+
+ ensureDir(() => {
+ runCmd(["bash", "-c", `ls -lh "${LOGO_DIR}"/*.bmp 2>/dev/null || echo "__EMPTY__"`], (out, err) => {
+ logoFiles = [];
+
+ if (err || !out || out.trim() === "__EMPTY__" || out.trim() === "") {
+ listEl.innerHTML = ' 暂无 Logo 文件,请上传
';
+ selectEl.innerHTML = '-- 暂无可用文件 -- ';
+ return;
+ }
+
+ // 解析 ls -lh 输出
+ const lines = out.trim().split("\n").filter(l => l && !l.startsWith("total"));
+ lines.forEach(line => {
+ // ls -lh 格式: -rw-r--r-- 1 root root 1.2M May 1 12:00 /path/to/file.bmp
+ const parts = line.trim().split(/\s+/);
+ if (parts.length >= 9) {
+ const filePath = parts.slice(8).join(" ");
+ const fileName = filePath.split("/").pop();
+ const fileSize = parts[4];
+ const fileDate = parts[5] + " " + parts[6] + " " + parts[7];
+ logoFiles.push({ path: filePath, name: fileName, size: fileSize, date: fileDate });
+ }
+ });
+
+ if (logoFiles.length === 0) {
+ listEl.innerHTML = ' 暂无 Logo 文件,请上传
';
+ selectEl.innerHTML = '-- 暂无可用文件 -- ';
+ return;
+ }
+
+ // 渲染列表
+ listEl.innerHTML = "";
+ selectEl.innerHTML = '-- 请选择 Logo 文件 -- ';
+
+ logoFiles.forEach(file => {
+ // 列表项
+ const item = document.createElement("div");
+ item.className = "logo-list-item";
+ item.innerHTML = `
+
+
+
+
+
${file.name}
+
${file.size} · ${file.date}
+
+
+
+ 预览
+
+
+ 选为烧写
+
+
+
+
+
+ `;
+ listEl.appendChild(item);
+
+ // 下拉选项
+ const opt = document.createElement("option");
+ opt.value = file.name;
+ opt.textContent = file.name + " (" + file.size + ")";
+ selectEl.appendChild(opt);
+ });
+
+ // 绑定列表按钮事件
+ bindListItemEvents();
+
+ // 加载缩略图(读取文件转 base64 显示)
+ logoFiles.forEach(file => loadThumb(file));
+ });
+ });
+}
+
+function bindListItemEvents() {
+ // 预览按钮
+ document.querySelectorAll(".btn-preview").forEach(btn => {
+ btn.addEventListener("click", function() {
+ const path = this.getAttribute("data-path");
+ const name = this.getAttribute("data-name");
+ previewLogoFile(path, name);
+ });
+ });
+
+ // 选为烧写按钮
+ document.querySelectorAll(".btn-select-flash").forEach(btn => {
+ btn.addEventListener("click", function() {
+ const name = this.getAttribute("data-name");
+ const sel = document.getElementById("flash-logo-select");
+ if (sel) {
+ sel.value = name;
+ updateFlashButton();
+ // 滚动到烧写区域
+ sel.scrollIntoView({ behavior: "smooth", block: "center" });
+ }
+ });
+ });
+
+ // 删除按钮
+ document.querySelectorAll(".btn-delete").forEach(btn => {
+ btn.addEventListener("click", function() {
+ const path = this.getAttribute("data-path");
+ const name = this.getAttribute("data-name");
+ if (confirm("确定要删除 " + name + " 吗?此操作不可恢复。")) {
+ deleteLogo(path);
+ }
+ });
+ });
+}
+
+// ===================== 缩略图加载 =====================
+function loadThumb(file) {
+ // 使用 cockpit.file 读取 BMP 文件,转为 base64 显示
+ const fileHandle = cockpit.file(file.path, { binary: true });
+ fileHandle.read().then(content => {
+ fileHandle.close();
+ if (!content) return;
+ // 将 Uint8Array 转为 base64
+ const b64 = uint8ToBase64(content);
+ const dataUrl = "data:image/bmp;base64," + b64;
+
+ // 设置缩略图
+ const thumbEl = document.getElementById("thumb-" + CSS.escape(file.name));
+ if (thumbEl) {
+ thumbEl.innerHTML = ` `;
+ }
+ }).catch(() => {
+ fileHandle.close();
+ });
+}
+
+// ===================== 预览 Logo =====================
+function previewLogoFile(path, name) {
+ setLogoOutput("⏳ 正在读取 " + name + " ...");
+ const imgEl = document.getElementById("logo-preview-img");
+ const placeholder = document.getElementById("logo-placeholder");
+
+ const fileHandle = cockpit.file(path, { binary: true });
+ fileHandle.read().then(content => {
+ fileHandle.close();
+ if (!content || content.length === 0) {
+ setLogoOutput("❌ 文件内容为空或读取失败");
+ return;
+ }
+ const b64 = uint8ToBase64(content);
+ const dataUrl = "data:image/bmp;base64," + b64;
+
+ imgEl.src = dataUrl;
+ imgEl.classList.remove("hidden");
+ placeholder.classList.add("hidden");
+
+ setLogoOutput("✅ 已预览:" + name + "\n路径:" + path + "大小:" + content.length + " 字节");
+ }).catch(err => {
+ fileHandle.close();
+ setLogoOutput("❌ 读取文件失败:" + (err.message || err));
+ });
+}
+
+// 读取当前设备 Logo(从分区)
+function readCurrentLogo() {
+ setLogoOutput("⏳ 正在从设备分区读取 Logo...\n命令: dd if=/dev/disk/by-partlabel/logo of=/tmp/current_logo_preview.bmp bs=512 count=100 2>&1");
+ const imgEl = document.getElementById("logo-preview-img");
+ const placeholder = document.getElementById("logo-placeholder");
+
+ // 先用 dd 从分区读出前半段(第一个 BMP,即 splash logo)
+ runCmd(["bash", "-c",
+ "dd if=/dev/disk/by-partlabel/logo of=/tmp/current_logo_preview.bmp bs=512 2>/dev/null && echo OK"
+ ], (out, err) => {
+ if (err && !out.includes("OK")) {
+ setLogoOutput("❌ 读取分区失败: " + (err.message || err) + "" + out +"提示:确认 /dev/disk/by-partlabel/logo 分区存在");
+ return;
+ }
+
+ // 读取保存的临时文件显示预览
+ const fileHandle = cockpit.file("/tmp/current_logo_preview.bmp", { binary: true });
+ fileHandle.read().then(content => {
+ fileHandle.close();
+ if (!content || content.length === 0) {
+ setLogoOutput("❌ 读取到的分区内容为空");
+ return;
+ }
+ const b64 = uint8ToBase64(content);
+ const dataUrl = "data:image/bmp;base64," + b64;
+
+ imgEl.src = dataUrl;
+ imgEl.classList.remove("hidden");
+ placeholder.classList.add("hidden");
+
+ setLogoOutput("✅ 已读取设备当前 Logo\n分区:/dev/disk/by-partlabel/logo大小:" + content.length + " 字节");
+ }).catch(err => {
+ fileHandle.close();
+ setLogoOutput("❌ 读取临时文件失败:" + (err.message || err));
+ });
+ });
+}
+
+// ===================== 上传 Logo =====================
+function handleFileUpload(file) {
+ if (!file) return;
+
+ // 检查扩展名
+ if (!file.name.toLowerCase().endsWith(".bmp")) {
+ showUploadStatus("❌ 仅支持 .bmp 格式文件", "error");
+ return;
+ }
+
+ showUploadStatus("⏳ 正在上传 " + file.name + " ...", "uploading");
+ setLogoOutput("⏳ 正在上传文件:" + file.name);
+
+ const reader = new FileReader();
+ reader.onload = function(e) {
+ const arrayBuffer = e.target.result;
+ const uint8 = new Uint8Array(arrayBuffer);
+ const destPath = LOGO_DIR + "/" + file.name;
+
+ ensureDir(() => {
+ // 使用 cockpit.file 写入
+ const fileHandle = cockpit.file(destPath, { binary: true, superuser: "require" });
+ fileHandle.replace(uint8).then(() => {
+ fileHandle.close();
+ showUploadStatus("✅ 上传成功:" + file.name, "success");
+ setLogoOutput("✅ 文件已保存到:" + destPath + "大小:" + uint8.length + " 字节");
+ refreshLogoList();
+ }).catch(err => {
+ fileHandle.close();
+ showUploadStatus("❌ 上传失败:" + (err.message || err), "error");
+ setLogoOutput("❌ 写入文件失败:" + (err.message || err));
+ });
+ });
+ };
+ reader.onerror = function() {
+ showUploadStatus("❌ 文件读取失败", "error");
+ };
+ reader.readAsArrayBuffer(file);
+}
+
+// ===================== 删除 Logo =====================
+function deleteLogo(path) {
+ setLogoOutput("⏳ 正在删除:" + path);
+ runCmd(["rm", "-f", path], (out, err) => {
+ if (err) {
+ setLogoOutput("❌ 删除失败:" + (err.message || err));
+ } else {
+ setLogoOutput("✅ 已删除:" + path);
+ refreshLogoList();
+ }
+ });
+}
+
+// ===================== 烧写 Logo =====================
+function updateFlashButton() {
+ const sel = document.getElementById("flash-logo-select");
+ const btn = document.getElementById("btn-flash-logo");
+ if (sel && btn) {
+ btn.disabled = !sel.value;
+ }
+}
+
+function flashLogo() {
+ const sel = document.getElementById("flash-logo-select");
+ if (!sel || !sel.value) return;
+
+ const logoName = sel.value;
+ const logoPath = LOGO_DIR + "/" + logoName;
+
+ // 检查是否存在 logo_kernel.bmp
+ const kernelPath = LOGO_DIR + "/logo_kernel.bmp";
+
+ setLogoOutput("⏳ 准备烧写...\n主 Logo:" + logoPath + "内核 Logo:" + kernelPath);
+
+ // 检查文件是否存在
+ runCmd(["bash", "-c", `test -f "${logoPath}" && echo "logo_ok" || echo "logo_missing"`], (out1) => {
+ if (out1.trim() !== "logo_ok") {
+ setLogoOutput("❌ 找不到文件:" + logoPath);
+ return;
+ }
+
+ runCmd(["bash", "-c", `test -f "${kernelPath}" && echo "kernel_ok" || echo "kernel_missing"`], (out2) => {
+ const hasKernel = out2.trim() === "kernel_ok";
+
+ if (!hasKernel) {
+ setLogoOutput("⚠️ 未找到 logo_kernel.bmp(" + kernelPath + ")\n将仅烧写主 Logo,跳过内核 Logo 合并步骤。\n\n⏳ 开始烧写...");
+ } else {
+ setLogoOutput("✅ 文件检查通过\n⏳ 开始合并并烧写...\n");
+ }
+
+ doFlash(logoPath, hasKernel ? kernelPath : null);
+ });
+ });
+}
+
+function doFlash(logoPath, kernelPath) {
+ // 构建烧写命令(与原始命令一致)
+ let cmd;
+ if (kernelPath) {
+ cmd = [
+ "bash", "-c",
+ `set -e && ` +
+ `cat "${logoPath}" > /tmp/logo && ` +
+ `truncate -s %512 /tmp/logo && ` +
+ `cat "${kernelPath}" >> /tmp/logo && ` +
+ `cat /tmp/logo > /dev/disk/by-partlabel/logo && ` +
+ `echo "FLASH_OK"`
+ ];
+ } else {
+ cmd = [
+ "bash", "-c",
+ `set -e && ` +
+ `cat "${logoPath}" > /tmp/logo && ` +
+ `truncate -s %512 /tmp/logo && ` +
+ `cat /tmp/logo > /dev/disk/by-partlabel/logo && ` +
+ `echo "FLASH_OK"`
+ ];
+ }
+
+ runCmd(cmd, (out, err) => {
+ if (err || !out.includes("FLASH_OK")) {
+ setLogoOutput(
+ "❌ 烧写失败!\n" +
+ "错误信息:" + (err ? (err.message || err) : "未知错误") + "" +
+ (out ? "\n输出:\n" + out : "") +
+ "\n\n请检查:\n" +
+ " 1. /dev/disk/by-partlabel/logo 分区是否存在" +
+ " 2. 是否有足够权限写入分区" +
+ " 3. BMP 文件格式是否正确"
+ );
+ } else {
+ setLogoOutput(
+ "✅ 烧写成功!\n" +
+ "主 Logo:" + logoPath + "" +
+ (kernelPath ? "内核 Logo:" + kernelPath + "" : "") +
+ "目标分区:/dev/disk/by-partlabel/logo\n" +
+ "重启设备后新 Logo 将生效。"
+ );
+ }
+ });
+}
+
+// ===================== 拖拽上传 =====================
+function initDragDrop() {
+ const area = document.getElementById("upload-area");
+ if (!area) return;
+
+ area.addEventListener("dragover", e => {
+ e.preventDefault();
+ area.classList.add("drag-over");
+ });
+
+ area.addEventListener("dragleave", () => {
+ area.classList.remove("drag-over");
+ });
+
+ area.addEventListener("drop", e => {
+ e.preventDefault();
+ area.classList.remove("drag-over");
+ const file = e.dataTransfer.files[0];
+ if (file) handleFileUpload(file);
+ });
+
+ // 点击选择文件
+ const fileInput = document.getElementById("logo-file-input");
+ if (fileInput) {
+ fileInput.addEventListener("change", function() {
+ if (this.files[0]) handleFileUpload(this.files[0]);
+ this.value = ""; // 重置,允许重复选同一文件
+ });
+ }
+}
+
+// ===================== Base64 工具 =====================
+function uint8ToBase64(uint8Array) {
+ let binary = "";
+ const chunkSize = 8192;
+ for (let i = 0; i < uint8Array.length; i += chunkSize) {
+ const chunk = uint8Array.subarray(i, i + chunkSize);
+ binary += String.fromCharCode.apply(null, chunk);
+ }
+ return btoa(binary);
+}
+
+// ===================== 页面初始化 =====================
+document.addEventListener("DOMContentLoaded", function() {
+ initTabs();
+ initDragDrop();
+ refreshLogoList();
+
+ // 读取当前 Logo 按钮
+ const btnReadLogo = document.getElementById("btn-read-logo");
+ if (btnReadLogo) btnReadLogo.addEventListener("click", readCurrentLogo);
+
+ // 刷新列表按钮
+ const btnRefreshList = document.getElementById("btn-refresh-list");
+ if (btnRefreshList) btnRefreshList.addEventListener("click", refreshLogoList);
+
+ // 烧写按钮
+ const btnFlash = document.getElementById("btn-flash-logo");
+ if (btnFlash) btnFlash.addEventListener("click", flashLogo);
+
+ // 下拉选择变化
+ const flashSel = document.getElementById("flash-logo-select");
+ if (flashSel) flashSel.addEventListener("change", updateFlashButton);
+});
diff --git a/lj360/manifest.json b/lj360/manifest.json
new file mode 100644
index 0000000..b52cfda
--- /dev/null
+++ b/lj360/manifest.json
@@ -0,0 +1,16 @@
+{
+ "main": "lj360.html",
+ "menu": {
+ "lj360-service": {
+ "label": "启动管理",
+ "path": "lj360.html",
+ "order": 10
+ },
+ "lj360-config": {
+ "label": "参数管理",
+ "path": "lj360_config.html",
+ "order": 20
+ }
+
+ }
+}
diff --git a/motd/inactive.motd b/motd/inactive.motd
new file mode 100644
index 0000000..ddb7cb5
--- /dev/null
+++ b/motd/inactive.motd
@@ -0,0 +1,2 @@
+Activate the web console with: systemctl enable --now cockpit.socket
+
diff --git a/motd/update-motd b/motd/update-motd
new file mode 100755
index 0000000..67e0fb6
--- /dev/null
+++ b/motd/update-motd
@@ -0,0 +1,24 @@
+#!/bin/sh -e
+
+# syntax: update-motd [port [hostname [ipaddr [protocol]]]]
+# each argument can be given as the empty string to use the default
+
+# port number from cmdline, then systemctl file, then 9090
+# take the last Listen line; this will be the user-specified one
+port=${1:-$(systemctl show --property Listen cockpit.socket |
+ sed -E '$!d;$s/.*[^0-9]([0-9]+).*/\1/;')}
+port=${port:-9090}
+
+# hostname from cmdline, then `hostname -f`
+hostname=${2:-$(hostname -f || hostname)}
+
+# ip addr from cmdline, then default route source addr
+ip=${3:-$(ip -o route get 255.0 2>/dev/null | sed -e 's/.*src \([^ ]*\) .*/\1/')}
+
+# protocol from cmdline, then https
+protocol=${4:-https}
+
+hostname_url="${protocol}://${hostname}:${port}/"
+ip_url="${ip:+ or ${protocol}://${ip}:${port}/}"
+
+printf 'Web console: %s%s\n\n' "${hostname_url}" "${ip_url}" > /run/cockpit/active.motd
diff --git a/networkmanager/firewall.css.gz b/networkmanager/firewall.css.gz
new file mode 100644
index 0000000..6a4d31e
Binary files /dev/null and b/networkmanager/firewall.css.gz differ
diff --git a/networkmanager/firewall.html.gz b/networkmanager/firewall.html.gz
new file mode 100644
index 0000000..672f52d
Binary files /dev/null and b/networkmanager/firewall.html.gz differ
diff --git a/networkmanager/firewall.min.js.gz b/networkmanager/firewall.min.js.gz
new file mode 100644
index 0000000..2bff3c9
Binary files /dev/null and b/networkmanager/firewall.min.js.gz differ
diff --git a/networkmanager/index.html.gz b/networkmanager/index.html.gz
new file mode 100644
index 0000000..7ff4ce5
Binary files /dev/null and b/networkmanager/index.html.gz differ
diff --git a/networkmanager/manifest.json b/networkmanager/manifest.json
new file mode 100644
index 0000000..811baf6
--- /dev/null
+++ b/networkmanager/manifest.json
@@ -0,0 +1,37 @@
+{
+ "version": "215",
+ "name": "network",
+ "requires": {
+ "cockpit": "186"
+ },
+
+ "menu": {
+ "index": {
+ "label": "Networking",
+ "order": 40,
+ "docs": [
+ {
+ "label": "Managing networking",
+ "url": "https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_systems_using_the_rhel_8_web_console/managing-networking-in-the-web-console_system-management-using-the-rhel-8-web-console"
+ },
+ {
+ "label": "Managing firewall",
+ "url": "https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_systems_using_the_rhel_8_web_console/using-the-web-console-for-managing-firewall_system-management-using-the-rhel-8-web-console"
+ }
+ ],
+ "keywords": [
+ {
+ "matches": ["network", "interface", "bridge", "vlan", "bond", "team", "port", "mac", "ipv4", "ipv6"]
+ },
+ {
+ "matches": ["firewall", "zone", "tcp", "udp"],
+ "goto": "/network/firewall"
+ }
+ ]
+ }
+ },
+
+ "hacks": {
+ "with_networkmanager_needs_root": "yes"
+ }
+}
diff --git a/networkmanager/network.css.gz b/networkmanager/network.css.gz
new file mode 100644
index 0000000..601f4d3
Binary files /dev/null and b/networkmanager/network.css.gz differ
diff --git a/networkmanager/network.min.js.gz b/networkmanager/network.min.js.gz
new file mode 100644
index 0000000..885ad12
Binary files /dev/null and b/networkmanager/network.min.js.gz differ
diff --git a/networkmanager/po.ca.js.gz b/networkmanager/po.ca.js.gz
new file mode 100644
index 0000000..509a1b7
Binary files /dev/null and b/networkmanager/po.ca.js.gz differ
diff --git a/networkmanager/po.cs.js.gz b/networkmanager/po.cs.js.gz
new file mode 100644
index 0000000..a3938a7
Binary files /dev/null and b/networkmanager/po.cs.js.gz differ
diff --git a/networkmanager/po.de.js.gz b/networkmanager/po.de.js.gz
new file mode 100644
index 0000000..e45c3ef
Binary files /dev/null and b/networkmanager/po.de.js.gz differ
diff --git a/networkmanager/po.es.js.gz b/networkmanager/po.es.js.gz
new file mode 100644
index 0000000..1d5b01d
Binary files /dev/null and b/networkmanager/po.es.js.gz differ
diff --git a/networkmanager/po.fr.js.gz b/networkmanager/po.fr.js.gz
new file mode 100644
index 0000000..1899a91
Binary files /dev/null and b/networkmanager/po.fr.js.gz differ
diff --git a/networkmanager/po.it.js.gz b/networkmanager/po.it.js.gz
new file mode 100644
index 0000000..45eb646
Binary files /dev/null and b/networkmanager/po.it.js.gz differ
diff --git a/networkmanager/po.ja.js.gz b/networkmanager/po.ja.js.gz
new file mode 100644
index 0000000..98f6269
Binary files /dev/null and b/networkmanager/po.ja.js.gz differ
diff --git a/networkmanager/po.js.gz b/networkmanager/po.js.gz
new file mode 100644
index 0000000..45247c1
Binary files /dev/null and b/networkmanager/po.js.gz differ
diff --git a/networkmanager/po.ko.js.gz b/networkmanager/po.ko.js.gz
new file mode 100644
index 0000000..d07ebea
Binary files /dev/null and b/networkmanager/po.ko.js.gz differ
diff --git a/networkmanager/po.nl.js.gz b/networkmanager/po.nl.js.gz
new file mode 100644
index 0000000..54d7883
Binary files /dev/null and b/networkmanager/po.nl.js.gz differ
diff --git a/networkmanager/po.pl.js.gz b/networkmanager/po.pl.js.gz
new file mode 100644
index 0000000..5abdbf5
Binary files /dev/null and b/networkmanager/po.pl.js.gz differ
diff --git a/networkmanager/po.pt_BR.js.gz b/networkmanager/po.pt_BR.js.gz
new file mode 100644
index 0000000..3f44ddf
Binary files /dev/null and b/networkmanager/po.pt_BR.js.gz differ
diff --git a/networkmanager/po.ru.js.gz b/networkmanager/po.ru.js.gz
new file mode 100644
index 0000000..ccbdf25
Binary files /dev/null and b/networkmanager/po.ru.js.gz differ
diff --git a/networkmanager/po.sv.js.gz b/networkmanager/po.sv.js.gz
new file mode 100644
index 0000000..42d6186
Binary files /dev/null and b/networkmanager/po.sv.js.gz differ
diff --git a/networkmanager/po.uk.js.gz b/networkmanager/po.uk.js.gz
new file mode 100644
index 0000000..b94e63c
Binary files /dev/null and b/networkmanager/po.uk.js.gz differ
diff --git a/networkmanager/po.zh_CN.js.gz b/networkmanager/po.zh_CN.js.gz
new file mode 100644
index 0000000..2c53867
Binary files /dev/null and b/networkmanager/po.zh_CN.js.gz differ
diff --git a/networkmanager/po.zh_TW.js.gz b/networkmanager/po.zh_TW.js.gz
new file mode 100644
index 0000000..7f50a62
Binary files /dev/null and b/networkmanager/po.zh_TW.js.gz differ
diff --git a/packagekit/index.html.gz b/packagekit/index.html.gz
new file mode 100644
index 0000000..90d0a11
Binary files /dev/null and b/packagekit/index.html.gz differ
diff --git a/packagekit/manifest.json b/packagekit/manifest.json
new file mode 100644
index 0000000..ab68684
--- /dev/null
+++ b/packagekit/manifest.json
@@ -0,0 +1,29 @@
+{
+ "version": "215",
+ "name": "updates",
+ "priority": 0,
+ "requires": {
+ "cockpit": "186"
+ },
+
+ "tools": {
+ "index": {
+ "label": "Software Updates",
+ "docs": [
+ {
+ "label": "Managing software updates",
+ "url": "https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_systems_using_the_rhel_8_web_console/managing-software-updates-in-the-web-console_system-management-using-the-rhel-8-web-console"
+ }
+ ],
+ "keywords": [
+ {
+ "matches": ["package", "packagekit", "dnf", "yum", "apt-get", "security"]
+ }
+ ]
+ }
+ },
+
+ "preload": [ "index" ],
+
+ "content-security-policy": "default-src 'self'; img-src 'self' data:; font-src 'self' data:;"
+}
diff --git a/packagekit/po.ca.js.gz b/packagekit/po.ca.js.gz
new file mode 100644
index 0000000..dc782e8
Binary files /dev/null and b/packagekit/po.ca.js.gz differ
diff --git a/packagekit/po.cs.js.gz b/packagekit/po.cs.js.gz
new file mode 100644
index 0000000..c642133
Binary files /dev/null and b/packagekit/po.cs.js.gz differ
diff --git a/packagekit/po.de.js.gz b/packagekit/po.de.js.gz
new file mode 100644
index 0000000..6350baa
Binary files /dev/null and b/packagekit/po.de.js.gz differ
diff --git a/packagekit/po.es.js.gz b/packagekit/po.es.js.gz
new file mode 100644
index 0000000..f44f1dd
Binary files /dev/null and b/packagekit/po.es.js.gz differ
diff --git a/packagekit/po.fr.js.gz b/packagekit/po.fr.js.gz
new file mode 100644
index 0000000..9b2316d
Binary files /dev/null and b/packagekit/po.fr.js.gz differ
diff --git a/packagekit/po.it.js.gz b/packagekit/po.it.js.gz
new file mode 100644
index 0000000..8507ada
Binary files /dev/null and b/packagekit/po.it.js.gz differ
diff --git a/packagekit/po.ja.js.gz b/packagekit/po.ja.js.gz
new file mode 100644
index 0000000..8157174
Binary files /dev/null and b/packagekit/po.ja.js.gz differ
diff --git a/packagekit/po.js.gz b/packagekit/po.js.gz
new file mode 100644
index 0000000..45247c1
Binary files /dev/null and b/packagekit/po.js.gz differ
diff --git a/packagekit/po.ko.js.gz b/packagekit/po.ko.js.gz
new file mode 100644
index 0000000..05c48b2
Binary files /dev/null and b/packagekit/po.ko.js.gz differ
diff --git a/packagekit/po.nl.js.gz b/packagekit/po.nl.js.gz
new file mode 100644
index 0000000..df851e4
Binary files /dev/null and b/packagekit/po.nl.js.gz differ
diff --git a/packagekit/po.pl.js.gz b/packagekit/po.pl.js.gz
new file mode 100644
index 0000000..d19db9d
Binary files /dev/null and b/packagekit/po.pl.js.gz differ
diff --git a/packagekit/po.pt_BR.js.gz b/packagekit/po.pt_BR.js.gz
new file mode 100644
index 0000000..cbd6b23
Binary files /dev/null and b/packagekit/po.pt_BR.js.gz differ
diff --git a/packagekit/po.ru.js.gz b/packagekit/po.ru.js.gz
new file mode 100644
index 0000000..aa9c78c
Binary files /dev/null and b/packagekit/po.ru.js.gz differ
diff --git a/packagekit/po.sv.js.gz b/packagekit/po.sv.js.gz
new file mode 100644
index 0000000..68fca31
Binary files /dev/null and b/packagekit/po.sv.js.gz differ
diff --git a/packagekit/po.uk.js.gz b/packagekit/po.uk.js.gz
new file mode 100644
index 0000000..b937f9c
Binary files /dev/null and b/packagekit/po.uk.js.gz differ
diff --git a/packagekit/po.zh_CN.js.gz b/packagekit/po.zh_CN.js.gz
new file mode 100644
index 0000000..9359f56
Binary files /dev/null and b/packagekit/po.zh_CN.js.gz differ
diff --git a/packagekit/po.zh_TW.js.gz b/packagekit/po.zh_TW.js.gz
new file mode 100644
index 0000000..a06c7cc
Binary files /dev/null and b/packagekit/po.zh_TW.js.gz differ
diff --git a/packagekit/updates.css.gz b/packagekit/updates.css.gz
new file mode 100644
index 0000000..475dc72
Binary files /dev/null and b/packagekit/updates.css.gz differ
diff --git a/packagekit/updates.min.js.gz b/packagekit/updates.min.js.gz
new file mode 100644
index 0000000..4d3d756
Binary files /dev/null and b/packagekit/updates.min.js.gz differ
diff --git a/pcp/manifest.json b/pcp/manifest.json
new file mode 100644
index 0000000..b7dfd04
--- /dev/null
+++ b/pcp/manifest.json
@@ -0,0 +1,11 @@
+{
+ "requires": {
+ "cockpit": "134.x"
+ },
+ "bridges": [
+ {
+ "match": { "payload": "metrics1" },
+ "spawn": [ "/usr/lib/cockpit/cockpit-pcp" ]
+ }
+ ]
+}
diff --git a/shell/images/server-error.png b/shell/images/server-error.png
new file mode 100644
index 0000000..2cc0514
Binary files /dev/null and b/shell/images/server-error.png differ
diff --git a/shell/images/server-large.png b/shell/images/server-large.png
new file mode 100644
index 0000000..894a273
Binary files /dev/null and b/shell/images/server-large.png differ
diff --git a/shell/images/server-small.png b/shell/images/server-small.png
new file mode 100644
index 0000000..8c33349
Binary files /dev/null and b/shell/images/server-small.png differ
diff --git a/shell/index.css.gz b/shell/index.css.gz
new file mode 100644
index 0000000..2ca0973
Binary files /dev/null and b/shell/index.css.gz differ
diff --git a/shell/index.html b/shell/index.html
new file mode 100644
index 0000000..bd1ec3b
--- /dev/null
+++ b/shell/index.html
@@ -0,0 +1,449 @@
+
+
+
+ Cockpit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Cockpit is an interactive Linux server admin interface.
+
+
+ Version .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Choose the language to be used in the application
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Password not usable for privileged tasks or to connect to other machines
+
+
+
+ Reuse my password for privileged tasks and to connect to other machines
+
+
+
+
+
+
+
+
+
+ Use the following keys to authenticate against other systems
+
+
+
+ Add key
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Reconnect
+ Troubleshoot
+
+
+
+
+
+
+
+
+
+
+
+
+
Connection failed
+
+ There was an unexpected error while connecting to the machine.
+ Messages related to the failure might be found in the journal:
+ journalctl -u cockpit
+
+
+ Safari users need to import and trust the certificate of the self-signing CA:
+ ca.cer
+
+
+
+
+
+
diff --git a/shell/index.min.js.gz b/shell/index.min.js.gz
new file mode 100644
index 0000000..360598c
Binary files /dev/null and b/shell/index.min.js.gz differ
diff --git a/shell/manifest.json b/shell/manifest.json
new file mode 100644
index 0000000..f7b3a02
--- /dev/null
+++ b/shell/manifest.json
@@ -0,0 +1,54 @@
+{
+ "version": "215",
+ "requires": {
+ "cockpit": "134.x"
+ },
+ "locales": {
+ "ca-es": "català",
+ "cs-cz": "čeština",
+ "de-de": "Deutsch",
+ "en-us": "English",
+ "es-es": "español",
+ "fr-fr": "français",
+ "it-it": "italiano",
+ "ja-jp": "日本語",
+ "ko-kr": "한국어",
+ "nl-nl": "Nederlands",
+ "pl-pl": "polski",
+ "pt-br": "português (Brasil)",
+ "ru-ru": "русский",
+ "sv-se": "svenska",
+ "uk-ua": "Українська",
+ "zh-cn": "中文(中国)",
+ "zh-tw": "中文(台灣)"
+ },
+ "bridges": [
+ {
+ "match": {
+ "superuser": null
+ },
+ "spawn": [
+ "/usr/bin/pkexec",
+ "--disable-internal-agent",
+ "cockpit-bridge",
+ "--privileged"
+ ],
+ "privileged": true
+ },
+ {
+ "match": {
+ "superuser": null
+ },
+ "environ": [
+ "SUDO_ASKPASS=/usr/lib/cockpit/cockpit-askpass"
+ ],
+ "spawn": [
+ "/usr/bin/sudo",
+ "-A",
+ "cockpit-bridge",
+ "--privileged"
+ ],
+ "privileged": true
+ }
+ ]
+}
diff --git a/shell/po.ca.js.gz b/shell/po.ca.js.gz
new file mode 100644
index 0000000..f72e74a
Binary files /dev/null and b/shell/po.ca.js.gz differ
diff --git a/shell/po.cs.js.gz b/shell/po.cs.js.gz
new file mode 100644
index 0000000..303b5e7
Binary files /dev/null and b/shell/po.cs.js.gz differ
diff --git a/shell/po.de.js.gz b/shell/po.de.js.gz
new file mode 100644
index 0000000..2d483b7
Binary files /dev/null and b/shell/po.de.js.gz differ
diff --git a/shell/po.es.js.gz b/shell/po.es.js.gz
new file mode 100644
index 0000000..63b6f84
Binary files /dev/null and b/shell/po.es.js.gz differ
diff --git a/shell/po.fr.js.gz b/shell/po.fr.js.gz
new file mode 100644
index 0000000..9bbf5ce
Binary files /dev/null and b/shell/po.fr.js.gz differ
diff --git a/shell/po.it.js.gz b/shell/po.it.js.gz
new file mode 100644
index 0000000..762e093
Binary files /dev/null and b/shell/po.it.js.gz differ
diff --git a/shell/po.ja.js.gz b/shell/po.ja.js.gz
new file mode 100644
index 0000000..10441b3
Binary files /dev/null and b/shell/po.ja.js.gz differ
diff --git a/shell/po.js.gz b/shell/po.js.gz
new file mode 100644
index 0000000..45247c1
Binary files /dev/null and b/shell/po.js.gz differ
diff --git a/shell/po.ko.js.gz b/shell/po.ko.js.gz
new file mode 100644
index 0000000..4eb95b2
Binary files /dev/null and b/shell/po.ko.js.gz differ
diff --git a/shell/po.nl.js.gz b/shell/po.nl.js.gz
new file mode 100644
index 0000000..6fbfced
Binary files /dev/null and b/shell/po.nl.js.gz differ
diff --git a/shell/po.pl.js.gz b/shell/po.pl.js.gz
new file mode 100644
index 0000000..844ade5
Binary files /dev/null and b/shell/po.pl.js.gz differ
diff --git a/shell/po.pt_BR.js.gz b/shell/po.pt_BR.js.gz
new file mode 100644
index 0000000..c3bf371
Binary files /dev/null and b/shell/po.pt_BR.js.gz differ
diff --git a/shell/po.ru.js.gz b/shell/po.ru.js.gz
new file mode 100644
index 0000000..d362faa
Binary files /dev/null and b/shell/po.ru.js.gz differ
diff --git a/shell/po.sv.js.gz b/shell/po.sv.js.gz
new file mode 100644
index 0000000..d9523ee
Binary files /dev/null and b/shell/po.sv.js.gz differ
diff --git a/shell/po.uk.js.gz b/shell/po.uk.js.gz
new file mode 100644
index 0000000..4f24940
Binary files /dev/null and b/shell/po.uk.js.gz differ
diff --git a/shell/po.zh_CN.js.gz b/shell/po.zh_CN.js.gz
new file mode 100644
index 0000000..74d0631
Binary files /dev/null and b/shell/po.zh_CN.js.gz differ
diff --git a/shell/po.zh_TW.js.gz b/shell/po.zh_TW.js.gz
new file mode 100644
index 0000000..25288a8
Binary files /dev/null and b/shell/po.zh_TW.js.gz differ
diff --git a/shell/shell.html.gz b/shell/shell.html.gz
new file mode 100644
index 0000000..d12bbf1
Binary files /dev/null and b/shell/shell.html.gz differ
diff --git a/ssh/manifest.json b/ssh/manifest.json
new file mode 100644
index 0000000..23528e7
--- /dev/null
+++ b/ssh/manifest.json
@@ -0,0 +1,37 @@
+{
+ "version": "215",
+ "requires": {
+ "cockpit": "138"
+ },
+ "priority": 100,
+ "bridges": [
+ {
+ "match": { "session": "private", "user": null, "host": null },
+ "environ": [ "COCKPIT_SSH_CONNECT_TO_UNKNOWN_HOSTS=true",
+ "COCKPIT_PRIVATE_${channel}=${channel}" ],
+ "spawn": [ "/usr/lib/cockpit/cockpit-ssh", "${user}@${host}" ],
+ "timeout": 30,
+ "problem": "not-supported"
+ },
+ {
+ "match": { "session": "private", "host": null },
+ "environ": [ "COCKPIT_SSH_CONNECT_TO_UNKNOWN_HOSTS=true",
+ "COCKPIT_PRIVATE_${channel}=${channel}" ],
+ "spawn": [ "/usr/lib/cockpit/cockpit-ssh", "${host}" ],
+ "timeout": 30,
+ "problem": "not-supported"
+ },
+ {
+ "match": { "user": null, "host": null },
+ "spawn": [ "/usr/lib/cockpit/cockpit-ssh", "${user}@${host}" ],
+ "timeout": 30,
+ "problem": "not-supported"
+ },
+ {
+ "match": { "host": null },
+ "spawn": [ "/usr/lib/cockpit/cockpit-ssh", "${host}" ],
+ "timeout": 30,
+ "problem": "not-supported"
+ }
+ ]
+}
diff --git a/static/fonts/OpenSans-Bold-webfont.woff b/static/fonts/OpenSans-Bold-webfont.woff
new file mode 100644
index 0000000..f501db0
Binary files /dev/null and b/static/fonts/OpenSans-Bold-webfont.woff differ
diff --git a/static/fonts/OpenSans-BoldItalic-webfont.woff b/static/fonts/OpenSans-BoldItalic-webfont.woff
new file mode 100644
index 0000000..80fd8a9
Binary files /dev/null and b/static/fonts/OpenSans-BoldItalic-webfont.woff differ
diff --git a/static/fonts/OpenSans-ExtraBold-webfont.woff b/static/fonts/OpenSans-ExtraBold-webfont.woff
new file mode 100644
index 0000000..af67f18
Binary files /dev/null and b/static/fonts/OpenSans-ExtraBold-webfont.woff differ
diff --git a/static/fonts/OpenSans-ExtraBoldItalic-webfont.woff b/static/fonts/OpenSans-ExtraBoldItalic-webfont.woff
new file mode 100644
index 0000000..3b8b071
Binary files /dev/null and b/static/fonts/OpenSans-ExtraBoldItalic-webfont.woff differ
diff --git a/static/fonts/OpenSans-Italic-webfont.woff b/static/fonts/OpenSans-Italic-webfont.woff
new file mode 100644
index 0000000..9e17567
Binary files /dev/null and b/static/fonts/OpenSans-Italic-webfont.woff differ
diff --git a/static/fonts/OpenSans-Light-webfont.woff b/static/fonts/OpenSans-Light-webfont.woff
new file mode 100644
index 0000000..fb34cf3
Binary files /dev/null and b/static/fonts/OpenSans-Light-webfont.woff differ
diff --git a/static/fonts/OpenSans-LightItalic-webfont.woff b/static/fonts/OpenSans-LightItalic-webfont.woff
new file mode 100644
index 0000000..360f4a4
Binary files /dev/null and b/static/fonts/OpenSans-LightItalic-webfont.woff differ
diff --git a/static/fonts/OpenSans-Regular-webfont.woff b/static/fonts/OpenSans-Regular-webfont.woff
new file mode 100644
index 0000000..1251d51
Binary files /dev/null and b/static/fonts/OpenSans-Regular-webfont.woff differ
diff --git a/static/fonts/OpenSans-Semibold-webfont.woff b/static/fonts/OpenSans-Semibold-webfont.woff
new file mode 100644
index 0000000..409c725
Binary files /dev/null and b/static/fonts/OpenSans-Semibold-webfont.woff differ
diff --git a/static/fonts/OpenSans-SemiboldItalic-webfont.woff b/static/fonts/OpenSans-SemiboldItalic-webfont.woff
new file mode 100644
index 0000000..5431477
Binary files /dev/null and b/static/fonts/OpenSans-SemiboldItalic-webfont.woff differ
diff --git a/static/fonts/RedHatDisplay-Black.woff2 b/static/fonts/RedHatDisplay-Black.woff2
new file mode 100644
index 0000000..0d756fe
Binary files /dev/null and b/static/fonts/RedHatDisplay-Black.woff2 differ
diff --git a/static/fonts/RedHatDisplay-BlackItalic.woff2 b/static/fonts/RedHatDisplay-BlackItalic.woff2
new file mode 100644
index 0000000..f35b3b8
Binary files /dev/null and b/static/fonts/RedHatDisplay-BlackItalic.woff2 differ
diff --git a/static/fonts/RedHatDisplay-Bold.woff2 b/static/fonts/RedHatDisplay-Bold.woff2
new file mode 100644
index 0000000..6196492
Binary files /dev/null and b/static/fonts/RedHatDisplay-Bold.woff2 differ
diff --git a/static/fonts/RedHatDisplay-BoldItalic.woff2 b/static/fonts/RedHatDisplay-BoldItalic.woff2
new file mode 100644
index 0000000..9c076fb
Binary files /dev/null and b/static/fonts/RedHatDisplay-BoldItalic.woff2 differ
diff --git a/static/fonts/RedHatDisplay-Italic.woff2 b/static/fonts/RedHatDisplay-Italic.woff2
new file mode 100644
index 0000000..ce31031
Binary files /dev/null and b/static/fonts/RedHatDisplay-Italic.woff2 differ
diff --git a/static/fonts/RedHatDisplay-Medium.woff2 b/static/fonts/RedHatDisplay-Medium.woff2
new file mode 100644
index 0000000..232b3f7
Binary files /dev/null and b/static/fonts/RedHatDisplay-Medium.woff2 differ
diff --git a/static/fonts/RedHatDisplay-MediumItalic.woff2 b/static/fonts/RedHatDisplay-MediumItalic.woff2
new file mode 100644
index 0000000..1232e69
Binary files /dev/null and b/static/fonts/RedHatDisplay-MediumItalic.woff2 differ
diff --git a/static/fonts/RedHatDisplay-Regular.woff2 b/static/fonts/RedHatDisplay-Regular.woff2
new file mode 100644
index 0000000..bffb15c
Binary files /dev/null and b/static/fonts/RedHatDisplay-Regular.woff2 differ
diff --git a/static/fonts/RedHatText-Bold.woff2 b/static/fonts/RedHatText-Bold.woff2
new file mode 100644
index 0000000..832ed37
Binary files /dev/null and b/static/fonts/RedHatText-Bold.woff2 differ
diff --git a/static/fonts/RedHatText-BoldItalic.woff2 b/static/fonts/RedHatText-BoldItalic.woff2
new file mode 100644
index 0000000..3908020
Binary files /dev/null and b/static/fonts/RedHatText-BoldItalic.woff2 differ
diff --git a/static/fonts/RedHatText-Italic.woff2 b/static/fonts/RedHatText-Italic.woff2
new file mode 100644
index 0000000..869167f
Binary files /dev/null and b/static/fonts/RedHatText-Italic.woff2 differ
diff --git a/static/fonts/RedHatText-Medium.woff2 b/static/fonts/RedHatText-Medium.woff2
new file mode 100644
index 0000000..3332bb3
Binary files /dev/null and b/static/fonts/RedHatText-Medium.woff2 differ
diff --git a/static/fonts/RedHatText-MediumItalic.woff2 b/static/fonts/RedHatText-MediumItalic.woff2
new file mode 100644
index 0000000..4c94c64
Binary files /dev/null and b/static/fonts/RedHatText-MediumItalic.woff2 differ
diff --git a/static/fonts/RedHatText-Regular.woff2 b/static/fonts/RedHatText-Regular.woff2
new file mode 100644
index 0000000..c160844
Binary files /dev/null and b/static/fonts/RedHatText-Regular.woff2 differ
diff --git a/static/login.min.html b/static/login.min.html
new file mode 100644
index 0000000..bf5226f
--- /dev/null
+++ b/static/login.min.html
@@ -0,0 +1,762 @@
+
+
+
+ Loading...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ User name
+
+
+
+
+
+
+
+
+
+
+
+
+ Log In
+
+
+
+
+
+
+
+
+
+ Validating authentication token
+
+
+
+
+
+
+
+
A modern browser is required for security, reliability, and performance.
+
+
+
Download a new browser for free
+
+
+
+
Or use a bundled browser
+
+
+
+
+
+
+
+
+
diff --git a/static/login.po.ca.html b/static/login.po.ca.html
new file mode 100644
index 0000000..b0980a0
--- /dev/null
+++ b/static/login.po.ca.html
@@ -0,0 +1,159 @@
+
diff --git a/static/login.po.cs.html b/static/login.po.cs.html
new file mode 100644
index 0000000..4bb1afc
--- /dev/null
+++ b/static/login.po.cs.html
@@ -0,0 +1,159 @@
+
diff --git a/static/login.po.de.html b/static/login.po.de.html
new file mode 100644
index 0000000..39b66bb
--- /dev/null
+++ b/static/login.po.de.html
@@ -0,0 +1,159 @@
+
diff --git a/static/login.po.es.html b/static/login.po.es.html
new file mode 100644
index 0000000..e5ea086
--- /dev/null
+++ b/static/login.po.es.html
@@ -0,0 +1,159 @@
+
diff --git a/static/login.po.fr.html b/static/login.po.fr.html
new file mode 100644
index 0000000..08597b4
--- /dev/null
+++ b/static/login.po.fr.html
@@ -0,0 +1,159 @@
+
diff --git a/static/login.po.html b/static/login.po.html
new file mode 100644
index 0000000..52c9182
--- /dev/null
+++ b/static/login.po.html
@@ -0,0 +1,6 @@
+
diff --git a/static/login.po.it.html b/static/login.po.it.html
new file mode 100644
index 0000000..6eda49e
--- /dev/null
+++ b/static/login.po.it.html
@@ -0,0 +1,159 @@
+
diff --git a/static/login.po.ja.html b/static/login.po.ja.html
new file mode 100644
index 0000000..099405a
--- /dev/null
+++ b/static/login.po.ja.html
@@ -0,0 +1,159 @@
+
diff --git a/static/login.po.ko.html b/static/login.po.ko.html
new file mode 100644
index 0000000..6e235cd
--- /dev/null
+++ b/static/login.po.ko.html
@@ -0,0 +1,159 @@
+
diff --git a/static/login.po.nl.html b/static/login.po.nl.html
new file mode 100644
index 0000000..2d3f77e
--- /dev/null
+++ b/static/login.po.nl.html
@@ -0,0 +1,159 @@
+
diff --git a/static/login.po.pl.html b/static/login.po.pl.html
new file mode 100644
index 0000000..3efad83
--- /dev/null
+++ b/static/login.po.pl.html
@@ -0,0 +1,159 @@
+
diff --git a/static/login.po.pt_BR.html b/static/login.po.pt_BR.html
new file mode 100644
index 0000000..13cca63
--- /dev/null
+++ b/static/login.po.pt_BR.html
@@ -0,0 +1,159 @@
+
diff --git a/static/login.po.ru.html b/static/login.po.ru.html
new file mode 100644
index 0000000..834da65
--- /dev/null
+++ b/static/login.po.ru.html
@@ -0,0 +1,159 @@
+
diff --git a/static/login.po.sv.html b/static/login.po.sv.html
new file mode 100644
index 0000000..87c1f55
--- /dev/null
+++ b/static/login.po.sv.html
@@ -0,0 +1,159 @@
+
diff --git a/static/login.po.uk.html b/static/login.po.uk.html
new file mode 100644
index 0000000..4e31726
--- /dev/null
+++ b/static/login.po.uk.html
@@ -0,0 +1,159 @@
+
diff --git a/static/login.po.zh_CN.html b/static/login.po.zh_CN.html
new file mode 100644
index 0000000..f419b66
--- /dev/null
+++ b/static/login.po.zh_CN.html
@@ -0,0 +1,159 @@
+
diff --git a/static/login.po.zh_TW.html b/static/login.po.zh_TW.html
new file mode 100644
index 0000000..444da82
--- /dev/null
+++ b/static/login.po.zh_TW.html
@@ -0,0 +1,159 @@
+
diff --git a/storaged/images/storage-array.png b/storaged/images/storage-array.png
new file mode 100644
index 0000000..25c27d7
Binary files /dev/null and b/storaged/images/storage-array.png differ
diff --git a/storaged/images/storage-disk.png b/storaged/images/storage-disk.png
new file mode 100644
index 0000000..663ed16
Binary files /dev/null and b/storaged/images/storage-disk.png differ
diff --git a/storaged/index.html.gz b/storaged/index.html.gz
new file mode 100644
index 0000000..e81e1c9
Binary files /dev/null and b/storaged/index.html.gz differ
diff --git a/storaged/manifest.json b/storaged/manifest.json
new file mode 100644
index 0000000..364d97b
--- /dev/null
+++ b/storaged/manifest.json
@@ -0,0 +1,39 @@
+{
+ "version": "215",
+ "name": "storage",
+ "requires": {
+ "cockpit": "186"
+ },
+
+ "menu": {
+ "index": {
+ "label": "Storage",
+ "order": 30,
+ "docs": [
+ {
+ "label": "Managing partitions",
+ "url": "https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_systems_using_the_rhel_8_web_console/managing-partitions-using-the-web-console_system-management-using-the-rhel-8-web-console"
+ },
+ {
+ "label": "Managing storage devices",
+ "url": "https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_systems_using_the_rhel_8_web_console/managing-storage-devices-in-the-web-console_system-management-using-the-rhel-8-web-console"
+ }
+ ],
+ "keywords": [
+ {
+ "matches": ["filesystem", "partition", "nfs", "raid", "volume", "disk", "vdo", "iscsi", "drive", "mount", "unmount", "udisks", "mkfs", "format", "fstab", "lvm2", "luks", "encryption", "nbde", "tang"]
+ }
+ ]
+ }
+ },
+
+ "hacks": {
+ "with_storaged_iscsi_sessions": "yes"
+ },
+
+ "config": {
+ "nfs_client_package": false,
+ "vdo_package": false
+ },
+ "content-security-policy": "img-src 'self' data:"
+}
diff --git a/storaged/po.ca.js.gz b/storaged/po.ca.js.gz
new file mode 100644
index 0000000..9bf92d7
Binary files /dev/null and b/storaged/po.ca.js.gz differ
diff --git a/storaged/po.cs.js.gz b/storaged/po.cs.js.gz
new file mode 100644
index 0000000..0d3df1e
Binary files /dev/null and b/storaged/po.cs.js.gz differ
diff --git a/storaged/po.de.js.gz b/storaged/po.de.js.gz
new file mode 100644
index 0000000..de81dfa
Binary files /dev/null and b/storaged/po.de.js.gz differ
diff --git a/storaged/po.es.js.gz b/storaged/po.es.js.gz
new file mode 100644
index 0000000..c4b0f77
Binary files /dev/null and b/storaged/po.es.js.gz differ
diff --git a/storaged/po.fr.js.gz b/storaged/po.fr.js.gz
new file mode 100644
index 0000000..c1669e9
Binary files /dev/null and b/storaged/po.fr.js.gz differ
diff --git a/storaged/po.it.js.gz b/storaged/po.it.js.gz
new file mode 100644
index 0000000..f92f31e
Binary files /dev/null and b/storaged/po.it.js.gz differ
diff --git a/storaged/po.ja.js.gz b/storaged/po.ja.js.gz
new file mode 100644
index 0000000..a3f0e64
Binary files /dev/null and b/storaged/po.ja.js.gz differ
diff --git a/storaged/po.js.gz b/storaged/po.js.gz
new file mode 100644
index 0000000..45247c1
Binary files /dev/null and b/storaged/po.js.gz differ
diff --git a/storaged/po.ko.js.gz b/storaged/po.ko.js.gz
new file mode 100644
index 0000000..5a02d92
Binary files /dev/null and b/storaged/po.ko.js.gz differ
diff --git a/storaged/po.nl.js.gz b/storaged/po.nl.js.gz
new file mode 100644
index 0000000..6b130b0
Binary files /dev/null and b/storaged/po.nl.js.gz differ
diff --git a/storaged/po.pl.js.gz b/storaged/po.pl.js.gz
new file mode 100644
index 0000000..6b6dd3e
Binary files /dev/null and b/storaged/po.pl.js.gz differ
diff --git a/storaged/po.pt_BR.js.gz b/storaged/po.pt_BR.js.gz
new file mode 100644
index 0000000..793f509
Binary files /dev/null and b/storaged/po.pt_BR.js.gz differ
diff --git a/storaged/po.ru.js.gz b/storaged/po.ru.js.gz
new file mode 100644
index 0000000..ba8d2b5
Binary files /dev/null and b/storaged/po.ru.js.gz differ
diff --git a/storaged/po.sv.js.gz b/storaged/po.sv.js.gz
new file mode 100644
index 0000000..128e9cb
Binary files /dev/null and b/storaged/po.sv.js.gz differ
diff --git a/storaged/po.uk.js.gz b/storaged/po.uk.js.gz
new file mode 100644
index 0000000..b305e94
Binary files /dev/null and b/storaged/po.uk.js.gz differ
diff --git a/storaged/po.zh_CN.js.gz b/storaged/po.zh_CN.js.gz
new file mode 100644
index 0000000..27b9ddf
Binary files /dev/null and b/storaged/po.zh_CN.js.gz differ
diff --git a/storaged/po.zh_TW.js.gz b/storaged/po.zh_TW.js.gz
new file mode 100644
index 0000000..e0a49bf
Binary files /dev/null and b/storaged/po.zh_TW.js.gz differ
diff --git a/storaged/storage.css.gz b/storaged/storage.css.gz
new file mode 100644
index 0000000..89c311a
Binary files /dev/null and b/storaged/storage.css.gz differ
diff --git a/storaged/storage.min.js.gz b/storaged/storage.min.js.gz
new file mode 100644
index 0000000..94c9513
Binary files /dev/null and b/storaged/storage.min.js.gz differ
diff --git a/systemd/graphs.css.gz b/systemd/graphs.css.gz
new file mode 100644
index 0000000..19aabac
Binary files /dev/null and b/systemd/graphs.css.gz differ
diff --git a/systemd/graphs.html.gz b/systemd/graphs.html.gz
new file mode 100644
index 0000000..6084058
Binary files /dev/null and b/systemd/graphs.html.gz differ
diff --git a/systemd/graphs.min.js.gz b/systemd/graphs.min.js.gz
new file mode 100644
index 0000000..f9927a5
Binary files /dev/null and b/systemd/graphs.min.js.gz differ
diff --git a/systemd/hwinfo.css.gz b/systemd/hwinfo.css.gz
new file mode 100644
index 0000000..259230d
Binary files /dev/null and b/systemd/hwinfo.css.gz differ
diff --git a/systemd/hwinfo.html.gz b/systemd/hwinfo.html.gz
new file mode 100644
index 0000000..ddee297
Binary files /dev/null and b/systemd/hwinfo.html.gz differ
diff --git a/systemd/hwinfo.min.js.gz b/systemd/hwinfo.min.js.gz
new file mode 100644
index 0000000..00da394
Binary files /dev/null and b/systemd/hwinfo.min.js.gz differ
diff --git a/systemd/index.html.gz b/systemd/index.html.gz
new file mode 100644
index 0000000..476f687
Binary files /dev/null and b/systemd/index.html.gz differ
diff --git a/systemd/logs.css.gz b/systemd/logs.css.gz
new file mode 100644
index 0000000..91580d6
Binary files /dev/null and b/systemd/logs.css.gz differ
diff --git a/systemd/logs.html.gz b/systemd/logs.html.gz
new file mode 100644
index 0000000..de9aae9
Binary files /dev/null and b/systemd/logs.html.gz differ
diff --git a/systemd/logs.min.js.gz b/systemd/logs.min.js.gz
new file mode 100644
index 0000000..2f392a2
Binary files /dev/null and b/systemd/logs.min.js.gz differ
diff --git a/systemd/manifest.json b/systemd/manifest.json
new file mode 100644
index 0000000..e993e37
--- /dev/null
+++ b/systemd/manifest.json
@@ -0,0 +1,87 @@
+{
+ "version": "215",
+ "name": "system",
+
+ "requires": {
+ "cockpit": "122"
+ },
+
+ "menu": {
+ "index": {
+ "label": "Overview",
+ "order": 10,
+ "docs": [
+ {
+ "label": "Configuring system settings",
+ "url": "https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_systems_using_the_rhel_8_web_console/configuring-system-settings-in-the-web-console_system-management-using-the-rhel-8-web-console"
+ }
+ ],
+ "keywords": [
+ {
+ "matches": ["time", "date", "restart", "shut", "domain", "machine", "operating system", "os", "asset tag", "ssh", "power", "version", "host"]
+ },
+ {
+ "matches": ["hardware", "mitigation", "pci", "memory", "cpu", "bios", "ram", "dimm", "serial"],
+ "goto": "/system/hwinfo"
+ },
+ {
+ "matches": ["graphs"],
+ "goto": "/system/graphs"
+ }
+ ]
+ },
+ "services": {
+ "label": "Services",
+ "order": 100,
+ "docs": [
+ {
+ "label": "Managing services",
+ "url": "https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_systems_using_the_rhel_8_web_console/managing-services-in-the-web-console_system-management-using-the-rhel-8-web-console"
+ }
+ ],
+ "keywords": [
+ {
+ "matches": ["service", "systemd", "target", "socket", "timer", "path", "unit", "systemctl"]
+ },
+ {
+ "matches": ["boot", "mask", "unmask", "restart", "enable", "disable"],
+ "weight": 1
+ }
+ ]
+ },
+ "logs": {
+ "label": "Logs",
+ "order": 20,
+ "docs": [
+ {
+ "label": "Reviewing logs",
+ "url": "https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_systems_using_the_rhel_8_web_console/reviewing-logs_system-management-using-the-rhel-8-web-console"
+ }
+ ],
+ "keywords": [
+ {
+ "matches": ["journal", "warning", "error", "debug"]
+ },
+ {
+ "matches": ["abrt", "crash", "coredump"],
+ "goto": "?tag=abrt-notification"
+ }
+ ]
+ }
+ },
+
+ "tools": {
+ "terminal": {
+ "label": "Terminal",
+ "keywords": [
+ {
+ "matches": ["console", "command", "bash", "shell"]
+ }
+ ]
+ }
+ },
+
+ "preload": [ "index", "services" ],
+
+ "content-security-policy": "img-src 'self' data:"
+}
diff --git a/systemd/overview.css.gz b/systemd/overview.css.gz
new file mode 100644
index 0000000..cc3d173
Binary files /dev/null and b/systemd/overview.css.gz differ
diff --git a/systemd/overview.min.js.gz b/systemd/overview.min.js.gz
new file mode 100644
index 0000000..7152183
Binary files /dev/null and b/systemd/overview.min.js.gz differ
diff --git a/systemd/po.ca.js.gz b/systemd/po.ca.js.gz
new file mode 100644
index 0000000..6c0d124
Binary files /dev/null and b/systemd/po.ca.js.gz differ
diff --git a/systemd/po.cs.js.gz b/systemd/po.cs.js.gz
new file mode 100644
index 0000000..868f2ce
Binary files /dev/null and b/systemd/po.cs.js.gz differ
diff --git a/systemd/po.de.js.gz b/systemd/po.de.js.gz
new file mode 100644
index 0000000..ee115e3
Binary files /dev/null and b/systemd/po.de.js.gz differ
diff --git a/systemd/po.es.js.gz b/systemd/po.es.js.gz
new file mode 100644
index 0000000..84bc53f
Binary files /dev/null and b/systemd/po.es.js.gz differ
diff --git a/systemd/po.fr.js.gz b/systemd/po.fr.js.gz
new file mode 100644
index 0000000..3002fc5
Binary files /dev/null and b/systemd/po.fr.js.gz differ
diff --git a/systemd/po.it.js.gz b/systemd/po.it.js.gz
new file mode 100644
index 0000000..059296d
Binary files /dev/null and b/systemd/po.it.js.gz differ
diff --git a/systemd/po.ja.js.gz b/systemd/po.ja.js.gz
new file mode 100644
index 0000000..835e9b1
Binary files /dev/null and b/systemd/po.ja.js.gz differ
diff --git a/systemd/po.js.gz b/systemd/po.js.gz
new file mode 100644
index 0000000..45247c1
Binary files /dev/null and b/systemd/po.js.gz differ
diff --git a/systemd/po.ko.js.gz b/systemd/po.ko.js.gz
new file mode 100644
index 0000000..7a47b1c
Binary files /dev/null and b/systemd/po.ko.js.gz differ
diff --git a/systemd/po.nl.js.gz b/systemd/po.nl.js.gz
new file mode 100644
index 0000000..446dd89
Binary files /dev/null and b/systemd/po.nl.js.gz differ
diff --git a/systemd/po.pl.js.gz b/systemd/po.pl.js.gz
new file mode 100644
index 0000000..dbe3d72
Binary files /dev/null and b/systemd/po.pl.js.gz differ
diff --git a/systemd/po.pt_BR.js.gz b/systemd/po.pt_BR.js.gz
new file mode 100644
index 0000000..7754305
Binary files /dev/null and b/systemd/po.pt_BR.js.gz differ
diff --git a/systemd/po.ru.js.gz b/systemd/po.ru.js.gz
new file mode 100644
index 0000000..8e60285
Binary files /dev/null and b/systemd/po.ru.js.gz differ
diff --git a/systemd/po.sv.js.gz b/systemd/po.sv.js.gz
new file mode 100644
index 0000000..8153313
Binary files /dev/null and b/systemd/po.sv.js.gz differ
diff --git a/systemd/po.uk.js.gz b/systemd/po.uk.js.gz
new file mode 100644
index 0000000..77fa4c3
Binary files /dev/null and b/systemd/po.uk.js.gz differ
diff --git a/systemd/po.zh_CN.js.gz b/systemd/po.zh_CN.js.gz
new file mode 100644
index 0000000..f96483e
Binary files /dev/null and b/systemd/po.zh_CN.js.gz differ
diff --git a/systemd/po.zh_TW.js.gz b/systemd/po.zh_TW.js.gz
new file mode 100644
index 0000000..a7c9a67
Binary files /dev/null and b/systemd/po.zh_TW.js.gz differ
diff --git a/systemd/services.css.gz b/systemd/services.css.gz
new file mode 100644
index 0000000..476b165
Binary files /dev/null and b/systemd/services.css.gz differ
diff --git a/systemd/services.html.gz b/systemd/services.html.gz
new file mode 100644
index 0000000..dc54ec8
Binary files /dev/null and b/systemd/services.html.gz differ
diff --git a/systemd/services.min.js.gz b/systemd/services.min.js.gz
new file mode 100644
index 0000000..28f0ca6
Binary files /dev/null and b/systemd/services.min.js.gz differ
diff --git a/systemd/terminal.css.gz b/systemd/terminal.css.gz
new file mode 100644
index 0000000..a1e0b62
Binary files /dev/null and b/systemd/terminal.css.gz differ
diff --git a/systemd/terminal.html.gz b/systemd/terminal.html.gz
new file mode 100644
index 0000000..38c82e1
Binary files /dev/null and b/systemd/terminal.html.gz differ
diff --git a/systemd/terminal.min.js.gz b/systemd/terminal.min.js.gz
new file mode 100644
index 0000000..2474c06
Binary files /dev/null and b/systemd/terminal.min.js.gz differ
diff --git a/tuned/manifest.json b/tuned/manifest.json
new file mode 100644
index 0000000..cf46d79
--- /dev/null
+++ b/tuned/manifest.json
@@ -0,0 +1,7 @@
+{
+ "version": "215",
+ "name": "performance",
+ "requires": {
+ "cockpit": "122"
+ }
+}
diff --git a/tuned/performance.css.gz b/tuned/performance.css.gz
new file mode 100644
index 0000000..8c13ddc
Binary files /dev/null and b/tuned/performance.css.gz differ
diff --git a/tuned/performance.min.js.gz b/tuned/performance.min.js.gz
new file mode 100644
index 0000000..a49a8c2
Binary files /dev/null and b/tuned/performance.min.js.gz differ
diff --git a/tuned/po.ca.js.gz b/tuned/po.ca.js.gz
new file mode 100644
index 0000000..3bcad23
Binary files /dev/null and b/tuned/po.ca.js.gz differ
diff --git a/tuned/po.cs.js.gz b/tuned/po.cs.js.gz
new file mode 100644
index 0000000..c43e570
Binary files /dev/null and b/tuned/po.cs.js.gz differ
diff --git a/tuned/po.de.js.gz b/tuned/po.de.js.gz
new file mode 100644
index 0000000..9887619
Binary files /dev/null and b/tuned/po.de.js.gz differ
diff --git a/tuned/po.es.js.gz b/tuned/po.es.js.gz
new file mode 100644
index 0000000..9853a1d
Binary files /dev/null and b/tuned/po.es.js.gz differ
diff --git a/tuned/po.fr.js.gz b/tuned/po.fr.js.gz
new file mode 100644
index 0000000..437445f
Binary files /dev/null and b/tuned/po.fr.js.gz differ
diff --git a/tuned/po.it.js.gz b/tuned/po.it.js.gz
new file mode 100644
index 0000000..111301a
Binary files /dev/null and b/tuned/po.it.js.gz differ
diff --git a/tuned/po.ja.js.gz b/tuned/po.ja.js.gz
new file mode 100644
index 0000000..18c1c1f
Binary files /dev/null and b/tuned/po.ja.js.gz differ
diff --git a/tuned/po.js.gz b/tuned/po.js.gz
new file mode 100644
index 0000000..45247c1
Binary files /dev/null and b/tuned/po.js.gz differ
diff --git a/tuned/po.ko.js.gz b/tuned/po.ko.js.gz
new file mode 100644
index 0000000..8eb8e50
Binary files /dev/null and b/tuned/po.ko.js.gz differ
diff --git a/tuned/po.nl.js.gz b/tuned/po.nl.js.gz
new file mode 100644
index 0000000..f8ae796
Binary files /dev/null and b/tuned/po.nl.js.gz differ
diff --git a/tuned/po.pl.js.gz b/tuned/po.pl.js.gz
new file mode 100644
index 0000000..ce52a95
Binary files /dev/null and b/tuned/po.pl.js.gz differ
diff --git a/tuned/po.pt_BR.js.gz b/tuned/po.pt_BR.js.gz
new file mode 100644
index 0000000..cdfb6ad
Binary files /dev/null and b/tuned/po.pt_BR.js.gz differ
diff --git a/tuned/po.ru.js.gz b/tuned/po.ru.js.gz
new file mode 100644
index 0000000..223c538
Binary files /dev/null and b/tuned/po.ru.js.gz differ
diff --git a/tuned/po.sv.js.gz b/tuned/po.sv.js.gz
new file mode 100644
index 0000000..e0034dd
Binary files /dev/null and b/tuned/po.sv.js.gz differ
diff --git a/tuned/po.uk.js.gz b/tuned/po.uk.js.gz
new file mode 100644
index 0000000..cebf5a8
Binary files /dev/null and b/tuned/po.uk.js.gz differ
diff --git a/tuned/po.zh_CN.js.gz b/tuned/po.zh_CN.js.gz
new file mode 100644
index 0000000..8c1571e
Binary files /dev/null and b/tuned/po.zh_CN.js.gz differ
diff --git a/tuned/po.zh_TW.js.gz b/tuned/po.zh_TW.js.gz
new file mode 100644
index 0000000..efb4fe8
Binary files /dev/null and b/tuned/po.zh_TW.js.gz differ
diff --git a/users/index.html.gz b/users/index.html.gz
new file mode 100644
index 0000000..63f8581
Binary files /dev/null and b/users/index.html.gz differ
diff --git a/users/manifest.json b/users/manifest.json
new file mode 100644
index 0000000..f5d7b14
--- /dev/null
+++ b/users/manifest.json
@@ -0,0 +1,24 @@
+{
+ "version": "215",
+ "requires": {
+ "cockpit": "122"
+ },
+
+ "menu": {
+ "index": {
+ "label": "Accounts",
+ "order": 70,
+ "docs": [
+ {
+ "label": "Managing user accounts",
+ "url": "https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_systems_using_the_rhel_8_web_console/managing-user-accounts-in-the-web-console_system-management-using-the-rhel-8-web-console"
+ }
+ ],
+ "keywords": [
+ {
+ "matches": ["user", "password", "useradd", "passwd", "username", "login", "access", "roles", "ssh", "keys"]
+ }
+ ]
+ }
+ }
+}
diff --git a/users/po.ca.js.gz b/users/po.ca.js.gz
new file mode 100644
index 0000000..583b47d
Binary files /dev/null and b/users/po.ca.js.gz differ
diff --git a/users/po.cs.js.gz b/users/po.cs.js.gz
new file mode 100644
index 0000000..50b46de
Binary files /dev/null and b/users/po.cs.js.gz differ
diff --git a/users/po.de.js.gz b/users/po.de.js.gz
new file mode 100644
index 0000000..c0b6164
Binary files /dev/null and b/users/po.de.js.gz differ
diff --git a/users/po.es.js.gz b/users/po.es.js.gz
new file mode 100644
index 0000000..154c1bf
Binary files /dev/null and b/users/po.es.js.gz differ
diff --git a/users/po.fr.js.gz b/users/po.fr.js.gz
new file mode 100644
index 0000000..283e972
Binary files /dev/null and b/users/po.fr.js.gz differ
diff --git a/users/po.it.js.gz b/users/po.it.js.gz
new file mode 100644
index 0000000..97c2071
Binary files /dev/null and b/users/po.it.js.gz differ
diff --git a/users/po.ja.js.gz b/users/po.ja.js.gz
new file mode 100644
index 0000000..b9c147d
Binary files /dev/null and b/users/po.ja.js.gz differ
diff --git a/users/po.js.gz b/users/po.js.gz
new file mode 100644
index 0000000..45247c1
Binary files /dev/null and b/users/po.js.gz differ
diff --git a/users/po.ko.js.gz b/users/po.ko.js.gz
new file mode 100644
index 0000000..9d5de04
Binary files /dev/null and b/users/po.ko.js.gz differ
diff --git a/users/po.nl.js.gz b/users/po.nl.js.gz
new file mode 100644
index 0000000..f46a106
Binary files /dev/null and b/users/po.nl.js.gz differ
diff --git a/users/po.pl.js.gz b/users/po.pl.js.gz
new file mode 100644
index 0000000..ff1c9cf
Binary files /dev/null and b/users/po.pl.js.gz differ
diff --git a/users/po.pt_BR.js.gz b/users/po.pt_BR.js.gz
new file mode 100644
index 0000000..81f5fc3
Binary files /dev/null and b/users/po.pt_BR.js.gz differ
diff --git a/users/po.ru.js.gz b/users/po.ru.js.gz
new file mode 100644
index 0000000..770d8cc
Binary files /dev/null and b/users/po.ru.js.gz differ
diff --git a/users/po.sv.js.gz b/users/po.sv.js.gz
new file mode 100644
index 0000000..2cce70c
Binary files /dev/null and b/users/po.sv.js.gz differ
diff --git a/users/po.uk.js.gz b/users/po.uk.js.gz
new file mode 100644
index 0000000..ba5ea13
Binary files /dev/null and b/users/po.uk.js.gz differ
diff --git a/users/po.zh_CN.js.gz b/users/po.zh_CN.js.gz
new file mode 100644
index 0000000..1d192ae
Binary files /dev/null and b/users/po.zh_CN.js.gz differ
diff --git a/users/po.zh_TW.js.gz b/users/po.zh_TW.js.gz
new file mode 100644
index 0000000..c6ea0df
Binary files /dev/null and b/users/po.zh_TW.js.gz differ
diff --git a/users/users.css.gz b/users/users.css.gz
new file mode 100644
index 0000000..3fcce20
Binary files /dev/null and b/users/users.css.gz differ
diff --git a/users/users.min.js.gz b/users/users.min.js.gz
new file mode 100644
index 0000000..f88cd87
Binary files /dev/null and b/users/users.min.js.gz differ