@devskeo/ward-agent 1.0.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 (105) hide show
  1. package/dist/cli/config.d.ts +2 -0
  2. package/dist/cli/config.d.ts.map +1 -0
  3. package/dist/cli/config.js +30 -0
  4. package/dist/cli/config.js.map +1 -0
  5. package/dist/cli/pipe.d.ts +2 -0
  6. package/dist/cli/pipe.d.ts.map +1 -0
  7. package/dist/cli/pipe.js +53 -0
  8. package/dist/cli/pipe.js.map +1 -0
  9. package/dist/cli/service.d.ts +10 -0
  10. package/dist/cli/service.d.ts.map +1 -0
  11. package/dist/cli/service.js +134 -0
  12. package/dist/cli/service.js.map +1 -0
  13. package/dist/cli/start.d.ts +6 -0
  14. package/dist/cli/start.d.ts.map +1 -0
  15. package/dist/cli/start.js +160 -0
  16. package/dist/cli/start.js.map +1 -0
  17. package/dist/cli/status.d.ts +2 -0
  18. package/dist/cli/status.d.ts.map +1 -0
  19. package/dist/cli/status.js +56 -0
  20. package/dist/cli/status.js.map +1 -0
  21. package/dist/cli/stop.d.ts +2 -0
  22. package/dist/cli/stop.d.ts.map +1 -0
  23. package/dist/cli/stop.js +106 -0
  24. package/dist/cli/stop.js.map +1 -0
  25. package/dist/cli/systemd.d.ts +3 -0
  26. package/dist/cli/systemd.d.ts.map +1 -0
  27. package/dist/cli/systemd.js +84 -0
  28. package/dist/cli/systemd.js.map +1 -0
  29. package/dist/config/AgentConfig.d.ts +30 -0
  30. package/dist/config/AgentConfig.d.ts.map +1 -0
  31. package/dist/config/AgentConfig.js +155 -0
  32. package/dist/config/AgentConfig.js.map +1 -0
  33. package/dist/config/ServiceConfig.d.ts +30 -0
  34. package/dist/config/ServiceConfig.d.ts.map +1 -0
  35. package/dist/config/ServiceConfig.js +4 -0
  36. package/dist/config/ServiceConfig.js.map +1 -0
  37. package/dist/daemon.d.ts +2 -0
  38. package/dist/daemon.d.ts.map +1 -0
  39. package/dist/daemon.js +300 -0
  40. package/dist/daemon.js.map +1 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +94 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/logs/LogForwarder.d.ts +22 -0
  46. package/dist/logs/LogForwarder.d.ts.map +1 -0
  47. package/dist/logs/LogForwarder.js +83 -0
  48. package/dist/logs/LogForwarder.js.map +1 -0
  49. package/dist/logs/LogWatcher.d.ts +15 -0
  50. package/dist/logs/LogWatcher.d.ts.map +1 -0
  51. package/dist/logs/LogWatcher.js +111 -0
  52. package/dist/logs/LogWatcher.js.map +1 -0
  53. package/dist/logs/ServiceWatcher.d.ts +32 -0
  54. package/dist/logs/ServiceWatcher.d.ts.map +1 -0
  55. package/dist/logs/ServiceWatcher.js +294 -0
  56. package/dist/logs/ServiceWatcher.js.map +1 -0
  57. package/dist/metrics/CpuCollector.d.ts +9 -0
  58. package/dist/metrics/CpuCollector.d.ts.map +1 -0
  59. package/dist/metrics/CpuCollector.js +24 -0
  60. package/dist/metrics/CpuCollector.js.map +1 -0
  61. package/dist/metrics/DiskCollector.d.ts +11 -0
  62. package/dist/metrics/DiskCollector.d.ts.map +1 -0
  63. package/dist/metrics/DiskCollector.js +51 -0
  64. package/dist/metrics/DiskCollector.js.map +1 -0
  65. package/dist/metrics/IpCollector.d.ts +13 -0
  66. package/dist/metrics/IpCollector.d.ts.map +1 -0
  67. package/dist/metrics/IpCollector.js +34 -0
  68. package/dist/metrics/IpCollector.js.map +1 -0
  69. package/dist/metrics/MemoryCollector.d.ts +12 -0
  70. package/dist/metrics/MemoryCollector.d.ts.map +1 -0
  71. package/dist/metrics/MemoryCollector.js +27 -0
  72. package/dist/metrics/MemoryCollector.js.map +1 -0
  73. package/dist/metrics/NetworkCollector.d.ts +9 -0
  74. package/dist/metrics/NetworkCollector.d.ts.map +1 -0
  75. package/dist/metrics/NetworkCollector.js +24 -0
  76. package/dist/metrics/NetworkCollector.js.map +1 -0
  77. package/dist/metrics/ProcessCollector.d.ts +16 -0
  78. package/dist/metrics/ProcessCollector.d.ts.map +1 -0
  79. package/dist/metrics/ProcessCollector.js +34 -0
  80. package/dist/metrics/ProcessCollector.js.map +1 -0
  81. package/dist/start-dev.d.ts +2 -0
  82. package/dist/start-dev.d.ts.map +1 -0
  83. package/dist/start-dev.js +205 -0
  84. package/dist/start-dev.js.map +1 -0
  85. package/dist/start-self.d.ts +2 -0
  86. package/dist/start-self.d.ts.map +1 -0
  87. package/dist/start-self.js +271 -0
  88. package/dist/start-self.js.map +1 -0
  89. package/dist/transport/HttpClient.d.ts +53 -0
  90. package/dist/transport/HttpClient.d.ts.map +1 -0
  91. package/dist/transport/HttpClient.js +172 -0
  92. package/dist/transport/HttpClient.js.map +1 -0
  93. package/dist/transport/Queue.d.ts +29 -0
  94. package/dist/transport/Queue.d.ts.map +1 -0
  95. package/dist/transport/Queue.js +74 -0
  96. package/dist/transport/Queue.js.map +1 -0
  97. package/dist/transport/ReconnectManager.d.ts +14 -0
  98. package/dist/transport/ReconnectManager.d.ts.map +1 -0
  99. package/dist/transport/ReconnectManager.js +59 -0
  100. package/dist/transport/ReconnectManager.js.map +1 -0
  101. package/dist/types/index.d.ts +35 -0
  102. package/dist/types/index.d.ts.map +1 -0
  103. package/dist/types/index.js +3 -0
  104. package/dist/types/index.js.map +1 -0
  105. package/package.json +41 -0
