@studiometa/trafic-agent 0.1.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.
Files changed (51) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +140 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/index-C7OaqqbZ.js +865 -0
  6. package/dist/index-C7OaqqbZ.js.map +1 -0
  7. package/dist/index.d.ts +12 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +41 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/server-CHT47EXr.js +618 -0
  12. package/dist/server-CHT47EXr.js.map +1 -0
  13. package/dist/server.d.ts +6 -0
  14. package/dist/server.d.ts.map +1 -0
  15. package/dist/server.js +9 -0
  16. package/dist/server.js.map +1 -0
  17. package/dist/setup/agent.d.ts +17 -0
  18. package/dist/setup/agent.d.ts.map +1 -0
  19. package/dist/setup/audit.d.ts +10 -0
  20. package/dist/setup/audit.d.ts.map +1 -0
  21. package/dist/setup/ddev.d.ts +27 -0
  22. package/dist/setup/ddev.d.ts.map +1 -0
  23. package/dist/setup/docker.d.ts +13 -0
  24. package/dist/setup/docker.d.ts.map +1 -0
  25. package/dist/setup/hardening.d.ts +29 -0
  26. package/dist/setup/hardening.d.ts.map +1 -0
  27. package/dist/setup/index.d.ts +12 -0
  28. package/dist/setup/index.d.ts.map +1 -0
  29. package/dist/setup/steps.d.ts +51 -0
  30. package/dist/setup/steps.d.ts.map +1 -0
  31. package/dist/setup/types.d.ts +37 -0
  32. package/dist/setup/types.d.ts.map +1 -0
  33. package/dist/setup/user.d.ts +9 -0
  34. package/dist/setup/user.d.ts.map +1 -0
  35. package/dist/tasks/stop-idle.d.ts +11 -0
  36. package/dist/tasks/stop-idle.d.ts.map +1 -0
  37. package/dist/types.d.ts +99 -0
  38. package/dist/types.d.ts.map +1 -0
  39. package/dist/utils/auth.d.ts +25 -0
  40. package/dist/utils/auth.d.ts.map +1 -0
  41. package/dist/utils/config.d.ts +14 -0
  42. package/dist/utils/config.d.ts.map +1 -0
  43. package/dist/utils/db.d.ts +43 -0
  44. package/dist/utils/db.d.ts.map +1 -0
  45. package/dist/utils/ddev.d.ts +35 -0
  46. package/dist/utils/ddev.d.ts.map +1 -0
  47. package/dist/utils/project-config.d.ts +23 -0
  48. package/dist/utils/project-config.d.ts.map +1 -0
  49. package/package.json +56 -0
  50. package/templates/error.html +59 -0
  51. package/templates/wait.html +86 -0
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,140 @@
1
+ #!/usr/bin/env node
2
+ import { parseArgs } from "node:util";
3
+ import { a as audit, s as setup, l as loadConfig, v as validateConfig, c as startIdleScheduler } from "./index-C7OaqqbZ.js";
4
+ import { x as startServer, d as closeDb } from "./server-CHT47EXr.js";
5
+ const HELP = `
6
+ trafic-agent — Server agent for DDEV preview environments
7
+
8
+ Usage:
9
+ trafic-agent <command> [options]
10
+
11
+ Commands:
12
+ start Start the agent server
13
+ setup Setup a new server (Docker, DDEV, hardening)
14
+ audit Run security audit checks
15
+ version Show version
16
+ help Show this help
17
+
18
+ Start options:
19
+ -c, --config <path> Path to config file (default: /etc/trafic/config.toml)
20
+ -p, --port <port> Override port from config
21
+
22
+ Setup options:
23
+ --tld <domain> TLD for DDEV projects (required)
24
+ --email <email> Email for Let's Encrypt certificates
25
+ --no-hardening Skip server hardening steps
26
+ --no-docker Skip Docker installation
27
+ --no-ddev Skip DDEV installation
28
+ --ssh-users <users> Comma-separated list of SSH users to allow (default: ddev)
29
+ --dry-run Show what would be done without making changes
30
+
31
+ Examples:
32
+ # Start the agent
33
+ trafic-agent start
34
+ trafic-agent start --config /path/to/config.toml
35
+
36
+ # Setup a new server
37
+ sudo trafic-agent setup --tld=previews.example.com
38
+ sudo trafic-agent setup --tld=previews.example.com --email=admin@example.com
39
+ sudo trafic-agent setup --tld=previews.example.com --no-hardening --dry-run
40
+
41
+ # Run security audit
42
+ trafic-agent audit
43
+ `;
44
+ function printHelp() {
45
+ console.log(HELP.trim());
46
+ }
47
+ function printVersion() {
48
+ console.log("0.1.0");
49
+ }
50
+ async function runStart(values) {
51
+ const config = loadConfig(values.config);
52
+ if (values.port) {
53
+ config.port = parseInt(values.port, 10);
54
+ }
55
+ const errors = validateConfig(config);
56
+ if (errors.length > 0) {
57
+ console.error("Configuration errors:");
58
+ for (const error of errors) {
59
+ console.error(` - ${error}`);
60
+ }
61
+ process.exit(1);
62
+ }
63
+ const shutdown = () => {
64
+ console.log("\nShutting down...");
65
+ closeDb();
66
+ process.exit(0);
67
+ };
68
+ process.on("SIGINT", shutdown);
69
+ process.on("SIGTERM", shutdown);
70
+ startServer(config);
71
+ startIdleScheduler(config);
72
+ }
73
+ async function runSetup(values) {
74
+ const tld = values.tld;
75
+ if (!tld) {
76
+ console.error("Error: --tld is required for setup");
77
+ console.error("Example: trafic-agent setup --tld=previews.example.com");
78
+ process.exit(1);
79
+ }
80
+ await setup({
81
+ tld,
82
+ email: values.email,
83
+ noHardening: values["no-hardening"],
84
+ noDocker: values["no-docker"],
85
+ noDdev: values["no-ddev"],
86
+ sshUsers: values["ssh-users"] ? values["ssh-users"].split(",").map((s) => s.trim()) : void 0,
87
+ dryRun: values["dry-run"]
88
+ });
89
+ }
90
+ async function main() {
91
+ const { values, positionals } = parseArgs({
92
+ allowPositionals: true,
93
+ options: {
94
+ // Common
95
+ help: { type: "boolean", short: "h" },
96
+ // Start options
97
+ config: { type: "string", short: "c" },
98
+ port: { type: "string", short: "p" },
99
+ // Setup options
100
+ tld: { type: "string" },
101
+ email: { type: "string" },
102
+ "no-hardening": { type: "boolean" },
103
+ "no-docker": { type: "boolean" },
104
+ "no-ddev": { type: "boolean" },
105
+ "ssh-users": { type: "string" },
106
+ "dry-run": { type: "boolean" }
107
+ }
108
+ });
109
+ const command = positionals[0] ?? "help";
110
+ if (values.help) {
111
+ printHelp();
112
+ process.exit(0);
113
+ }
114
+ switch (command) {
115
+ case "help":
116
+ printHelp();
117
+ break;
118
+ case "version":
119
+ printVersion();
120
+ break;
121
+ case "start":
122
+ await runStart(values);
123
+ break;
124
+ case "setup":
125
+ await runSetup(values);
126
+ break;
127
+ case "audit":
128
+ await audit();
129
+ break;
130
+ default:
131
+ console.error(`Unknown command: ${command}`);
132
+ printHelp();
133
+ process.exit(1);
134
+ }
135
+ }
136
+ main().catch((error) => {
137
+ console.error("Fatal error:", error);
138
+ process.exit(1);
139
+ });
140
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { parseArgs } from \"node:util\";\nimport { loadConfig, validateConfig } from \"./utils/config.js\";\nimport { startServer } from \"./server.js\";\nimport { startIdleScheduler } from \"./tasks/stop-idle.js\";\nimport { closeDb } from \"./utils/db.js\";\nimport { setup, audit } from \"./setup/index.js\";\n\ndeclare const __VERSION__: string;\n\nconst HELP = `\ntrafic-agent — Server agent for DDEV preview environments\n\nUsage:\n trafic-agent <command> [options]\n\nCommands:\n start Start the agent server\n setup Setup a new server (Docker, DDEV, hardening)\n audit Run security audit checks\n version Show version\n help Show this help\n\nStart options:\n -c, --config <path> Path to config file (default: /etc/trafic/config.toml)\n -p, --port <port> Override port from config\n\nSetup options:\n --tld <domain> TLD for DDEV projects (required)\n --email <email> Email for Let's Encrypt certificates\n --no-hardening Skip server hardening steps\n --no-docker Skip Docker installation\n --no-ddev Skip DDEV installation\n --ssh-users <users> Comma-separated list of SSH users to allow (default: ddev)\n --dry-run Show what would be done without making changes\n\nExamples:\n # Start the agent\n trafic-agent start\n trafic-agent start --config /path/to/config.toml\n\n # Setup a new server\n sudo trafic-agent setup --tld=previews.example.com\n sudo trafic-agent setup --tld=previews.example.com --email=admin@example.com\n sudo trafic-agent setup --tld=previews.example.com --no-hardening --dry-run\n\n # Run security audit\n trafic-agent audit\n`;\n\nfunction printHelp(): void {\n console.log(HELP.trim());\n}\n\nfunction printVersion(): void {\n console.log(__VERSION__);\n}\n\nasync function runStart(values: Record<string, unknown>): Promise<void> {\n // Load config\n const config = loadConfig(values.config as string | undefined);\n\n // Override port if specified\n if (values.port) {\n config.port = parseInt(values.port as string, 10);\n }\n\n // Validate config\n const errors = validateConfig(config);\n if (errors.length > 0) {\n console.error(\"Configuration errors:\");\n for (const error of errors) {\n console.error(` - ${error}`);\n }\n process.exit(1);\n }\n\n // Graceful shutdown\n const shutdown = (): void => {\n console.log(\"\\nShutting down...\");\n closeDb();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n // Start server and scheduler\n startServer(config);\n startIdleScheduler(config);\n}\n\nasync function runSetup(values: Record<string, unknown>): Promise<void> {\n const tld = values.tld as string | undefined;\n\n if (!tld) {\n console.error(\"Error: --tld is required for setup\");\n console.error(\"Example: trafic-agent setup --tld=previews.example.com\");\n process.exit(1);\n }\n\n await setup({\n tld,\n email: values.email as string | undefined,\n noHardening: values[\"no-hardening\"] as boolean | undefined,\n noDocker: values[\"no-docker\"] as boolean | undefined,\n noDdev: values[\"no-ddev\"] as boolean | undefined,\n sshUsers: values[\"ssh-users\"]\n ? (values[\"ssh-users\"] as string).split(\",\").map((s) => s.trim())\n : undefined,\n dryRun: values[\"dry-run\"] as boolean | undefined,\n });\n}\n\nasync function main(): Promise<void> {\n const { values, positionals } = parseArgs({\n allowPositionals: true,\n options: {\n // Common\n help: { type: \"boolean\", short: \"h\" },\n\n // Start options\n config: { type: \"string\", short: \"c\" },\n port: { type: \"string\", short: \"p\" },\n\n // Setup options\n tld: { type: \"string\" },\n email: { type: \"string\" },\n \"no-hardening\": { type: \"boolean\" },\n \"no-docker\": { type: \"boolean\" },\n \"no-ddev\": { type: \"boolean\" },\n \"ssh-users\": { type: \"string\" },\n \"dry-run\": { type: \"boolean\" },\n },\n });\n\n const command = positionals[0] ?? \"help\";\n\n if (values.help) {\n printHelp();\n process.exit(0);\n }\n\n switch (command) {\n case \"help\":\n printHelp();\n break;\n\n case \"version\":\n printVersion();\n break;\n\n case \"start\":\n await runStart(values);\n break;\n\n case \"setup\":\n await runSetup(values);\n break;\n\n case \"audit\":\n await audit();\n break;\n\n default:\n console.error(`Unknown command: ${command}`);\n printHelp();\n process.exit(1);\n }\n}\n\nmain().catch((error) => {\n console.error(\"Fatal error:\", error);\n process.exit(1);\n});\n"],"names":[],"mappings":"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"}