@orb44/cli 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.
- package/README.md +20 -0
- package/bin/orb44.mjs +561 -0
- package/package.json +40 -0
- package/server/cli-menu.mjs +133 -0
- package/server/pulse.mjs +704 -0
- package/server/sat-i18n.mjs +293 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
export const LANGS = ["en", "ru", "ko", "es"];
|
|
2
|
+
export const LANG_LABEL = { en: "English", ru: "Русский", ko: "한국어", es: "Español" };
|
|
3
|
+
|
|
4
|
+
export function normalizeLang(raw) {
|
|
5
|
+
const s = String(raw || "")
|
|
6
|
+
.trim()
|
|
7
|
+
.toLowerCase()
|
|
8
|
+
.replace(/_/g, "-");
|
|
9
|
+
if (s === "kr" || s.startsWith("ko")) return "ko";
|
|
10
|
+
if (s === "espanol" || s === "español" || s.startsWith("es")) return "es";
|
|
11
|
+
if (s === "russian" || s.startsWith("ru")) return "ru";
|
|
12
|
+
if (s.startsWith("en")) return "en";
|
|
13
|
+
if (LANGS.includes(s)) return s;
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function detectLang(env = process.env) {
|
|
18
|
+
return normalizeLang(env.ORB44_LANG) || normalizeLang(env.LC_ALL) || normalizeLang(env.LANG) || "en";
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const STR = {
|
|
22
|
+
en: {
|
|
23
|
+
banner_title: "Orb44 satellite",
|
|
24
|
+
banner_sub: "Device key is pulse only, not a shell. Advice comes back on the pulse; you run commands.",
|
|
25
|
+
lang_pick: "Language · Язык · 언어 · Idioma",
|
|
26
|
+
lang_saved: "Language saved: {label}",
|
|
27
|
+
lang_now: "CLI language: {label} (--lang en|ru|ko|es)",
|
|
28
|
+
open_link: "Open this link in the browser where Orb44 is already signed in:",
|
|
29
|
+
code: "code {code}",
|
|
30
|
+
waiting: "Waiting for cabinet confirmation…",
|
|
31
|
+
code_expired: "Code expired. Run login again.",
|
|
32
|
+
no_confirm: "Did not get confirmation.",
|
|
33
|
+
paired: "Paired: {host} ({name})",
|
|
34
|
+
key_file: "Key: {file}",
|
|
35
|
+
payload: "What goes to the cabinet",
|
|
36
|
+
pulse_ok: "Pulse is in the cabinet.",
|
|
37
|
+
pulse_fail: "pulse not accepted",
|
|
38
|
+
pair_fail: "could not start pairing",
|
|
39
|
+
ask_daemon: "Install as a Watch daemon?\nRuns in the background and starts again after reboot. Pulse every 5 min.",
|
|
40
|
+
daemon_no: "No",
|
|
41
|
+
daemon_yes: "Yes — background, starts after reboot",
|
|
42
|
+
daemon_skip: "Daemon not installed. Later: orb44 install or login --daemon",
|
|
43
|
+
need_login: "First: orb44 login",
|
|
44
|
+
key_revoked: "Key revoked. Again: orb44 login",
|
|
45
|
+
daemon_run: "daemon every {sec}s · {host}",
|
|
46
|
+
daemon_revoked: "key revoked",
|
|
47
|
+
unit_written: "unit {path}",
|
|
48
|
+
daemon_on: "daemon enabled: background pulse, starts again after reboot.",
|
|
49
|
+
login_done: "Done. You can close this session — the daemon is already in the background.",
|
|
50
|
+
daemon_user: "service user {user} · key {file}",
|
|
51
|
+
daemon_user_fail: "could not create user orb44{err}; unit runs as root",
|
|
52
|
+
unit_enable_fail: "unit written, enable failed{err}",
|
|
53
|
+
install_root: "daemon is not root: User=orb44. Create the user if missing:",
|
|
54
|
+
copy_key: "and copy the key into ORB44_DEVICE_FILE that user orb44 can read.",
|
|
55
|
+
not_paired: "Not paired. orb44 login",
|
|
56
|
+
now_on_box: "On the machine now",
|
|
57
|
+
logged_out: "Disconnected. Cabinet dropped the device.",
|
|
58
|
+
advice_title: "What to do on this machine",
|
|
59
|
+
advice_sub: "The cabinet will not run this — a leaked key must not become a remote shell.",
|
|
60
|
+
preview_host: "host {h}",
|
|
61
|
+
preview_load: "load {load} RAM {used}/{total} GB disk {disk}%",
|
|
62
|
+
preview_listen: "listening: {list}",
|
|
63
|
+
preview_top: "top: {list}",
|
|
64
|
+
preview_none: "not visible",
|
|
65
|
+
preview_guard: "guard: firewall {fw} · {ban} · unattended-upgrades {upd} · time {sync} · SSH {ssh} · grade {grade}",
|
|
66
|
+
preview_fw_no: "none",
|
|
67
|
+
preview_ban_no: "no fail2ban",
|
|
68
|
+
preview_yes: "yes",
|
|
69
|
+
preview_no: "no",
|
|
70
|
+
preview_ssh_pass: "password",
|
|
71
|
+
preview_ssh_key: "keys",
|
|
72
|
+
preview_limited: "limited: cannot see which process owns the ports",
|
|
73
|
+
help: `Orb44 satellite — admin device.
|
|
74
|
+
|
|
75
|
+
orb44 login [--url http://127.0.0.1:8787] [--daemon] [--lang en|ru|ko|es]
|
|
76
|
+
orb44 pulse
|
|
77
|
+
orb44 daemon [--interval 300]
|
|
78
|
+
orb44 install [--system] [--interval 300]
|
|
79
|
+
orb44 lang [en|ru|ko|es]
|
|
80
|
+
orb44 status
|
|
81
|
+
orb44 logout
|
|
82
|
+
|
|
83
|
+
Login asks language (saved) then daemon (default no).
|
|
84
|
+
Key: {file}
|
|
85
|
+
Outgoing pulse. Cabinet does not execute commands; it replies with advice.`,
|
|
86
|
+
},
|
|
87
|
+
ru: {
|
|
88
|
+
banner_title: "Orb44 сателлит",
|
|
89
|
+
banner_sub: "Ключ устройства — только пульс, не шелл. Советы приходят ответом, команды выполняете вы.",
|
|
90
|
+
lang_pick: "Language · Язык · 언어 · Idioma",
|
|
91
|
+
lang_saved: "Язык сохранён: {label}",
|
|
92
|
+
lang_now: "Язык консоли: {label} (--lang en|ru|ko|es)",
|
|
93
|
+
open_link: "Открой ссылку в браузере, где уже открыт Orb44:",
|
|
94
|
+
code: "код {code}",
|
|
95
|
+
waiting: "Жду подтверждения в кабинете…",
|
|
96
|
+
code_expired: "Код истёк. Запустите login ещё раз.",
|
|
97
|
+
no_confirm: "Не дождались подтверждения.",
|
|
98
|
+
paired: "Связано: {host} ({name})",
|
|
99
|
+
key_file: "Ключ: {file}",
|
|
100
|
+
payload: "Что уходит в кабинет",
|
|
101
|
+
pulse_ok: "Пульс в кабинете.",
|
|
102
|
+
pulse_fail: "пульс не принят",
|
|
103
|
+
pair_fail: "не удалось начать пару",
|
|
104
|
+
ask_daemon: "Поставить Watch-демоном?\nБудет работать в фоне и подниматься после перезагрузки. Пульс каждые 5 мин.",
|
|
105
|
+
daemon_no: "Нет",
|
|
106
|
+
daemon_yes: "Да — в фоне и после перезагрузки",
|
|
107
|
+
daemon_skip: "Демон не ставили. Позже: orb44 install или login --daemon",
|
|
108
|
+
need_login: "Сначала: orb44 login",
|
|
109
|
+
key_revoked: "Ключ отозван. Снова: orb44 login",
|
|
110
|
+
daemon_run: "демон каждые {sec}с · {host}",
|
|
111
|
+
daemon_revoked: "ключ отозван",
|
|
112
|
+
unit_written: "unit {path}",
|
|
113
|
+
daemon_on: "демон включён: пульс в фоне, поднимается после перезагрузки.",
|
|
114
|
+
login_done: "Готово. Эту сессию можно закрыть — демон уже в фоне.",
|
|
115
|
+
daemon_user: "пользователь службы {user} · ключ {file}",
|
|
116
|
+
daemon_user_fail: "не удалось создать пользователя orb44{err}; unit от root",
|
|
117
|
+
unit_enable_fail: "unit записан, включить не вышло{err}",
|
|
118
|
+
install_root: "демон не root: User=orb44. Создайте пользователя, если его нет:",
|
|
119
|
+
copy_key: "и скопируйте ключ в ORB44_DEVICE_FILE, который читает orb44.",
|
|
120
|
+
not_paired: "Не связано. orb44 login",
|
|
121
|
+
now_on_box: "Сейчас на машине",
|
|
122
|
+
logged_out: "Отключено. В кабинете устройство снято.",
|
|
123
|
+
advice_title: "Что сделать на этой машине",
|
|
124
|
+
advice_sub: "Кабинет это не выполнит — иначе утечка ключа была бы удалённым шеллом.",
|
|
125
|
+
preview_host: "хост {h}",
|
|
126
|
+
preview_load: "load {load} RAM {used}/{total} ГБ диск {disk}%",
|
|
127
|
+
preview_listen: "слушает: {list}",
|
|
128
|
+
preview_top: "топ: {list}",
|
|
129
|
+
preview_none: "не видно",
|
|
130
|
+
preview_guard: "защита: файрвол {fw} · {ban} · автообновления {upd} · время {sync} · SSH {ssh} · грейд {grade}",
|
|
131
|
+
preview_fw_no: "нет",
|
|
132
|
+
preview_ban_no: "fail2ban нет",
|
|
133
|
+
preview_yes: "есть",
|
|
134
|
+
preview_no: "нет",
|
|
135
|
+
preview_ssh_pass: "пароль",
|
|
136
|
+
preview_ssh_key: "ключи",
|
|
137
|
+
preview_limited: "ограничено: не видно, какой процесс слушает порты",
|
|
138
|
+
help: `Orb44 сателлит — устройство админа.
|
|
139
|
+
|
|
140
|
+
orb44 login [--url http://127.0.0.1:8787] [--daemon] [--lang en|ru|ko|es]
|
|
141
|
+
orb44 pulse
|
|
142
|
+
orb44 daemon [--interval 300]
|
|
143
|
+
orb44 install [--system] [--interval 300]
|
|
144
|
+
orb44 lang [en|ru|ko|es]
|
|
145
|
+
orb44 status
|
|
146
|
+
orb44 logout
|
|
147
|
+
|
|
148
|
+
После login спрашивает язык (запоминает), затем демон — по умолчанию нет.
|
|
149
|
+
Ключ: {file}
|
|
150
|
+
Пульс исходящий. Кабинет не выполняет команды: отвечает текстом «что сделать».`,
|
|
151
|
+
},
|
|
152
|
+
ko: {
|
|
153
|
+
banner_title: "Orb44 위성",
|
|
154
|
+
banner_sub: "장치 키는 펄스만입니다. 셸이 아닙니다. 조언은 펄스 응답으로 오고, 명령은 직접 실행합니다.",
|
|
155
|
+
lang_pick: "Language · Язык · 언어 · Idioma",
|
|
156
|
+
lang_saved: "언어 저장됨: {label}",
|
|
157
|
+
lang_now: "CLI 언어: {label} (--lang en|ru|ko|es)",
|
|
158
|
+
open_link: "이미 Orb44에 로그인한 브라우저에서 이 링크를 여세요:",
|
|
159
|
+
code: "코드 {code}",
|
|
160
|
+
waiting: "콘솔 확인을 기다리는 중…",
|
|
161
|
+
code_expired: "코드가 만료되었습니다. login을 다시 실행하세요.",
|
|
162
|
+
no_confirm: "확인을 받지 못했습니다.",
|
|
163
|
+
paired: "연결됨: {host} ({name})",
|
|
164
|
+
key_file: "키: {file}",
|
|
165
|
+
payload: "콘솔로 보내는 내용",
|
|
166
|
+
pulse_ok: "펄스가 콘솔에 있습니다.",
|
|
167
|
+
pulse_fail: "펄스 거부",
|
|
168
|
+
pair_fail: "페어링을 시작하지 못했습니다",
|
|
169
|
+
ask_daemon: "Watch 데몬으로 설치할까요?\n백그라운드에서 돌고 재부팅 후에도 올라옵니다. 5분마다 펄스.",
|
|
170
|
+
daemon_no: "아니요",
|
|
171
|
+
daemon_yes: "예 — 백그라운드, 재부팅 후 자동",
|
|
172
|
+
daemon_skip: "데몬을 설치하지 않았습니다. 나중에: orb44 install 또는 login --daemon",
|
|
173
|
+
need_login: "먼저: orb44 login",
|
|
174
|
+
key_revoked: "키가 취소되었습니다. 다시: orb44 login",
|
|
175
|
+
daemon_run: "데몬 {sec}초마다 · {host}",
|
|
176
|
+
daemon_revoked: "키 취소됨",
|
|
177
|
+
unit_written: "unit {path}",
|
|
178
|
+
daemon_on: "데몬이 켜졌습니다: 백그라운드 펄스, 재부팅 후에도 올라옵니다.",
|
|
179
|
+
login_done: "끝났습니다. 이 세션을 닫아도 됩니다 — 데몬은 이미 백그라운드에 있습니다.",
|
|
180
|
+
daemon_user: "서비스 사용자 {user} · 키 {file}",
|
|
181
|
+
daemon_user_fail: "orb44 사용자를 만들지 못했습니다{err}; root로 실행",
|
|
182
|
+
unit_enable_fail: "unit은 썼지만 enable 실패{err}",
|
|
183
|
+
install_root: "데몬은 root가 아닙니다: User=orb44. 없으면 사용자를 만드세요:",
|
|
184
|
+
copy_key: "그리고 orb44가 읽을 ORB44_DEVICE_FILE로 키를 복사하세요.",
|
|
185
|
+
not_paired: "연결되지 않음. orb44 login",
|
|
186
|
+
now_on_box: "지금 이 기기",
|
|
187
|
+
logged_out: "해제됨. 콘솔에서 장치가 제거되었습니다.",
|
|
188
|
+
advice_title: "이 기기에서 할 일",
|
|
189
|
+
advice_sub: "콘솔은 실행하지 않습니다. 키 유출이 원격 셸이 되면 안 됩니다.",
|
|
190
|
+
preview_host: "호스트 {h}",
|
|
191
|
+
preview_load: "load {load} RAM {used}/{total} GB 디스크 {disk}%",
|
|
192
|
+
preview_listen: "수신: {list}",
|
|
193
|
+
preview_top: "top: {list}",
|
|
194
|
+
preview_none: "없음",
|
|
195
|
+
preview_guard: "보호: 방화벽 {fw} · {ban} · 자동업데이트 {upd} · 시간 {sync} · SSH {ssh} · 등급 {grade}",
|
|
196
|
+
preview_fw_no: "없음",
|
|
197
|
+
preview_ban_no: "fail2ban 없음",
|
|
198
|
+
preview_yes: "있음",
|
|
199
|
+
preview_no: "없음",
|
|
200
|
+
preview_ssh_pass: "비밀번호",
|
|
201
|
+
preview_ssh_key: "키",
|
|
202
|
+
preview_limited: "제한: 포트를 연 프로세스를 볼 수 없음",
|
|
203
|
+
help: `Orb44 위성 — 관리자 장치.
|
|
204
|
+
|
|
205
|
+
orb44 login [--url http://127.0.0.1:8787] [--daemon] [--lang en|ru|ko|es]
|
|
206
|
+
orb44 pulse
|
|
207
|
+
orb44 daemon [--interval 300]
|
|
208
|
+
orb44 install [--system] [--interval 300]
|
|
209
|
+
orb44 lang [en|ru|ko|es]
|
|
210
|
+
orb44 status
|
|
211
|
+
orb44 logout
|
|
212
|
+
|
|
213
|
+
login에서 언어를 묻고 저장한 뒤, 데몬은 기본값 아니오입니다.
|
|
214
|
+
키: {file}
|
|
215
|
+
나가는 펄스. 콘솔은 명령을 실행하지 않고 조언만 돌려줍니다.`,
|
|
216
|
+
},
|
|
217
|
+
es: {
|
|
218
|
+
banner_title: "Satélite Orb44",
|
|
219
|
+
banner_sub: "La clave del dispositivo es solo pulso, no un shell. Los consejos vuelven en la respuesta; las órdenes las ejecuta usted.",
|
|
220
|
+
lang_pick: "Language · Язык · 언어 · Idioma",
|
|
221
|
+
lang_saved: "Idioma guardado: {label}",
|
|
222
|
+
lang_now: "Idioma de la consola: {label} (--lang en|ru|ko|es)",
|
|
223
|
+
open_link: "Abra este enlace en el navegador donde ya está Orb44:",
|
|
224
|
+
code: "código {code}",
|
|
225
|
+
waiting: "Esperando confirmación en el gabinete…",
|
|
226
|
+
code_expired: "El código caducó. Ejecute login otra vez.",
|
|
227
|
+
no_confirm: "No llegó la confirmación.",
|
|
228
|
+
paired: "Vinculado: {host} ({name})",
|
|
229
|
+
key_file: "Clave: {file}",
|
|
230
|
+
payload: "Qué se envía al gabinete",
|
|
231
|
+
pulse_ok: "Pulso en el gabinete.",
|
|
232
|
+
pulse_fail: "pulso rechazado",
|
|
233
|
+
pair_fail: "no se pudo iniciar el emparejamiento",
|
|
234
|
+
ask_daemon: "¿Instalar como demonio Watch?\nCorre en segundo plano y arranca de nuevo tras el reinicio. Pulso cada 5 min.",
|
|
235
|
+
daemon_no: "No",
|
|
236
|
+
daemon_yes: "Sí — segundo plano y tras el reinicio",
|
|
237
|
+
daemon_skip: "Demonio no instalado. Luego: orb44 install o login --daemon",
|
|
238
|
+
need_login: "Primero: orb44 login",
|
|
239
|
+
key_revoked: "Clave revocada. Otra vez: orb44 login",
|
|
240
|
+
daemon_run: "demonio cada {sec}s · {host}",
|
|
241
|
+
daemon_revoked: "clave revocada",
|
|
242
|
+
unit_written: "unit {path}",
|
|
243
|
+
daemon_on: "demonio activado: pulso en segundo plano, arranca de nuevo tras el reinicio.",
|
|
244
|
+
login_done: "Listo. Puede cerrar esta sesión: el demonio ya está en segundo plano.",
|
|
245
|
+
daemon_user: "usuario del servicio {user} · clave {file}",
|
|
246
|
+
daemon_user_fail: "no se pudo crear el usuario orb44{err}; el unit corre como root",
|
|
247
|
+
unit_enable_fail: "unit escrito, no se pudo activar{err}",
|
|
248
|
+
install_root: "el demonio no es root: User=orb44. Cree el usuario si falta:",
|
|
249
|
+
copy_key: "y copie la clave a ORB44_DEVICE_FILE que pueda leer orb44.",
|
|
250
|
+
not_paired: "Sin vincular. orb44 login",
|
|
251
|
+
now_on_box: "Ahora en la máquina",
|
|
252
|
+
logged_out: "Desconectado. El gabinete quitó el dispositivo.",
|
|
253
|
+
advice_title: "Qué hacer en esta máquina",
|
|
254
|
+
advice_sub: "El gabinete no lo ejecutará: una clave filtrada no debe ser un shell remoto.",
|
|
255
|
+
preview_host: "host {h}",
|
|
256
|
+
preview_load: "load {load} RAM {used}/{total} GB disco {disk}%",
|
|
257
|
+
preview_listen: "escucha: {list}",
|
|
258
|
+
preview_top: "top: {list}",
|
|
259
|
+
preview_none: "no se ve",
|
|
260
|
+
preview_guard: "defensa: cortafuegos {fw} · {ban} · actualizaciones {upd} · hora {sync} · SSH {ssh} · grado {grade}",
|
|
261
|
+
preview_fw_no: "no",
|
|
262
|
+
preview_ban_no: "sin fail2ban",
|
|
263
|
+
preview_yes: "sí",
|
|
264
|
+
preview_no: "no",
|
|
265
|
+
preview_ssh_pass: "contraseña",
|
|
266
|
+
preview_ssh_key: "claves",
|
|
267
|
+
preview_limited: "limitado: no se ve qué proceso tiene los puertos",
|
|
268
|
+
help: `Satélite Orb44 — dispositivo de admin.
|
|
269
|
+
|
|
270
|
+
orb44 login [--url http://127.0.0.1:8787] [--daemon] [--lang en|ru|ko|es]
|
|
271
|
+
orb44 pulse
|
|
272
|
+
orb44 daemon [--interval 300]
|
|
273
|
+
orb44 install [--system] [--interval 300]
|
|
274
|
+
orb44 lang [en|ru|ko|es]
|
|
275
|
+
orb44 status
|
|
276
|
+
orb44 logout
|
|
277
|
+
|
|
278
|
+
Login pregunta idioma (lo guarda) y luego demonio (por defecto no).
|
|
279
|
+
Clave: {file}
|
|
280
|
+
Pulso saliente. El gabinete no ejecuta órdenes; responde con consejos.`,
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
export function t(lang, key, vars = {}) {
|
|
285
|
+
const table = STR[lang] || STR.en;
|
|
286
|
+
let s = table[key] || STR.en[key] || key;
|
|
287
|
+
for (const [k, v] of Object.entries(vars)) s = s.replaceAll(`{${k}}`, v == null ? "" : String(v));
|
|
288
|
+
return s;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export function looksYes(s) {
|
|
292
|
+
return /^(y|yes|j|ja|д|да|s|si|sí|예|네)$/i.test(String(s || "").trim());
|
|
293
|
+
}
|