@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.
- package/dist/cli/config.d.ts +2 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +30 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/pipe.d.ts +2 -0
- package/dist/cli/pipe.d.ts.map +1 -0
- package/dist/cli/pipe.js +53 -0
- package/dist/cli/pipe.js.map +1 -0
- package/dist/cli/service.d.ts +10 -0
- package/dist/cli/service.d.ts.map +1 -0
- package/dist/cli/service.js +134 -0
- package/dist/cli/service.js.map +1 -0
- package/dist/cli/start.d.ts +6 -0
- package/dist/cli/start.d.ts.map +1 -0
- package/dist/cli/start.js +160 -0
- package/dist/cli/start.js.map +1 -0
- package/dist/cli/status.d.ts +2 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +56 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/stop.d.ts +2 -0
- package/dist/cli/stop.d.ts.map +1 -0
- package/dist/cli/stop.js +106 -0
- package/dist/cli/stop.js.map +1 -0
- package/dist/cli/systemd.d.ts +3 -0
- package/dist/cli/systemd.d.ts.map +1 -0
- package/dist/cli/systemd.js +84 -0
- package/dist/cli/systemd.js.map +1 -0
- package/dist/config/AgentConfig.d.ts +30 -0
- package/dist/config/AgentConfig.d.ts.map +1 -0
- package/dist/config/AgentConfig.js +155 -0
- package/dist/config/AgentConfig.js.map +1 -0
- package/dist/config/ServiceConfig.d.ts +30 -0
- package/dist/config/ServiceConfig.d.ts.map +1 -0
- package/dist/config/ServiceConfig.js +4 -0
- package/dist/config/ServiceConfig.js.map +1 -0
- package/dist/daemon.d.ts +2 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +300 -0
- package/dist/daemon.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +94 -0
- package/dist/index.js.map +1 -0
- package/dist/logs/LogForwarder.d.ts +22 -0
- package/dist/logs/LogForwarder.d.ts.map +1 -0
- package/dist/logs/LogForwarder.js +83 -0
- package/dist/logs/LogForwarder.js.map +1 -0
- package/dist/logs/LogWatcher.d.ts +15 -0
- package/dist/logs/LogWatcher.d.ts.map +1 -0
- package/dist/logs/LogWatcher.js +111 -0
- package/dist/logs/LogWatcher.js.map +1 -0
- package/dist/logs/ServiceWatcher.d.ts +32 -0
- package/dist/logs/ServiceWatcher.d.ts.map +1 -0
- package/dist/logs/ServiceWatcher.js +294 -0
- package/dist/logs/ServiceWatcher.js.map +1 -0
- package/dist/metrics/CpuCollector.d.ts +9 -0
- package/dist/metrics/CpuCollector.d.ts.map +1 -0
- package/dist/metrics/CpuCollector.js +24 -0
- package/dist/metrics/CpuCollector.js.map +1 -0
- package/dist/metrics/DiskCollector.d.ts +11 -0
- package/dist/metrics/DiskCollector.d.ts.map +1 -0
- package/dist/metrics/DiskCollector.js +51 -0
- package/dist/metrics/DiskCollector.js.map +1 -0
- package/dist/metrics/IpCollector.d.ts +13 -0
- package/dist/metrics/IpCollector.d.ts.map +1 -0
- package/dist/metrics/IpCollector.js +34 -0
- package/dist/metrics/IpCollector.js.map +1 -0
- package/dist/metrics/MemoryCollector.d.ts +12 -0
- package/dist/metrics/MemoryCollector.d.ts.map +1 -0
- package/dist/metrics/MemoryCollector.js +27 -0
- package/dist/metrics/MemoryCollector.js.map +1 -0
- package/dist/metrics/NetworkCollector.d.ts +9 -0
- package/dist/metrics/NetworkCollector.d.ts.map +1 -0
- package/dist/metrics/NetworkCollector.js +24 -0
- package/dist/metrics/NetworkCollector.js.map +1 -0
- package/dist/metrics/ProcessCollector.d.ts +16 -0
- package/dist/metrics/ProcessCollector.d.ts.map +1 -0
- package/dist/metrics/ProcessCollector.js +34 -0
- package/dist/metrics/ProcessCollector.js.map +1 -0
- package/dist/start-dev.d.ts +2 -0
- package/dist/start-dev.d.ts.map +1 -0
- package/dist/start-dev.js +205 -0
- package/dist/start-dev.js.map +1 -0
- package/dist/start-self.d.ts +2 -0
- package/dist/start-self.d.ts.map +1 -0
- package/dist/start-self.js +271 -0
- package/dist/start-self.js.map +1 -0
- package/dist/transport/HttpClient.d.ts +53 -0
- package/dist/transport/HttpClient.d.ts.map +1 -0
- package/dist/transport/HttpClient.js +172 -0
- package/dist/transport/HttpClient.js.map +1 -0
- package/dist/transport/Queue.d.ts +29 -0
- package/dist/transport/Queue.d.ts.map +1 -0
- package/dist/transport/Queue.js +74 -0
- package/dist/transport/Queue.js.map +1 -0
- package/dist/transport/ReconnectManager.d.ts +14 -0
- package/dist/transport/ReconnectManager.d.ts.map +1 -0
- package/dist/transport/ReconnectManager.js +59 -0
- package/dist/transport/ReconnectManager.js.map +1 -0
- package/dist/types/index.d.ts +35 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,84 @@
|
|
|
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.setupSystemd = setupSystemd;
|
|
37
|
+
exports.removeSystemd = removeSystemd;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const child_process_1 = require("child_process");
|
|
40
|
+
const util_1 = require("util");
|
|
41
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
42
|
+
const SERVICE_PATH = '/etc/systemd/system/ward-agent.service';
|
|
43
|
+
// Linux 전용: systemd 서비스 등록
|
|
44
|
+
async function setupSystemd(serverUrl, groupName) {
|
|
45
|
+
const nameArg = groupName ? ` --name "${groupName}"` : '';
|
|
46
|
+
const serviceContent = `[Unit]
|
|
47
|
+
Description=Ward Monitoring Agent
|
|
48
|
+
After=network.target
|
|
49
|
+
|
|
50
|
+
[Service]
|
|
51
|
+
Type=simple
|
|
52
|
+
ExecStart=${process.execPath} ${process.argv[1]} start ${serverUrl}${nameArg}
|
|
53
|
+
Restart=always
|
|
54
|
+
RestartSec=10
|
|
55
|
+
|
|
56
|
+
[Install]
|
|
57
|
+
WantedBy=multi-user.target
|
|
58
|
+
`;
|
|
59
|
+
try {
|
|
60
|
+
fs.writeFileSync(SERVICE_PATH, serviceContent, 'utf-8');
|
|
61
|
+
await execAsync('systemctl enable ward-agent');
|
|
62
|
+
await execAsync('systemctl start ward-agent');
|
|
63
|
+
console.log('systemd 서비스가 등록되었습니다.');
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
// 권한 없음 등 실패는 경고만 출력
|
|
67
|
+
console.warn('systemd 서비스 등록 실패 (root 권한 필요):', error instanceof Error ? error.message : error);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Linux 전용: systemd 서비스 제거
|
|
71
|
+
async function removeSystemd() {
|
|
72
|
+
try {
|
|
73
|
+
await execAsync('systemctl stop ward-agent').catch(() => { });
|
|
74
|
+
await execAsync('systemctl disable ward-agent').catch(() => { });
|
|
75
|
+
if (fs.existsSync(SERVICE_PATH)) {
|
|
76
|
+
fs.unlinkSync(SERVICE_PATH);
|
|
77
|
+
}
|
|
78
|
+
console.log('systemd 서비스가 제거되었습니다.');
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.warn('systemd 서비스 제거 실패:', error instanceof Error ? error.message : error);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=systemd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systemd.js","sourceRoot":"","sources":["../../src/cli/systemd.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,oCAyBC;AAGD,sCAWC;AAhDD,uCAAyB;AACzB,iDAAqC;AACrC,+BAAiC;AAEjC,MAAM,SAAS,GAAG,IAAA,gBAAS,EAAC,oBAAI,CAAC,CAAC;AAElC,MAAM,YAAY,GAAG,wCAAwC,CAAC;AAE9D,2BAA2B;AACpB,KAAK,UAAU,YAAY,CAAC,SAAiB,EAAE,SAAkB;IACtE,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,YAAY,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1D,MAAM,cAAc,GAAG;;;;;;YAMb,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,SAAS,GAAG,OAAO;;;;;;CAM3E,CAAC;IAEA,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,SAAS,CAAC,6BAA6B,CAAC,CAAC;QAC/C,MAAM,SAAS,CAAC,4BAA4B,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,qBAAqB;QACrB,OAAO,CAAC,IAAI,CAAC,iCAAiC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAClG,CAAC;AACH,CAAC;AAED,2BAA2B;AACpB,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,2BAA2B,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC7D,MAAM,SAAS,CAAC,8BAA8B,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAChE,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACrF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ServiceConfig } from './ServiceConfig.js';
|
|
2
|
+
export type { ServiceConfig } from './ServiceConfig.js';
|
|
3
|
+
export interface AgentConfig {
|
|
4
|
+
server: {
|
|
5
|
+
url: string;
|
|
6
|
+
groupName?: string;
|
|
7
|
+
};
|
|
8
|
+
metrics: {
|
|
9
|
+
interval: number;
|
|
10
|
+
};
|
|
11
|
+
services: ServiceConfig[];
|
|
12
|
+
}
|
|
13
|
+
export type AgentConfigData = AgentConfig;
|
|
14
|
+
export interface AgentState {
|
|
15
|
+
serverId: string;
|
|
16
|
+
serverUrl: string;
|
|
17
|
+
hostname: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function getWardDir(): string;
|
|
20
|
+
export declare function getConfigPath(): string;
|
|
21
|
+
export declare function getStatePath(): string;
|
|
22
|
+
export declare function getPidPath(): string;
|
|
23
|
+
export declare function loadConfig(): AgentConfig | null;
|
|
24
|
+
export declare function saveConfig(config: AgentConfig): void;
|
|
25
|
+
export declare function loadState(): AgentState | null;
|
|
26
|
+
export declare function saveState(state: AgentState): void;
|
|
27
|
+
export declare function addService(config: AgentConfig, service: ServiceConfig): AgentConfig;
|
|
28
|
+
export declare function removeService(config: AgentConfig, name: string): AgentConfig;
|
|
29
|
+
export declare function validateConfig(config: AgentConfig): string[];
|
|
30
|
+
//# sourceMappingURL=AgentConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentConfig.d.ts","sourceRoot":"","sources":["../../src/config/AgentConfig.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAGD,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC;AAG1C,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAcD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAGD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAGD,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAGD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAGD,wBAAgB,UAAU,IAAI,WAAW,GAAG,IAAI,CAyB/C;AAGD,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAUpD;AAGD,wBAAgB,SAAS,IAAI,UAAU,GAAG,IAAI,CAc7C;AAGD,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CASjD;AAGD,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,WAAW,CAGnF;AAGD,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAE5E;AAGD,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAY5D"}
|
|
@@ -0,0 +1,155 @@
|
|
|
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.getWardDir = getWardDir;
|
|
37
|
+
exports.getConfigPath = getConfigPath;
|
|
38
|
+
exports.getStatePath = getStatePath;
|
|
39
|
+
exports.getPidPath = getPidPath;
|
|
40
|
+
exports.loadConfig = loadConfig;
|
|
41
|
+
exports.saveConfig = saveConfig;
|
|
42
|
+
exports.loadState = loadState;
|
|
43
|
+
exports.saveState = saveState;
|
|
44
|
+
exports.addService = addService;
|
|
45
|
+
exports.removeService = removeService;
|
|
46
|
+
exports.validateConfig = validateConfig;
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const os = __importStar(require("os"));
|
|
50
|
+
// 기본 설정값
|
|
51
|
+
const DEFAULT_CONFIG = {
|
|
52
|
+
server: {
|
|
53
|
+
url: 'http://localhost:3000',
|
|
54
|
+
},
|
|
55
|
+
metrics: {
|
|
56
|
+
interval: 30,
|
|
57
|
+
},
|
|
58
|
+
services: [],
|
|
59
|
+
};
|
|
60
|
+
// Ward 설정 디렉토리 경로
|
|
61
|
+
function getWardDir() {
|
|
62
|
+
return path.join(os.homedir(), '.ward');
|
|
63
|
+
}
|
|
64
|
+
// 설정 파일 경로 (JSON)
|
|
65
|
+
function getConfigPath() {
|
|
66
|
+
return path.join(getWardDir(), 'config.json');
|
|
67
|
+
}
|
|
68
|
+
// 상태 파일 경로
|
|
69
|
+
function getStatePath() {
|
|
70
|
+
return path.join(getWardDir(), 'state.json');
|
|
71
|
+
}
|
|
72
|
+
// PID 파일 경로
|
|
73
|
+
function getPidPath() {
|
|
74
|
+
return path.join(getWardDir(), 'agent.pid');
|
|
75
|
+
}
|
|
76
|
+
// 설정 파일 로드
|
|
77
|
+
function loadConfig() {
|
|
78
|
+
const configPath = getConfigPath();
|
|
79
|
+
if (!fs.existsSync(configPath)) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
84
|
+
const parsed = JSON.parse(content);
|
|
85
|
+
return {
|
|
86
|
+
server: {
|
|
87
|
+
url: parsed?.server?.url ?? DEFAULT_CONFIG.server.url,
|
|
88
|
+
groupName: parsed?.server?.groupName,
|
|
89
|
+
},
|
|
90
|
+
metrics: {
|
|
91
|
+
interval: parsed?.metrics?.interval ?? DEFAULT_CONFIG.metrics.interval,
|
|
92
|
+
},
|
|
93
|
+
services: parsed?.services ?? DEFAULT_CONFIG.services,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
console.error('설정 파일 로드 실패:', error);
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// 설정 파일 저장
|
|
102
|
+
function saveConfig(config) {
|
|
103
|
+
const wardDir = getWardDir();
|
|
104
|
+
// 디렉토리 생성
|
|
105
|
+
if (!fs.existsSync(wardDir)) {
|
|
106
|
+
fs.mkdirSync(wardDir, { recursive: true });
|
|
107
|
+
}
|
|
108
|
+
const configPath = getConfigPath();
|
|
109
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
110
|
+
}
|
|
111
|
+
// 상태 파일 로드
|
|
112
|
+
function loadState() {
|
|
113
|
+
const statePath = getStatePath();
|
|
114
|
+
if (!fs.existsSync(statePath)) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const content = fs.readFileSync(statePath, 'utf-8');
|
|
119
|
+
return JSON.parse(content);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
console.error('상태 파일 로드 실패:', error);
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// 상태 파일 저장
|
|
127
|
+
function saveState(state) {
|
|
128
|
+
const wardDir = getWardDir();
|
|
129
|
+
if (!fs.existsSync(wardDir)) {
|
|
130
|
+
fs.mkdirSync(wardDir, { recursive: true });
|
|
131
|
+
}
|
|
132
|
+
const statePath = getStatePath();
|
|
133
|
+
fs.writeFileSync(statePath, JSON.stringify(state, null, 2), 'utf-8');
|
|
134
|
+
}
|
|
135
|
+
// 서비스 추가 (동일 name이면 교체)
|
|
136
|
+
function addService(config, service) {
|
|
137
|
+
const filtered = config.services.filter(s => s.name !== service.name);
|
|
138
|
+
return { ...config, services: [...filtered, service] };
|
|
139
|
+
}
|
|
140
|
+
// 서비스 제거
|
|
141
|
+
function removeService(config, name) {
|
|
142
|
+
return { ...config, services: config.services.filter(s => s.name !== name) };
|
|
143
|
+
}
|
|
144
|
+
// 설정 유효성 검사
|
|
145
|
+
function validateConfig(config) {
|
|
146
|
+
const errors = [];
|
|
147
|
+
if (!config.server.url) {
|
|
148
|
+
errors.push('서버 URL이 설정되지 않았습니다.');
|
|
149
|
+
}
|
|
150
|
+
if (config.metrics.interval < 1) {
|
|
151
|
+
errors.push('메트릭 수집 주기는 1초 이상이어야 합니다.');
|
|
152
|
+
}
|
|
153
|
+
return errors;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=AgentConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentConfig.js","sourceRoot":"","sources":["../../src/config/AgentConfig.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,gCAEC;AAGD,sCAEC;AAGD,oCAEC;AAGD,gCAEC;AAGD,gCAyBC;AAGD,gCAUC;AAGD,8BAcC;AAGD,8BASC;AAGD,gCAGC;AAGD,sCAEC;AAGD,wCAYC;AA3JD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AA4BzB,SAAS;AACT,MAAM,cAAc,GAAgB;IAClC,MAAM,EAAE;QACN,GAAG,EAAE,uBAAuB;KAC7B;IACD,OAAO,EAAE;QACP,QAAQ,EAAE,EAAE;KACb;IACD,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,kBAAkB;AAClB,SAAgB,UAAU;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,kBAAkB;AAClB,SAAgB,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa,CAAC,CAAC;AAChD,CAAC;AAED,WAAW;AACX,SAAgB,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,YAAY,CAAC,CAAC;AAC/C,CAAC;AAED,YAAY;AACZ,SAAgB,UAAU;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,WAAW,CAAC,CAAC;AAC9C,CAAC;AAED,WAAW;AACX,SAAgB,UAAU;IACxB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAyB,CAAC;QAE3D,OAAO;YACL,MAAM,EAAE;gBACN,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,GAAG;gBACrD,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS;aACrC;YACD,OAAO,EAAE;gBACP,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,IAAI,cAAc,CAAC,OAAO,CAAC,QAAQ;aACvE;YACD,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,cAAc,CAAC,QAAQ;SACtD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,WAAW;AACX,SAAgB,UAAU,CAAC,MAAmB;IAC5C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,UAAU;IACV,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED,WAAW;AACX,SAAgB,SAAS;IACvB,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,WAAW;AACX,SAAgB,SAAS,CAAC,KAAiB;IACzC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACvE,CAAC;AAED,wBAAwB;AACxB,SAAgB,UAAU,CAAC,MAAmB,EAAE,OAAsB;IACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;AACzD,CAAC;AAED,SAAS;AACT,SAAgB,aAAa,CAAC,MAAmB,EAAE,IAAY;IAC7D,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,YAAY;AACZ,SAAgB,cAAc,CAAC,MAAmB;IAChD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export type ServiceMethod = 'file' | 'exec' | 'journal' | 'docker' | 'pipe';
|
|
2
|
+
export interface FileServiceConfig {
|
|
3
|
+
name: string;
|
|
4
|
+
method: 'file';
|
|
5
|
+
paths: string[];
|
|
6
|
+
}
|
|
7
|
+
export interface ExecServiceConfig {
|
|
8
|
+
name: string;
|
|
9
|
+
method: 'exec';
|
|
10
|
+
command: string;
|
|
11
|
+
restartDelay?: number;
|
|
12
|
+
maxMemBytes?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface JournalServiceConfig {
|
|
15
|
+
name: string;
|
|
16
|
+
method: 'journal';
|
|
17
|
+
unit: string;
|
|
18
|
+
}
|
|
19
|
+
export interface DockerServiceConfig {
|
|
20
|
+
name: string;
|
|
21
|
+
method: 'docker';
|
|
22
|
+
container: string;
|
|
23
|
+
}
|
|
24
|
+
export interface PipeServiceConfig {
|
|
25
|
+
name: string;
|
|
26
|
+
method: 'pipe';
|
|
27
|
+
command: string;
|
|
28
|
+
}
|
|
29
|
+
export type ServiceConfig = FileServiceConfig | ExecServiceConfig | JournalServiceConfig | DockerServiceConfig | PipeServiceConfig;
|
|
30
|
+
//# sourceMappingURL=ServiceConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServiceConfig.d.ts","sourceRoot":"","sources":["../../src/config/ServiceConfig.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAG5E,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAGD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAGD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,aAAa,GACrB,iBAAiB,GACjB,iBAAiB,GACjB,oBAAoB,GACpB,mBAAmB,GACnB,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServiceConfig.js","sourceRoot":"","sources":["../../src/config/ServiceConfig.ts"],"names":[],"mappings":";AAAA,sBAAsB"}
|
package/dist/daemon.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AA+LA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA4DjD"}
|
package/dist/daemon.js
ADDED
|
@@ -0,0 +1,300 @@
|
|
|
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.startDaemon = startDaemon;
|
|
40
|
+
// 에이전트 데몬 프로세스 - 백그라운드에서 실행
|
|
41
|
+
const os = __importStar(require("os"));
|
|
42
|
+
const pidusage_1 = __importDefault(require("pidusage"));
|
|
43
|
+
const AgentConfig_js_1 = require("./config/AgentConfig.js");
|
|
44
|
+
const CpuCollector_js_1 = require("./metrics/CpuCollector.js");
|
|
45
|
+
const MemoryCollector_js_1 = require("./metrics/MemoryCollector.js");
|
|
46
|
+
const DiskCollector_js_1 = require("./metrics/DiskCollector.js");
|
|
47
|
+
const NetworkCollector_js_1 = require("./metrics/NetworkCollector.js");
|
|
48
|
+
const ProcessCollector_js_1 = require("./metrics/ProcessCollector.js");
|
|
49
|
+
const IpCollector_js_1 = require("./metrics/IpCollector.js");
|
|
50
|
+
const HttpClient_js_1 = require("./transport/HttpClient.js");
|
|
51
|
+
const ReconnectManager_js_1 = require("./transport/ReconnectManager.js");
|
|
52
|
+
const Queue_js_1 = require("./transport/Queue.js");
|
|
53
|
+
const LogForwarder_js_1 = require("./logs/LogForwarder.js");
|
|
54
|
+
const ServiceWatcher_js_1 = require("./logs/ServiceWatcher.js");
|
|
55
|
+
// 각 수집기 인스턴스 생성
|
|
56
|
+
const cpuCollector = new CpuCollector_js_1.CpuCollector();
|
|
57
|
+
const memoryCollector = new MemoryCollector_js_1.MemoryCollector();
|
|
58
|
+
const diskCollector = new DiskCollector_js_1.DiskCollector();
|
|
59
|
+
const networkCollector = new NetworkCollector_js_1.NetworkCollector();
|
|
60
|
+
const processCollector = new ProcessCollector_js_1.ProcessCollector();
|
|
61
|
+
const ipCollector = new IpCollector_js_1.IpCollector();
|
|
62
|
+
// 전송 실패 큐
|
|
63
|
+
const queue = new Queue_js_1.Queue({ maxSize: 1000, maxRetries: 3 });
|
|
64
|
+
let httpClient;
|
|
65
|
+
let reconnectManager;
|
|
66
|
+
let metricsInterval;
|
|
67
|
+
let heartbeatInterval;
|
|
68
|
+
let serviceWatcher;
|
|
69
|
+
let logForwarder;
|
|
70
|
+
let currentHostname;
|
|
71
|
+
// 큐에 쌓인 데이터 재전송 시도
|
|
72
|
+
async function flushQueue() {
|
|
73
|
+
if (queue.isEmpty)
|
|
74
|
+
return;
|
|
75
|
+
const items = queue.dequeueAll();
|
|
76
|
+
for (const item of items) {
|
|
77
|
+
const result = await httpClient.post(item.path, item.data);
|
|
78
|
+
reconnectManager.reportResult(result);
|
|
79
|
+
if (!result.success) {
|
|
80
|
+
queue.requeueItem(item);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// 메트릭 수집 및 전송
|
|
85
|
+
async function collectAndSendMetrics() {
|
|
86
|
+
try {
|
|
87
|
+
const [cpu, memory, disk, network, processes] = await Promise.all([
|
|
88
|
+
cpuCollector.collect(),
|
|
89
|
+
memoryCollector.collect(),
|
|
90
|
+
diskCollector.collect(),
|
|
91
|
+
networkCollector.collect(),
|
|
92
|
+
processCollector.collect(),
|
|
93
|
+
]);
|
|
94
|
+
const payload = {
|
|
95
|
+
collectedAt: new Date().toISOString(),
|
|
96
|
+
cpu,
|
|
97
|
+
memory,
|
|
98
|
+
disk,
|
|
99
|
+
network,
|
|
100
|
+
processes: processes.processes, // 서버는 배열을 기대함
|
|
101
|
+
};
|
|
102
|
+
const result = await httpClient.sendMetrics(payload);
|
|
103
|
+
reconnectManager.reportResult(result);
|
|
104
|
+
if (!result.success) {
|
|
105
|
+
// 전송 실패 시 큐에 저장
|
|
106
|
+
queue.enqueue('/api/agent/metrics', payload);
|
|
107
|
+
console.error(`메트릭 전송 실패: ${result.error}`);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// 전송 성공 시 큐 데이터도 함께 전송 시도
|
|
111
|
+
await flushQueue();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
console.error('메트릭 수집 오류:', error);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// 서비스 목록을 서버에 동기화
|
|
119
|
+
async function syncServicesToServer() {
|
|
120
|
+
const config = (0, AgentConfig_js_1.loadConfig)();
|
|
121
|
+
const services = config?.services ?? [];
|
|
122
|
+
const servicePayloads = await Promise.all(services.map(async (svc) => {
|
|
123
|
+
const statusInfo = serviceWatcher?.getServiceStatus(svc.name) ?? { status: 'unknown', restartCount: 0 };
|
|
124
|
+
let cpuUsage;
|
|
125
|
+
let memUsage;
|
|
126
|
+
if (statusInfo.pid && svc.method === 'exec') {
|
|
127
|
+
try {
|
|
128
|
+
const stats = await (0, pidusage_1.default)(statusInfo.pid);
|
|
129
|
+
cpuUsage = stats.cpu;
|
|
130
|
+
memUsage = stats.memory;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// PID가 없거나 접근 불가
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
name: svc.name,
|
|
138
|
+
type: svc.method,
|
|
139
|
+
config: svc,
|
|
140
|
+
status: statusInfo.status,
|
|
141
|
+
pid: statusInfo.pid,
|
|
142
|
+
restartCount: statusInfo.restartCount,
|
|
143
|
+
startedAt: statusInfo.startedAt?.toISOString(),
|
|
144
|
+
cpuUsage,
|
|
145
|
+
memUsage,
|
|
146
|
+
};
|
|
147
|
+
}));
|
|
148
|
+
const result = await httpClient.syncServices(servicePayloads);
|
|
149
|
+
if (!result.success) {
|
|
150
|
+
console.error(`서비스 동기화 실패: ${result.error}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// heartbeat 응답의 commands 처리
|
|
154
|
+
async function handleHeartbeatCommands(result) {
|
|
155
|
+
if (!result.commands || result.commands.length === 0)
|
|
156
|
+
return;
|
|
157
|
+
for (const cmd of result.commands) {
|
|
158
|
+
console.log(`명령 수신: ${cmd.serviceName} → ${cmd.action}`);
|
|
159
|
+
if (cmd.action === 'restart') {
|
|
160
|
+
serviceWatcher?.restart(cmd.serviceName);
|
|
161
|
+
console.log(`서비스 재시작: ${cmd.serviceName}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Heartbeat 전송
|
|
166
|
+
async function sendHeartbeat() {
|
|
167
|
+
try {
|
|
168
|
+
const ipInfo = await ipCollector.collect();
|
|
169
|
+
const config = (0, AgentConfig_js_1.loadConfig)();
|
|
170
|
+
const serviceStatuses = await Promise.all((config?.services ?? []).map(async (svc) => {
|
|
171
|
+
const statusInfo = serviceWatcher?.getServiceStatus(svc.name) ?? { status: 'unknown', restartCount: 0 };
|
|
172
|
+
let cpuUsage;
|
|
173
|
+
let memUsage;
|
|
174
|
+
if (statusInfo.pid && svc.method === 'exec') {
|
|
175
|
+
try {
|
|
176
|
+
const stats = await (0, pidusage_1.default)(statusInfo.pid);
|
|
177
|
+
cpuUsage = stats.cpu;
|
|
178
|
+
memUsage = stats.memory;
|
|
179
|
+
}
|
|
180
|
+
catch { /* 무시 */ }
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
name: svc.name,
|
|
184
|
+
status: statusInfo.status,
|
|
185
|
+
pid: statusInfo.pid,
|
|
186
|
+
restartCount: statusInfo.restartCount,
|
|
187
|
+
startedAt: statusInfo.startedAt?.toISOString(),
|
|
188
|
+
cpuUsage,
|
|
189
|
+
memUsage,
|
|
190
|
+
};
|
|
191
|
+
}));
|
|
192
|
+
const payload = {
|
|
193
|
+
sentAt: new Date().toISOString(),
|
|
194
|
+
hostname: currentHostname,
|
|
195
|
+
ipInfo,
|
|
196
|
+
services: serviceStatuses.length > 0 ? serviceStatuses : undefined,
|
|
197
|
+
};
|
|
198
|
+
const result = await httpClient.sendHeartbeat(payload);
|
|
199
|
+
reconnectManager.reportResult(result);
|
|
200
|
+
if (!result.success) {
|
|
201
|
+
console.error(`Heartbeat 전송 실패: ${result.error}`);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
await handleHeartbeatCommands(result);
|
|
205
|
+
}
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
console.error('Heartbeat 전송 오류:', error);
|
|
210
|
+
return { success: false, error: String(error) };
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// 데몬 시작
|
|
214
|
+
async function startDaemon() {
|
|
215
|
+
// state에서 serverId + serverUrl 로드
|
|
216
|
+
const state = (0, AgentConfig_js_1.loadState)();
|
|
217
|
+
if (!state) {
|
|
218
|
+
console.error('에이전트 상태가 없습니다. `ward start <서버 URL>`로 먼저 시작하세요.');
|
|
219
|
+
process.exit(1);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
const config = (0, AgentConfig_js_1.loadConfig)();
|
|
223
|
+
const interval = config?.metrics?.interval ?? 30;
|
|
224
|
+
currentHostname = state.hostname ?? os.hostname();
|
|
225
|
+
httpClient = new HttpClient_js_1.HttpClient({
|
|
226
|
+
serverUrl: state.serverUrl,
|
|
227
|
+
serverId: state.serverId,
|
|
228
|
+
});
|
|
229
|
+
reconnectManager = new ReconnectManager_js_1.ReconnectManager(async () => {
|
|
230
|
+
await sendHeartbeat();
|
|
231
|
+
});
|
|
232
|
+
console.log('Ward 에이전트 데몬 시작');
|
|
233
|
+
console.log(`서버: ${state.serverUrl}`);
|
|
234
|
+
console.log(`메트릭 수집 주기: ${interval}초`);
|
|
235
|
+
// ServiceWatcher/LogForwarder 초기화 및 연결
|
|
236
|
+
serviceWatcher = new ServiceWatcher_js_1.ServiceWatcher();
|
|
237
|
+
logForwarder = new LogForwarder_js_1.LogForwarder({ client: httpClient });
|
|
238
|
+
// 설정의 services 배열로 서비스 감시 등록
|
|
239
|
+
for (const svc of config?.services ?? []) {
|
|
240
|
+
serviceWatcher.watch(svc);
|
|
241
|
+
}
|
|
242
|
+
// ServiceWatcher 이벤트를 LogForwarder에 연결
|
|
243
|
+
serviceWatcher.on('line', (source, line) => {
|
|
244
|
+
logForwarder.addLog(source, line);
|
|
245
|
+
});
|
|
246
|
+
// 서비스 상태 변경 로그 출력
|
|
247
|
+
serviceWatcher.on('status', (name, status, pid, restartCount, _startedAt) => {
|
|
248
|
+
console.log(`서비스 상태 변경: ${name} → ${status}${pid ? ` (PID: ${pid})` : ''}${restartCount ? ` (재시작: ${restartCount}회)` : ''}`);
|
|
249
|
+
});
|
|
250
|
+
// LogForwarder 시작
|
|
251
|
+
logForwarder.start();
|
|
252
|
+
// 메트릭 수집 인터벌 설정
|
|
253
|
+
metricsInterval = setInterval(collectAndSendMetrics, interval * 1000);
|
|
254
|
+
// Heartbeat 인터벌 설정 (30초)
|
|
255
|
+
heartbeatInterval = setInterval(sendHeartbeat, 30000);
|
|
256
|
+
// 즉시 첫 번째 수집 실행
|
|
257
|
+
await collectAndSendMetrics();
|
|
258
|
+
await sendHeartbeat();
|
|
259
|
+
await syncServicesToServer();
|
|
260
|
+
}
|
|
261
|
+
// SIGUSR1: ward service add/remove 후 설정 재로드
|
|
262
|
+
process.on('SIGUSR1', () => {
|
|
263
|
+
console.log('설정 재로드 중...');
|
|
264
|
+
const newConfig = (0, AgentConfig_js_1.loadConfig)();
|
|
265
|
+
const services = newConfig?.services ?? [];
|
|
266
|
+
// 기존 서비스 모두 해제 후 새 설정으로 재시작
|
|
267
|
+
serviceWatcher?.unwatchAll();
|
|
268
|
+
for (const svc of services) {
|
|
269
|
+
serviceWatcher?.watch(svc);
|
|
270
|
+
}
|
|
271
|
+
console.log(`서비스 재로드 완료: ${services.map(s => s.name).join(', ') || '(없음)'}`);
|
|
272
|
+
syncServicesToServer().catch(err => console.error('서비스 동기화 오류:', err));
|
|
273
|
+
});
|
|
274
|
+
// 종료 시그널 처리
|
|
275
|
+
process.on('SIGTERM', () => {
|
|
276
|
+
console.log('에이전트 데몬 종료 중...');
|
|
277
|
+
clearInterval(metricsInterval);
|
|
278
|
+
clearInterval(heartbeatInterval);
|
|
279
|
+
reconnectManager?.destroy();
|
|
280
|
+
serviceWatcher?.unwatchAll();
|
|
281
|
+
void logForwarder?.stop();
|
|
282
|
+
process.exit(0);
|
|
283
|
+
});
|
|
284
|
+
process.on('SIGINT', () => {
|
|
285
|
+
console.log('에이전트 데몬 인터럽트...');
|
|
286
|
+
clearInterval(metricsInterval);
|
|
287
|
+
clearInterval(heartbeatInterval);
|
|
288
|
+
reconnectManager?.destroy();
|
|
289
|
+
serviceWatcher?.unwatchAll();
|
|
290
|
+
void logForwarder?.stop();
|
|
291
|
+
process.exit(0);
|
|
292
|
+
});
|
|
293
|
+
// 데몬 실행 (직접 실행 시)
|
|
294
|
+
if (process.env['WARD_DAEMON'] === 'true') {
|
|
295
|
+
startDaemon().catch((error) => {
|
|
296
|
+
console.error('데몬 시작 실패:', error);
|
|
297
|
+
process.exit(1);
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|