@@ -0,0 +1,2 @@
1
+ export declare function configShow(): void;
2
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAMA,wBAAgB,UAAU,IAAI,IAAI,CA0BjC"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configShow = configShow;
4
+ const AgentConfig_js_1 = require("../config/AgentConfig.js");
5
+ // ward config show - 현재 설정 출력
6
+ function configShow() {
7
+ const config = (0, AgentConfig_js_1.loadConfig)();
8
+ const configPath = (0, AgentConfig_js_1.getConfigPath)();
9
+ console.log(`설정 파일: ${configPath}\n`);
10
+ if (!config) {
11
+ console.log('설정 파일이 없습니다. `ward start <서버 URL>`로 에이전트를 시작하세요.');
12
+ return;
13
+ }
14
+ console.log('현재 설정:');
15
+ console.log(` 서버 URL: ${config.server.url}`);
16
+ if (config.server.groupName) {
17
+ console.log(` 그룹명: ${config.server.groupName}`);
18
+ }
19
+ console.log(` 메트릭 수집 주기: ${config.metrics.interval}초`);
20
+ if (config.services.length > 0) {
21
+ console.log(' 등록 서비스:');
22
+ config.services.forEach((svc) => {
23
+ console.log(` - ${svc.name} (${svc.method})`);
24
+ });
25
+ }
26
+ else {
27
+ console.log(' 등록 서비스: 없음');
28
+ }
29
+ }
30
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":";;AAMA,gCA0BC;AAhCD,6DAGkC;AAElC,8BAA8B;AAC9B,SAAgB,UAAU;IACxB,MAAM,MAAM,GAAG,IAAA,2BAAU,GAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,IAAA,8BAAa,GAAE,CAAC;IAEnC,OAAO,CAAC,GAAG,CAAC,UAAU,UAAU,IAAI,CAAC,CAAC;IAEtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IAExD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function pipe(serviceName: string): Promise<void>;
2
+ //# sourceMappingURL=pipe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipe.d.ts","sourceRoot":"","sources":["../../src/cli/pipe.ts"],"names":[],"mappings":"AAOA,wBAAsB,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiD7D"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.pipe = pipe;
7
+ const readline_1 = __importDefault(require("readline"));
8
+ const AgentConfig_js_1 = require("../config/AgentConfig.js");
9
+ const HttpClient_js_1 = require("../transport/HttpClient.js");
10
+ const LogForwarder_js_1 = require("../logs/LogForwarder.js");
11
+ // stdin을 읽어서 지정된 서비스 이름으로 로그 전송
12
+ // 사용 예: node app.js 2>&1 | ward pipe my-api
13
+ async function pipe(serviceName) {
14
+ const state = (0, AgentConfig_js_1.loadState)();
15
+ if (!state) {
16
+ console.error('에이전트가 등록되지 않았습니다. ward start <url> 먼저 실행하세요.');
17
+ process.exit(1);
18
+ return;
19
+ }
20
+ const client = new HttpClient_js_1.HttpClient({
21
+ serverUrl: state.serverUrl,
22
+ serverId: state.serverId,
23
+ });
24
+ const forwarder = new LogForwarder_js_1.LogForwarder({
25
+ client,
26
+ batchSize: 50,
27
+ flushIntervalMs: 2000,
28
+ });
29
+ forwarder.start();
30
+ const rl = readline_1.default.createInterface({
31
+ input: process.stdin,
32
+ crlfDelay: Infinity,
33
+ });
34
+ console.error(`[ward pipe] "${serviceName}" 로그 전송 시작 (Ctrl+C 또는 EOF로 종료)`);
35
+ rl.on('line', (line) => {
36
+ forwarder.addLog(serviceName, line);
37
+ });
38
+ const shutdown = async () => {
39
+ rl.close();
40
+ await forwarder.stop();
41
+ process.exit(0);
42
+ };
43
+ rl.on('close', () => {
44
+ void forwarder.stop().then(() => process.exit(0));
45
+ });
46
+ process.on('SIGINT', () => {
47
+ void shutdown();
48
+ });
49
+ process.on('SIGTERM', () => {
50
+ void shutdown();
51
+ });
52
+ }
53
+ //# sourceMappingURL=pipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipe.js","sourceRoot":"","sources":["../../src/cli/pipe.ts"],"names":[],"mappings":";;;;;AAOA,oBAiDC;AAxDD,wDAAgC;AAChC,6DAAqD;AACrD,8DAAwD;AACxD,6DAAuD;AAEvD,gCAAgC;AAChC,4CAA4C;AACrC,KAAK,UAAU,IAAI,CAAC,WAAmB;IAC5C,MAAM,KAAK,GAAG,IAAA,0BAAS,GAAE,CAAC;IAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,0BAAU,CAAC;QAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,8BAAY,CAAC;QACjC,MAAM;QACN,SAAS,EAAE,EAAE;QACb,eAAe,EAAE,IAAI;KACtB,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,EAAE,CAAC;IAElB,MAAM,EAAE,GAAG,kBAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAC;IAEH,OAAO,CAAC,KAAK,CAAC,gBAAgB,WAAW,gCAAgC,CAAC,CAAC;IAE3E,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACrB,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAClB,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,KAAK,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,KAAK,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare function serviceAdd(name: string, options: {
2
+ log?: string[];
3
+ exec?: string;
4
+ cwd?: string;
5
+ journal?: string;
6
+ docker?: string;
7
+ }): Promise<void>;
8
+ export declare function serviceRemove(name: string): Promise<void>;
9
+ export declare function serviceList(): void;
10
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/cli/service.ts"],"names":[],"mappings":"AAoCA,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAGD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC/D;AAGD,wBAAgB,WAAW,IAAI,IAAI,CAmBlC"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.serviceAdd = serviceAdd;
7
+ exports.serviceRemove = serviceRemove;
8
+ exports.serviceList = serviceList;
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const AgentConfig_js_1 = require("../config/AgentConfig.js");
11
+ const HttpClient_js_1 = require("../transport/HttpClient.js");
12
+ // 실행 중인 데몬에 SIGUSR1 시그널 전송 (설정 재로드)
13
+ function signalDaemon() {
14
+ const pidPath = (0, AgentConfig_js_1.getPidPath)();
15
+ if (!fs_1.default.existsSync(pidPath))
16
+ return;
17
+ try {
18
+ const pid = parseInt(fs_1.default.readFileSync(pidPath, 'utf-8').trim(), 10);
19
+ process.kill(pid, 'SIGUSR1');
20
+ console.log('데몬에 설정 재로드 시그널을 전송했습니다.');
21
+ }
22
+ catch {
23
+ // 데몬이 없으면 무시
24
+ }
25
+ }
26
+ // 현재 config 로드 (없으면 빈 config 반환)
27
+ function getConfig() {
28
+ return (0, AgentConfig_js_1.loadConfig)() ?? {
29
+ server: { url: '' },
30
+ metrics: { interval: 30 },
31
+ services: [],
32
+ };
33
+ }
34
+ // ward service add <name> [옵션들]
35
+ async function serviceAdd(name, options) {
36
+ const config = getConfig();
37
+ let service;
38
+ if (options.exec) {
39
+ service = { name, method: 'exec', command: options.exec, restartDelay: 3000 };
40
+ }
41
+ else if (options.journal) {
42
+ service = { name, method: 'journal', unit: options.journal };
43
+ }
44
+ else if (options.docker) {
45
+ service = { name, method: 'docker', container: options.docker };
46
+ }
47
+ else if (options.log && options.log.length > 0) {
48
+ service = { name, method: 'file', paths: options.log };
49
+ }
50
+ else {
51
+ console.error('서비스 타입을 지정하세요:');
52
+ console.error(' --log <경로> 로그 파일 감시');
53
+ console.error(' --exec <명령어> 프로세스 실행 및 stdout/stderr 수집');
54
+ console.error(' --journal <유닛> systemd 유닛 로그 수집');
55
+ console.error(' --docker <컨테이너> 도커 컨테이너 로그 수집');
56
+ process.exit(1);
57
+ return;
58
+ }
59
+ const newConfig = (0, AgentConfig_js_1.addService)(config, service);
60
+ (0, AgentConfig_js_1.saveConfig)(newConfig);
61
+ console.log(`서비스 "${name}" (${service.method}) 등록 완료.`);
62
+ // 서버에 서비스 목록 동기화 시도
63
+ const state = (0, AgentConfig_js_1.loadState)();
64
+ if (state) {
65
+ const client = new HttpClient_js_1.HttpClient({ serverUrl: state.serverUrl, serverId: state.serverId });
66
+ const allServices = newConfig.services.map(svc => ({
67
+ name: svc.name,
68
+ type: svc.method,
69
+ config: svc,
70
+ status: 'unknown',
71
+ }));
72
+ await client.syncServices(allServices).catch(() => {
73
+ // 서버 미연결 시 무시 (데몬이 시작될 때 sync됨)
74
+ });
75
+ }
76
+ signalDaemon();
77
+ }
78
+ // ward service remove <name>
79
+ async function serviceRemove(name) {
80
+ const config = (0, AgentConfig_js_1.loadConfig)();
81
+ if (!config) {
82
+ console.error('설정 파일이 없습니다. ward start 먼저 실행하세요.');
83
+ process.exit(1);
84
+ return;
85
+ }
86
+ const exists = config.services.some(s => s.name === name);
87
+ if (!exists) {
88
+ console.error(`서비스 "${name}"을 찾을 수 없습니다.`);
89
+ process.exit(1);
90
+ return;
91
+ }
92
+ const newConfig = (0, AgentConfig_js_1.removeService)(config, name);
93
+ (0, AgentConfig_js_1.saveConfig)(newConfig);
94
+ console.log(`서비스 "${name}" 제거 완료.`);
95
+ // 서버에 서비스 목록 동기화 시도
96
+ const state = (0, AgentConfig_js_1.loadState)();
97
+ if (state) {
98
+ const client = new HttpClient_js_1.HttpClient({ serverUrl: state.serverUrl, serverId: state.serverId });
99
+ const remainingServices = newConfig.services.map(svc => ({
100
+ name: svc.name,
101
+ type: svc.method,
102
+ config: svc,
103
+ status: 'unknown',
104
+ }));
105
+ await client.syncServices(remainingServices).catch(() => { });
106
+ }
107
+ signalDaemon();
108
+ }
109
+ // ward service list
110
+ function serviceList() {
111
+ const config = (0, AgentConfig_js_1.loadConfig)();
112
+ if (!config || config.services.length === 0) {
113
+ console.log('등록된 서비스가 없습니다.');
114
+ return;
115
+ }
116
+ console.log('\n등록된 서비스 목록:');
117
+ console.log('─'.repeat(60));
118
+ for (const svc of config.services) {
119
+ let detail = '';
120
+ if (svc.method === 'file')
121
+ detail = svc.paths.join(', ');
122
+ if (svc.method === 'exec')
123
+ detail = svc.command;
124
+ if (svc.method === 'journal')
125
+ detail = svc.unit;
126
+ if (svc.method === 'docker')
127
+ detail = svc.container;
128
+ if (svc.method === 'pipe')
129
+ detail = svc.command;
130
+ console.log(` ${svc.name.padEnd(20)} [${svc.method}] ${detail}`);
131
+ }
132
+ console.log('─'.repeat(60));
133
+ }
134
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/cli/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function isAgentRunning(): boolean;
2
+ export declare function normalizeUrl(url: string): string;
3
+ export declare function start(serverUrl: string, options?: {
4
+ name?: string;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/cli/start.ts"],"names":[],"mappings":"AAgBA,wBAAgB,cAAc,IAAI,OAAO,CA2BxC;AAGD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGhD;AA6BD,wBAAsB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAmE7F"}
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.isAgentRunning = isAgentRunning;
40
+ exports.normalizeUrl = normalizeUrl;
41
+ exports.start = start;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const os = __importStar(require("os"));
45
+ const child_process_1 = require("child_process");
46
+ const systeminformation_1 = __importDefault(require("systeminformation"));
47
+ const AgentConfig_js_1 = require("../config/AgentConfig.js");
48
+ const HttpClient_js_1 = require("../transport/HttpClient.js");
49
+ const systemd_js_1 = require("./systemd.js");
50
+ // 에이전트가 이미 실행 중인지 확인
51
+ function isAgentRunning() {
52
+ const pidPath = (0, AgentConfig_js_1.getPidPath)();
53
+ if (!fs.existsSync(pidPath)) {
54
+ return false;
55
+ }
56
+ try {
57
+ const pidStr = fs.readFileSync(pidPath, 'utf-8').trim();
58
+ const pid = parseInt(pidStr, 10);
59
+ if (isNaN(pid)) {
60
+ return false;
61
+ }
62
+ // 프로세스 존재 여부 확인 (시그널 0 전송)
63
+ process.kill(pid, 0);
64
+ return true;
65
+ }
66
+ catch {
67
+ // 프로세스가 존재하지 않으면 PID 파일 삭제
68
+ try {
69
+ fs.unlinkSync(pidPath);
70
+ }
71
+ catch {
72
+ // 파일 삭제 실패는 무시
73
+ }
74
+ return false;
75
+ }
76
+ }
77
+ // URL 정규화 (http:// 또는 https:// 없으면 https:// 자동 추가)
78
+ function normalizeUrl(url) {
79
+ if (url.startsWith('http://') || url.startsWith('https://'))
80
+ return url;
81
+ return `https://${url}`;
82
+ }
83
+ // Ward 서버에 등록 시도
84
+ async function registerWithServer(serverUrl, hostname, groupName) {
85
+ try {
86
+ // OS 정보 수집
87
+ const osData = await systeminformation_1.default.osInfo();
88
+ const osInfo = {
89
+ osName: osData.distro,
90
+ osVersion: osData.release,
91
+ arch: osData.arch,
92
+ };
93
+ const tempClient = new HttpClient_js_1.HttpClient({ serverUrl, serverId: '' });
94
+ const result = await tempClient.register(hostname, groupName, osInfo);
95
+ return { success: true, serverId: result.serverId };
96
+ }
97
+ catch (error) {
98
+ return {
99
+ success: false,
100
+ error: error instanceof Error ? error.message : '알 수 없는 오류',
101
+ };
102
+ }
103
+ }
104
+ // ward start <serverUrl> [--name <groupName>]
105
+ async function start(serverUrl, options = {}) {
106
+ // 1. 서버 URL 정규화
107
+ const normalizedUrl = normalizeUrl(serverUrl);
108
+ // 2. 이미 실행 중인지 확인
109
+ if (isAgentRunning()) {
110
+ console.log('에이전트가 이미 실행 중입니다.');
111
+ return;
112
+ }
113
+ // 3. Ward 디렉토리 생성
114
+ const wardDir = (0, AgentConfig_js_1.getWardDir)();
115
+ if (!fs.existsSync(wardDir)) {
116
+ fs.mkdirSync(wardDir, { recursive: true });
117
+ }
118
+ // 4. 자동 등록
119
+ const hostname = os.hostname();
120
+ const registerResult = await registerWithServer(normalizedUrl, hostname, options.name);
121
+ if (!registerResult.success) {
122
+ console.warn(`서버 등록 실패: ${registerResult.error}`);
123
+ console.warn('데몬을 시작하고 서버가 올라오면 자동으로 재시도합니다.');
124
+ }
125
+ // 5. state 저장
126
+ (0, AgentConfig_js_1.saveState)({
127
+ serverId: registerResult.serverId ?? '',
128
+ serverUrl: normalizedUrl,
129
+ hostname,
130
+ });
131
+ // 6. config 저장
132
+ (0, AgentConfig_js_1.saveConfig)({
133
+ server: { url: normalizedUrl, groupName: options.name },
134
+ metrics: { interval: 30 },
135
+ services: [],
136
+ });
137
+ // 7. 데몬 프로세스 시작
138
+ const daemonScript = path.join(__dirname, '../daemon.js');
139
+ const child = (0, child_process_1.spawn)('node', [daemonScript], {
140
+ detached: true,
141
+ stdio: 'ignore',
142
+ env: { ...process.env, WARD_DAEMON: 'true' },
143
+ });
144
+ child.unref();
145
+ if (child.pid === undefined) {
146
+ console.error('에이전트 시작 실패: 프로세스 PID를 가져올 수 없습니다.');
147
+ process.exit(1);
148
+ return;
149
+ }
150
+ // PID 파일 저장
151
+ const pidPath = (0, AgentConfig_js_1.getPidPath)();
152
+ fs.writeFileSync(pidPath, String(child.pid), 'utf-8');
153
+ console.log(`에이전트가 시작되었습니다. (PID: ${child.pid})`);
154
+ console.log(`서버: ${normalizedUrl}`);
155
+ // 8. systemd 서비스 등록 (Linux 전용)
156
+ if (process.platform === 'linux') {
157
+ await (0, systemd_js_1.setupSystemd)(normalizedUrl, options.name);
158
+ }
159
+ }
160
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/cli/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function status(): void;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AAKA,wBAAgB,MAAM,IAAI,IAAI,CAe7B"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.status = status;
37
+ const fs = __importStar(require("fs"));
38
+ const AgentConfig_js_1 = require("../config/AgentConfig.js");
39
+ const start_js_1 = require("./start.js");
40
+ // ward status - 에이전트 상태 확인
41
+ function status() {
42
+ const pidPath = (0, AgentConfig_js_1.getPidPath)();
43
+ const running = (0, start_js_1.isAgentRunning)();
44
+ if (running) {
45
+ const pidStr = fs.readFileSync(pidPath, 'utf-8').trim();
46
+ const config = (0, AgentConfig_js_1.loadConfig)();
47
+ console.log('에이전트 상태: 실행 중');
48
+ console.log(`PID: ${pidStr}`);
49
+ console.log(`서버: ${config?.server.url ?? '-'}`);
50
+ console.log(`메트릭 수집 주기: ${config?.metrics.interval ?? 30}초`);
51
+ }
52
+ else {
53
+ console.log('에이전트 상태: 중지됨');
54
+ }
55
+ }
56
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,wBAeC;AApBD,uCAAyB;AACzB,6DAAkE;AAClE,yCAA4C;AAE5C,2BAA2B;AAC3B,SAAgB,MAAM;IACpB,MAAM,OAAO,GAAG,IAAA,2BAAU,GAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAA,yBAAc,GAAE,CAAC;IAEjC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,IAAA,2BAAU,GAAE,CAAC;QAE5B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function stop(): Promise<void>;
2
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/cli/stop.ts"],"names":[],"mappings":"AAaA,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA0D1C"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.stop = stop;
37
+ const fs = __importStar(require("fs"));
38
+ const AgentConfig_js_1 = require("../config/AgentConfig.js");
39
+ const AgentConfig_js_2 = require("../config/AgentConfig.js");
40
+ const HttpClient_js_1 = require("../transport/HttpClient.js");
41
+ const systemd_js_1 = require("./systemd.js");
42
+ // 서버에 등록 해제 요청
43
+ async function unregisterFromServer(serverUrl, serverId) {
44
+ const client = new HttpClient_js_1.HttpClient({ serverUrl, serverId });
45
+ await client.unregister().catch(() => { });
46
+ }
47
+ // ward stop - 에이전트 중지
48
+ async function stop() {
49
+ // 1. state 로드해서 serverId 확인
50
+ const state = (0, AgentConfig_js_2.loadState)();
51
+ // 2. 서버에 unregister 요청 (실패해도 계속 진행)
52
+ if (state?.serverId) {
53
+ await unregisterFromServer(state.serverUrl, state.serverId).catch(() => { });
54
+ }
55
+ const pidPath = (0, AgentConfig_js_1.getPidPath)();
56
+ // 3. 데몬 프로세스 종료 (SIGTERM)
57
+ if (!fs.existsSync(pidPath)) {
58
+ console.log('에이전트가 실행 중이지 않습니다.');
59
+ }
60
+ else {
61
+ try {
62
+ const pidStr = fs.readFileSync(pidPath, 'utf-8').trim();
63
+ const pid = parseInt(pidStr, 10);
64
+ if (isNaN(pid)) {
65
+ console.error('PID 파일이 손상되었습니다.');
66
+ }
67
+ else {
68
+ process.kill(pid, 'SIGTERM');
69
+ console.log(`에이전트가 중지되었습니다. (PID: ${pid})`);
70
+ }
71
+ }
72
+ catch (error) {
73
+ if (error instanceof Error && 'code' in error && error.code === 'ESRCH') {
74
+ console.log('에이전트가 이미 종료되어 있습니다.');
75
+ }
76
+ else {
77
+ console.error('에이전트 중지 실패:', error);
78
+ }
79
+ }
80
+ }
81
+ // 4. systemd 서비스 비활성화 (Linux 전용)
82
+ if (process.platform === 'linux') {
83
+ await (0, systemd_js_1.removeSystemd)().catch(() => { });
84
+ }
85
+ // 5. state 파일 삭제
86
+ try {
87
+ const { getStatePath } = await import('../config/AgentConfig.js');
88
+ const statePath = getStatePath();
89
+ if (fs.existsSync(statePath)) {
90
+ fs.unlinkSync(statePath);
91
+ }
92
+ }
93
+ catch {
94
+ // 무시
95
+ }
96
+ // 6. PID 파일 삭제
97
+ try {
98
+ if (fs.existsSync(pidPath)) {
99
+ fs.unlinkSync(pidPath);
100
+ }
101
+ }
102
+ catch {
103
+ // 무시
104
+ }
105
+ }
106
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/cli/stop.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,oBA0DC;AAvED,uCAAyB;AACzB,6DAAsD;AACtD,6DAAqD;AACrD,8DAAwD;AACxD,6CAA6C;AAE7C,eAAe;AACf,KAAK,UAAU,oBAAoB,CAAC,SAAiB,EAAE,QAAgB;IACrE,MAAM,MAAM,GAAG,IAAI,0BAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvD,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,sBAAsB;AACf,KAAK,UAAU,IAAI;IACxB,4BAA4B;IAC5B,MAAM,KAAK,GAAG,IAAA,0BAAS,GAAE,CAAC;IAE1B,oCAAoC;IACpC,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;QACpB,MAAM,oBAAoB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,2BAAU,GAAE,CAAC;IAE7B,0BAA0B;IAC1B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAEjC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,GAAG,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAK,KAA+B,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACnG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,IAAA,0BAAa,GAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,iBAAiB;IACjB,IAAI,CAAC;QACH,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,KAAK;IACP,CAAC;IAED,eAAe;IACf,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,KAAK;IACP,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function setupSystemd(serverUrl: string, groupName?: string): Promise<void>;
2
+ export declare function removeSystemd(): Promise<void>;
3
+ //# sourceMappingURL=systemd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemd.d.ts","sourceRoot":"","sources":["../../src/cli/systemd.ts"],"names":[],"mappings":"AASA,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBvF;AAGD,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAWnD"}