Skip to content

Commit 7e950a9

Browse files
committed
fixes
1 parent e67d1fd commit 7e950a9

13 files changed

Lines changed: 90 additions & 43 deletions

File tree

ansible/roles/traefik/tasks/main.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,3 @@
100100
state: started
101101
enabled: true
102102
daemon_reload: true
103-
104-
- name: Run Traefik sync immediately
105-
ansible.builtin.command: /usr/local/bin/terrariumctl proxy sync
106-
changed_when: false

ansible/site.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,7 @@
9999
- role: lxd
100100
- role: backups
101101
- role: hardening
102+
post_tasks:
103+
- name: Run Traefik sync after all dependent services are configured
104+
ansible.builtin.command: /usr/local/bin/terrariumctl proxy sync
105+
changed_when: false

scripts/ctl/backup.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { confirm } from "@inquirer/prompts";
22
import { heading, label, requireConfig, success, value } from "./context";
3-
import { configBoolean, configString, runAllowFailure, runInteractive, runText } from "../lib/common";
3+
import { configBoolean, configString, normalizeS3Endpoint, runAllowFailure, runInteractive, runText } from "../lib/common";
44
import { backupExportCmd } from "../terrarium-s3-export";
55
import { reconstructFromS3 } from "../terrarium-zfs-reconstruct";
66
import { PREFIX } from "./context";
@@ -16,7 +16,7 @@ export async function backupListCmd(): Promise<void> {
1616
const pool = configString(config, "terrarium_lxd_pool_name", "terrarium");
1717
const bucket = configString(config, "terrarium_s3_bucket");
1818
const prefix = configString(config, "terrarium_s3_prefix", "terrarium");
19-
const endpoint = configString(config, "terrarium_s3_endpoint");
19+
const endpoint = normalizeS3Endpoint(configString(config, "terrarium_s3_endpoint"));
2020
const awsEnv: Record<string, string> = {};
2121
const accessKey = configString(config, "terrarium_s3_access_key");
2222
const secretKey = configString(config, "terrarium_s3_secret_key");

scripts/ctl/config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
setConfigValue,
1212
success
1313
} from "./context";
14-
import { configBoolean, configString } from "../lib/common";
14+
import { configBoolean, configString, normalizeS3Endpoint } from "../lib/common";
1515
import { writeFileSync } from "node:fs";
1616
import { verifyOidcConfig, verifyS3Config } from "./verify";
1717

@@ -216,7 +216,7 @@ export async function setS3Cmd(options: SetS3Options, actions: ReconcileActions)
216216
const nextEnabled = options.enable ? true : options.disable ? false : configBoolean(config, "terrarium_enable_s3");
217217
setConfigValue(config, "terrarium_enable_s3", nextEnabled);
218218

219-
if (options.s3Endpoint !== undefined) setConfigValue(config, "terrarium_s3_endpoint", options.s3Endpoint);
219+
if (options.s3Endpoint !== undefined) setConfigValue(config, "terrarium_s3_endpoint", normalizeS3Endpoint(options.s3Endpoint));
220220
if (options.s3Bucket !== undefined) setConfigValue(config, "terrarium_s3_bucket", options.s3Bucket);
221221
if (options.s3Region !== undefined) setConfigValue(config, "terrarium_s3_region", options.s3Region);
222222
if (options.s3Prefix !== undefined) setConfigValue(config, "terrarium_s3_prefix", options.s3Prefix);

scripts/ctl/verify.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { randomUUID } from "node:crypto";
22
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
33
import { join } from "node:path";
44
import { tmpdir } from "node:os";
5-
import { runAllowFailure } from "../lib/common";
5+
import { normalizeS3Endpoint, runAllowFailure } from "../lib/common";
66

