@superyachttimes/cli 1.2.0 → 1.3.0
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/aws/route53.d.ts +10 -0
- package/dist/aws/route53.d.ts.map +1 -0
- package/dist/aws/route53.js +78 -0
- package/dist/aws/route53.js.map +1 -0
- package/dist/commands/sync-ec2-route53.d.ts +2 -0
- package/dist/commands/sync-ec2-route53.d.ts.map +1 -0
- package/dist/commands/sync-ec2-route53.js +96 -0
- package/dist/commands/sync-ec2-route53.js.map +1 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +11 -0
- package/dist/config.js.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AwsOptions } from "./ec2.js";
|
|
2
|
+
export interface DesiredRecord {
|
|
3
|
+
name: string;
|
|
4
|
+
ip: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function slugify(name: string): string;
|
|
7
|
+
export declare function resolveHostedZoneId(opts: AwsOptions, zoneName: string): Promise<string>;
|
|
8
|
+
export declare function listARecords(opts: AwsOptions, zoneId: string): Promise<Map<string, string>>;
|
|
9
|
+
export declare function upsertARecords(opts: AwsOptions, zoneId: string, records: DesiredRecord[], ttl: number): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=route53.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route53.d.ts","sourceRoot":"","sources":["../../src/aws/route53.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAWD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM5C;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAYjB;AAGD,wBAAsB,YAAY,CAChC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA4B9B;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,EAAE,EACxB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAmBf"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { Route53Client, ListHostedZonesByNameCommand, ListResourceRecordSetsCommand, ChangeResourceRecordSetsCommand, } from "@aws-sdk/client-route-53";
|
|
2
|
+
import { fromIni } from "@aws-sdk/credential-providers";
|
|
3
|
+
function createClient(opts) {
|
|
4
|
+
return new Route53Client({
|
|
5
|
+
region: opts.region,
|
|
6
|
+
credentials: fromIni({ profile: opts.profile }),
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
// Lowercase; keep [a-z0-9_-]; replace any other run with "-";
|
|
10
|
+
// collapse repeated hyphens; trim leading/trailing hyphens.
|
|
11
|
+
export function slugify(name) {
|
|
12
|
+
return name
|
|
13
|
+
.toLowerCase()
|
|
14
|
+
.replace(/[^a-z0-9_-]+/g, "-")
|
|
15
|
+
.replace(/-+/g, "-")
|
|
16
|
+
.replace(/^-+|-+$/g, "");
|
|
17
|
+
}
|
|
18
|
+
export async function resolveHostedZoneId(opts, zoneName) {
|
|
19
|
+
const client = createClient(opts);
|
|
20
|
+
const target = zoneName.endsWith(".") ? zoneName : `${zoneName}.`;
|
|
21
|
+
const res = await client.send(new ListHostedZonesByNameCommand({ DNSName: target }));
|
|
22
|
+
const zone = (res.HostedZones ?? []).find((z) => z.Name === target);
|
|
23
|
+
if (!zone?.Id) {
|
|
24
|
+
throw new Error(`Route53 hosted zone "${zoneName}" not found.`);
|
|
25
|
+
}
|
|
26
|
+
// Id looks like "/hostedzone/Z123..."; strip the prefix.
|
|
27
|
+
return zone.Id.replace(/^\/hostedzone\//, "");
|
|
28
|
+
}
|
|
29
|
+
// Returns a map of fully-qualified A-record name (no trailing dot) -> IP value.
|
|
30
|
+
export async function listARecords(opts, zoneId) {
|
|
31
|
+
const client = createClient(opts);
|
|
32
|
+
const records = new Map();
|
|
33
|
+
let startName;
|
|
34
|
+
let startType;
|
|
35
|
+
let startIdentifier;
|
|
36
|
+
let truncated = true;
|
|
37
|
+
while (truncated) {
|
|
38
|
+
const res = await client.send(new ListResourceRecordSetsCommand({
|
|
39
|
+
HostedZoneId: zoneId,
|
|
40
|
+
StartRecordName: startName,
|
|
41
|
+
StartRecordType: startType,
|
|
42
|
+
StartRecordIdentifier: startIdentifier,
|
|
43
|
+
}));
|
|
44
|
+
for (const rr of res.ResourceRecordSets ?? []) {
|
|
45
|
+
if (rr.Type !== "A" || !rr.Name)
|
|
46
|
+
continue;
|
|
47
|
+
const ip = rr.ResourceRecords?.[0]?.Value;
|
|
48
|
+
if (!ip)
|
|
49
|
+
continue;
|
|
50
|
+
records.set(rr.Name.replace(/\.$/, ""), ip);
|
|
51
|
+
}
|
|
52
|
+
truncated = Boolean(res.IsTruncated);
|
|
53
|
+
startName = res.NextRecordName;
|
|
54
|
+
startType = res.NextRecordType;
|
|
55
|
+
startIdentifier = res.NextRecordIdentifier;
|
|
56
|
+
}
|
|
57
|
+
return records;
|
|
58
|
+
}
|
|
59
|
+
export async function upsertARecords(opts, zoneId, records, ttl) {
|
|
60
|
+
if (records.length === 0)
|
|
61
|
+
return;
|
|
62
|
+
const client = createClient(opts);
|
|
63
|
+
await client.send(new ChangeResourceRecordSetsCommand({
|
|
64
|
+
HostedZoneId: zoneId,
|
|
65
|
+
ChangeBatch: {
|
|
66
|
+
Changes: records.map((r) => ({
|
|
67
|
+
Action: "UPSERT",
|
|
68
|
+
ResourceRecordSet: {
|
|
69
|
+
Name: r.name,
|
|
70
|
+
Type: "A",
|
|
71
|
+
TTL: ttl,
|
|
72
|
+
ResourceRecords: [{ Value: r.ip }],
|
|
73
|
+
},
|
|
74
|
+
})),
|
|
75
|
+
},
|
|
76
|
+
}));
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=route53.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route53.js","sourceRoot":"","sources":["../../src/aws/route53.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-ec2-route53.d.ts","sourceRoot":"","sources":["../../src/commands/sync-ec2-route53.ts"],"names":[],"mappings":"AAKA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuGtD"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { checkbox } from "@inquirer/prompts";
|
|
2
|
+
import { loadConfig, getAwsConfig, getRoute53Config } from "../config.js";
|
|
3
|
+
import * as ec2 from "../aws/ec2.js";
|
|
4
|
+
import * as route53 from "../aws/route53.js";
|
|
5
|
+
export async function syncEc2ToRoute53() {
|
|
6
|
+
const config = loadConfig();
|
|
7
|
+
const aws = getAwsConfig(config);
|
|
8
|
+
const r53 = getRoute53Config(config);
|
|
9
|
+
console.log(`Listing running EC2 instances in ${aws.region}...`);
|
|
10
|
+
const instances = await ec2.listInstances(aws);
|
|
11
|
+
const running = instances.filter((i) => i.state === "running" && i.publicIp);
|
|
12
|
+
if (running.length === 0) {
|
|
13
|
+
console.log("No running instances with a public IP found. Nothing to do.");
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
// Group by slug so we can detect collisions; skip unnamed instances.
|
|
17
|
+
const suffix = `${r53.subdomain}.${r53.zoneName}`;
|
|
18
|
+
const bySlug = new Map();
|
|
19
|
+
for (const inst of running) {
|
|
20
|
+
if (inst.name === "(no name)") {
|
|
21
|
+
console.log(`Skipping ${inst.instanceId}: no Name tag.`);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const slug = route53.slugify(inst.name);
|
|
25
|
+
if (!slug) {
|
|
26
|
+
console.log(`Skipping ${inst.instanceId}: name "${inst.name}" slugified to empty.`);
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
const list = bySlug.get(slug) ?? [];
|
|
30
|
+
list.push(inst);
|
|
31
|
+
bySlug.set(slug, list);
|
|
32
|
+
}
|
|
33
|
+
const desired = [];
|
|
34
|
+
for (const [slug, insts] of bySlug) {
|
|
35
|
+
if (insts.length > 1) {
|
|
36
|
+
console.log(`Skipping slug "${slug}": ${insts.length} instances share it (${insts
|
|
37
|
+
.map((i) => i.instanceId)
|
|
38
|
+
.join(", ")}).`);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
desired.push({
|
|
42
|
+
name: `${slug}.${suffix}`,
|
|
43
|
+
ip: insts[0].publicIp,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
if (desired.length === 0) {
|
|
47
|
+
console.log("No records to sync after filtering. Nothing to do.");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
console.log(`Resolving hosted zone "${r53.zoneName}"...`);
|
|
51
|
+
const zoneId = await route53.resolveHostedZoneId(aws, r53.zoneName);
|
|
52
|
+
const existing = await route53.listARecords(aws, zoneId);
|
|
53
|
+
const toCreate = [];
|
|
54
|
+
const toUpdate = [];
|
|
55
|
+
let unchanged = 0;
|
|
56
|
+
for (const rec of desired) {
|
|
57
|
+
const current = existing.get(rec.name);
|
|
58
|
+
if (current === undefined)
|
|
59
|
+
toCreate.push(rec);
|
|
60
|
+
else if (current !== rec.ip)
|
|
61
|
+
toUpdate.push(rec);
|
|
62
|
+
else
|
|
63
|
+
unchanged++;
|
|
64
|
+
}
|
|
65
|
+
if (toCreate.length === 0 && toUpdate.length === 0) {
|
|
66
|
+
console.log(`All ${unchanged} record(s) already up to date — no changes.`);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (unchanged > 0)
|
|
70
|
+
console.log(`${unchanged} record(s) already up to date.`);
|
|
71
|
+
const choices = [
|
|
72
|
+
...toCreate.map((r) => ({
|
|
73
|
+
name: `+ ${r.name} -> ${r.ip}`,
|
|
74
|
+
value: r,
|
|
75
|
+
checked: true,
|
|
76
|
+
})),
|
|
77
|
+
...toUpdate.map((r) => ({
|
|
78
|
+
name: `~ ${r.name} -> ${r.ip} (was ${existing.get(r.name)})`,
|
|
79
|
+
value: r,
|
|
80
|
+
checked: true,
|
|
81
|
+
})),
|
|
82
|
+
].sort((a, b) => a.value.name.localeCompare(b.value.name));
|
|
83
|
+
const selected = await checkbox({
|
|
84
|
+
message: `Select records to apply to ${r53.zoneName} (space toggles, enter confirms):`,
|
|
85
|
+
choices,
|
|
86
|
+
});
|
|
87
|
+
if (selected.length === 0) {
|
|
88
|
+
console.log("Nothing selected. Aborted.");
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
await route53.upsertARecords(aws, zoneId, selected, r53.ttl);
|
|
92
|
+
const createdCount = selected.filter((r) => toCreate.includes(r)).length;
|
|
93
|
+
const updatedCount = selected.length - createdCount;
|
|
94
|
+
console.log(`Done. ${createdCount} created, ${updatedCount} updated.`);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=sync-ec2-route53.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-ec2-route53.js","sourceRoot":"","sources":["../../src/commands/sync-ec2-route53.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -14,12 +14,18 @@ export interface CloudflareConfig {
|
|
|
14
14
|
zoneName?: string;
|
|
15
15
|
ruleDescription?: string;
|
|
16
16
|
}
|
|
17
|
+
export interface Route53Config {
|
|
18
|
+
zoneName?: string;
|
|
19
|
+
subdomain?: string;
|
|
20
|
+
ttl?: number;
|
|
21
|
+
}
|
|
17
22
|
export interface Config {
|
|
18
23
|
sytApiUrl: string;
|
|
19
24
|
sytApiKey: string;
|
|
20
25
|
nodejsApi: PortainerInstance[];
|
|
21
26
|
aws?: AwsConfig;
|
|
22
27
|
cloudflare?: CloudflareConfig;
|
|
28
|
+
route53?: Route53Config;
|
|
23
29
|
}
|
|
24
30
|
export declare function loadConfig(): Config;
|
|
25
31
|
export interface ResolvedAwsConfig {
|
|
@@ -33,4 +39,10 @@ export interface ResolvedCloudflareConfig {
|
|
|
33
39
|
}
|
|
34
40
|
export declare function getAwsConfig(config: Config): ResolvedAwsConfig;
|
|
35
41
|
export declare function getCloudflareConfig(config: Config): ResolvedCloudflareConfig;
|
|
42
|
+
export interface ResolvedRoute53Config {
|
|
43
|
+
zoneName: string;
|
|
44
|
+
subdomain: string;
|
|
45
|
+
ttl: number;
|
|
46
|
+
}
|
|
47
|
+
export declare function getRoute53Config(config: Config): ResolvedRoute53Config;
|
|
36
48
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,UAAU,CAAC,EAAE,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAID,wBAAgB,UAAU,IAAI,MAAM,CAmDnC;AAOD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAK9D;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,wBAAwB,CAa5E;AAMD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB,CAOtE"}
|
package/dist/config.js
CHANGED
|
@@ -60,4 +60,15 @@ export function getCloudflareConfig(config) {
|
|
|
60
60
|
ruleDescription: config.cloudflare?.ruleDescription?.trim() || DEFAULT_CLOUDFLARE_RULE,
|
|
61
61
|
};
|
|
62
62
|
}
|
|
63
|
+
const DEFAULT_ROUTE53_ZONE = "superyachtapi.com";
|
|
64
|
+
const DEFAULT_ROUTE53_SUBDOMAIN = "infra";
|
|
65
|
+
const DEFAULT_ROUTE53_TTL = 300;
|
|
66
|
+
export function getRoute53Config(config) {
|
|
67
|
+
const ttl = config.route53?.ttl;
|
|
68
|
+
return {
|
|
69
|
+
zoneName: config.route53?.zoneName?.trim() || DEFAULT_ROUTE53_ZONE,
|
|
70
|
+
subdomain: config.route53?.subdomain?.trim() || DEFAULT_ROUTE53_SUBDOMAIN,
|
|
71
|
+
ttl: typeof ttl === "number" && ttl > 0 ? ttl : DEFAULT_ROUTE53_TTL,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
63
74
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -8,6 +8,7 @@ import { createApiKey } from "./commands/create-api-key.js";
|
|
|
8
8
|
import { recreateNodejsApi } from "./commands/recreate-nodejs-api.js";
|
|
9
9
|
import { restartEc2 } from "./commands/restart-ec2.js";
|
|
10
10
|
import { syncEc2IpsToCloudflare } from "./commands/sync-ec2-ips-cloudflare.js";
|
|
11
|
+
import { syncEc2ToRoute53 } from "./commands/sync-ec2-route53.js";
|
|
11
12
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
12
13
|
const pkg = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf-8"));
|
|
13
14
|
function printHelp() {
|
|
@@ -21,6 +22,7 @@ function printHelp() {
|
|
|
21
22
|
console.log(" recreate-nodejs-api Recreate Node.js API containers via Portainer");
|
|
22
23
|
console.log(" restart-ec2 Restart (reboot) one or more EC2 servers");
|
|
23
24
|
console.log(" sync-ec2-ips-cloudflare Sync EC2 egress IPs to a Cloudflare WAF rule");
|
|
25
|
+
console.log(" sync-ec2-route53 Sync running EC2 public IPs to Route53 infra records");
|
|
24
26
|
console.log();
|
|
25
27
|
console.log("Options:");
|
|
26
28
|
console.log(" -v, --version Show version");
|
|
@@ -53,6 +55,9 @@ async function runCommand(cmd) {
|
|
|
53
55
|
case "sync-ec2-ips-cloudflare":
|
|
54
56
|
await syncEc2IpsToCloudflare();
|
|
55
57
|
break;
|
|
58
|
+
case "sync-ec2-route53":
|
|
59
|
+
await syncEc2ToRoute53();
|
|
60
|
+
break;
|
|
56
61
|
default:
|
|
57
62
|
console.error(`Unknown command: ${cmd}`);
|
|
58
63
|
printHelp();
|
|
@@ -88,6 +93,11 @@ async function showMenu() {
|
|
|
88
93
|
value: "sync-ec2-ips-cloudflare",
|
|
89
94
|
description: "Sync EC2 egress IPs to a Cloudflare WAF rule",
|
|
90
95
|
},
|
|
96
|
+
{
|
|
97
|
+
name: "Sync EC2 IPs to Route53",
|
|
98
|
+
value: "sync-ec2-route53",
|
|
99
|
+
description: "Sync running EC2 public IPs to Route53 infra records",
|
|
100
|
+
},
|
|
91
101
|
],
|
|
92
102
|
});
|
|
93
103
|
await runCommand(chosen);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@superyachttimes/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "SuperYachtTimes CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"@aws-sdk/client-ec2": "^3.1053.0",
|
|
29
|
+
"@aws-sdk/client-route-53": "^3.1061.0",
|
|
29
30
|
"@aws-sdk/credential-providers": "^3.1053.0",
|
|
30
31
|
"@inquirer/prompts": "^8.2.0"
|
|
31
32
|
}
|