Veröffentlichte Quellen
Quellen als ZIP herunterladen
CH-J Tools
Durchsuchen Sie Verzeichnisse und Dateien einer bestimmten Anwendungsausgabe.
CH-J / Server Manager
406 Dateien
core-20261024T135205Z-7c487d719de2
Hinzugefügt: · Erstellt:
1
"use strict";3
// Builds synthetic remoteDisks.sh "inspect" output for chj.disks unit tests (no real server data).4
const SECTION = (name) => `\x1eCHJ_SECTION=${name}\n`;5
const 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"];7
function 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;67
}69
const GiB = 1024 ** 3; const MiB = 1024 ** 2;70
const sectors = (bytes) => bytes / 512;72
module.exports = { ALL_TOOLS, GiB, MiB, inspectOutput, sectors };SHA-256
0830a2b457730960568ab144e67862f64bbe7aff84d0e22e9ebce92d5496e4f8CH-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 Archivs
476ed8aef0f1e96a5acdf223127b6692acdf4492eeaf5d0816b6e2a634fbbda6