@glassmkr/crucible 0.6.4 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/collect/network.js +30 -3
- package/dist/collect/network.js.map +1 -1
- package/dist/lib/types.d.ts +2 -0
- package/package.json +1 -1
- package/src/collect/network.ts +28 -3
- package/src/lib/types.ts +2 -0
package/dist/collect/network.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { readProcFile, sleep } from "../lib/parse.js";
|
|
2
|
-
import { readFileSync } from "fs";
|
|
2
|
+
import { readFileSync, readdirSync } from "fs";
|
|
3
3
|
const previousCounters = new Map();
|
|
4
4
|
function parseNetDev() {
|
|
5
5
|
const raw = readProcFile("/proc/net/dev") || "";
|
|
@@ -30,6 +30,28 @@ function getSpeed(iface) {
|
|
|
30
30
|
return 0;
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
+
function getOperstate(iface) {
|
|
34
|
+
try {
|
|
35
|
+
return readFileSync(`/sys/class/net/${iface}/operstate`, "utf-8").trim();
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return "unknown";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function getBondMaster(iface) {
|
|
42
|
+
try {
|
|
43
|
+
const bonds = readdirSync("/proc/net/bonding/");
|
|
44
|
+
for (const bond of bonds) {
|
|
45
|
+
const content = readFileSync(`/proc/net/bonding/${bond}`, "utf-8");
|
|
46
|
+
if (content.includes(`Slave Interface: ${iface}`))
|
|
47
|
+
return bond;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// No bonds or /proc/net/bonding doesn't exist
|
|
52
|
+
}
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
33
55
|
// Compute delta, handling counter wraps (current < previous means reset, use current as delta)
|
|
34
56
|
function delta(current, previous) {
|
|
35
57
|
if (current >= previous)
|
|
@@ -66,7 +88,7 @@ export async function collectNetwork() {
|
|
|
66
88
|
rx_drops: s2.rx_drops,
|
|
67
89
|
tx_drops: s2.tx_drops,
|
|
68
90
|
});
|
|
69
|
-
|
|
91
|
+
const entry = {
|
|
70
92
|
interface: name,
|
|
71
93
|
speed_mbps: getSpeed(name),
|
|
72
94
|
rx_bytes_sec: s2.rx_bytes - s1.rx_bytes, // already a 1-second delta
|
|
@@ -75,7 +97,12 @@ export async function collectNetwork() {
|
|
|
75
97
|
tx_errors: txErrorsDelta,
|
|
76
98
|
rx_drops: rxDropsDelta,
|
|
77
99
|
tx_drops: txDropsDelta,
|
|
78
|
-
|
|
100
|
+
operstate: getOperstate(name),
|
|
101
|
+
};
|
|
102
|
+
const master = getBondMaster(name);
|
|
103
|
+
if (master)
|
|
104
|
+
entry.bond_master = master;
|
|
105
|
+
results.push(entry);
|
|
79
106
|
}
|
|
80
107
|
// Remove stale interfaces that disappeared
|
|
81
108
|
for (const name of previousCounters.keys()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/collect/network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/collect/network.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/types.d.ts
CHANGED
package/package.json
CHANGED
package/src/collect/network.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { readProcFile, sleep } from "../lib/parse.js";
|
|
2
|
-
import { readFileSync } from "fs";
|
|
2
|
+
import { readFileSync, readdirSync } from "fs";
|
|
3
3
|
import type { NetworkInfo } from "../lib/types.js";
|
|
4
4
|
|
|
5
5
|
interface IfaceStats {
|
|
@@ -45,6 +45,27 @@ function getSpeed(iface: string): number {
|
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
+
function getOperstate(iface: string): string {
|
|
49
|
+
try {
|
|
50
|
+
return readFileSync(`/sys/class/net/${iface}/operstate`, "utf-8").trim();
|
|
51
|
+
} catch {
|
|
52
|
+
return "unknown";
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function getBondMaster(iface: string): string | undefined {
|
|
57
|
+
try {
|
|
58
|
+
const bonds = readdirSync("/proc/net/bonding/");
|
|
59
|
+
for (const bond of bonds) {
|
|
60
|
+
const content = readFileSync(`/proc/net/bonding/${bond}`, "utf-8");
|
|
61
|
+
if (content.includes(`Slave Interface: ${iface}`)) return bond;
|
|
62
|
+
}
|
|
63
|
+
} catch {
|
|
64
|
+
// No bonds or /proc/net/bonding doesn't exist
|
|
65
|
+
}
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
|
|
48
69
|
// Compute delta, handling counter wraps (current < previous means reset, use current as delta)
|
|
49
70
|
function delta(current: number, previous: number): number {
|
|
50
71
|
if (current >= previous) return current - previous;
|
|
@@ -87,7 +108,7 @@ export async function collectNetwork(): Promise<NetworkInfo[]> {
|
|
|
87
108
|
tx_drops: s2.tx_drops,
|
|
88
109
|
});
|
|
89
110
|
|
|
90
|
-
|
|
111
|
+
const entry: NetworkInfo = {
|
|
91
112
|
interface: name,
|
|
92
113
|
speed_mbps: getSpeed(name),
|
|
93
114
|
rx_bytes_sec: s2.rx_bytes - s1.rx_bytes, // already a 1-second delta
|
|
@@ -96,7 +117,11 @@ export async function collectNetwork(): Promise<NetworkInfo[]> {
|
|
|
96
117
|
tx_errors: txErrorsDelta,
|
|
97
118
|
rx_drops: rxDropsDelta,
|
|
98
119
|
tx_drops: txDropsDelta,
|
|
99
|
-
|
|
120
|
+
operstate: getOperstate(name),
|
|
121
|
+
};
|
|
122
|
+
const master = getBondMaster(name);
|
|
123
|
+
if (master) entry.bond_master = master;
|
|
124
|
+
results.push(entry);
|
|
100
125
|
}
|
|
101
126
|
|
|
102
127
|
// Remove stale interfaces that disappeared
|
package/src/lib/types.ts
CHANGED
|
@@ -143,6 +143,8 @@ export interface NetworkInfo {
|
|
|
143
143
|
tx_errors: number;
|
|
144
144
|
rx_drops: number;
|
|
145
145
|
tx_drops: number;
|
|
146
|
+
operstate?: string; // "up", "down", "unknown", etc. from /sys/class/net/{iface}/operstate
|
|
147
|
+
bond_master?: string; // if this interface is a bond slave, the bond name
|
|
146
148
|
}
|
|
147
149
|
|
|
148
150
|
export interface RaidInfo {
|