From 6dc118c8c744f21d5711ed07caaf2ca1a9e3f98f Mon Sep 17 00:00:00 2001 From: WeeXnes Date: Wed, 26 Feb 2025 09:38:06 +0100 Subject: [PATCH] initial commit --- app.vue | 49 +++++ nuxt.config.ts | 6 + package.json | 27 +++ pages/index.vue | 280 +++++++++++++++++++++++++++++ pages/login.vue | 65 +++++++ pages/settings.vue | 16 ++ panel.config.ts | 21 +++ public/favicon.ico | Bin 0 -> 4286 bytes public/robots.txt | 1 + server/api/controlVM.ts | 27 +++ server/api/getCpu.ts | 16 ++ server/api/getMemory.ts | 12 ++ server/api/getNetworkInterfaces.ts | 45 +++++ server/api/getServices.ts | 30 ++++ server/api/getSettings.ts | 10 ++ server/api/getSystem.ts | 12 ++ server/api/getVMs.ts | 28 +++ server/plugins/init.ts | 7 + server/tsconfig.json | 3 + tailwind.config.js | 3 + tsconfig.json | 4 + types/VM.ts | 8 + types/networkInterface.ts | 8 + types/serviceInterface.ts | 4 + 24 files changed, 682 insertions(+) create mode 100644 app.vue create mode 100644 nuxt.config.ts create mode 100644 package.json create mode 100644 pages/index.vue create mode 100644 pages/login.vue create mode 100644 pages/settings.vue create mode 100644 panel.config.ts create mode 100644 public/favicon.ico create mode 100644 public/robots.txt create mode 100644 server/api/controlVM.ts create mode 100644 server/api/getCpu.ts create mode 100644 server/api/getMemory.ts create mode 100644 server/api/getNetworkInterfaces.ts create mode 100644 server/api/getServices.ts create mode 100644 server/api/getSettings.ts create mode 100644 server/api/getSystem.ts create mode 100644 server/api/getVMs.ts create mode 100644 server/plugins/init.ts create mode 100644 server/tsconfig.json create mode 100644 tailwind.config.js create mode 100644 tsconfig.json create mode 100644 types/VM.ts create mode 100644 types/networkInterface.ts create mode 100644 types/serviceInterface.ts diff --git a/app.vue b/app.vue new file mode 100644 index 0000000..d7203a6 --- /dev/null +++ b/app.vue @@ -0,0 +1,49 @@ + + + diff --git a/nuxt.config.ts b/nuxt.config.ts new file mode 100644 index 0000000..9a74de5 --- /dev/null +++ b/nuxt.config.ts @@ -0,0 +1,6 @@ +// https://nuxt.com/docs/api/configuration/nuxt-config +export default defineNuxtConfig({ + compatibilityDate: '2024-11-01', + devtools: { enabled: true }, + modules: ['@nuxtjs/tailwindcss'], +}) diff --git a/package.json b/package.json new file mode 100644 index 0000000..9877556 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "nuxt-app", + "private": true, + "type": "module", + "scripts": { + "build": "nuxt build", + "dev": "nuxt dev", + "generate": "nuxt generate", + "preview": "nuxt preview", + "postinstall": "nuxt prepare" + }, + "dependencies": { + "nuxt": "^3.15.4", + "vue": "latest", + "vue-router": "latest", + "@nuxtjs/tailwindcss": "^6.13.1", + "axios": "^1.7.9", + "bcryptjs": "^3.0.0", + "daisyui": "^4.12.23", + "dotenv": "^16.4.7", + "jsonwebtoken": "^9.0.2", + "systeminformation": "^5.25.11" + }, + "devDependencies": { + "@types/jsonwebtoken": "^9.0.8" + } +} diff --git a/pages/index.vue b/pages/index.vue new file mode 100644 index 0000000..fde5e6a --- /dev/null +++ b/pages/index.vue @@ -0,0 +1,280 @@ + + + + + + diff --git a/pages/login.vue b/pages/login.vue new file mode 100644 index 0000000..35329e3 --- /dev/null +++ b/pages/login.vue @@ -0,0 +1,65 @@ + + + \ No newline at end of file diff --git a/pages/settings.vue b/pages/settings.vue new file mode 100644 index 0000000..1261a7f --- /dev/null +++ b/pages/settings.vue @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/panel.config.ts b/panel.config.ts new file mode 100644 index 0000000..6e2af83 --- /dev/null +++ b/panel.config.ts @@ -0,0 +1,21 @@ +import { reactive } from "vue"; + +export const settings = reactive({ + ignoreCache: false, + enable_services: false, + enable_qemu_controls: true, + qemu_vms: [ + { + name: "Gameserver", + os: "Ubuntu 24.04" + }, + { + name: "Ubuntu_VM1", + os: "Ubuntu 24.04" + }, + ], + systemctl_services:[ + "libvirt", + "frp" + ] +}); \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..18993ad91cfd43e03b074dd0b5cc3f37ab38e49c GIT binary patch literal 4286 zcmeHLOKuuL5PjK%MHWVi6lD zOGiREbCw`xmFozJ^aNatJY>w+g ze6a2@u~m#^BZm@8wco9#Crlli0uLb^3E$t2-WIc^#(?t)*@`UpuofJ(Uyh@F>b3Ph z$D^m8Xq~pTkGJ4Q`Q2)te3mgkWYZ^Ijq|hkiP^9`De={bQQ%heZC$QU2UpP(-tbl8 zPWD2abEew;oat@w`uP3J^YpsgT%~jT(Dk%oU}sa$7|n6hBjDj`+I;RX(>)%lm_7N{+B7Mu%H?422lE%MBJH!!YTN2oT7xr>>N-8OF$C&qU^ z>vLsa{$0X%q1fjOe3P1mCv#lN{xQ4_*HCSAZjTb1`}mlc+9rl8$B3OP%VT@mch_~G z7Y+4b{r>9e=M+7vSI;BgB?ryZDY4m>&wcHSn81VH1N~`0gvwH{ z8dv#hG|OK`>1;j7tM#B)Z7zDN?{6=dUal}$e { + const body = await readBody(event); + const { action, vm } = body; + + try { + + const command = action === 'start' + ? `virsh start ${vm.name}` + : `virsh shutdown ${vm.name}`; + + await new Promise((resolve, reject) => { + exec(command, (error, stdout, stderr) => { + if (error || stderr) { + reject(`Error: ${stderr || error?.message}`); + } + resolve(stdout); + }); + }); + + return { status: 'success', message: `VM ${action} successful`, vm }; + } catch (error) { + return { status: 'error', message: `Failed to ${action} VM`, error: error }; + } +}); + diff --git a/server/api/getCpu.ts b/server/api/getCpu.ts new file mode 100644 index 0000000..c6a63de --- /dev/null +++ b/server/api/getCpu.ts @@ -0,0 +1,16 @@ +import si from 'systeminformation'; + +export default defineEventHandler(async () => { + try { + const cpuData = await si.cpu(); + const cpuTemp = await si.cpuTemperature(); + + return { + info: cpuData, // `info` is the key, `cpuData` is the value + temps: cpuTemp // `temps` is the key, `cpuTemp` is the value + }; + + } catch (error) { + console.error('Error fetching CPU info:', error); + } +}); diff --git a/server/api/getMemory.ts b/server/api/getMemory.ts new file mode 100644 index 0000000..30a61a8 --- /dev/null +++ b/server/api/getMemory.ts @@ -0,0 +1,12 @@ +import si from 'systeminformation'; + +export default defineEventHandler(async () => { + try { + const memoryData = await si.mem(); + + return memoryData; + + } catch (error) { + console.error('Error fetching CPU info:', error); + } +}); diff --git a/server/api/getNetworkInterfaces.ts b/server/api/getNetworkInterfaces.ts new file mode 100644 index 0000000..5bc1afd --- /dev/null +++ b/server/api/getNetworkInterfaces.ts @@ -0,0 +1,45 @@ +import { execSync } from 'child_process'; +import si from 'systeminformation'; +import {VM} from "~/types/VM"; +import {networkInterface} from "~/types/networkInterface"; + +export default defineEventHandler(async () => { + try { + const cpuData = await si.cpu(); + const cpuTemp = await si.cpuTemperature(); + const osInfo = await si.osInfo(); + const network = await si.networkInterfaces(); + + const interfaces: networkInterface[] = []; + if (Array.isArray(network)) { + network.forEach((interface_obj) => { + interfaces.push({ + name: interface_obj.ifaceName, + ip4: interface_obj.ip4, + ip6: interface_obj.ip6, + ip4subnet: interface_obj.ip4subnet, + ip6subnet: interface_obj.ip6subnet, + state: interface_obj.operstate as "up" | "down" | "unknown" + }) + }); + } else { + console.log(network.ifaceName + " is reachable at " + network.ip4); + interfaces.push({ + name: network.ifaceName, + ip4: network.ip4, + ip6: network.ip6, + ip4subnet: network.ip4subnet, + ip6subnet: network.ip6subnet, + state: network.operstate as "up" | "down" | "unknown" + }) + } + + interfaces.forEach(obj => { + console.log(obj.name + " is " + obj.state); + }) + return interfaces; + + } catch (error) { + console.error('Error fetching CPU info:', error); + } +}); diff --git a/server/api/getServices.ts b/server/api/getServices.ts new file mode 100644 index 0000000..bcc7b66 --- /dev/null +++ b/server/api/getServices.ts @@ -0,0 +1,30 @@ +import { execSync } from 'child_process'; +import si from 'systeminformation'; +import {VM} from "~/types/VM"; +import {serviceInterface} from "~/types/serviceInterface"; +import {settings} from "~/panel.config"; + +export default defineEventHandler(async () => { + try { + const services = await si.services(settings.systemctl_services.join(', ')); + + + const interfaces: serviceInterface[] = []; + if (Array.isArray(services)) { + console.log(`services is array`); + services.forEach((interface_obj) => { + interfaces.push({ + name: interface_obj.name, + state: interface_obj.running + }) + }); + } else { + interfaces.push(services); + } + + return interfaces; + + } catch (error) { + console.error('Error fetching CPU info:', error); + } +}); diff --git a/server/api/getSettings.ts b/server/api/getSettings.ts new file mode 100644 index 0000000..cc11079 --- /dev/null +++ b/server/api/getSettings.ts @@ -0,0 +1,10 @@ +import si from 'systeminformation'; +import {settings} from "~/panel.config"; + +export default defineEventHandler(async () => { + try { + return settings + } catch (error) { + console.error('Error fetching CPU info:', error); + } +}); diff --git a/server/api/getSystem.ts b/server/api/getSystem.ts new file mode 100644 index 0000000..2b532b0 --- /dev/null +++ b/server/api/getSystem.ts @@ -0,0 +1,12 @@ +import si from 'systeminformation'; + +export default defineEventHandler(async () => { + try { + const systemData = await si.osInfo(); + + return systemData; + + } catch (error) { + console.error('Error fetching CPU info:', error); + } +}); diff --git a/server/api/getVMs.ts b/server/api/getVMs.ts new file mode 100644 index 0000000..9ee54ba --- /dev/null +++ b/server/api/getVMs.ts @@ -0,0 +1,28 @@ + +import { execSync } from 'child_process'; +import {VM} from "~/types/VM"; +import {settings} from "~/panel.config"; + +export default defineEventHandler(() => { + + + let vmNames = ["Gameserver", "Ubuntu_VM1"] + const virtualMachines: VM[] = []; + settings.qemu_vms.forEach(vm => { + const vCpuCount = parseInt(execSync(`LANG=C virsh dominfo ${vm.name} | grep 'CPU(s)' | awk '{print $2}'`).toString().trim()); + const maxMemory = parseInt(execSync(`LANG=C virsh dominfo ${vm.name} | grep 'Max memory' | awk '{print $3}'`).toString().trim()) / 1024; + const autostartValue = execSync(`LANG=C virsh dominfo ${vm.name} | grep 'Autostart' | awk '{print $2}'`).toString().trim(); + const autostart = autostartValue === "enable"; + const stateValue = execSync(`LANG=C virsh dominfo ${vm.name} | grep 'State' | awk '{print $2, $3}'`).toString().trim(); + const state: 'on' | 'off' = stateValue === "running" ? 'on' : 'off'; + virtualMachines.push({ + name: vm.name, + os: vm.os, + vCpuCount: vCpuCount, + maxMemory: maxMemory, + autostart: autostart, + state: state + }); + }); + return virtualMachines; +}); diff --git a/server/plugins/init.ts b/server/plugins/init.ts new file mode 100644 index 0000000..e7c83cf --- /dev/null +++ b/server/plugins/init.ts @@ -0,0 +1,7 @@ +import { defineNitroPlugin } from "#imports"; + + +export default defineNitroPlugin((nitroApp) => { + console.log("Loading Server Settings"); + +}); diff --git a/server/tsconfig.json b/server/tsconfig.json new file mode 100644 index 0000000..b9ed69c --- /dev/null +++ b/server/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../.nuxt/tsconfig.server.json" +} diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..817df2e --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,3 @@ +module.exports = { + plugins: [require('daisyui')], +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..a746f2a --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,4 @@ +{ + // https://nuxt.com/docs/guide/concepts/typescript + "extends": "./.nuxt/tsconfig.json" +} diff --git a/types/VM.ts b/types/VM.ts new file mode 100644 index 0000000..ceb7d67 --- /dev/null +++ b/types/VM.ts @@ -0,0 +1,8 @@ +export interface VM { + name: string; + os: string; + vCpuCount: number; + maxMemory: number; + autostart: boolean; + state: "on" | "off"; +} diff --git a/types/networkInterface.ts b/types/networkInterface.ts new file mode 100644 index 0000000..97e8773 --- /dev/null +++ b/types/networkInterface.ts @@ -0,0 +1,8 @@ +export interface networkInterface { + name: string; + ip4: string; + ip6: string; + ip4subnet: string; + ip6subnet: string; + state: "up" | "down" | "unknown"; +} diff --git a/types/serviceInterface.ts b/types/serviceInterface.ts new file mode 100644 index 0000000..0276364 --- /dev/null +++ b/types/serviceInterface.ts @@ -0,0 +1,4 @@ +export interface serviceInterface { + name: string; + state: boolean; +}