77
/** Input required to verify a writable S3-compatible backup target. */
88
export type S3VerificationOptions = {
@@ -39,7 +39,7 @@ async function ensureAwsCli(): Promise<void> {
3939
return;
4040
}
4141

42-
const fallbackArch = ({ x86_64: "x86_64", amd64: "x86_64", aarch64: "aarch64", arm64: "aarch64" } as Record<string, string>)[
42+
const fallbackArch = ({ x64: "x86_64", x86_64: "x86_64", amd64: "x86_64", aarch64: "aarch64", arm64: "aarch64" } as Record<string, string>)[
4343
process.arch
4444
] ?? process.arch;
4545
const tempDir = mkdtempSync(join(tmpdir(), "terrarium-awscli-install-"));
@@ -103,8 +103,9 @@ function s3Env(options: S3VerificationOptions): Record<string, string> {
103103
/** Builds the common AWS CLI prefix, including custom endpoint handling. */
104104
function s3BaseArgs(options: S3VerificationOptions): string[] {
105105
const args = ["aws"];
106-
if (options.endpoint) {
107-
args.push("--endpoint-url", options.endpoint);
106+
const endpoint = normalizeS3Endpoint(options.endpoint);
107+
if (endpoint) {
108+
args.push("--endpoint-url", endpoint);
108109
}
109110
return args;
110111
}

scripts/lib/common.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,15 @@ export function configBoolean(config: Record<string, unknown>, key: string): boo
186186
return false;
187187
}
188188

189+
/** Normalizes S3-compatible endpoints so bare hostnames default to HTTPS. */
190+
export function normalizeS3Endpoint(endpoint: string): string {
191+
const trimmed = endpoint.trim();
192+
if (!trimmed) {
193+
return "";
194+
}
195+
return /^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed) ? trimmed : `https://${trimmed}`;
196+
}
197+
189198
/** Creates a new temporary directory using the OS temp root and a caller prefix. */
190199
export function makeTempDir(prefix: string): string {
191200
return mkdtempSync(join(tmpdir(), prefix));

scripts/terrarium-install.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { tmpdir } from "node:os";
88
import { stringify } from "yaml";
99
import { TERRARIUM_SPLASH, TERRARIUM_VERSION } from "./generated/build-info";
1010
import { verifyOidcConfig, verifyS3Config } from "./ctl/verify";
11+
import { normalizeS3Endpoint } from "./lib/common";
1112

1213
const PREFIX = "terrariumctl install";
1314
const REPO_URL = process.env.TERRARIUM_REPO_URL ?? "https://github.com/terion-name/terrarium.git";
@@ -493,7 +494,7 @@ async function promptAndVerifyExternalOidc(options: InstallOptions): Promise<voi
493494
*/
494495
async function promptAndVerifyS3(options: InstallOptions): Promise<void> {
495496
while (true) {
496-
options.s3Endpoint = await promptText("S3 endpoint", options.s3Endpoint || "https://s3.amazonaws.com");
497+
options.s3Endpoint = normalizeS3Endpoint(await promptText("S3 endpoint", options.s3Endpoint || "https://s3.amazonaws.com"));
497498
options.s3Bucket = await promptText("S3 bucket", options.s3Bucket);
498499
options.s3Region = await promptText("S3 region", options.s3Region || "us-east-1");
499500
options.s3Prefix = await promptText("S3 prefix", options.s3Prefix || "terrarium");
@@ -809,7 +810,7 @@ function validateNonInteractive(options: InstallOptions): void {
809810
if (!options.s3SecretKey) {
810811
fail("--s3-secret-key is required when S3 is enabled");
811812
}
812-
options.s3Endpoint = options.s3Endpoint || "https://s3.amazonaws.com";
813+
options.s3Endpoint = normalizeS3Endpoint(options.s3Endpoint || "https://s3.amazonaws.com");
813814
options.s3Region = options.s3Region || "us-east-1";
814815
}
815816

@@ -1079,7 +1080,7 @@ export function registerInstallCommand(cli: CAC): void {
10791080
options.storageSource = readCliOption(cliOptions, "storageSource");
10801081
options.storageSize = readCliOption(cliOptions, "storageSize");
10811082
options.enableS3 = Boolean(cliOptions.enableS3);
1082-
options.s3Endpoint = readCliOption(cliOptions, "s3Endpoint", ["s3-endpoint"]);
1083+
options.s3Endpoint = normalizeS3Endpoint(readCliOption(cliOptions, "s3Endpoint", ["s3-endpoint"]));
10831084
options.s3Bucket = readCliOption(cliOptions, "s3Bucket", ["s3-bucket"]);
10841085
options.s3Region = readCliOption(cliOptions, "s3Region", ["s3-region"]);
10851086
options.s3Prefix = readCliOption(cliOptions, "s3Prefix", ["s3-prefix"]) || options.s3Prefix;

scripts/terrarium-s3-export.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
22
import { join } from "node:path";
3-
import { configBoolean, configString, loadConfig, runAllowFailure, runJson, runShell, runText, shellEscape, writeJsonFile } from "./lib/common";
3+
import {
4+
configBoolean,
5+
configString,
6+
loadConfig,
7+
normalizeS3Endpoint,
8+
runAllowFailure,
9+
runJson,
10+
runShell,
11+
runText,
12+
shellEscape,
13+
writeJsonFile
14+
} from "./lib/common";
415

516
const PREFIX = "terrariumctl backup export";
617
const DEFAULT_CONFIG_PATH = process.env.TERRARIUM_CONFIG_PATH ?? "/etc/terrarium/config.yaml";
@@ -45,7 +56,7 @@ export async function backupExportCmd(configPath = DEFAULT_CONFIG_PATH): Promise
4556
return;
4657
}
4758

48-
const endpoint = configString(config, "terrarium_s3_endpoint");
59+
const endpoint = normalizeS3Endpoint(configString(config, "terrarium_s3_endpoint"));
4960
const prefix = configString(config, "terrarium_s3_prefix", "terrarium");
5061
const pool = configString(config, "terrarium_lxd_pool_name", "terrarium");
5162
const awsEnv = s3Env(config);

scripts/terrarium-traefik-sync.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ async function enrichInstanceState(containers: LxcInstance[]): Promise<LxcInstan
215215
continue;
216216
}
217217

218-
const response = await runAllowFailure(["lxc", "query", `/1.0/instances/${container.name}/state`]);
218+
const response = await runAllowFailure(["timeout", "15s", "lxc", "query", `/1.0/instances/${container.name}/state`]);
219219
if (response.exitCode !== 0) {
220220
enriched.push(container);
221221
continue;
@@ -301,7 +301,7 @@ async function syncUfw(desiredPorts: DesiredPort[]): Promise<string[]> {
301301
* up container routes once LXD is actually ready.
302302
*/
303303
async function loadInstancesForProxySync(): Promise<LxcInstance[]> {
304-
const result = await runAllowFailure(["lxc", "list", "-f", "json"]);
304+
const result = await runAllowFailure(["timeout", "15s", "lxc", "list", "-f", "json"]);
305305
if (result.exitCode !== 0) {
306306
console.warn(`${PREFIX}: LXD is not ready yet; skipping container route discovery`);
307307
return [];

scripts/terrarium-zfs-reconstruct.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
import { existsSync } from "node:fs";
22
import { join } from "node:path";
3-
import { configString, loadConfig, makeTempDir, readJsonFile, removePath, runAllowFailure, runShell, runText, shellEscape } from "./lib/common";
3+
import {
4+
configString,
5+
loadConfig,
6+
makeTempDir,
7+
normalizeS3Endpoint,
8+
readJsonFile,
9+
removePath,
10+
runAllowFailure,
11+
runShell,
12+
runText,
13+
shellEscape
14+
} from "./lib/common";
415

516
const PREFIX = "terrariumctl backup reconstruct";
617
const DEFAULT_CONFIG_PATH = process.env.TERRARIUM_CONFIG_PATH ?? "/etc/terrarium/config.yaml";
@@ -55,7 +66,7 @@ function selectChain(directory: string, match = ""): Manifest[] {
5566
export async function reconstructFromS3(instance: string, at: string, targetDataset: string, configPath = DEFAULT_CONFIG_PATH): Promise<void> {
5667
const config = loadConfig(configPath, PREFIX);
5768
const bucket = configString(config, "terrarium_s3_bucket");
58-
const endpoint = configString(config, "terrarium_s3_endpoint");
69+
const endpoint = normalizeS3Endpoint(configString(config, "terrarium_s3_endpoint"));
5970
const prefix = configString(config, "terrarium_s3_prefix", "terrarium");
6071
const awsEnv = s3Env(config);
6172
const awsBase = ["aws"];

0 commit comments

Comments
 (0)