CH-J ToolsSerververwaltung über SSH
Menü
Veröffentlichte Quellen

CH-J Tools

Durchsuchen Sie Verzeichnisse und Dateien einer bestimmten Anwendungsausgabe.

Quellen als ZIP herunterladen
CH-J / Server Manager 406 Dateien
core-20261024T135205Z-7c487d719de2 Hinzugefügt: · Erstellt:
inspectFixture.js Hinzugefügt: Datum nicht erfasst 6,6 KB · 72 Zeilen
Code Datei herunterladen
1"use strict";
3// Builds synthetic remoteDisks.sh "inspect" output for chj.disks unit tests (no real server data).
4const SECTION = (name) => `\x1eCHJ_SECTION=${name}\n`;
5const ALL_TOOLS = ["lsblk", "blkid", "findmnt", "sfdisk", "partx", "blockdev", "udevadm", "wipefs", "e2fsck", "resize2fs", "dumpe2fs", "e2label", "mkfs.ext4", "xfs_growfs", "xfs_repair", "xfs_admin", "xfs_info", "mkfs.xfs", "btrfs", "mkfs.btrfs", "fsck.vfat", "fatlabel", "mkfs.vfat", "ntfsresize", "ntfslabel", "mkfs.ntfs", "mkswap", "swaplabel", "pvs", "vgs", "lvs", "pvresize", "lvextend", "lvreduce", "cryptsetup", "systemd-run", "setsid", "base64", "sha256sum", "mount", "umount"];
7function inspectOutput(spec = {}) {
8 const uid = spec.uid ?? 0;
9 const tools = (spec.tools || ALL_TOOLS).filter((tool) => !(spec.withoutTools || []).includes(tool));
10 const sys = []; const blkid = []; const mountinfo = []; const df = []; const pt = []; const fsinfo = [];
11 let minor = 0;
12 const devno = (major) => `${major}:${minor++}`;
13 const nodes = [];
14 for (const disk of spec.disks || []) {
15 const lbs = disk.lbs || 512;
16 const holdersOfDisk = disk.holders || [];
17 nodes.push({ name: disk.name, devno: devno(8), sectors512: disk.sectors * lbs / 512, part: "-", start: "-", parent: "-", rota: disk.rota ?? 0, lbs, model: disk.model ?? "QEMU HARDDISK", vendor: disk.vendor ?? "QEMU", holders: holdersOfDisk, slaves: [], sysPath: `/sys/devices/pci0000:00/virtio2/block/${disk.name}`, fs: disk.fs, mount: disk.mount, used: disk.used, backing: disk.backing });
18 const parts = disk.partitions || [];
19 if (disk.table) {
20 const json = { partitiontable: { label: disk.table, id: "TEST-ID", device: `/dev/${disk.name}`, unit: "sectors", firstlba: disk.table === "gpt" ? 2048 : undefined, lastlba: disk.table === "gpt" ? disk.lastlba ?? disk.sectors - 34 : undefined, sectorsize: lbs, partitions: parts.map((part) => ({ node: `/dev/${disk.name}${/\d$/.test(disk.name) ? "p" : ""}${part.n}`, start: part.start, size: part.size, type: part.type || (disk.table === "gpt" ? "0FC63DAF-8483-4772-8E79-3D69D8477DE4" : "83"), uuid: `PART-${part.n}`, name: part.name, attrs: part.attrs, bootable: part.bootable })) } };
21 pt.push(`@@disk ${disk.name} ${disk.hash || "a".repeat(64)}`, JSON.stringify(json, null, 2), "@@end");
22 }
23 for (const part of parts) {
24 const name = `${disk.name}${/\d$/.test(disk.name) ? "p" : ""}${part.n}`;
25 nodes.push({ name, devno: devno(8), sectors512: (part.kernelSize ?? part.size) * lbs / 512, part: part.n, start: part.start * lbs / 512, parent: disk.name, rota: 0, lbs, model: "", vendor: "", holders: part.holders || [], slaves: [], sysPath: `/sys/devices/virtio2/block/${disk.name}/${name}`, fs: part.fs, mount: part.mount, used: part.used, label: part.label, swap: part.swap, fsSize: part.fsSize });
26 }
27 }
28 for (const dm of spec.dm || []) nodes.push({ name: dm.name, devno: devno(253), sectors512: dm.bytes / 512, part: "-", start: "-", parent: "-", rota: 0, lbs: 512, model: "", vendor: "", holders: dm.holders || [], slaves: dm.slaves || [], dmName: dm.dmName, dmUuid: dm.dmUuid, sysPath: `/sys/devices/virtual/block/${dm.name}`, fs: dm.fs, mount: dm.mount, used: dm.used, fsSize: dm.fsSize });
29 for (const node of nodes) {
30 sys.push([node.name, node.devno, node.sectors512, 0, 0, node.part, node.start, node.parent, node.rota, node.lbs, node.lbs, node.model, node.vendor, "", "", node.holders.join(",") + (node.holders.length ? "," : ""), node.slaves.join(",") + (node.slaves.length ? "," : ""), node.dmName || "", node.dmUuid || "", node.backing || "", "", node.sysPath, 0].join("|"));
31 const path = node.dmName ? `/dev/mapper/${node.dmName}` : `/dev/${node.name}`;
32 if (node.fs) blkid.push([`DEVNAME=${path}`, `TYPE=${node.fs}`, `UUID=uuid-${node.name}`, node.label ? `LABEL=${node.label}` : ""].filter(Boolean).join("\n"));
33 if (node.mount) {
34 mountinfo.push(`${20 + nodes.indexOf(node)} 1 ${node.devno} / ${node.mount} rw,relatime - ${node.fs} ${path} rw`);
35 const total = Math.floor((node.fsSize ?? node.sectors512 * 512) / 1024);
36 const used = Math.floor((node.used ?? 0) / 1024);
37 df.push(`${path} ${total} ${used} ${total - used} ${Math.round(used / Math.max(1, total) * 100)}% ${node.mount}`);
38 }
39 if (node.fs && /^ext/.test(node.fs) && (node.fsSize || node.used !== undefined)) {
40 const blocks = Math.floor((node.fsSize ?? node.sectors512 * 512) / 4096);
41 fsinfo.push(`@@fs ${path} ${node.fs}`, `Block count: ${blocks}`, `Block size: 4096`, `Free blocks: ${blocks - Math.ceil((node.used ?? 0) / 4096)}`, "Filesystem state: clean");
42 }
43 if (node.fs === "xfs" && node.fsSize) fsinfo.push(`@@fs ${path} xfs`, `data = bsize=4096 blocks=${Math.floor(node.fsSize / 4096)}, imaxpct=25`);
44 }
45 const swaps = ["Filename Type Size Used Priority", ...nodes.filter((node) => node.swap).map((node) => `/dev/${node.name} partition ${node.sectors512 / 2} 0 -2`)];
46 let out = "\x1eCHJ_READY\n";
47 out += SECTION("meta") + `uid=${uid}\nos=Test Linux\nosId=test\nkernel=6.8.0\nsystemd=1\npve=${spec.pve ? 1 : 0}\nmountinfo=1\ntime=1\n`;
48 out += SECTION("tools") + tools.map((tool) => `${tool}=/usr/sbin/${tool}`).join("\n") + "\n";
49 out += SECTION("versions") + "util-linux=sfdisk from util-linux 2.39.3\n";
50 out += SECTION("sysblock") + sys.join("\n") + "\n";
51 out += SECTION("lsblk") + JSON.stringify({ blockdevices: (spec.disks || []).map((disk) => ({ name: disk.name, kname: disk.name, pttype: disk.table || null })) }) + "\n";
52 out += SECTION("blkid") + blkid.join("\n\n") + "\n";
53 out += SECTION("mountinfo") + mountinfo.join("\n") + "\n";
54 out += SECTION("df") + ["Filesystem 1024-blocks Used Available Capacity Mounted on", ...df].join("\n") + "\n";
55 out += SECTION("swaps") + swaps.join("\n") + "\n";
56 out += SECTION("mdstat") + "\n";
57 if (uid === 0) {
58 out += SECTION("pt") + pt.join("\n") + "\n";
59 if (spec.lvm) {
60 const report = (key, rows) => JSON.stringify({ report: [{ [key]: rows }] });
61 out += SECTION("lvm") + `@@pvs\n${report("pv", spec.lvm.pvs || [])}\n@@vgs\n${report("vg", spec.lvm.vgs || [])}\n@@lvs\n${report("lv", spec.lvm.lvs || [])}\n`;
62 }
63 if (spec.crypt) out += SECTION("crypt") + Object.entries(spec.crypt).map(([name, status]) => `@@map ${name}\ntype: ${status.type || "LUKS2"}\ncipher: aes-xts-plain64\nkey location: ${status.keyLocation}\ndevice: ${status.device}\n`).join("");
64 out += SECTION("fsinfo") + fsinfo.join("\n") + "\n";
65 }
66 return out;
69const GiB = 1024 ** 3; const MiB = 1024 ** 2;
70const sectors = (bytes) => bytes / 512;
72module.exports = { ALL_TOOLS, GiB, MiB, inspectOutput, sectors };
SHA-2560830a2b457730960568ab144e67862f64bbe7aff84d0e22e9ebce92d5496e4f8

CH-J Proprietary Software License 1.14 · Die Quellen werden unter der CH-J Proprietary Software License 1.14 bereitgestellt. Ihre Verfügbarkeit ändert die Lizenzbedingungen nicht und gewährt keine zusätzlichen Rechte.

SHA-256 des Archivs476ed8aef0f1e96a5acdf223127b6692acdf4492eeaf5d0816b6e2a634fbbda6
Dateien