@factiii/stack 0.1.189 → 0.1.191
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/LICENSE +21 -21
- package/README.md +403 -441
- package/bin/stack +333 -300
- package/dist/cli/dev-sync.js +16 -16
- package/dist/cli/secrets.d.ts +6 -1
- package/dist/cli/secrets.d.ts.map +1 -1
- package/dist/cli/secrets.js +228 -0
- package/dist/cli/secrets.js.map +1 -1
- package/dist/plugins/addons/auth/index.js +7 -7
- package/dist/plugins/addons/dns/index.d.ts +47 -0
- package/dist/plugins/addons/dns/index.d.ts.map +1 -0
- package/dist/plugins/addons/dns/index.js +104 -0
- package/dist/plugins/addons/dns/index.js.map +1 -0
- package/dist/plugins/addons/dns/scanfix/dev.d.ts +13 -0
- package/dist/plugins/addons/dns/scanfix/dev.d.ts.map +1 -0
- package/dist/plugins/addons/dns/scanfix/dev.js +235 -0
- package/dist/plugins/addons/dns/scanfix/dev.js.map +1 -0
- package/dist/plugins/addons/server-mode/index.d.ts.map +1 -1
- package/dist/plugins/addons/server-mode/index.js +6 -0
- package/dist/plugins/addons/server-mode/index.js.map +1 -1
- package/dist/plugins/addons/server-mode/scanfix/env-marker.d.ts +17 -0
- package/dist/plugins/addons/server-mode/scanfix/env-marker.d.ts.map +1 -0
- package/dist/plugins/addons/server-mode/scanfix/env-marker.js +195 -0
- package/dist/plugins/addons/server-mode/scanfix/env-marker.js.map +1 -0
- package/dist/plugins/addons/server-mode/scanfix/tailscale.d.ts +16 -0
- package/dist/plugins/addons/server-mode/scanfix/tailscale.d.ts.map +1 -0
- package/dist/plugins/addons/server-mode/scanfix/tailscale.js +211 -0
- package/dist/plugins/addons/server-mode/scanfix/tailscale.js.map +1 -0
- package/dist/plugins/addons/vercel/index.js +9 -9
- package/dist/plugins/addons/vercel/scanfix/config.js +10 -10
- package/dist/plugins/addons/vercel/scanfix/token.js +15 -15
- package/dist/plugins/approved.json +13 -13
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +8 -0
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/pipelines/aws/index.js +12 -12
- package/dist/plugins/pipelines/aws/policies/bootstrap-policy.json +135 -135
- package/dist/plugins/pipelines/aws/prod.js +1 -1
- package/dist/plugins/pipelines/factiii/prod.d.ts +1 -1
- package/dist/plugins/pipelines/factiii/prod.d.ts.map +1 -1
- package/dist/plugins/pipelines/factiii/prod.js +66 -25
- package/dist/plugins/pipelines/factiii/prod.js.map +1 -1
- package/dist/plugins/pipelines/factiii/scanfix/start-sh.d.ts.map +1 -1
- package/dist/plugins/pipelines/factiii/scanfix/start-sh.js +3 -11
- package/dist/plugins/pipelines/factiii/scanfix/start-sh.js.map +1 -1
- package/dist/plugins/pipelines/factiii/staging.js +23 -23
- package/dist/plugins/pipelines/factiii/workflows/stack-ci.yml +75 -75
- package/dist/plugins/pipelines/factiii/workflows/stack-cicd-prod.yml +73 -73
- package/dist/plugins/servers/amazon-linux/index.js +16 -16
- package/dist/plugins/servers/mac/index.js +12 -12
- package/dist/plugins/servers/mac/staging.js +2 -2
- package/dist/plugins/servers/ubuntu/index.js +23 -23
- package/dist/plugins/servers/windows/index.js +15 -15
- package/dist/scripts/generate-all.js +73 -73
- package/dist/utils/ansible-vault-secrets.d.ts +8 -0
- package/dist/utils/ansible-vault-secrets.d.ts.map +1 -1
- package/dist/utils/ansible-vault-secrets.js +54 -0
- package/dist/utils/ansible-vault-secrets.js.map +1 -1
- package/dist/utils/deployment-report.js +2 -2
- package/dist/utils/secret-prompts.js +34 -34
- package/dist/utils/ssh-helper.d.ts.map +1 -1
- package/dist/utils/ssh-helper.js +25 -5
- package/dist/utils/ssh-helper.js.map +1 -1
- package/dist/utils/template-generator.js +74 -74
- package/package.json +100 -100
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DNS Dev Stage Fixes
|
|
4
|
+
*
|
|
5
|
+
* Checks that domains configured in stack.yml resolve to the expected targets.
|
|
6
|
+
* Does NOT call any DNS provider API — just does local DNS lookups and compares
|
|
7
|
+
* against the expected values cached in stackAuto.yml.
|
|
8
|
+
*
|
|
9
|
+
* If a mismatch is found, tells the user to update their DNS provider manually.
|
|
10
|
+
* The fix function offers to acknowledge the warning so it stops appearing.
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
45
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
46
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
47
|
+
};
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.dnsFixes = void 0;
|
|
50
|
+
const dns = __importStar(require("dns"));
|
|
51
|
+
const fs = __importStar(require("fs"));
|
|
52
|
+
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
53
|
+
const config_files_js_1 = require("../../../../constants/config-files.js");
|
|
54
|
+
const dnsPromises = dns.promises;
|
|
55
|
+
// ============================================================
|
|
56
|
+
// Helpers
|
|
57
|
+
// ============================================================
|
|
58
|
+
/**
|
|
59
|
+
* Build the FQDN from the environment domain + record host label.
|
|
60
|
+
* e.g. domain="dev.example.com", host="api" => "api.dev.example.com"
|
|
61
|
+
* domain="dev.example.com", host="" => "dev.example.com"
|
|
62
|
+
*/
|
|
63
|
+
function buildFqdn(domain, host) {
|
|
64
|
+
if (!host || host === '@')
|
|
65
|
+
return domain;
|
|
66
|
+
return host + '.' + domain;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Resolve a hostname and return what it points to (CNAME chain or A record).
|
|
70
|
+
*/
|
|
71
|
+
async function resolveTarget(fqdn) {
|
|
72
|
+
// Try CNAME first
|
|
73
|
+
try {
|
|
74
|
+
const cnames = await dnsPromises.resolveCname(fqdn);
|
|
75
|
+
if (cnames.length > 0)
|
|
76
|
+
return cnames[0] ?? null;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Not a CNAME, try A record
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const addresses = await dnsPromises.resolve4(fqdn);
|
|
83
|
+
if (addresses.length > 0)
|
|
84
|
+
return addresses[0] ?? null;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// No A record either
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Read the dns section from stackAuto.yml
|
|
93
|
+
*/
|
|
94
|
+
function readDnsAuto(rootDir) {
|
|
95
|
+
try {
|
|
96
|
+
const autoPath = (0, config_files_js_1.getStackAutoPath)(rootDir);
|
|
97
|
+
if (!fs.existsSync(autoPath))
|
|
98
|
+
return {};
|
|
99
|
+
const content = fs.readFileSync(autoPath, 'utf8');
|
|
100
|
+
return js_yaml_1.default.load(content) || {};
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return {};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check if a specific record has been acknowledged in stackAuto.yml
|
|
108
|
+
*/
|
|
109
|
+
function isAcknowledged(rootDir, fqdn) {
|
|
110
|
+
const auto = readDnsAuto(rootDir);
|
|
111
|
+
if (!auto.dns?.records)
|
|
112
|
+
return false;
|
|
113
|
+
return auto.dns.records.some(r => buildFqdn('', r.host) === fqdn && r.acknowledged === true);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Write acknowledgement for a record into stackAuto.yml
|
|
117
|
+
*/
|
|
118
|
+
function acknowledgeRecord(rootDir, fqdn, target) {
|
|
119
|
+
const autoPath = (0, config_files_js_1.getStackAutoPath)(rootDir);
|
|
120
|
+
let autoConfig = {};
|
|
121
|
+
try {
|
|
122
|
+
if (fs.existsSync(autoPath)) {
|
|
123
|
+
autoConfig = js_yaml_1.default.load(fs.readFileSync(autoPath, 'utf8')) || {};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
autoConfig = {};
|
|
128
|
+
}
|
|
129
|
+
// Ensure dns.records array exists
|
|
130
|
+
if (!autoConfig.dns || typeof autoConfig.dns !== 'object') {
|
|
131
|
+
autoConfig.dns = { records: [] };
|
|
132
|
+
}
|
|
133
|
+
const dnsSection = autoConfig.dns;
|
|
134
|
+
if (!dnsSection.records) {
|
|
135
|
+
dnsSection.records = [];
|
|
136
|
+
}
|
|
137
|
+
// Update or add the record
|
|
138
|
+
const existing = dnsSection.records.find(r => r.fqdn === fqdn);
|
|
139
|
+
if (existing) {
|
|
140
|
+
existing.target = target;
|
|
141
|
+
existing.acknowledged = true;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
dnsSection.records.push({ fqdn, target, acknowledged: true });
|
|
145
|
+
}
|
|
146
|
+
fs.writeFileSync(autoPath, js_yaml_1.default.dump(autoConfig, { lineWidth: -1, noRefs: true }));
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get DNS records from the dev environment's plugins.dns config
|
|
150
|
+
*/
|
|
151
|
+
function getDnsRecords(config) {
|
|
152
|
+
// Look for dev environment
|
|
153
|
+
const dev = config.dev;
|
|
154
|
+
if (!dev?.domain)
|
|
155
|
+
return null;
|
|
156
|
+
const dnsPlugin = dev.plugins?.dns;
|
|
157
|
+
if (!dnsPlugin?.records || dnsPlugin.records.length === 0)
|
|
158
|
+
return null;
|
|
159
|
+
return { domain: dev.domain, records: dnsPlugin.records };
|
|
160
|
+
}
|
|
161
|
+
// ============================================================
|
|
162
|
+
// Fixes
|
|
163
|
+
// ============================================================
|
|
164
|
+
exports.dnsFixes = [];
|
|
165
|
+
// Single dev-stage fix that checks all configured DNS records
|
|
166
|
+
exports.dnsFixes.push({
|
|
167
|
+
id: 'dns-records-dev',
|
|
168
|
+
stage: 'dev',
|
|
169
|
+
severity: 'warning',
|
|
170
|
+
description: 'DNS records not pointing to expected targets',
|
|
171
|
+
plugin: 'dns',
|
|
172
|
+
scan: async (config, rootDir) => {
|
|
173
|
+
const dnsConfig = getDnsRecords(config);
|
|
174
|
+
if (!dnsConfig)
|
|
175
|
+
return false; // No DNS config = nothing to check
|
|
176
|
+
const { domain, records } = dnsConfig;
|
|
177
|
+
for (const record of records) {
|
|
178
|
+
const fqdn = buildFqdn(domain, record.host);
|
|
179
|
+
// Skip if user already acknowledged this warning
|
|
180
|
+
const auto = readDnsAuto(rootDir);
|
|
181
|
+
const autoRecord = auto.dns?.records?.find((r) => (r.fqdn === fqdn || buildFqdn(domain, r.host || '') === fqdn) &&
|
|
182
|
+
r.target === record.target &&
|
|
183
|
+
r.acknowledged === true);
|
|
184
|
+
if (autoRecord)
|
|
185
|
+
continue;
|
|
186
|
+
// Do DNS lookup
|
|
187
|
+
const resolved = await resolveTarget(fqdn);
|
|
188
|
+
if (!resolved) {
|
|
189
|
+
console.log(' ⚠️ ' + fqdn + ' does not resolve (expected: ' + record.target + ')');
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
// Normalize trailing dots for comparison
|
|
193
|
+
const normalizedResolved = resolved.replace(/\.$/, '');
|
|
194
|
+
const normalizedTarget = record.target.replace(/\.$/, '');
|
|
195
|
+
if (normalizedResolved !== normalizedTarget) {
|
|
196
|
+
console.log(' ⚠️ ' + fqdn + ' points to ' + resolved + ' (expected: ' + record.target + ')');
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return false; // All records match or are acknowledged
|
|
201
|
+
},
|
|
202
|
+
fix: async (config, rootDir) => {
|
|
203
|
+
const dnsConfig = getDnsRecords(config);
|
|
204
|
+
if (!dnsConfig)
|
|
205
|
+
return false;
|
|
206
|
+
const { domain, records } = dnsConfig;
|
|
207
|
+
let hasIssues = false;
|
|
208
|
+
for (const record of records) {
|
|
209
|
+
const fqdn = buildFqdn(domain, record.host);
|
|
210
|
+
const resolved = await resolveTarget(fqdn);
|
|
211
|
+
const normalizedResolved = resolved?.replace(/\.$/, '') || '';
|
|
212
|
+
const normalizedTarget = record.target.replace(/\.$/, '');
|
|
213
|
+
if (normalizedResolved !== normalizedTarget) {
|
|
214
|
+
hasIssues = true;
|
|
215
|
+
if (!resolved) {
|
|
216
|
+
console.log(' ⚠️ ' + fqdn + ' does not resolve');
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
console.log(' ⚠️ ' + fqdn + ' → ' + resolved + ' (expected: ' + record.target + ')');
|
|
220
|
+
}
|
|
221
|
+
console.log(' Update this DNS record at your DNS provider (Dynu, Cloudflare, etc.)');
|
|
222
|
+
console.log('');
|
|
223
|
+
// Acknowledge so it doesn't keep warning
|
|
224
|
+
acknowledgeRecord(rootDir, fqdn, record.target);
|
|
225
|
+
console.log(' ✅ Warning acknowledged — will re-check if target changes in stack.yml');
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (!hasIssues) {
|
|
229
|
+
console.log(' ✅ All DNS records are correct');
|
|
230
|
+
}
|
|
231
|
+
return true;
|
|
232
|
+
},
|
|
233
|
+
manualFix: 'Update DNS records at your DNS provider to match the targets in stack.yml dev.plugins.dns.records',
|
|
234
|
+
});
|
|
235
|
+
//# sourceMappingURL=dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../../../src/plugins/addons/dns/scanfix/dev.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/addons/server-mode/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,GAAG,EACH,QAAQ,EACT,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/addons/server-mode/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,GAAG,EACH,QAAQ,EACT,MAAM,yBAAyB,CAAC;AAUjC,cAAM,eAAe;IAKnB,MAAM,CAAC,QAAQ,CAAC,EAAE,iBAAiB;IACnC,MAAM,CAAC,QAAQ,CAAC,IAAI,iBAAiB;IACrC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAW;IAC5C,MAAM,CAAC,QAAQ,CAAC,OAAO,WAAW;IAGlC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,CAAM;IAG/C,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEnD;IAGF,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;IAE9D;;;OAGG;WACU,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBlF,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,CAa1B;IAMF;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,QAAQ,GAAG,GAAG,EAAE;IAYzC,OAAO,CAAC,OAAO,CAAgB;gBAEnB,MAAM,EAAE,aAAa;CAGlC;AAED,eAAe,eAAe,CAAC"}
|
|
@@ -67,7 +67,9 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
67
67
|
})();
|
|
68
68
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
69
69
|
// Import OS-specific scanfix arrays
|
|
70
|
+
const env_marker_js_1 = require("./scanfix/env-marker.js");
|
|
70
71
|
const mac_js_1 = require("./scanfix/mac.js");
|
|
72
|
+
const tailscale_js_1 = require("./scanfix/tailscale.js");
|
|
71
73
|
const ubuntu_js_1 = require("./scanfix/ubuntu.js");
|
|
72
74
|
const windows_js_1 = require("./scanfix/windows.js");
|
|
73
75
|
const tart_js_1 = require("./scanfix/tart.js");
|
|
@@ -105,6 +107,10 @@ class ServerModeAddon {
|
|
|
105
107
|
static fixes = [
|
|
106
108
|
// Mac fixes
|
|
107
109
|
...mac_js_1.macFixes,
|
|
110
|
+
// Environment markers (all servers)
|
|
111
|
+
...env_marker_js_1.envMarkerFixes,
|
|
112
|
+
// Tailscale (Mac + Ubuntu)
|
|
113
|
+
...tailscale_js_1.tailscaleFixes,
|
|
108
114
|
// Ubuntu fixes
|
|
109
115
|
...ubuntu_js_1.ubuntuFixes,
|
|
110
116
|
// Windows fixes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/addons/server-mode/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQH,oCAAoC;AACpC,6CAA4C;AAC5C,mDAAkD;AAClD,qDAAoD;AACpD,+CAA8C;AAE9C,MAAM,eAAe;IACnB,+DAA+D;IAC/D,kBAAkB;IAClB,+DAA+D;IAE/D,MAAM,CAAU,EAAE,GAAG,aAAa,CAAC;IACnC,MAAM,CAAU,IAAI,GAAG,aAAa,CAAC;IACrC,MAAM,CAAU,QAAQ,GAAY,OAAO,CAAC;IAC5C,MAAM,CAAU,OAAO,GAAG,OAAO,CAAC;IAElC,+BAA+B;IAC/B,MAAM,CAAU,eAAe,GAAa,EAAE,CAAC;IAE/C,uCAAuC;IACvC,MAAM,CAAU,YAAY,GAA4B;IACtD,8DAA8D;KAC/D,CAAC;IAEF,6CAA6C;IAC7C,MAAM,CAAU,gBAAgB,GAA2B,EAAE,CAAC;IAE9D;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,MAAqB;QAC7D,MAAM,EAAE,mBAAmB,EAAE,GAAG,wDAAa,kCAAkC,GAAC,CAAC;QACjF,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAEjD,mDAAmD;QACnD,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC5C,GAAG,CAAC,WAAW,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CACxD,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,uDAAuD;IACvD,+DAA+D;IAC/D,kDAAkD;IAClD,+DAA+D;IAE/D,MAAM,CAAU,KAAK,GAAU;QAC7B,YAAY;QACZ,GAAG,iBAAQ;QACX,eAAe;QACf,GAAG,uBAAW;QACd,gBAAgB;QAChB,GAAG,yBAAY;QACf,+BAA+B;QAC/B,GAAG,mBAAS;KACb,CAAC;IAEF,+DAA+D;IAC/D,iBAAiB;IACjB,+DAA+D;IAE/D;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,EAAY;QAC/B,OAAO,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACxC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC,CAAC,gCAAgC;YAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACtD,OAAO,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,+DAA+D;IAC/D,mBAAmB;IACnB,+DAA+D;IAEvD,OAAO,CAAgB;IAE/B,YAAY,MAAqB;QAC/B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;;AAGH,kBAAe,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/addons/server-mode/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQH,oCAAoC;AACpC,2DAAyD;AACzD,6CAA4C;AAC5C,yDAAwD;AACxD,mDAAkD;AAClD,qDAAoD;AACpD,+CAA8C;AAE9C,MAAM,eAAe;IACnB,+DAA+D;IAC/D,kBAAkB;IAClB,+DAA+D;IAE/D,MAAM,CAAU,EAAE,GAAG,aAAa,CAAC;IACnC,MAAM,CAAU,IAAI,GAAG,aAAa,CAAC;IACrC,MAAM,CAAU,QAAQ,GAAY,OAAO,CAAC;IAC5C,MAAM,CAAU,OAAO,GAAG,OAAO,CAAC;IAElC,+BAA+B;IAC/B,MAAM,CAAU,eAAe,GAAa,EAAE,CAAC;IAE/C,uCAAuC;IACvC,MAAM,CAAU,YAAY,GAA4B;IACtD,8DAA8D;KAC/D,CAAC;IAEF,6CAA6C;IAC7C,MAAM,CAAU,gBAAgB,GAA2B,EAAE,CAAC;IAE9D;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,MAAqB;QAC7D,MAAM,EAAE,mBAAmB,EAAE,GAAG,wDAAa,kCAAkC,GAAC,CAAC;QACjF,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAEjD,mDAAmD;QACnD,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC5C,GAAG,CAAC,WAAW,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CACxD,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,uDAAuD;IACvD,+DAA+D;IAC/D,kDAAkD;IAClD,+DAA+D;IAE/D,MAAM,CAAU,KAAK,GAAU;QAC7B,YAAY;QACZ,GAAG,iBAAQ;QACX,oCAAoC;QACpC,GAAG,8BAAc;QACjB,2BAA2B;QAC3B,GAAG,6BAAc;QACjB,eAAe;QACf,GAAG,uBAAW;QACd,gBAAgB;QAChB,GAAG,yBAAY;QACf,+BAA+B;QAC/B,GAAG,mBAAS;KACb,CAAC;IAEF,+DAA+D;IAC/D,iBAAiB;IACjB,+DAA+D;IAE/D;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,EAAY;QAC/B,OAAO,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACxC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC,CAAC,gCAAgC;YAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACtD,OAAO,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,+DAA+D;IAC/D,mBAAmB;IACnB,+DAA+D;IAEvD,OAAO,CAAgB;IAE/B,YAAY,MAAqB;QAC/B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;;AAGH,kBAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Marker Scanfix
|
|
3
|
+
*
|
|
4
|
+
* Writes /etc/factiii/environment on servers so you can identify
|
|
5
|
+
* which environment you're on when SSH'd in.
|
|
6
|
+
*
|
|
7
|
+
* Usage after setup:
|
|
8
|
+
* cat /etc/factiii/environment → "staging" or "prod"
|
|
9
|
+
* factiii-env → prints environment name
|
|
10
|
+
*
|
|
11
|
+
* Also sets PS1 prompt coloring:
|
|
12
|
+
* staging = yellow prompt
|
|
13
|
+
* prod = red prompt
|
|
14
|
+
*/
|
|
15
|
+
import type { Fix } from '../../../../types/index.js';
|
|
16
|
+
export declare const envMarkerFixes: Fix[];
|
|
17
|
+
//# sourceMappingURL=env-marker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-marker.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/addons/server-mode/scanfix/env-marker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,GAAG,EAAiB,MAAM,4BAA4B,CAAC;AAqFrE,eAAO,MAAM,cAAc,EAAE,GAAG,EAkE/B,CAAC"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Environment Marker Scanfix
|
|
4
|
+
*
|
|
5
|
+
* Writes /etc/factiii/environment on servers so you can identify
|
|
6
|
+
* which environment you're on when SSH'd in.
|
|
7
|
+
*
|
|
8
|
+
* Usage after setup:
|
|
9
|
+
* cat /etc/factiii/environment → "staging" or "prod"
|
|
10
|
+
* factiii-env → prints environment name
|
|
11
|
+
*
|
|
12
|
+
* Also sets PS1 prompt coloring:
|
|
13
|
+
* staging = yellow prompt
|
|
14
|
+
* prod = red prompt
|
|
15
|
+
*/
|
|
16
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
+
}) : function(o, v) {
|
|
30
|
+
o["default"] = v;
|
|
31
|
+
});
|
|
32
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
33
|
+
var ownKeys = function(o) {
|
|
34
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
35
|
+
var ar = [];
|
|
36
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
37
|
+
return ar;
|
|
38
|
+
};
|
|
39
|
+
return ownKeys(o);
|
|
40
|
+
};
|
|
41
|
+
return function (mod) {
|
|
42
|
+
if (mod && mod.__esModule) return mod;
|
|
43
|
+
var result = {};
|
|
44
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
45
|
+
__setModuleDefault(result, mod);
|
|
46
|
+
return result;
|
|
47
|
+
};
|
|
48
|
+
})();
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.envMarkerFixes = void 0;
|
|
51
|
+
const child_process_1 = require("child_process");
|
|
52
|
+
const fs = __importStar(require("fs"));
|
|
53
|
+
const MARKER_PATH = '/etc/factiii/environment';
|
|
54
|
+
const PROFILE_MARKER = '# factiii-env-prompt';
|
|
55
|
+
function getCurrentMarker() {
|
|
56
|
+
try {
|
|
57
|
+
return fs.readFileSync(MARKER_PATH, 'utf8').trim();
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Try via sudo (file may be root-owned)
|
|
61
|
+
try {
|
|
62
|
+
return (0, child_process_1.execSync)('sudo cat ' + MARKER_PATH + ' 2>/dev/null', {
|
|
63
|
+
encoding: 'utf8',
|
|
64
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
65
|
+
}).trim();
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function hasPromptMarker() {
|
|
73
|
+
try {
|
|
74
|
+
const profilePaths = [
|
|
75
|
+
process.env.HOME + '/.bashrc',
|
|
76
|
+
process.env.HOME + '/.zshrc',
|
|
77
|
+
];
|
|
78
|
+
for (const p of profilePaths) {
|
|
79
|
+
try {
|
|
80
|
+
const content = fs.readFileSync(p, 'utf8');
|
|
81
|
+
if (content.includes(PROFILE_MARKER))
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function writeEnvMarker(stage) {
|
|
95
|
+
try {
|
|
96
|
+
(0, child_process_1.execSync)('sudo mkdir -p /etc/factiii && echo "' + stage + '" | sudo tee ' + MARKER_PATH + ' > /dev/null', { stdio: 'inherit' });
|
|
97
|
+
// Also create a convenience command
|
|
98
|
+
(0, child_process_1.execSync)('echo \'#!/bin/sh\ncat ' + MARKER_PATH + '\' | sudo tee /usr/local/bin/factiii-env > /dev/null && sudo chmod +x /usr/local/bin/factiii-env', { stdio: 'inherit' });
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function writePromptColor(stage) {
|
|
106
|
+
const color = stage === 'prod' ? '\\033[0;31m' : '\\033[0;33m'; // red : yellow
|
|
107
|
+
const reset = '\\033[0m';
|
|
108
|
+
const label = stage.toUpperCase();
|
|
109
|
+
// Snippet that prepends [STAGING] or [PROD] to PS1
|
|
110
|
+
const snippet = '\n' + PROFILE_MARKER + '\n' +
|
|
111
|
+
'if [ -f ' + MARKER_PATH + ' ]; then\n' +
|
|
112
|
+
' _FACTIII_ENV=$(cat ' + MARKER_PATH + ')\n' +
|
|
113
|
+
' PS1="' + color + '[' + label + ']' + reset + ' $PS1"\n' +
|
|
114
|
+
'fi\n';
|
|
115
|
+
try {
|
|
116
|
+
// Detect shell and write to the right rc file
|
|
117
|
+
const shell = process.env.SHELL || '/bin/bash';
|
|
118
|
+
const rcFile = shell.includes('zsh')
|
|
119
|
+
? process.env.HOME + '/.zshrc'
|
|
120
|
+
: process.env.HOME + '/.bashrc';
|
|
121
|
+
fs.appendFileSync(rcFile, snippet);
|
|
122
|
+
console.log(' Added [' + label + '] prompt indicator to ' + rcFile);
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
exports.envMarkerFixes = [
|
|
130
|
+
// ── Staging marker ─────────────────────────────────────────
|
|
131
|
+
{
|
|
132
|
+
id: 'env-marker-missing-staging',
|
|
133
|
+
stage: 'staging',
|
|
134
|
+
severity: 'info',
|
|
135
|
+
description: 'No /etc/factiii/environment marker (hard to tell which server you\'re on)',
|
|
136
|
+
scan: async () => {
|
|
137
|
+
return getCurrentMarker() !== 'staging';
|
|
138
|
+
},
|
|
139
|
+
fix: async () => {
|
|
140
|
+
console.log(' Writing environment marker: staging');
|
|
141
|
+
return writeEnvMarker('staging');
|
|
142
|
+
},
|
|
143
|
+
manualFix: 'Run: sudo mkdir -p /etc/factiii && echo "staging" | sudo tee /etc/factiii/environment',
|
|
144
|
+
},
|
|
145
|
+
// ── Prod marker ────────────────────────────────────────────
|
|
146
|
+
{
|
|
147
|
+
id: 'env-marker-missing-prod',
|
|
148
|
+
stage: 'prod',
|
|
149
|
+
severity: 'info',
|
|
150
|
+
description: 'No /etc/factiii/environment marker (hard to tell which server you\'re on)',
|
|
151
|
+
scan: async () => {
|
|
152
|
+
return getCurrentMarker() !== 'prod';
|
|
153
|
+
},
|
|
154
|
+
fix: async () => {
|
|
155
|
+
console.log(' Writing environment marker: prod');
|
|
156
|
+
return writeEnvMarker('prod');
|
|
157
|
+
},
|
|
158
|
+
manualFix: 'Run: sudo mkdir -p /etc/factiii && echo "prod" | sudo tee /etc/factiii/environment',
|
|
159
|
+
},
|
|
160
|
+
// ── Staging prompt ─────────────────────────────────────────
|
|
161
|
+
{
|
|
162
|
+
id: 'env-prompt-missing-staging',
|
|
163
|
+
stage: 'staging',
|
|
164
|
+
severity: 'info',
|
|
165
|
+
description: 'Shell prompt doesn\'t show environment (easy to run prod commands on staging)',
|
|
166
|
+
scan: async () => {
|
|
167
|
+
if (getCurrentMarker() !== 'staging')
|
|
168
|
+
return false; // Marker first
|
|
169
|
+
return !hasPromptMarker();
|
|
170
|
+
},
|
|
171
|
+
fix: async () => {
|
|
172
|
+
return writePromptColor('staging');
|
|
173
|
+
},
|
|
174
|
+
manualFix: 'Add to ~/.bashrc or ~/.zshrc:\n' +
|
|
175
|
+
' PS1="\\033[0;33m[STAGING]\\033[0m $PS1"',
|
|
176
|
+
},
|
|
177
|
+
// ── Prod prompt ────────────────────────────────────────────
|
|
178
|
+
{
|
|
179
|
+
id: 'env-prompt-missing-prod',
|
|
180
|
+
stage: 'prod',
|
|
181
|
+
severity: 'info',
|
|
182
|
+
description: 'Shell prompt doesn\'t show environment (easy to run staging commands on prod)',
|
|
183
|
+
scan: async () => {
|
|
184
|
+
if (getCurrentMarker() !== 'prod')
|
|
185
|
+
return false; // Marker first
|
|
186
|
+
return !hasPromptMarker();
|
|
187
|
+
},
|
|
188
|
+
fix: async () => {
|
|
189
|
+
return writePromptColor('prod');
|
|
190
|
+
},
|
|
191
|
+
manualFix: 'Add to ~/.bashrc or ~/.zshrc:\n' +
|
|
192
|
+
' PS1="\\033[0;31m[PROD]\\033[0m $PS1"',
|
|
193
|
+
},
|
|
194
|
+
];
|
|
195
|
+
//# sourceMappingURL=env-marker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-marker.js","sourceRoot":"","sources":["../../../../../src/plugins/addons/server-mode/scanfix/env-marker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tailscale VPN Scanfix
|
|
3
|
+
*
|
|
4
|
+
* Installs and configures Tailscale on Mac/Linux servers for reliable
|
|
5
|
+
* remote access. Tailscale creates a WireGuard tunnel that survives
|
|
6
|
+
* firewall changes, port closures, and SSH misconfigurations.
|
|
7
|
+
*
|
|
8
|
+
* Auth key is stored in the Ansible Vault via:
|
|
9
|
+
* npx stack deploy --secrets set TAILSCALE_AUTH_KEY
|
|
10
|
+
*
|
|
11
|
+
* Generate the key at: https://login.tailscale.com/admin/settings/keys
|
|
12
|
+
* - Reusable + Pre-approved for servers
|
|
13
|
+
*/
|
|
14
|
+
import type { Fix } from '../../../../types/index.js';
|
|
15
|
+
export declare const tailscaleFixes: Fix[];
|
|
16
|
+
//# sourceMappingURL=tailscale.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailscale.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/addons/server-mode/scanfix/tailscale.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,GAAG,EAA2B,MAAM,4BAA4B,CAAC;AAuF/E,eAAO,MAAM,cAAc,EAAE,GAAG,EAiF/B,CAAC"}
|