easyoref 1.4.0 β†’ 1.6.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/init.js DELETED
@@ -1,163 +0,0 @@
1
- /**
2
- * `npx easyoref init` β€” Interactive setup wizard.
3
- *
4
- * Asks 4 questions, writes ~/.easyoref/config.yaml.
5
- */
6
- import { confirm, input, password, select } from "@inquirer/prompts";
7
- import chalk from "chalk";
8
- import { Bot } from "grammy";
9
- import yaml from "js-yaml";
10
- import { existsSync, mkdirSync, writeFileSync } from "node:fs";
11
- import { CONFIG_DIR, HOME_CONFIG_PATH } from "./config.js";
12
- export async function init() {
13
- console.log(chalk.bold("\n🚨 EasyOref Setup\n"));
14
- // ── Guard: config already exists ─────────────────────
15
- if (existsSync(HOME_CONFIG_PATH)) {
16
- const overwrite = await confirm({
17
- message: `${HOME_CONFIG_PATH} already exists. Overwrite?`,
18
- default: false,
19
- });
20
- if (!overwrite) {
21
- console.log(chalk.dim("Cancelled."));
22
- return;
23
- }
24
- }
25
- // ── 1. Language ──────────────────────────────────────
26
- const language = await select({
27
- message: "🌍 Language / Π―Π·Ρ‹ΠΊ / Χ©Χ€Χ”:",
28
- choices: [
29
- { name: "Русский", value: "ru" },
30
- { name: "English", value: "en" },
31
- { name: "Χ’Χ‘Χ¨Χ™Χͺ", value: "he" },
32
- { name: "Ψ§Ω„ΨΉΨ±Ψ¨ΩŠΨ©", value: "ar" },
33
- ],
34
- });
35
- const t = STRINGS[language] ?? STRINGS.en;
36
- // ── 2. Bot Token ─────────────────────────────────────
37
- const botToken = await password({
38
- message: t.token,
39
- validate: (val) => {
40
- if (!val || val.length < 10)
41
- return t.tokenRequired;
42
- if (!val.includes(":"))
43
- return t.tokenFormat;
44
- return true;
45
- },
46
- });
47
- console.log(chalk.dim(t.validating));
48
- try {
49
- const bot = new Bot(botToken);
50
- const me = await bot.api.getMe();
51
- console.log(chalk.green(` βœ… ${t.botOk}: @${me.username}`));
52
- }
53
- catch {
54
- console.log(chalk.yellow(` ⚠️ ${t.botFail}`));
55
- }
56
- // ── 3. Chat ID ───────────────────────────────────────
57
- const chatId = await input({
58
- message: t.chatId,
59
- validate: (val) => {
60
- if (!val)
61
- return t.chatIdRequired;
62
- if (!/^-?\d+$/.test(val))
63
- return t.chatIdFormat;
64
- return true;
65
- },
66
- });
67
- // ── 4. City ID ───────────────────────────────────────
68
- const cityIdRaw = await input({
69
- message: t.cityId,
70
- validate: (val) => {
71
- if (!val)
72
- return t.cityIdRequired;
73
- if (!/^\d+$/.test(val))
74
- return t.cityIdFormat;
75
- return true;
76
- },
77
- });
78
- // ── Write config ─────────────────────────────────────
79
- const cfg = {
80
- city_ids: [Number(cityIdRaw)],
81
- language,
82
- telegram: {
83
- bot_token: botToken,
84
- chat_id: chatId,
85
- },
86
- };
87
- mkdirSync(CONFIG_DIR, { recursive: true });
88
- writeFileSync(HOME_CONFIG_PATH, yaml.dump(cfg), "utf-8");
89
- console.log("");
90
- console.log(chalk.green(`βœ… ${t.saved} ${HOME_CONFIG_PATH}`));
91
- console.log("");
92
- console.log(t.next);
93
- console.log(` ${chalk.cyan("npx easyoref")}`);
94
- console.log("");
95
- }
96
- // ── i18n strings for the wizard ────────────────────────
97
- const STRINGS = {
98
- ru: {
99
- token: "πŸ€– Π’ΠΎΠΊΠ΅Π½ Π±ΠΎΡ‚Π° (ΠΎΡ‚ @BotFather):",
100
- tokenRequired: "Π’ΠΎΠΊΠ΅Π½ обязатСлСн",
101
- tokenFormat: "Π€ΠΎΡ€ΠΌΠ°Ρ‚: 123456:ABC-DEF...",
102
- validating: " ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Ρ‚ΠΎΠΊΠ΅Π½...",
103
- botOk: "Π‘ΠΎΡ‚ Π½Π°ΠΉΠ΄Π΅Π½",
104
- botFail: "НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ (ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ)",
105
- chatId: "πŸ’¬ Chat ID (ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число для Π³Ρ€ΡƒΠΏΠΏ):",
106
- chatIdRequired: "Chat ID обязатСлСн",
107
- chatIdFormat: "Число (ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ для Π³Ρ€ΡƒΠΏΠΏ)",
108
- cityId: "πŸ“ ID Π³ΠΎΡ€ΠΎΠ΄Π° (Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° https://github.com/eladnava/pikud-haoref-api/blob/master/cities.json):",
109
- cityIdRequired: "ID обязатСлСн",
110
- cityIdFormat: "Волько Ρ†ΠΈΡ„Ρ€Ρ‹",
111
- saved: "ΠšΠΎΠ½Ρ„ΠΈΠ³ сохранён β†’",
112
- next: "ЗапуститС Π±ΠΎΡ‚Π°:",
113
- },
114
- en: {
115
- token: "πŸ€– Bot token (from @BotFather):",
116
- tokenRequired: "Token is required",
117
- tokenFormat: "Format: 123456:ABC-DEF...",
118
- validating: " Validating token...",
119
- botOk: "Bot found",
120
- botFail: "Could not verify (continuing anyway)",
121
- chatId: "πŸ’¬ Chat ID (negative number for groups):",
122
- chatIdRequired: "Chat ID is required",
123
- chatIdFormat: "Must be a number (negative for groups)",
124
- cityId: "πŸ“ City ID (find at https://github.com/eladnava/pikud-haoref-api/blob/master/cities.json):",
125
- cityIdRequired: "City ID is required",
126
- cityIdFormat: "Numbers only",
127
- saved: "Config saved β†’",
128
- next: "Start the bot:",
129
- },
130
- he: {
131
- token: "πŸ€– Χ˜Χ•Χ§ΧŸ Χ‘Χ•Χ˜ (מ-@BotFather):",
132
- tokenRequired: "Χ˜Χ•Χ§ΧŸ Χ Χ“Χ¨Χ©",
133
- tokenFormat: "Χ€Χ•Χ¨ΧžΧ˜: 123456:ABC-DEF...",
134
- validating: " מאמΧͺ Χ˜Χ•Χ§ΧŸ...",
135
- botOk: "Χ‘Χ•Χ˜ נמצא",
136
- botFail: "לא Χ Χ™Χͺן לאמΧͺ (ΧžΧžΧ©Χ™Χ›Χ™Χ)",
137
- chatId: "πŸ’¬ Chat ID (מב׀ר Χ©ΧœΧ™ΧœΧ™ ΧœΧ§Χ‘Χ•Χ¦Χ•Χͺ):",
138
- chatIdRequired: "Chat ID Χ Χ“Χ¨Χ©",
139
- chatIdFormat: "Χ—Χ™Χ™Χ‘ ΧœΧ”Χ™Χ•Χͺ מב׀ר (Χ©ΧœΧ™ΧœΧ™ ΧœΧ§Χ‘Χ•Χ¦Χ•Χͺ)",
140
- cityId: "πŸ“ ID Χ’Χ™Χ¨ (ΧžΧ¦ΧΧ• Χ‘-https://github.com/eladnava/pikud-haoref-api/blob/master/cities.json):",
141
- cityIdRequired: "ID Χ’Χ™Χ¨ Χ Χ“Χ¨Χ©",
142
- cityIdFormat: "ΧžΧ‘Χ€Χ¨Χ™Χ Χ‘ΧœΧ‘Χ“",
143
- saved: "Χ”Χ’Χ“Χ¨Χ•Χͺ Χ Χ©ΧžΧ¨Χ• β†’",
144
- next: "Χ”Χ€Χ’Χ™ΧœΧ• אΧͺ Χ”Χ‘Χ•Χ˜:",
145
- },
146
- ar: {
147
- token: "πŸ€– Ψ±Ω…Ψ² Ψ§Ω„Ψ¨ΩˆΨͺ (Ω…Ω† @BotFather):",
148
- tokenRequired: "Ψ§Ω„Ψ±Ω…Ψ² Ω…Ψ·Ω„ΩˆΨ¨",
149
- tokenFormat: "Ψ§Ω„Ψ΄ΩƒΩ„: 123456:ABC-DEF...",
150
- validating: " جارٍ Ψ§Ω„ΨͺΨ­Ω‚Ω‚...",
151
- botOk: "ΨͺΩ… Ψ§Ω„ΨΉΨ«ΩˆΨ± ΨΉΩ„Ω‰ Ψ§Ω„Ψ¨ΩˆΨͺ",
152
- botFail: "ΨͺΨΉΨ°Ψ± Ψ§Ω„ΨͺΨ­Ω‚Ω‚ (Ω…ΨͺΨ§Ψ¨ΨΉΨ©)",
153
- chatId: "πŸ’¬ Chat ID (Ψ±Ω‚Ω… Ψ³Ψ§Ω„Ψ¨ Ω„Ω„Ω…Ψ¬Ω…ΩˆΨΉΨ§Ψͺ):",
154
- chatIdRequired: "Chat ID Ω…Ψ·Ω„ΩˆΨ¨",
155
- chatIdFormat: "يجب Ψ£Ω† ΩŠΩƒΩˆΩ† Ψ±Ω‚Ω…Ω‹Ψ§ (Ψ³Ψ§Ω„Ψ¨ Ω„Ω„Ω…Ψ¬Ω…ΩˆΨΉΨ§Ψͺ)",
156
- cityId: "πŸ“ Ψ±Ω‚Ω… Ψ§Ω„Ω…Ψ―ΩŠΩ†Ψ© (Ψ§Ψ¨Ψ­Ψ« في https://github.com/eladnava/pikud-haoref-api/blob/master/cities.json):",
157
- cityIdRequired: "Ψ±Ω‚Ω… Ψ§Ω„Ω…Ψ―ΩŠΩ†Ψ© Ω…Ψ·Ω„ΩˆΨ¨",
158
- cityIdFormat: "Ψ£Ψ±Ω‚Ψ§Ω… فقط",
159
- saved: "ΨͺΩ… حفظ Ψ§Ω„Ψ₯ΨΉΨ―Ψ§Ψ―Ψ§Ψͺ β†’",
160
- next: "Ψ΄ΨΊΩ‘Ω„ Ψ§Ω„Ψ¨ΩˆΨͺ:",
161
- },
162
- };
163
- //# sourceMappingURL=init.js.map
package/dist/init.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
package/dist/logger.d.ts DELETED
@@ -1,14 +0,0 @@
1
- /**
2
- * EasyOref Logger
3
- *
4
- * Dual-output: console (always) + Better Stack Logtail (if token set).
5
- * Token source: config.yaml `observability.betterstack_token` or LOGTAIL_TOKEN env.
6
- * Live Tail: https://logs.betterstack.com β†’ your source β†’ "Live Tail"
7
- */
8
- export declare function info(message: string, ctx?: Record<string, unknown>): void;
9
- export declare function warn(message: string, ctx?: Record<string, unknown>): void;
10
- export declare function error(message: string, ctx?: Record<string, unknown>): void;
11
- export declare function debug(message: string, ctx?: Record<string, unknown>): void;
12
- /** Call before process.exit() β€” flushes Logtail buffer */
13
- export declare function flush(): Promise<void>;
14
- //# sourceMappingURL=logger.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAuBH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAGzE;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAGzE;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAG1E;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAK1E;AAED,0DAA0D;AAC1D,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3C"}
package/dist/logger.js DELETED
@@ -1,45 +0,0 @@
1
- /**
2
- * EasyOref Logger
3
- *
4
- * Dual-output: console (always) + Better Stack Logtail (if token set).
5
- * Token source: config.yaml `observability.betterstack_token` or LOGTAIL_TOKEN env.
6
- * Live Tail: https://logs.betterstack.com β†’ your source β†’ "Live Tail"
7
- */
8
- import { Logtail } from "@logtail/node";
9
- import { config } from "./config.js";
10
- const token = config.logtailToken;
11
- const logtail = token ? new Logtail(token) : null;
12
- const base = {
13
- service: "easyoref",
14
- env: process.env.NODE_ENV ?? "production",
15
- };
16
- if (logtail) {
17
- console.log("πŸ“‘ Better Stack Logtail enabled β€” live tail at logs.betterstack.com");
18
- }
19
- else {
20
- console.log("πŸ“Ÿ LOGTAIL_TOKEN not set β€” logging to console only");
21
- }
22
- // ── Public API ────────────────────────────────────────────────────────────────
23
- export function info(message, ctx) {
24
- console.log(message, ctx ?? "");
25
- logtail?.info(message, { ...base, ...ctx });
26
- }
27
- export function warn(message, ctx) {
28
- console.warn(message, ctx ?? "");
29
- logtail?.warn(message, { ...base, ...ctx });
30
- }
31
- export function error(message, ctx) {
32
- console.error(message, ctx ?? "");
33
- logtail?.error(message, { ...base, ...ctx });
34
- }
35
- export function debug(message, ctx) {
36
- if (process.env.LOG_LEVEL === "debug") {
37
- console.debug(message, ctx ?? "");
38
- }
39
- logtail?.debug(message, { ...base, ...ctx });
40
- }
41
- /** Call before process.exit() β€” flushes Logtail buffer */
42
- export async function flush() {
43
- await logtail?.flush();
44
- }
45
- //# sourceMappingURL=logger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AAClC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAElD,MAAM,IAAI,GAAG;IACX,OAAO,EAAE,UAAU;IACnB,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,YAAY;CAC1C,CAAC;AAEF,IAAI,OAAO,EAAE,CAAC;IACZ,OAAO,CAAC,GAAG,CACT,qEAAqE,CACtE,CAAC;AACJ,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;AACpE,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,IAAI,CAAC,OAAe,EAAE,GAA6B;IACjE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAChC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe,EAAE,GAA6B;IACjE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACjC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe,EAAE,GAA6B;IAClE,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAClC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe,EAAE,GAA6B;IAClE,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC;AACzB,CAAC"}
package/dist/service.d.ts DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * EasyOref β€” systemd service management (Γ  la Homebridge)
3
- *
4
- * easyoref install β€” create & enable systemd service, then start
5
- * easyoref uninstall β€” stop & remove systemd service
6
- * easyoref start β€” start the service (install first if needed)
7
- * easyoref stop β€” stop the service
8
- * easyoref restart β€” restart the service
9
- * easyoref status β€” show service status
10
- * easyoref logs β€” follow journal logs
11
- */
12
- export declare function install(): void;
13
- export declare function uninstall(): void;
14
- export declare function start(): void;
15
- export declare function stop(): void;
16
- export declare function restart(): void;
17
- export declare function status(): void;
18
- export declare function logs(): void;
19
- //# sourceMappingURL=service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAwFH,wBAAgB,OAAO,IAAI,IAAI,CAsB9B;AAED,wBAAgB,SAAS,IAAI,IAAI,CAchC;AAED,wBAAgB,KAAK,IAAI,IAAI,CAQ5B;AAED,wBAAgB,IAAI,IAAI,IAAI,CAO3B;AAED,wBAAgB,OAAO,IAAI,IAAI,CAQ9B;AAED,wBAAgB,MAAM,IAAI,IAAI,CAQ7B;AAED,wBAAgB,IAAI,IAAI,IAAI,CAY3B"}
package/dist/service.js DELETED
@@ -1,165 +0,0 @@
1
- /**
2
- * EasyOref β€” systemd service management (Γ  la Homebridge)
3
- *
4
- * easyoref install β€” create & enable systemd service, then start
5
- * easyoref uninstall β€” stop & remove systemd service
6
- * easyoref start β€” start the service (install first if needed)
7
- * easyoref stop β€” stop the service
8
- * easyoref restart β€” restart the service
9
- * easyoref status β€” show service status
10
- * easyoref logs β€” follow journal logs
11
- */
12
- import { execSync, spawnSync } from "node:child_process";
13
- import { existsSync, writeFileSync } from "node:fs";
14
- import { homedir } from "node:os";
15
- import { join } from "node:path";
16
- const SERVICE_NAME = "easyoref";
17
- const UNIT_PATH = `/etc/systemd/system/${SERVICE_NAME}.service`;
18
- const CONFIG_DIR = join(homedir(), ".easyoref");
19
- const CONFIG_PATH = join(CONFIG_DIR, "config.yaml");
20
- function whichBin() {
21
- try {
22
- return execSync("which easyoref", { encoding: "utf-8" }).trim();
23
- }
24
- catch {
25
- // Fallback: resolve from npm global
26
- try {
27
- return execSync("npm bin -g", { encoding: "utf-8" }).trim() + "/easyoref";
28
- }
29
- catch {
30
- return "/usr/bin/easyoref";
31
- }
32
- }
33
- }
34
- function whichNode() {
35
- try {
36
- return execSync("which node", { encoding: "utf-8" }).trim();
37
- }
38
- catch {
39
- return "/usr/bin/node";
40
- }
41
- }
42
- function isRoot() {
43
- return process.getuid?.() === 0;
44
- }
45
- function sudoExec(cmd) {
46
- const result = spawnSync("sudo", cmd.split(" "), {
47
- stdio: "inherit",
48
- });
49
- if (result.status !== 0) {
50
- console.error(`❌ Command failed: sudo ${cmd}`);
51
- process.exit(1);
52
- }
53
- }
54
- function exec(cmd) {
55
- const result = spawnSync(cmd.split(" ")[0], cmd.split(" ").slice(1), {
56
- stdio: "inherit",
57
- });
58
- if (result.status !== 0) {
59
- process.exit(result.status ?? 1);
60
- }
61
- }
62
- function isInstalled() {
63
- return existsSync(UNIT_PATH);
64
- }
65
- function generateUnit() {
66
- const bin = whichBin();
67
- const node = whichNode();
68
- const user = process.env.USER || process.env.LOGNAME || "pi";
69
- const home = homedir();
70
- return `[Unit]
71
- Description=EasyOref Telegram Bot
72
- After=network-online.target
73
- Wants=network-online.target
74
-
75
- [Service]
76
- Type=simple
77
- User=${user}
78
- Environment=HOME=${home}
79
- Environment=NODE_ENV=production
80
- ExecStart=${node} ${bin} run
81
- WorkingDirectory=${home}
82
- Restart=always
83
- RestartSec=10
84
-
85
- [Install]
86
- WantedBy=multi-user.target
87
- `;
88
- }
89
- // ── Commands ─────────────────────────────────────────────
90
- export function install() {
91
- if (!existsSync(CONFIG_PATH)) {
92
- console.error(`❌ Config not found at ${CONFIG_PATH}`);
93
- console.error(` Run: easyoref init`);
94
- process.exit(1);
95
- }
96
- console.log(`πŸ“¦ Installing ${SERVICE_NAME} systemd service...`);
97
- const unit = generateUnit();
98
- const tmpPath = `/tmp/${SERVICE_NAME}.service`;
99
- writeFileSync(tmpPath, unit);
100
- sudoExec(`cp ${tmpPath} ${UNIT_PATH}`);
101
- sudoExec("systemctl daemon-reload");
102
- sudoExec(`systemctl enable ${SERVICE_NAME}`);
103
- sudoExec(`systemctl start ${SERVICE_NAME}`);
104
- console.log(`βœ… Service installed and started`);
105
- console.log(` Config: ${CONFIG_PATH}`);
106
- console.log(` Logs: easyoref logs`);
107
- console.log(` Status: easyoref status`);
108
- }
109
- export function uninstall() {
110
- if (!isInstalled()) {
111
- console.log("ℹ️ Service not installed");
112
- return;
113
- }
114
- console.log(`πŸ—‘ Removing ${SERVICE_NAME} systemd service...`);
115
- sudoExec(`systemctl stop ${SERVICE_NAME}`);
116
- sudoExec(`systemctl disable ${SERVICE_NAME}`);
117
- sudoExec(`rm ${UNIT_PATH}`);
118
- sudoExec("systemctl daemon-reload");
119
- console.log("βœ… Service removed");
120
- }
121
- export function start() {
122
- if (!isInstalled()) {
123
- console.log("Service not installed β€” installing first...");
124
- install();
125
- return;
126
- }
127
- sudoExec(`systemctl start ${SERVICE_NAME}`);
128
- console.log("βœ… Started");
129
- }
130
- export function stop() {
131
- if (!isInstalled()) {
132
- console.log("ℹ️ Service not installed");
133
- return;
134
- }
135
- sudoExec(`systemctl stop ${SERVICE_NAME}`);
136
- console.log("βœ… Stopped");
137
- }
138
- export function restart() {
139
- if (!isInstalled()) {
140
- console.log("Service not installed β€” installing first...");
141
- install();
142
- return;
143
- }
144
- sudoExec(`systemctl restart ${SERVICE_NAME}`);
145
- console.log("βœ… Restarted");
146
- }
147
- export function status() {
148
- if (!isInstalled()) {
149
- console.log("ℹ️ Service not installed. Run: easyoref install");
150
- return;
151
- }
152
- spawnSync("systemctl", ["status", SERVICE_NAME, "--no-pager"], {
153
- stdio: "inherit",
154
- });
155
- }
156
- export function logs() {
157
- if (!isInstalled()) {
158
- console.log("ℹ️ Service not installed. Run: easyoref install");
159
- return;
160
- }
161
- spawnSync("journalctl", ["-u", SERVICE_NAME, "-f", "--no-pager", "-o", "cat"], {
162
- stdio: "inherit",
163
- });
164
- }
165
- //# sourceMappingURL=service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}