mirror of
https://github.com/ClusterCockpit/cc-backend
synced 2025-04-05 03:35:56 +02:00
Update configurations and add new files
This commit is contained in:
parent
0309720c43
commit
72c5a3dd5e
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"addr": "127.0.0.1:8080",
|
"addr": "0.0.0.0:8080",
|
||||||
"db-driver": "mysql",
|
"db-driver": "mysql",
|
||||||
"embed-static-files": false,
|
"embed-static-files": false,
|
||||||
"static-files": "./web/frontend/public/",
|
"static-files": "./web/frontend/public/",
|
||||||
|
@ -13,4 +13,5 @@ DROP TABLE IF EXISTS volume_groups;
|
|||||||
DROP TABLE IF EXISTS physical_volumes;
|
DROP TABLE IF EXISTS physical_volumes;
|
||||||
DROP TABLE IF EXISTS lvm_storage_issuer;
|
DROP TABLE IF EXISTS lvm_storage_issuer;
|
||||||
DROP TABLE IF EXISTS machine_conf;
|
DROP TABLE IF EXISTS machine_conf;
|
||||||
|
DROP TABLE IF EXISTS file_stash_url ;
|
||||||
|
|
||||||
|
@ -167,3 +167,9 @@ CREATE TABLE IF NOT EXISTS machine_conf (
|
|||||||
folder_path VARCHAR(255) ,
|
folder_path VARCHAR(255) ,
|
||||||
FOREIGN KEY (machine_serial_number) REFERENCES machines(machine_id)
|
FOREIGN KEY (machine_serial_number) REFERENCES machines(machine_id)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS file_stash_url (
|
||||||
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
url VARCHAR(255) NOT NULL
|
||||||
|
);
|
@ -45,7 +45,10 @@ var routes []Route = []Route{
|
|||||||
{"/monitoring/node/{cluster}/{hostname}", "monitoring/node.tmpl", "Node <ID> - ClusterCockpit", false, setupNodeRoute},
|
{"/monitoring/node/{cluster}/{hostname}", "monitoring/node.tmpl", "Node <ID> - ClusterCockpit", false, setupNodeRoute},
|
||||||
{"/monitoring/analysis/{cluster}", "monitoring/analysis.tmpl", "Analysis - ClusterCockpit", true, setupAnalysisRoute},
|
{"/monitoring/analysis/{cluster}", "monitoring/analysis.tmpl", "Analysis - ClusterCockpit", true, setupAnalysisRoute},
|
||||||
{"/monitoring/status/{cluster}", "monitoring/status.tmpl", "Status of <ID> - ClusterCockpit", false, setupClusterRoute},
|
{"/monitoring/status/{cluster}", "monitoring/status.tmpl", "Status of <ID> - ClusterCockpit", false, setupClusterRoute},
|
||||||
{"/partitions/systems/{cluster}", "partitions/systems.tmpl", "Cluster <ID> - ClusterCockpit", false, setupClusterRoute},
|
{"/monitoring/partition/{cluster}", "partitions/systems.tmpl", "Cluster <ID> - ClusterCockpit", false, setupClusterRoute},
|
||||||
|
{"/monitoring/history/", "monitoring/history.tmpl", "Cluster <ID> - ClusterCockpit", false, setupClusterRoute},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,11 +13,13 @@
|
|||||||
"@timohausmann/quadtree-js": "^1.2.5",
|
"@timohausmann/quadtree-js": "^1.2.5",
|
||||||
"rollup": "^3.21.0",
|
"rollup": "^3.21.0",
|
||||||
"rollup-plugin-css-only": "^4.3.0",
|
"rollup-plugin-css-only": "^4.3.0",
|
||||||
|
"rollup-plugin-livereload": "^2.0.5",
|
||||||
"rollup-plugin-svelte": "^7.1.4",
|
"rollup-plugin-svelte": "^7.1.4",
|
||||||
"svelte": "^3.58.0"
|
"svelte": "^3.58.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@rollup/plugin-replace": "^5.0.2",
|
"@rollup/plugin-replace": "^5.0.2",
|
||||||
|
"@tanstack/svelte-table": "^8.12.0",
|
||||||
"@urql/svelte": "^4.0.1",
|
"@urql/svelte": "^4.0.1",
|
||||||
"chart.js": "^4.3.3",
|
"chart.js": "^4.3.3",
|
||||||
"date-fns": "^2.30.0",
|
"date-fns": "^2.30.0",
|
||||||
|
158
web/frontend/pnpm-lock.yaml
generated
158
web/frontend/pnpm-lock.yaml
generated
@ -8,6 +8,9 @@ dependencies:
|
|||||||
'@rollup/plugin-replace':
|
'@rollup/plugin-replace':
|
||||||
specifier: ^5.0.2
|
specifier: ^5.0.2
|
||||||
version: 5.0.5(rollup@3.29.4)
|
version: 5.0.5(rollup@3.29.4)
|
||||||
|
'@tanstack/svelte-table':
|
||||||
|
specifier: ^8.12.0
|
||||||
|
version: 8.12.0(svelte@3.59.2)
|
||||||
'@urql/svelte':
|
'@urql/svelte':
|
||||||
specifier: ^4.0.1
|
specifier: ^4.0.1
|
||||||
version: 4.0.4(graphql@16.8.1)(svelte@3.59.2)
|
version: 4.0.4(graphql@16.8.1)(svelte@3.59.2)
|
||||||
@ -55,6 +58,9 @@ devDependencies:
|
|||||||
rollup-plugin-css-only:
|
rollup-plugin-css-only:
|
||||||
specifier: ^4.3.0
|
specifier: ^4.3.0
|
||||||
version: 4.5.2(rollup@3.29.4)
|
version: 4.5.2(rollup@3.29.4)
|
||||||
|
rollup-plugin-livereload:
|
||||||
|
specifier: ^2.0.5
|
||||||
|
version: 2.0.5
|
||||||
rollup-plugin-svelte:
|
rollup-plugin-svelte:
|
||||||
specifier: ^7.1.4
|
specifier: ^7.1.4
|
||||||
version: 7.1.6(rollup@3.29.4)(svelte@3.59.2)
|
version: 7.1.6(rollup@3.29.4)(svelte@3.59.2)
|
||||||
@ -213,6 +219,21 @@ packages:
|
|||||||
picomatch: 2.3.1
|
picomatch: 2.3.1
|
||||||
rollup: 3.29.4
|
rollup: 3.29.4
|
||||||
|
|
||||||
|
/@tanstack/svelte-table@8.12.0(svelte@3.59.2):
|
||||||
|
resolution: {integrity: sha512-IgmCj4tVUgjQAUa895XommqNkNdlbi5K3MgcuyB7SbgRMXZXWUrz4chDSrFSseosLz+hcizXsoavmDcDm/WYwA==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
peerDependencies:
|
||||||
|
svelte: ^4.0.0 || ^3.49.0
|
||||||
|
dependencies:
|
||||||
|
'@tanstack/table-core': 8.12.0
|
||||||
|
svelte: 3.59.2
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@tanstack/table-core@8.12.0:
|
||||||
|
resolution: {integrity: sha512-cq/ylWVrOwixmwNXQjgZaQw1Izf7+nPxjczum7paAnMtwPg1S2qRAJU+Jb8rEBUWm69voC/zcChmePlk2hc6ug==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@timohausmann/quadtree-js@1.2.6:
|
/@timohausmann/quadtree-js@1.2.6:
|
||||||
resolution: {integrity: sha512-EoAoLMFV2JfSG8+8XD9xWJQdyvfEB5xNpiQWGD7rTDSbDQQV8IVpkm0uOIxwJZ+1uC9hHKri9GmJ5wBSUO4jfg==}
|
resolution: {integrity: sha512-EoAoLMFV2JfSG8+8XD9xWJQdyvfEB5xNpiQWGD7rTDSbDQQV8IVpkm0uOIxwJZ+1uC9hHKri9GmJ5wBSUO4jfg==}
|
||||||
dev: true
|
dev: true
|
||||||
@ -251,16 +272,36 @@ packages:
|
|||||||
hasBin: true
|
hasBin: true
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/anymatch@3.1.3:
|
||||||
|
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
|
||||||
|
engines: {node: '>= 8'}
|
||||||
|
dependencies:
|
||||||
|
normalize-path: 3.0.0
|
||||||
|
picomatch: 2.3.1
|
||||||
|
dev: true
|
||||||
|
|
||||||
/balanced-match@1.0.2:
|
/balanced-match@1.0.2:
|
||||||
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/binary-extensions@2.2.0:
|
||||||
|
resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/brace-expansion@2.0.1:
|
/brace-expansion@2.0.1:
|
||||||
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
|
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
balanced-match: 1.0.2
|
balanced-match: 1.0.2
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/braces@3.0.2:
|
||||||
|
resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
dependencies:
|
||||||
|
fill-range: 7.0.1
|
||||||
|
dev: true
|
||||||
|
|
||||||
/buffer-from@1.1.2:
|
/buffer-from@1.1.2:
|
||||||
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
|
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
|
||||||
dev: true
|
dev: true
|
||||||
@ -277,6 +318,21 @@ packages:
|
|||||||
'@kurkle/color': 0.3.2
|
'@kurkle/color': 0.3.2
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/chokidar@3.6.0:
|
||||||
|
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
|
||||||
|
engines: {node: '>= 8.10.0'}
|
||||||
|
dependencies:
|
||||||
|
anymatch: 3.1.3
|
||||||
|
braces: 3.0.2
|
||||||
|
glob-parent: 5.1.2
|
||||||
|
is-binary-path: 2.1.0
|
||||||
|
is-glob: 4.0.3
|
||||||
|
normalize-path: 3.0.0
|
||||||
|
readdirp: 3.6.0
|
||||||
|
optionalDependencies:
|
||||||
|
fsevents: 2.3.3
|
||||||
|
dev: true
|
||||||
|
|
||||||
/commander@2.20.3:
|
/commander@2.20.3:
|
||||||
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
|
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
|
||||||
dev: true
|
dev: true
|
||||||
@ -312,6 +368,13 @@ packages:
|
|||||||
/estree-walker@2.0.2:
|
/estree-walker@2.0.2:
|
||||||
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
|
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
|
||||||
|
|
||||||
|
/fill-range@7.0.1:
|
||||||
|
resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
dependencies:
|
||||||
|
to-regex-range: 5.0.1
|
||||||
|
dev: true
|
||||||
|
|
||||||
/fraction.js@4.3.4:
|
/fraction.js@4.3.4:
|
||||||
resolution: {integrity: sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q==}
|
resolution: {integrity: sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q==}
|
||||||
dev: false
|
dev: false
|
||||||
@ -331,6 +394,13 @@ packages:
|
|||||||
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
|
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/glob-parent@5.1.2:
|
||||||
|
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
|
||||||
|
engines: {node: '>= 6'}
|
||||||
|
dependencies:
|
||||||
|
is-glob: 4.0.3
|
||||||
|
dev: true
|
||||||
|
|
||||||
/glob@8.1.0:
|
/glob@8.1.0:
|
||||||
resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
|
resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
@ -365,6 +435,13 @@ packages:
|
|||||||
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
|
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/is-binary-path@2.1.0:
|
||||||
|
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
|
||||||
|
engines: {node: '>=8'}
|
||||||
|
dependencies:
|
||||||
|
binary-extensions: 2.2.0
|
||||||
|
dev: true
|
||||||
|
|
||||||
/is-builtin-module@3.2.1:
|
/is-builtin-module@3.2.1:
|
||||||
resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
|
resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
@ -378,10 +455,27 @@ packages:
|
|||||||
hasown: 2.0.1
|
hasown: 2.0.1
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/is-extglob@2.1.1:
|
||||||
|
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
|
||||||
|
engines: {node: '>=0.10.0'}
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/is-glob@4.0.3:
|
||||||
|
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
|
||||||
|
engines: {node: '>=0.10.0'}
|
||||||
|
dependencies:
|
||||||
|
is-extglob: 2.1.1
|
||||||
|
dev: true
|
||||||
|
|
||||||
/is-module@1.0.0:
|
/is-module@1.0.0:
|
||||||
resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
|
resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/is-number@7.0.0:
|
||||||
|
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
|
||||||
|
engines: {node: '>=0.12.0'}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/is-reference@1.2.1:
|
/is-reference@1.2.1:
|
||||||
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
|
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -392,6 +486,24 @@ packages:
|
|||||||
resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==}
|
resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/livereload-js@3.4.1:
|
||||||
|
resolution: {integrity: sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/livereload@0.9.3:
|
||||||
|
resolution: {integrity: sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==}
|
||||||
|
engines: {node: '>=8.0.0'}
|
||||||
|
hasBin: true
|
||||||
|
dependencies:
|
||||||
|
chokidar: 3.6.0
|
||||||
|
livereload-js: 3.4.1
|
||||||
|
opts: 2.0.2
|
||||||
|
ws: 7.5.9
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- bufferutil
|
||||||
|
- utf-8-validate
|
||||||
|
dev: true
|
||||||
|
|
||||||
/magic-string@0.27.0:
|
/magic-string@0.27.0:
|
||||||
resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==}
|
resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
@ -429,12 +541,21 @@ packages:
|
|||||||
brace-expansion: 2.0.1
|
brace-expansion: 2.0.1
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/normalize-path@3.0.0:
|
||||||
|
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
|
||||||
|
engines: {node: '>=0.10.0'}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/once@1.4.0:
|
/once@1.4.0:
|
||||||
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
|
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
|
||||||
dependencies:
|
dependencies:
|
||||||
wrappy: 1.0.2
|
wrappy: 1.0.2
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/opts@2.0.2:
|
||||||
|
resolution: {integrity: sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/path-parse@1.0.7:
|
/path-parse@1.0.7:
|
||||||
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
|
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
|
||||||
dev: true
|
dev: true
|
||||||
@ -449,6 +570,13 @@ packages:
|
|||||||
safe-buffer: 5.2.1
|
safe-buffer: 5.2.1
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/readdirp@3.6.0:
|
||||||
|
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
|
||||||
|
engines: {node: '>=8.10.0'}
|
||||||
|
dependencies:
|
||||||
|
picomatch: 2.3.1
|
||||||
|
dev: true
|
||||||
|
|
||||||
/regenerator-runtime@0.14.1:
|
/regenerator-runtime@0.14.1:
|
||||||
resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
|
resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
|
||||||
dev: false
|
dev: false
|
||||||
@ -477,6 +605,16 @@ packages:
|
|||||||
rollup: 3.29.4
|
rollup: 3.29.4
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/rollup-plugin-livereload@2.0.5:
|
||||||
|
resolution: {integrity: sha512-vqQZ/UQowTW7VoiKEM5ouNW90wE5/GZLfdWuR0ELxyKOJUIaj+uismPZZaICU4DnWPVjnpCDDxEqwU7pcKY/PA==}
|
||||||
|
engines: {node: '>=8.3'}
|
||||||
|
dependencies:
|
||||||
|
livereload: 0.9.3
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- bufferutil
|
||||||
|
- utf-8-validate
|
||||||
|
dev: true
|
||||||
|
|
||||||
/rollup-plugin-svelte@7.1.6(rollup@3.29.4)(svelte@3.59.2):
|
/rollup-plugin-svelte@7.1.6(rollup@3.29.4)(svelte@3.59.2):
|
||||||
resolution: {integrity: sha512-nVFRBpGWI2qUY1OcSiEEA/kjCY2+vAjO9BI8SzA7NRrh2GTunLd6w2EYmnMt/atgdg8GvcNjLsmZmbQs/u4SQA==}
|
resolution: {integrity: sha512-nVFRBpGWI2qUY1OcSiEEA/kjCY2+vAjO9BI8SzA7NRrh2GTunLd6w2EYmnMt/atgdg8GvcNjLsmZmbQs/u4SQA==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
@ -570,6 +708,13 @@ packages:
|
|||||||
resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==}
|
resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/to-regex-range@5.0.1:
|
||||||
|
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
|
||||||
|
engines: {node: '>=8.0'}
|
||||||
|
dependencies:
|
||||||
|
is-number: 7.0.0
|
||||||
|
dev: true
|
||||||
|
|
||||||
/typed-function@4.1.1:
|
/typed-function@4.1.1:
|
||||||
resolution: {integrity: sha512-Pq1DVubcvibmm8bYcMowjVnnMwPVMeh0DIdA8ad8NZY2sJgapANJmiigSUwlt+EgXxpfIv8MWrQXTIzkfYZLYQ==}
|
resolution: {integrity: sha512-Pq1DVubcvibmm8bYcMowjVnnMwPVMeh0DIdA8ad8NZY2sJgapANJmiigSUwlt+EgXxpfIv8MWrQXTIzkfYZLYQ==}
|
||||||
engines: {node: '>= 14'}
|
engines: {node: '>= 14'}
|
||||||
@ -586,3 +731,16 @@ packages:
|
|||||||
/wrappy@1.0.2:
|
/wrappy@1.0.2:
|
||||||
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/ws@7.5.9:
|
||||||
|
resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==}
|
||||||
|
engines: {node: '>=8.3.0'}
|
||||||
|
peerDependencies:
|
||||||
|
bufferutil: ^4.0.1
|
||||||
|
utf-8-validate: ^5.0.2
|
||||||
|
peerDependenciesMeta:
|
||||||
|
bufferutil:
|
||||||
|
optional: true
|
||||||
|
utf-8-validate:
|
||||||
|
optional: true
|
||||||
|
dev: true
|
||||||
|
@ -4,6 +4,7 @@ import commonjs from '@rollup/plugin-commonjs';
|
|||||||
import resolve from '@rollup/plugin-node-resolve';
|
import resolve from '@rollup/plugin-node-resolve';
|
||||||
import terser from '@rollup/plugin-terser';
|
import terser from '@rollup/plugin-terser';
|
||||||
import css from 'rollup-plugin-css-only';
|
import css from 'rollup-plugin-css-only';
|
||||||
|
import livereload from 'rollup-plugin-livereload';
|
||||||
|
|
||||||
// const production = !process.env.ROLLUP_WATCH;
|
// const production = !process.env.ROLLUP_WATCH;
|
||||||
const production = false
|
const production = false
|
||||||
@ -51,6 +52,7 @@ const entrypoint = (name, path) => ({
|
|||||||
// we'll extract any component CSS out into
|
// we'll extract any component CSS out into
|
||||||
// a separate file - better for performance
|
// a separate file - better for performance
|
||||||
css({ output: `${name}.css` }),
|
css({ output: `${name}.css` }),
|
||||||
|
!production && livereload('public')
|
||||||
],
|
],
|
||||||
watch: {
|
watch: {
|
||||||
clearScreen: false
|
clearScreen: false
|
||||||
@ -68,5 +70,7 @@ export default [
|
|||||||
entrypoint('analysis', 'src/analysis.entrypoint.js'),
|
entrypoint('analysis', 'src/analysis.entrypoint.js'),
|
||||||
entrypoint('status', 'src/status.entrypoint.js'),
|
entrypoint('status', 'src/status.entrypoint.js'),
|
||||||
entrypoint('config', 'src/config.entrypoint.js'),
|
entrypoint('config', 'src/config.entrypoint.js'),
|
||||||
entrypoint('partitions', 'src/partitions.entrypoint.js')
|
entrypoint('partitions', 'src/partitions.entrypoint.js'),
|
||||||
|
entrypoint('history', 'src/history.entrypoint.js')
|
||||||
|
|
||||||
];
|
];
|
||||||
|
@ -1,31 +1,67 @@
|
|||||||
<script>
|
<script>
|
||||||
import { getContext } from 'svelte'
|
import { getContext } from "svelte";
|
||||||
import { init } from './utils.js'
|
import { init } from "./utils.js";
|
||||||
import { Card, CardHeader, CardTitle } from 'sveltestrap'
|
import {
|
||||||
|
Card,
|
||||||
|
CardHeader,
|
||||||
|
CardTitle,
|
||||||
|
Col,
|
||||||
|
Icon,
|
||||||
|
TabContent,
|
||||||
|
TabPane,
|
||||||
|
Row,
|
||||||
|
} from "sveltestrap";
|
||||||
|
|
||||||
import PlotSettings from './config/PlotSettings.svelte'
|
import PlotSettings from "./config/PlotSettings.svelte";
|
||||||
import AdminSettings from './config/AdminSettings.svelte'
|
import AdminSettings from "./config/AdminSettings.svelte";
|
||||||
|
// import InfoxDbConf from "./config/admin/InfluxDbConf.svelte";
|
||||||
|
import InfluxModalDefault from "./config/admin/InfluxModalDefault.svelte";
|
||||||
|
import FileBrowser from "./config/admin/FileBrowser.svelte";
|
||||||
|
|
||||||
const { query: initq } = init()
|
const { query: initq } = init();
|
||||||
|
|
||||||
const ccconfig = getContext('cc-config')
|
const ccconfig = getContext("cc-config");
|
||||||
|
|
||||||
export let isAdmin
|
|
||||||
|
|
||||||
|
export let isAdmin;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if isAdmin == true}
|
<TabContent>
|
||||||
<Card style="margin-bottom: 1.5em;">
|
<TabPane tabId="admin-options" active class="mt-3">
|
||||||
<CardHeader>
|
<span slot="tab">
|
||||||
<CardTitle class="mb-1">Admin Options</CardTitle>
|
Admin Options
|
||||||
</CardHeader>
|
<!-- <Icon name="gear" /> -->
|
||||||
<AdminSettings/>
|
</span>
|
||||||
</Card>
|
{#if isAdmin == true}
|
||||||
{/if}
|
<Card style="margin-bottom: 1.5em;">
|
||||||
|
<AdminSettings />
|
||||||
<Card>
|
</Card>
|
||||||
<CardHeader>
|
{/if}
|
||||||
<CardTitle class="mb-1">Plotting Options</CardTitle>
|
</TabPane>
|
||||||
</CardHeader>
|
<TabPane tabId="plotting-options" class="mt-3">
|
||||||
<PlotSettings config={ccconfig}/>
|
<span slot="tab">
|
||||||
</Card>
|
Plotting Options
|
||||||
|
<!-- <Icon name="hand-thumbs-up" /> -->
|
||||||
|
</span>
|
||||||
|
<Card>
|
||||||
|
<PlotSettings config={ccconfig} />
|
||||||
|
</Card>
|
||||||
|
</TabPane>
|
||||||
|
<TabPane tabId="influx-conf" class="mt-3">
|
||||||
|
<span slot="tab">
|
||||||
|
Default Configuration
|
||||||
|
<!-- <Icon name="alarm" /> -->
|
||||||
|
</span>
|
||||||
|
<Row cols={2} class="p-2 g-2">
|
||||||
|
<Col class="mb-1">
|
||||||
|
<Card class="p-3">
|
||||||
|
<CardHeader>Default InfluxDB Configuration</CardHeader>
|
||||||
|
<br>
|
||||||
|
<InfluxModalDefault />
|
||||||
|
</Card>
|
||||||
|
</Col>
|
||||||
|
<Col class="mb-1">
|
||||||
|
<FileBrowser />
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
</TabPane>
|
||||||
|
</TabContent>
|
||||||
|
@ -1,186 +1,184 @@
|
|||||||
<script>
|
<script>
|
||||||
import {
|
import {
|
||||||
Icon,
|
Icon,
|
||||||
Collapse,
|
Collapse,
|
||||||
Navbar,
|
Navbar,
|
||||||
NavbarBrand,
|
NavbarBrand,
|
||||||
Nav,
|
Nav,
|
||||||
NavbarToggler,
|
NavbarToggler,
|
||||||
Dropdown,
|
Dropdown,
|
||||||
DropdownToggle,
|
DropdownToggle,
|
||||||
DropdownMenu,
|
DropdownMenu,
|
||||||
} from "sveltestrap";
|
} from "sveltestrap";
|
||||||
import NavbarLinks from "./NavbarLinks.svelte";
|
import NavbarLinks from "./NavbarLinks.svelte";
|
||||||
import NavbarTools from "./NavbarTools.svelte";
|
import NavbarTools from "./NavbarTools.svelte";
|
||||||
|
|
||||||
export let username; // empty string if auth. is disabled, otherwise the username as string
|
export let username; // empty string if auth. is disabled, otherwise the username as string
|
||||||
export let authlevel; // Integer
|
export let authlevel; // Integer
|
||||||
export let clusters; // array of names
|
export let clusters; // array of names
|
||||||
export let roles; // Role Enum-Like
|
export let roles; // Role Enum-Like
|
||||||
|
|
||||||
let isOpen = false;
|
let isOpen = false;
|
||||||
let screenSize;
|
let screenSize;
|
||||||
|
|
||||||
const jobsTitle = new Map();
|
const jobsTitle = new Map();
|
||||||
jobsTitle.set(2, "Job Search");
|
jobsTitle.set(2, "Job Search");
|
||||||
jobsTitle.set(3, "Managed Jobs");
|
jobsTitle.set(3, "Managed Jobs");
|
||||||
jobsTitle.set(4, "Jobs");
|
jobsTitle.set(4, "Jobs");
|
||||||
jobsTitle.set(5, "Jobs");
|
jobsTitle.set(5, "Jobs");
|
||||||
const usersTitle = new Map();
|
const usersTitle = new Map();
|
||||||
usersTitle.set(3, "Managed Users");
|
usersTitle.set(3, "Managed Users");
|
||||||
usersTitle.set(4, "Users");
|
usersTitle.set(4, "Users");
|
||||||
usersTitle.set(5, "Users");
|
usersTitle.set(5, "Users");
|
||||||
|
|
||||||
const views = [
|
const views = [
|
||||||
{
|
{
|
||||||
title: "My Jobs",
|
title: "My Jobs",
|
||||||
requiredRole: roles.user,
|
requiredRole: roles.user,
|
||||||
href: `/monitoring/user/${username}`,
|
href: `/monitoring/user/${username}`,
|
||||||
icon: "bar-chart-line-fill",
|
icon: "bar-chart-line-fill",
|
||||||
perCluster: false,
|
perCluster: false,
|
||||||
menu: "none",
|
menu: "none",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: jobsTitle.get(authlevel),
|
title: jobsTitle.get(authlevel),
|
||||||
requiredRole: roles.user,
|
requiredRole: roles.user,
|
||||||
href: `/monitoring/jobs/`,
|
href: `/monitoring/jobs/`,
|
||||||
icon: "card-list",
|
icon: "card-list",
|
||||||
perCluster: false,
|
perCluster: false,
|
||||||
menu: "none",
|
menu: "none",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: usersTitle.get(authlevel),
|
title: usersTitle.get(authlevel),
|
||||||
requiredRole: roles.manager,
|
requiredRole: roles.manager,
|
||||||
href: "/monitoring/users/",
|
href: "/monitoring/users/",
|
||||||
icon: "people-fill",
|
icon: "people-fill",
|
||||||
perCluster: false,
|
perCluster: false,
|
||||||
menu: "Groups",
|
menu: "Groups",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Projects",
|
title: "Projects",
|
||||||
requiredRole: roles.support,
|
requiredRole: roles.support,
|
||||||
href: "/monitoring/projects/",
|
href: "/monitoring/projects/",
|
||||||
icon: "folder",
|
icon: "folder",
|
||||||
perCluster: false,
|
perCluster: false,
|
||||||
menu: "Groups",
|
menu: "Groups",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Tags",
|
title: "Tags",
|
||||||
requiredRole: roles.user,
|
requiredRole: roles.user,
|
||||||
href: "/monitoring/tags/",
|
href: "/monitoring/tags/",
|
||||||
icon: "tags",
|
icon: "tags",
|
||||||
perCluster: false,
|
perCluster: false,
|
||||||
menu: "Groups",
|
menu: "Groups",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Analysis",
|
title: "Analysis",
|
||||||
requiredRole: roles.support,
|
requiredRole: roles.support,
|
||||||
href: "/monitoring/analysis/",
|
href: "/monitoring/analysis/",
|
||||||
icon: "graph-up",
|
icon: "graph-up",
|
||||||
perCluster: true,
|
perCluster: true,
|
||||||
menu: "Stats",
|
menu: "Stats",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Nodes",
|
title: "Nodes",
|
||||||
requiredRole: roles.admin,
|
requiredRole: roles.admin,
|
||||||
href: "/monitoring/systems/",
|
href: "/monitoring/systems/",
|
||||||
icon: "cpu",
|
icon: "cpu",
|
||||||
perCluster: true,
|
perCluster: true,
|
||||||
menu: "Groups",
|
menu: "Groups",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Status",
|
title: "Status",
|
||||||
requiredRole: roles.admin,
|
requiredRole: roles.admin,
|
||||||
href: "/monitoring/status/",
|
href: "/monitoring/status/",
|
||||||
icon: "cpu",
|
icon: "cpu",
|
||||||
perCluster: true,
|
perCluster: true,
|
||||||
menu: "Stats",
|
menu: "Stats",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Partitions",
|
title: "Partitions",
|
||||||
requiredRole: roles.admin,
|
requiredRole: roles.admin,
|
||||||
href: "partitions/systems/",
|
href: "/monitoring/partition/",
|
||||||
icon: "device-hdd",
|
icon: "device-hdd",
|
||||||
perCluster: true,
|
perCluster: true,
|
||||||
menu: "Stats",
|
menu: "Stats",
|
||||||
},
|
},
|
||||||
];
|
{
|
||||||
|
title: "History",
|
||||||
|
requiredRole: roles.admin,
|
||||||
|
href: "/monitoring/history/",
|
||||||
|
icon: "clock-history",
|
||||||
|
perCluster: false,
|
||||||
|
menu: "Stats",
|
||||||
|
},
|
||||||
|
];
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:window bind:innerWidth={screenSize} />
|
<svelte:window bind:innerWidth={screenSize} />
|
||||||
<Navbar color="light" light expand="md" fixed="top">
|
<Navbar color="light" light expand="md" fixed="top">
|
||||||
<NavbarBrand href="/">
|
<NavbarBrand href="/">
|
||||||
<img alt="ClusterCockpit Logo" src="/img/logo.png" height="25rem" />
|
<img alt="ClusterCockpit Logo" src="/img/logo.png" height="25rem" />
|
||||||
</NavbarBrand>
|
</NavbarBrand>
|
||||||
<NavbarToggler on:click={() => (isOpen = !isOpen)} />
|
<NavbarToggler on:click={() => (isOpen = !isOpen)} />
|
||||||
<Collapse
|
<Collapse
|
||||||
style="justify-content: space-between"
|
style="justify-content: space-between"
|
||||||
{isOpen}
|
{isOpen}
|
||||||
navbar
|
navbar
|
||||||
expand="md"
|
expand="md"
|
||||||
on:update={({ detail }) => (isOpen = detail.isOpen)}
|
on:update={({ detail }) => (isOpen = detail.isOpen)}
|
||||||
>
|
>
|
||||||
<Nav navbar>
|
<Nav navbar>
|
||||||
{#if screenSize > 1500 || screenSize < 768}
|
{#if screenSize > 1500 || screenSize < 768}
|
||||||
<NavbarLinks
|
<NavbarLinks
|
||||||
{clusters}
|
{clusters}
|
||||||
links={views.filter(
|
links={views.filter((item) => item.requiredRole <= authlevel)}
|
||||||
(item) => item.requiredRole <= authlevel
|
/>
|
||||||
)}
|
{:else if screenSize > 1300}
|
||||||
/>
|
<NavbarLinks
|
||||||
{:else if screenSize > 1300}
|
{clusters}
|
||||||
<NavbarLinks
|
links={views.filter(
|
||||||
{clusters}
|
(item) => item.requiredRole <= authlevel && item.menu != "Stats"
|
||||||
links={views.filter(
|
)}
|
||||||
(item) =>
|
/>
|
||||||
item.requiredRole <= authlevel &&
|
<Dropdown nav>
|
||||||
item.menu != "Stats"
|
<DropdownToggle nav caret>
|
||||||
)}
|
<Icon name="graph-up" />
|
||||||
/>
|
Stats
|
||||||
<Dropdown nav>
|
</DropdownToggle>
|
||||||
<DropdownToggle nav caret>
|
<DropdownMenu class="dropdown-menu-lg-end">
|
||||||
<Icon name="graph-up" />
|
<NavbarLinks
|
||||||
Stats
|
{clusters}
|
||||||
</DropdownToggle>
|
links={views.filter(
|
||||||
<DropdownMenu class="dropdown-menu-lg-end">
|
(item) => item.requiredRole <= authlevel && item.menu == "Stats"
|
||||||
<NavbarLinks
|
)}
|
||||||
{clusters}
|
/>
|
||||||
links={views.filter(
|
</DropdownMenu>
|
||||||
(item) =>
|
</Dropdown>
|
||||||
item.requiredRole <= authlevel &&
|
{:else}
|
||||||
item.menu == "Stats"
|
<NavbarLinks
|
||||||
)}
|
{clusters}
|
||||||
/>
|
links={views.filter(
|
||||||
</DropdownMenu>
|
(item) => item.requiredRole <= authlevel && item.menu == "none"
|
||||||
</Dropdown>
|
)}
|
||||||
{:else}
|
/>
|
||||||
<NavbarLinks
|
{#each Array("Groups", "Stats") as menu}
|
||||||
{clusters}
|
<Dropdown nav>
|
||||||
links={views.filter(
|
<DropdownToggle nav caret>
|
||||||
(item) =>
|
{menu}
|
||||||
item.requiredRole <= authlevel &&
|
</DropdownToggle>
|
||||||
item.menu == "none"
|
<DropdownMenu class="dropdown-menu-lg-end">
|
||||||
)}
|
<NavbarLinks
|
||||||
/>
|
{clusters}
|
||||||
{#each Array("Groups", "Stats") as menu}
|
links={views.filter(
|
||||||
<Dropdown nav>
|
(item) => item.requiredRole <= authlevel && item.menu == menu
|
||||||
<DropdownToggle nav caret>
|
)}
|
||||||
{menu}
|
/>
|
||||||
</DropdownToggle>
|
</DropdownMenu>
|
||||||
<DropdownMenu class="dropdown-menu-lg-end">
|
</Dropdown>
|
||||||
<NavbarLinks
|
{/each}
|
||||||
{clusters}
|
{/if}
|
||||||
links={views.filter(
|
</Nav>
|
||||||
(item) =>
|
<NavbarTools {username} {authlevel} {roles} {screenSize} />
|
||||||
item.requiredRole <= authlevel &&
|
</Collapse>
|
||||||
item.menu == menu
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
</DropdownMenu>
|
|
||||||
</Dropdown>
|
|
||||||
{/each}
|
|
||||||
{/if}
|
|
||||||
</Nav>
|
|
||||||
<NavbarTools {username} {authlevel} {roles} {screenSize} />
|
|
||||||
</Collapse>
|
|
||||||
</Navbar>
|
</Navbar>
|
||||||
|
98
web/frontend/src/History.svelte
Normal file
98
web/frontend/src/History.svelte
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
<script>
|
||||||
|
import {
|
||||||
|
Col,
|
||||||
|
Row,
|
||||||
|
Card,
|
||||||
|
CardHeader,
|
||||||
|
CardBody,
|
||||||
|
CardTitle,
|
||||||
|
CardSubtitle,
|
||||||
|
CardText,
|
||||||
|
InputGroup,
|
||||||
|
InputGroupText,
|
||||||
|
Input,
|
||||||
|
Button,
|
||||||
|
Icon,
|
||||||
|
Dropdown,
|
||||||
|
DropdownToggle,
|
||||||
|
DropdownMenu,
|
||||||
|
DropdownItem,
|
||||||
|
} from "sveltestrap";
|
||||||
|
import SvTable from "./partition/SvTable.svelte";
|
||||||
|
let pages = [5, 10, 15, 20];
|
||||||
|
let selectedPages = 5;
|
||||||
|
let isOpen = false;
|
||||||
|
|
||||||
|
const selectPage = (page) => {
|
||||||
|
selectedPages = page;
|
||||||
|
isOpen = false;
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Col cols={1} class="p-2 g-2">
|
||||||
|
<Row>
|
||||||
|
<Col>
|
||||||
|
<Card class="mb-1">
|
||||||
|
<CardHeader>
|
||||||
|
<CardTitle>
|
||||||
|
<h3>History</h3></CardTitle
|
||||||
|
>
|
||||||
|
</CardHeader>
|
||||||
|
<CardBody class="h5">
|
||||||
|
<CardSubtitle
|
||||||
|
>History records for past connections are listed here and can be
|
||||||
|
sorted by clicking the column headers. To search for specific
|
||||||
|
records, enter a filter string and click "Search". Only records
|
||||||
|
which match the provided filter string will be listed.
|
||||||
|
</CardSubtitle>
|
||||||
|
<CardText></CardText>
|
||||||
|
<Row>
|
||||||
|
<Row class="p-3">
|
||||||
|
<Col>
|
||||||
|
<!-- bind:value={filterString} -->
|
||||||
|
<InputGroup>
|
||||||
|
<Input type="text" placeholder="Filter string" />
|
||||||
|
<InputGroupText>
|
||||||
|
<Icon name="search" />
|
||||||
|
</InputGroupText>
|
||||||
|
</InputGroup>
|
||||||
|
</Col>
|
||||||
|
<Col>
|
||||||
|
<!-- <Button color="primary" on:click={search}> -->
|
||||||
|
<Button color="primary">Search</Button>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
</Row>
|
||||||
|
<!-- <br> -->
|
||||||
|
<Row class="p-3">
|
||||||
|
<SvTable />
|
||||||
|
</Row>
|
||||||
|
<!-- pagination -->
|
||||||
|
<Row>
|
||||||
|
<Col cols="3">
|
||||||
|
<!-- <Button color="primary" on:click={prevPage}> -->
|
||||||
|
<Button color="primary">Previous</Button>
|
||||||
|
<!-- <Button color="primary" on:click={nextPage}> -->
|
||||||
|
<Button color="primary">Next</Button>
|
||||||
|
<!-- dropdown for number of pages to show -->
|
||||||
|
<div>
|
||||||
|
<Dropdown {isOpen} toggle={() => (isOpen = !isOpen)}>
|
||||||
|
<DropdownToggle caret>
|
||||||
|
{selectedPages}
|
||||||
|
</DropdownToggle>
|
||||||
|
<DropdownMenu>
|
||||||
|
{#each pages as page (page)}
|
||||||
|
<DropdownItem on:click={() => selectPage(page)}
|
||||||
|
>{page}</DropdownItem
|
||||||
|
>
|
||||||
|
{/each}
|
||||||
|
</DropdownMenu>
|
||||||
|
</Dropdown>
|
||||||
|
</div>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
</CardBody>
|
||||||
|
</Card>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
</Col>
|
53
web/frontend/src/config/admin/FileBrowser.svelte
Normal file
53
web/frontend/src/config/admin/FileBrowser.svelte
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
<script>
|
||||||
|
import { Button, Card, CardText, CardTitle } from 'sveltestrap'
|
||||||
|
import { createEventDispatcher } from 'svelte'
|
||||||
|
import { fade } from 'svelte/transition'
|
||||||
|
|
||||||
|
const dispatch = createEventDispatcher()
|
||||||
|
|
||||||
|
let message = {msg: '', color: '#d63384'}
|
||||||
|
let displayMessage = false
|
||||||
|
|
||||||
|
async function handleUrlSubmit() {
|
||||||
|
let form = document.querySelector('#create-url-form')
|
||||||
|
let formData = new FormData(form)
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch(form.action, { method: 'POST', body: formData });
|
||||||
|
if (res.ok) {
|
||||||
|
let text = await res.text()
|
||||||
|
popMessage(text, '#048109')
|
||||||
|
form.reset()
|
||||||
|
} else {
|
||||||
|
let text = await res.text()
|
||||||
|
throw new Error('Response Code ' + res.status + '-> ' + text)
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
popMessage(err, '#d63384')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function popMessage(response, rescolor) {
|
||||||
|
message = {msg: response, color: rescolor}
|
||||||
|
displayMessage = true
|
||||||
|
setTimeout(function() {
|
||||||
|
displayMessage = false
|
||||||
|
}, 3500)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Card>
|
||||||
|
<!-- default url -->
|
||||||
|
<form id="create-url-form" method="post" action="/api/url/" class="card-body" on:submit|preventDefault={handleUrlSubmit}>
|
||||||
|
<CardTitle class="mb-3">FileBrowser Configuration</CardTitle>
|
||||||
|
<CardText><p>Current URL :</p></CardText>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="url" class="form-label">URL</label>
|
||||||
|
<input type="text" class="form-control" id="url" name="url" required />
|
||||||
|
</div>
|
||||||
|
<p style="display: flex; align-items: center;">
|
||||||
|
<Button type="submit" color="primary">Submit</Button>
|
||||||
|
{#if displayMessage}<div style="margin-left: 1.5em;"><b><code style="color: {message.color};" out:fade>{message.msg}</code></b></div>{/if}
|
||||||
|
</p>
|
||||||
|
</form>
|
||||||
|
</Card>
|
193
web/frontend/src/config/admin/InfluxDbConf.svelte
Normal file
193
web/frontend/src/config/admin/InfluxDbConf.svelte
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
<script>
|
||||||
|
import { Button, Card, CardTitle } from "sveltestrap";
|
||||||
|
import { createEventDispatcher } from "svelte";
|
||||||
|
import { fade } from "svelte/transition";
|
||||||
|
|
||||||
|
const dispatch = createEventDispatcher();
|
||||||
|
|
||||||
|
let message = { msg: "", color: "#d63384" };
|
||||||
|
let displayMessage = false;
|
||||||
|
|
||||||
|
async function handleInfluxSubmit() {
|
||||||
|
let form = document.querySelector("#create-influx-form");
|
||||||
|
let formData = new FormData(form);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch(form.action, { method: "POST", body: formData });
|
||||||
|
if (res.ok) {
|
||||||
|
let text = await res.text();
|
||||||
|
popMessage(text, "#048109");
|
||||||
|
form.reset();
|
||||||
|
} else {
|
||||||
|
let text = await res.text();
|
||||||
|
throw new Error("Response Code " + res.status + "-> " + text);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
popMessage(err, "#d63384");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function popMessage(response, rescolor) {
|
||||||
|
message = { msg: response, color: rescolor };
|
||||||
|
displayMessage = true;
|
||||||
|
setTimeout(function () {
|
||||||
|
displayMessage = false;
|
||||||
|
}, 3500);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Card class="m-2">
|
||||||
|
<form
|
||||||
|
id="create-influx-form"
|
||||||
|
method="post"
|
||||||
|
action="/api/influx/"
|
||||||
|
class="card-body"
|
||||||
|
on:submit|preventDefault={handleInfluxSubmit}
|
||||||
|
>
|
||||||
|
<!-- <CardTitle class="mb-3">Create Influx Configuration</CardTitle> -->
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="type" class="form-label">Type</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="form-control"
|
||||||
|
id="type"
|
||||||
|
name="type"
|
||||||
|
value="influxasync"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="database" class="form-label">Database</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="form-control"
|
||||||
|
id="database"
|
||||||
|
name="database"
|
||||||
|
value="Bucket"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="host" class="form-label">Host</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="form-control"
|
||||||
|
id="host"
|
||||||
|
name="host"
|
||||||
|
value="103.165.95.123"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="port" class="form-label">Port</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="form-control"
|
||||||
|
id="port"
|
||||||
|
name="port"
|
||||||
|
value="8086"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<!-- Add more input fields as needed -->
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="user" class="form-label">User</label>
|
||||||
|
<input type="text" class="form-control" id="user" name="user" value="" />
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="password" class="form-label">Password</label>
|
||||||
|
<input
|
||||||
|
type="password"
|
||||||
|
class="form-control"
|
||||||
|
id="password"
|
||||||
|
name="password"
|
||||||
|
value="-7snr5tvEWxx5pnNSwfqSz9C2hO6NHUAqMRIBeS3Q-Z8kmPn0pO6UC-IEWo2EAw3oTorriVGWwiNYahS2BTiFg=="
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="organization" class="form-label">Organization</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="form-control"
|
||||||
|
id="organization"
|
||||||
|
name="organization"
|
||||||
|
value="myorg"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="ssl" class="form-label">SSL</label>
|
||||||
|
<select class="form-control" id="ssl" name="ssl">
|
||||||
|
{#each ['true', 'false'] as option}
|
||||||
|
<option>{option}</option>
|
||||||
|
{/each}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="batch_size" class="form-label">Batch Size</label>
|
||||||
|
<input
|
||||||
|
type="number"
|
||||||
|
class="form-control"
|
||||||
|
id="batch_size"
|
||||||
|
name="batch_size"
|
||||||
|
value="200"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="retry_interval" class="form-label">Retry Interval</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="form-control"
|
||||||
|
id="retry_interval"
|
||||||
|
name="retry_interval"
|
||||||
|
value="1s"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="retry_exponential_base" class="form-label"
|
||||||
|
>Retry Exponential Base</label
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
type="number"
|
||||||
|
class="form-control"
|
||||||
|
id="retry_exponential_base"
|
||||||
|
name="retry_exponential_base"
|
||||||
|
value="2"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="max_retries" class="form-label">Max Retries</label>
|
||||||
|
<input
|
||||||
|
type="number"
|
||||||
|
class="form-control"
|
||||||
|
id="max_retries"
|
||||||
|
name="max_retries"
|
||||||
|
value="20"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="max_retry_time" class="form-label">Max Retry Time</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="form-control"
|
||||||
|
id="max_retry_time"
|
||||||
|
name="max_retry_time"
|
||||||
|
value="168h"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="meta_as_tags" class="form-label">Meta as Tags</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
class="form-control"
|
||||||
|
id="meta_as_tags"
|
||||||
|
name="meta_as_tags"
|
||||||
|
value="[]"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<p style="display: flex; align-items: center;">
|
||||||
|
<Button type="submit" color="primary">Submit</Button>
|
||||||
|
{#if displayMessage}<div style="margin-left: 1.5em;">
|
||||||
|
<b
|
||||||
|
><code style="color: {message.color};" out:fade>{message.msg}</code
|
||||||
|
></b
|
||||||
|
>
|
||||||
|
</div>{/if}
|
||||||
|
</p>
|
||||||
|
</form>
|
||||||
|
</Card>
|
30
web/frontend/src/config/admin/InfluxModalDefault.svelte
Normal file
30
web/frontend/src/config/admin/InfluxModalDefault.svelte
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<script>
|
||||||
|
import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'sveltestrap';
|
||||||
|
import InfoxDbConf from './InfluxDbConf.svelte';
|
||||||
|
import { onMount } from 'svelte';
|
||||||
|
|
||||||
|
let isOpen = false;
|
||||||
|
let influxDbConfig = {};
|
||||||
|
|
||||||
|
onMount(async () => {
|
||||||
|
// Fetch the default values of influxdb configuration from db
|
||||||
|
const response = await fetch('/api/influxdb-config');
|
||||||
|
influxDbConfig = await response.json();
|
||||||
|
});
|
||||||
|
|
||||||
|
const toggle = () => {
|
||||||
|
isOpen = !isOpen;
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Button color="primary btn" style="" on:click={toggle}>Show InfluxDB Configuration</Button>
|
||||||
|
|
||||||
|
<Modal isOpen={isOpen} toggle={toggle}>
|
||||||
|
<ModalHeader toggle={toggle}>InfluxDB Configuration</ModalHeader>
|
||||||
|
<ModalBody style="max-height: calc(100vh - 210px); overflow-y: auto;">
|
||||||
|
<InfoxDbConf {influxDbConfig} />
|
||||||
|
</ModalBody>
|
||||||
|
<ModalFooter>
|
||||||
|
<Button color="secondary" on:click={toggle}>Close</Button>
|
||||||
|
</ModalFooter>
|
||||||
|
</Modal>
|
13
web/frontend/src/history.entrypoint.js
Normal file
13
web/frontend/src/history.entrypoint.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import {} from './header.entrypoint.js'
|
||||||
|
import History from './History.svelte'
|
||||||
|
|
||||||
|
|
||||||
|
new History({
|
||||||
|
target: document.getElementById('svelte-app'),
|
||||||
|
props: {
|
||||||
|
filterPresets: filterPresets
|
||||||
|
},
|
||||||
|
context: new Map([
|
||||||
|
['cc-config', clusterCockpitConfig]
|
||||||
|
])
|
||||||
|
})
|
36
web/frontend/src/partition/SvTable.svelte
Normal file
36
web/frontend/src/partition/SvTable.svelte
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
<script>
|
||||||
|
import { Table } from 'sveltestrap';
|
||||||
|
|
||||||
|
let data = [
|
||||||
|
{ username: 'user1', linuxMachine: 'machine1', usage: '20%', role: 'admin' },
|
||||||
|
{ username: 'user2', linuxMachine: 'machine2', usage: '30%', role: 'user' },
|
||||||
|
// Add more data as needed
|
||||||
|
];
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.bg-light {
|
||||||
|
background-color: #f8f9fa; /* This is the color Bootstrap uses for .bg-light */
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<Table striped>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Username</th>
|
||||||
|
<th>Linux-machine</th>
|
||||||
|
<th>Usage</th>
|
||||||
|
<th>Role</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{#each data as item (item.username)}
|
||||||
|
<tr>
|
||||||
|
<td class=""><p class="font-weight-light">{item.username}</p></td>
|
||||||
|
<td class="bg-light">{item.linuxMachine}</td>
|
||||||
|
<td class="bg-light">{item.usage}</td>
|
||||||
|
<td class="bg-light">{item.role}</td>
|
||||||
|
</tr>
|
||||||
|
{/each}
|
||||||
|
</tbody>
|
||||||
|
</Table>
|
15
web/templates/monitoring/history.tmpl
Normal file
15
web/templates/monitoring/history.tmpl
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{{define "content"}}
|
||||||
|
<div id="svelte-app"></div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{define "stylesheets"}}
|
||||||
|
<link rel='stylesheet' href='/build/history.css'>
|
||||||
|
{{end}}
|
||||||
|
{{define "javascript"}}
|
||||||
|
<script>
|
||||||
|
const cluster = {{ .Infos.cluster }};
|
||||||
|
const filterPresets = {{ .FilterPresets }};
|
||||||
|
const clusterCockpitConfig = {{ .Config }};
|
||||||
|
</script>
|
||||||
|
<script src='/build/history.js'></script>
|
||||||
|
{{end}}
|
Loading…
x
Reference in New Issue
Block a user