@phystack/cli 4.4.29

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 (192) hide show
  1. package/LICENSE.md +19 -0
  2. package/README.md +24 -0
  3. package/bin/index.js +2 -0
  4. package/dist/commands/app/build-apps.js +66 -0
  5. package/dist/commands/app/build-apps.js.map +1 -0
  6. package/dist/commands/app/build-container-remote.js +171 -0
  7. package/dist/commands/app/build-container-remote.js.map +1 -0
  8. package/dist/commands/app/build-container.js +322 -0
  9. package/dist/commands/app/build-container.js.map +1 -0
  10. package/dist/commands/app/build.js +375 -0
  11. package/dist/commands/app/build.js.map +1 -0
  12. package/dist/commands/app/create.js +409 -0
  13. package/dist/commands/app/create.js.map +1 -0
  14. package/dist/commands/app/deploy.js +176 -0
  15. package/dist/commands/app/deploy.js.map +1 -0
  16. package/dist/commands/app/device-picker.js +150 -0
  17. package/dist/commands/app/device-picker.js.map +1 -0
  18. package/dist/commands/app/import.js +303 -0
  19. package/dist/commands/app/import.js.map +1 -0
  20. package/dist/commands/app/list.js +26 -0
  21. package/dist/commands/app/list.js.map +1 -0
  22. package/dist/commands/app/publish.js +327 -0
  23. package/dist/commands/app/publish.js.map +1 -0
  24. package/dist/commands/app/settings.js +129 -0
  25. package/dist/commands/app/settings.js.map +1 -0
  26. package/dist/commands/app/types.js +13 -0
  27. package/dist/commands/app/types.js.map +1 -0
  28. package/dist/commands/app/upload-description.js +139 -0
  29. package/dist/commands/app/upload-description.js.map +1 -0
  30. package/dist/commands/app/upload-settings.js +29 -0
  31. package/dist/commands/app/upload-settings.js.map +1 -0
  32. package/dist/commands/app/utils.js +86 -0
  33. package/dist/commands/app/utils.js.map +1 -0
  34. package/dist/commands/auth/login.js +111 -0
  35. package/dist/commands/auth/login.js.map +1 -0
  36. package/dist/commands/auth/logout.js +19 -0
  37. package/dist/commands/auth/logout.js.map +1 -0
  38. package/dist/commands/descriptor/create.js +143 -0
  39. package/dist/commands/descriptor/create.js.map +1 -0
  40. package/dist/commands/descriptor/index.js +36 -0
  41. package/dist/commands/descriptor/index.js.map +1 -0
  42. package/dist/commands/descriptor/publish.js +163 -0
  43. package/dist/commands/descriptor/publish.js.map +1 -0
  44. package/dist/commands/descriptor/show.js +68 -0
  45. package/dist/commands/descriptor/show.js.map +1 -0
  46. package/dist/commands/dev/develop.js +175 -0
  47. package/dist/commands/dev/develop.js.map +1 -0
  48. package/dist/commands/dev/forward.js +118 -0
  49. package/dist/commands/dev/forward.js.map +1 -0
  50. package/dist/commands/dev/index.js +66 -0
  51. package/dist/commands/dev/index.js.map +1 -0
  52. package/dist/commands/dev/list.js +96 -0
  53. package/dist/commands/dev/list.js.map +1 -0
  54. package/dist/commands/dev/screen-devtools.js +156 -0
  55. package/dist/commands/dev/screen-devtools.js.map +1 -0
  56. package/dist/commands/dev/select.js +118 -0
  57. package/dist/commands/dev/select.js.map +1 -0
  58. package/dist/commands/dev/shell.js +171 -0
  59. package/dist/commands/dev/shell.js.map +1 -0
  60. package/dist/commands/dev/vnc.js +75 -0
  61. package/dist/commands/dev/vnc.js.map +1 -0
  62. package/dist/commands/device/select.js +118 -0
  63. package/dist/commands/device/select.js.map +1 -0
  64. package/dist/commands/flash.js +1120 -0
  65. package/dist/commands/flash.js.map +1 -0
  66. package/dist/commands/inst/create.js +55 -0
  67. package/dist/commands/inst/create.js.map +1 -0
  68. package/dist/commands/inst/index.js +15 -0
  69. package/dist/commands/inst/index.js.map +1 -0
  70. package/dist/commands/inst/list.js +26 -0
  71. package/dist/commands/inst/list.js.map +1 -0
  72. package/dist/commands/legacydev/debug.js +11 -0
  73. package/dist/commands/legacydev/debug.js.map +1 -0
  74. package/dist/commands/legacydev/deploy.js +15 -0
  75. package/dist/commands/legacydev/deploy.js.map +1 -0
  76. package/dist/commands/legacydev/dumpTwin.js +27 -0
  77. package/dist/commands/legacydev/dumpTwin.js.map +1 -0
  78. package/dist/commands/legacydev/forward.js +104 -0
  79. package/dist/commands/legacydev/forward.js.map +1 -0
  80. package/dist/commands/legacydev/index.js +188 -0
  81. package/dist/commands/legacydev/index.js.map +1 -0
  82. package/dist/commands/legacydev/invoke.js +29 -0
  83. package/dist/commands/legacydev/invoke.js.map +1 -0
  84. package/dist/commands/legacydev/js.js +69 -0
  85. package/dist/commands/legacydev/js.js.map +1 -0
  86. package/dist/commands/legacydev/list.js +196 -0
  87. package/dist/commands/legacydev/list.js.map +1 -0
  88. package/dist/commands/legacydev/logs.js +60 -0
  89. package/dist/commands/legacydev/logs.js.map +1 -0
  90. package/dist/commands/legacydev/modules.js +50 -0
  91. package/dist/commands/legacydev/modules.js.map +1 -0
  92. package/dist/commands/legacydev/move.js +23 -0
  93. package/dist/commands/legacydev/move.js.map +1 -0
  94. package/dist/commands/legacydev/ota.js +88 -0
  95. package/dist/commands/legacydev/ota.js.map +1 -0
  96. package/dist/commands/legacydev/patchTwin.js +21 -0
  97. package/dist/commands/legacydev/patchTwin.js.map +1 -0
  98. package/dist/commands/legacydev/pin.js +23 -0
  99. package/dist/commands/legacydev/pin.js.map +1 -0
  100. package/dist/commands/legacydev/pub.js +25 -0
  101. package/dist/commands/legacydev/pub.js.map +1 -0
  102. package/dist/commands/legacydev/rdp.js +64 -0
  103. package/dist/commands/legacydev/rdp.js.map +1 -0
  104. package/dist/commands/legacydev/screen-devtools.js +142 -0
  105. package/dist/commands/legacydev/screen-devtools.js.map +1 -0
  106. package/dist/commands/legacydev/settingsShow.js +89 -0
  107. package/dist/commands/legacydev/settingsShow.js.map +1 -0
  108. package/dist/commands/legacydev/settingsUpdate.js +114 -0
  109. package/dist/commands/legacydev/settingsUpdate.js.map +1 -0
  110. package/dist/commands/legacydev/shell.js +167 -0
  111. package/dist/commands/legacydev/shell.js.map +1 -0
  112. package/dist/commands/legacydev/showTwin.js +9 -0
  113. package/dist/commands/legacydev/showTwin.js.map +1 -0
  114. package/dist/commands/legacydev/statusLog.js +56 -0
  115. package/dist/commands/legacydev/statusLog.js.map +1 -0
  116. package/dist/commands/legacydev/sub.js +39 -0
  117. package/dist/commands/legacydev/sub.js.map +1 -0
  118. package/dist/commands/legacydev/vnc.js +61 -0
  119. package/dist/commands/legacydev/vnc.js.map +1 -0
  120. package/dist/commands/tenant/index.js +21 -0
  121. package/dist/commands/tenant/index.js.map +1 -0
  122. package/dist/commands/tenant/list.js +14 -0
  123. package/dist/commands/tenant/list.js.map +1 -0
  124. package/dist/commands/tenant/select.js +87 -0
  125. package/dist/commands/tenant/select.js.map +1 -0
  126. package/dist/commands/vm/create.js +718 -0
  127. package/dist/commands/vm/create.js.map +1 -0
  128. package/dist/commands/vm/index.js +130 -0
  129. package/dist/commands/vm/index.js.map +1 -0
  130. package/dist/commands/vm/list.js +124 -0
  131. package/dist/commands/vm/list.js.map +1 -0
  132. package/dist/commands/vm/logs.js +66 -0
  133. package/dist/commands/vm/logs.js.map +1 -0
  134. package/dist/commands/vm/remove.js +180 -0
  135. package/dist/commands/vm/remove.js.map +1 -0
  136. package/dist/commands/vm/shell.js +400 -0
  137. package/dist/commands/vm/shell.js.map +1 -0
  138. package/dist/commands/vm/start.js +861 -0
  139. package/dist/commands/vm/start.js.map +1 -0
  140. package/dist/commands/vm/stop.js +232 -0
  141. package/dist/commands/vm/stop.js.map +1 -0
  142. package/dist/index.js +158 -0
  143. package/dist/index.js.map +1 -0
  144. package/dist/services/admin-api/admin-api.types.js +3 -0
  145. package/dist/services/admin-api/admin-api.types.js.map +1 -0
  146. package/dist/services/admin-api/device-modules.admin-api.service.js +58 -0
  147. package/dist/services/admin-api/device-modules.admin-api.service.js.map +1 -0
  148. package/dist/services/admin-api/devices-admin-api.service.js +213 -0
  149. package/dist/services/admin-api/devices-admin-api.service.js.map +1 -0
  150. package/dist/services/admin-api/gridapps-admin-api.service.js +59 -0
  151. package/dist/services/admin-api/gridapps-admin-api.service.js.map +1 -0
  152. package/dist/services/admin-api/index.js +157 -0
  153. package/dist/services/admin-api/index.js.map +1 -0
  154. package/dist/services/admin-api/installations-admin-api.service.js +29 -0
  155. package/dist/services/admin-api/installations-admin-api.service.js.map +1 -0
  156. package/dist/services/admin-api/organizations-admin-api.service.js +53 -0
  157. package/dist/services/admin-api/organizations-admin-api.service.js.map +1 -0
  158. package/dist/services/auth/device-grant-auth.service.js +224 -0
  159. package/dist/services/auth/device-grant-auth.service.js.map +1 -0
  160. package/dist/services/phyhub/index.js +200 -0
  161. package/dist/services/phyhub/index.js.map +1 -0
  162. package/dist/services/phyhub/phyhub.types.js +3 -0
  163. package/dist/services/phyhub/phyhub.types.js.map +1 -0
  164. package/dist/utils/device-fetcher.js +92 -0
  165. package/dist/utils/device-fetcher.js.map +1 -0
  166. package/dist/utils/devices.js +41 -0
  167. package/dist/utils/devices.js.map +1 -0
  168. package/dist/utils/docker-credentials.js +546 -0
  169. package/dist/utils/docker-credentials.js.map +1 -0
  170. package/dist/utils/emulated-device.js +91 -0
  171. package/dist/utils/emulated-device.js.map +1 -0
  172. package/dist/utils/index.js +180 -0
  173. package/dist/utils/index.js.map +1 -0
  174. package/dist/utils/modules.js +36 -0
  175. package/dist/utils/modules.js.map +1 -0
  176. package/dist/utils/org-selector.js +108 -0
  177. package/dist/utils/org-selector.js.map +1 -0
  178. package/dist/utils/proxy.js +31 -0
  179. package/dist/utils/proxy.js.map +1 -0
  180. package/dist/utils/registry-credentials.js +113 -0
  181. package/dist/utils/registry-credentials.js.map +1 -0
  182. package/dist/utils/statuses.js +124 -0
  183. package/dist/utils/statuses.js.map +1 -0
  184. package/dist/utils/templates.js +189 -0
  185. package/dist/utils/templates.js.map +1 -0
  186. package/dist/utils/tenant-storage.js +88 -0
  187. package/dist/utils/tenant-storage.js.map +1 -0
  188. package/dist/utils/vm.js +434 -0
  189. package/dist/utils/vm.js.map +1 -0
  190. package/dist/utils/with-spinner.js +20 -0
  191. package/dist/utils/with-spinner.js.map +1 -0
  192. package/package.json +103 -0
@@ -0,0 +1,400 @@
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.default = shellVm;
40
+ const fs_1 = __importDefault(require("fs"));
41
+ const chalk_1 = __importDefault(require("chalk"));
42
+ const child_process_1 = require("child_process");
43
+ const vm_1 = require("../../utils/vm");
44
+ /**
45
+ * Checks if socat is installed on the system
46
+ */
47
+ function isSocatInstalled() {
48
+ try {
49
+ (0, child_process_1.execSync)('which socat', { stdio: 'ignore' });
50
+ return true;
51
+ }
52
+ catch (error) {
53
+ return false;
54
+ }
55
+ }
56
+ /**
57
+ * Installs socat based on the detected OS
58
+ */
59
+ async function installSocat() {
60
+ console.log(chalk_1.default.blue('Installing socat...'));
61
+ try {
62
+ const platform = process.platform;
63
+ if (platform === 'darwin') {
64
+ // macOS using Homebrew
65
+ console.log(chalk_1.default.blue('Using Homebrew to install socat...'));
66
+ (0, child_process_1.execSync)('brew install socat', { stdio: 'inherit' });
67
+ }
68
+ else if (platform === 'linux') {
69
+ // Try apt-get (Debian/Ubuntu)
70
+ try {
71
+ console.log(chalk_1.default.blue('Using apt-get to install socat...'));
72
+ (0, child_process_1.execSync)('sudo apt-get update && sudo apt-get install -y socat', { stdio: 'inherit' });
73
+ }
74
+ catch (error) {
75
+ // If apt-get fails, try yum (Red Hat/CentOS)
76
+ try {
77
+ console.log(chalk_1.default.blue('Using yum to install socat...'));
78
+ (0, child_process_1.execSync)('sudo yum install -y socat', { stdio: 'inherit' });
79
+ }
80
+ catch (innerError) {
81
+ console.error(chalk_1.default.red('Failed to install socat automatically.'));
82
+ return false;
83
+ }
84
+ }
85
+ }
86
+ else {
87
+ console.error(chalk_1.default.red(`Automatic installation not supported on ${platform}.`));
88
+ console.log(chalk_1.default.yellow('Please install socat manually.'));
89
+ return false;
90
+ }
91
+ console.log(chalk_1.default.green('socat installed successfully!'));
92
+ return true;
93
+ }
94
+ catch (error) {
95
+ console.error(chalk_1.default.red(`Failed to install socat: ${error.message}`));
96
+ return false;
97
+ }
98
+ }
99
+ /**
100
+ * Extracts the actual serial socket path from VM log file
101
+ */
102
+ async function getSerialSocketFromLogs(vmName) {
103
+ try {
104
+ const logPath = (0, vm_1.getVmDir)(vmName) + '/qemu.log';
105
+ if (!fs_1.default.existsSync(logPath)) {
106
+ return null;
107
+ }
108
+ // Read the log file and search for socket path
109
+ const logContent = fs_1.default.readFileSync(logPath, 'utf8');
110
+ const lines = logContent.split('\n');
111
+ // Look for the socket path line (search from the end for the most recent one)
112
+ for (let i = lines.length - 1; i >= 0; i--) {
113
+ if (lines[i].includes('Serial socket:')) {
114
+ // Match both new format with VM name and old format
115
+ const match = lines[i].match(/Serial socket: (\/tmp\/qemu-serial-[^\.]+\.sock)/);
116
+ if (match && match[1]) {
117
+ return match[1];
118
+ }
119
+ }
120
+ }
121
+ return null;
122
+ }
123
+ catch (error) {
124
+ console.error(chalk_1.default.red(`Error reading log file: ${error.message}`));
125
+ return null;
126
+ }
127
+ }
128
+ /**
129
+ * Find all possible QEMU serial sockets for this VM
130
+ */
131
+ function findPossibleSockets(vmName, pid) {
132
+ const possibleSockets = [];
133
+ // Socket based on VM name and current PID (new format)
134
+ possibleSockets.push(`/tmp/qemu-serial-${vmName}-${pid}.sock`);
135
+ // Legacy socket path based on just PID (for backward compatibility)
136
+ possibleSockets.push(`/tmp/qemu-serial-${pid}.sock`);
137
+ // List all qemu sockets in /tmp that might match this VM
138
+ try {
139
+ const tmpFiles = fs_1.default.readdirSync('/tmp');
140
+ // Look for VM-specific sockets first
141
+ const vmSpecificSockets = tmpFiles.filter(file => file.startsWith(`qemu-serial-${vmName}-`) && file.endsWith('.sock'));
142
+ for (const socket of vmSpecificSockets) {
143
+ const socketPath = `/tmp/${socket}`;
144
+ if (!possibleSockets.includes(socketPath)) {
145
+ possibleSockets.push(socketPath);
146
+ }
147
+ }
148
+ // Also look for legacy sockets
149
+ const legacySockets = tmpFiles.filter(file => file.startsWith('qemu-serial-') && file.endsWith('.sock') && !file.includes(`-${vmName}-`));
150
+ for (const socket of legacySockets) {
151
+ const socketPath = `/tmp/${socket}`;
152
+ if (!possibleSockets.includes(socketPath)) {
153
+ possibleSockets.push(socketPath);
154
+ }
155
+ }
156
+ }
157
+ catch (error) {
158
+ // Ignore errors while searching /tmp
159
+ }
160
+ return possibleSockets;
161
+ }
162
+ /**
163
+ * Check if file is actually a socket
164
+ */
165
+ function isRealSocket(path) {
166
+ try {
167
+ // This stats the file to get its type
168
+ const stats = fs_1.default.statSync(path);
169
+ // Socket files have a specific mode
170
+ return stats.isSocket();
171
+ }
172
+ catch (error) {
173
+ return false;
174
+ }
175
+ }
176
+ /**
177
+ * Try to connect to socket with retry logic
178
+ */
179
+ async function connectWithRetry(socketPath, name, maxRetries = 5) {
180
+ console.log(chalk_1.default.blue(`Connecting to console for VM "${name}"...`));
181
+ console.log(chalk_1.default.yellow('Press Ctrl+] to exit the console'));
182
+ console.log(chalk_1.default.gray(`Using socket: ${socketPath}`));
183
+ // Wait for the socket to become available (max 10 seconds)
184
+ console.log(chalk_1.default.blue(`Waiting for socket to become available...`));
185
+ let socketReady = false;
186
+ for (let i = 0; i < 20; i++) {
187
+ if (fs_1.default.existsSync(socketPath) && isRealSocket(socketPath)) {
188
+ socketReady = true;
189
+ console.log(chalk_1.default.green(`Socket is ready for connection`));
190
+ break;
191
+ }
192
+ await new Promise(resolve => setTimeout(resolve, 500));
193
+ process.stdout.write('.');
194
+ }
195
+ if (!socketReady) {
196
+ console.log('');
197
+ console.log(chalk_1.default.yellow(`Socket was not created after waiting. QEMU might not have created it properly.`));
198
+ console.log(chalk_1.default.yellow(`Will attempt to connect anyway...`));
199
+ }
200
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
201
+ try {
202
+ // Use socat to connect to the serial socket
203
+ console.log(chalk_1.default.blue(`Connection attempt ${attempt}/${maxRetries}...`));
204
+ // Double-check the socket before connecting
205
+ if (!fs_1.default.existsSync(socketPath)) {
206
+ throw new Error(`Socket not found at ${socketPath}`);
207
+ }
208
+ // Verify it's a real socket and not a regular file
209
+ if (!isRealSocket(socketPath)) {
210
+ throw new Error(`File exists at ${socketPath} but it's not a valid socket`);
211
+ }
212
+ const socat = (0, child_process_1.spawn)('socat', [
213
+ // Use an escape character to exit (Ctrl+])
214
+ 'STDIO,raw,echo=0,icanon=0,escape=0x1d',
215
+ `UNIX-CONNECT:${socketPath}`
216
+ ], {
217
+ stdio: 'inherit'
218
+ });
219
+ let connected = false;
220
+ // Set up error handler
221
+ socat.on('error', (error) => {
222
+ console.error(chalk_1.default.red(`Connection error: ${error.message}`));
223
+ });
224
+ // Wait for process to exit
225
+ await new Promise((resolve) => {
226
+ socat.on('close', (code) => {
227
+ // Only show error if we haven't successfully connected
228
+ if (code !== 0 && !connected) {
229
+ console.log(chalk_1.default.yellow(`Connection failed with code ${code}`));
230
+ }
231
+ resolve();
232
+ });
233
+ // Consider connected after a short delay with no errors
234
+ setTimeout(() => {
235
+ connected = true;
236
+ }, 500);
237
+ });
238
+ // If we got here with connected=true, we succeeded
239
+ if (connected) {
240
+ return;
241
+ }
242
+ // If this wasn't the last attempt, wait before retry
243
+ if (attempt < maxRetries) {
244
+ console.log(chalk_1.default.yellow(`Retrying in 2 seconds...`));
245
+ await new Promise(resolve => setTimeout(resolve, 2000));
246
+ }
247
+ }
248
+ catch (error) {
249
+ console.log(chalk_1.default.yellow(`Attempt ${attempt} failed: ${error.message}`));
250
+ // If this wasn't the last attempt, wait before retry
251
+ if (attempt < maxRetries) {
252
+ console.log(chalk_1.default.yellow(`Retrying in 2 seconds...`));
253
+ await new Promise(resolve => setTimeout(resolve, 2000));
254
+ }
255
+ else {
256
+ throw new Error(`Failed to connect after ${maxRetries} attempts`);
257
+ }
258
+ }
259
+ }
260
+ }
261
+ /**
262
+ * Connect to a VM's serial console
263
+ */
264
+ async function shellVm(name) {
265
+ if (!name) {
266
+ throw new Error('VM name is required');
267
+ }
268
+ // Check if sudo is needed and relaunch if necessary
269
+ const isRoot = process.getuid && process.getuid() === 0;
270
+ if (!isRoot && (0, vm_1.isPidFileRootOwned)(name)) {
271
+ console.log(chalk_1.default.yellow(`VM "${name}" requires root privileges. Relaunching shell command...`));
272
+ (0, vm_1.relaunchWithSudo)(process.argv.slice(2));
273
+ return; // Exit current process
274
+ }
275
+ // Check if VM exists
276
+ if (!(0, vm_1.vmExists)(name)) {
277
+ throw new Error(`VM "${name}" not found`);
278
+ }
279
+ // Check if VM is running
280
+ if (!(0, vm_1.isVmRunning)(name)) {
281
+ throw new Error(`VM "${name}" is not running. Start it first with 'phy vm start ${name}'`);
282
+ }
283
+ // Get the VM PID
284
+ const pid = (0, vm_1.getVmPid)(name);
285
+ if (!pid) {
286
+ throw new Error(`Could not get PID for VM "${name}"`);
287
+ }
288
+ // Get a list of possible socket paths
289
+ const possibleSockets = findPossibleSockets(name, pid);
290
+ // First try the standard socket path based on PID
291
+ let serialSocketPath = possibleSockets[0];
292
+ let socketFound = false;
293
+ // Try each possible socket
294
+ for (const socketPath of possibleSockets) {
295
+ if (fs_1.default.existsSync(socketPath)) {
296
+ try {
297
+ // Verify it's actually a socket, not just a file
298
+ if (!isRealSocket(socketPath)) {
299
+ console.log(chalk_1.default.yellow(`File exists at ${socketPath} but it's not a valid socket`));
300
+ continue;
301
+ }
302
+ // Verify we can access it
303
+ fs_1.default.accessSync(socketPath, fs_1.default.constants.R_OK | fs_1.default.constants.W_OK);
304
+ serialSocketPath = socketPath;
305
+ socketFound = true;
306
+ console.log(chalk_1.default.green(`Found accessible socket at ${socketPath}`));
307
+ break;
308
+ }
309
+ catch (error) {
310
+ console.log(chalk_1.default.yellow(`Socket exists at ${socketPath} but is not accessible: ${error.message}`));
311
+ }
312
+ }
313
+ }
314
+ // If no socket found via direct paths, try the logs
315
+ if (!socketFound) {
316
+ console.log(chalk_1.default.yellow(`No accessible socket found, checking logs...`));
317
+ const socketFromLogs = await getSerialSocketFromLogs(name);
318
+ if (socketFromLogs) {
319
+ console.log(chalk_1.default.green(`Found socket path in logs: ${socketFromLogs}`));
320
+ if (fs_1.default.existsSync(socketFromLogs)) {
321
+ try {
322
+ // Verify it's actually a socket, not just a file
323
+ if (!isRealSocket(socketFromLogs)) {
324
+ console.log(chalk_1.default.yellow(`File exists at ${socketFromLogs} but it's not a valid socket`));
325
+ }
326
+ else {
327
+ fs_1.default.accessSync(socketFromLogs, fs_1.default.constants.R_OK | fs_1.default.constants.W_OK);
328
+ serialSocketPath = socketFromLogs;
329
+ socketFound = true;
330
+ }
331
+ }
332
+ catch (error) {
333
+ console.log(chalk_1.default.yellow(`Socket from logs exists but is not accessible: ${error.message}`));
334
+ }
335
+ }
336
+ else {
337
+ console.log(chalk_1.default.yellow(`Socket from logs doesn't exist: ${socketFromLogs}`));
338
+ }
339
+ }
340
+ }
341
+ // Double-check socket exists and verify permissions
342
+ if (!socketFound) {
343
+ console.error(chalk_1.default.red(`Could not find an accessible socket for VM "${name}"`));
344
+ // Try list sockets in /tmp to help with troubleshooting
345
+ try {
346
+ console.log(chalk_1.default.yellow('Looking for available sockets in /tmp...'));
347
+ const socketFiles = (0, child_process_1.execSync)('ls -l /tmp/qemu-*sock 2>/dev/null || echo "No sockets found"', { encoding: 'utf8' });
348
+ console.log(chalk_1.default.gray(socketFiles));
349
+ }
350
+ catch (err) {
351
+ // Ignore error from ls command
352
+ }
353
+ // Explain potential solutions
354
+ console.log(chalk_1.default.yellow('Suggestions:'));
355
+ console.log(chalk_1.default.yellow('1. Try restarting the VM: phy vm restart ' + name));
356
+ console.log(chalk_1.default.yellow('2. Check if VM is running correctly: phy vm logs ' + name));
357
+ console.log(chalk_1.default.yellow('3. If VM is stuck or not responding, stop and start it:'));
358
+ console.log(chalk_1.default.yellow(' phy vm stop ' + name + ' --force'));
359
+ console.log(chalk_1.default.yellow(' phy vm start ' + name));
360
+ throw new Error('Could not find an accessible VM console socket. The VM may not be configured correctly for console access.');
361
+ }
362
+ // Check if socat is installed, and install it if needed
363
+ if (!isSocatInstalled()) {
364
+ console.log(chalk_1.default.yellow('socat is not installed but required for VM console access'));
365
+ const installPrompt = await Promise.resolve().then(() => __importStar(require('readline'))).then(readline => {
366
+ return new Promise(resolve => {
367
+ const rl = readline.createInterface({
368
+ input: process.stdin,
369
+ output: process.stdout
370
+ });
371
+ rl.question(chalk_1.default.yellow('Would you like to install socat now? (y/n) '), (answer) => {
372
+ rl.close();
373
+ resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
374
+ });
375
+ });
376
+ });
377
+ if (installPrompt) {
378
+ const installed = await installSocat();
379
+ if (!installed) {
380
+ console.log(chalk_1.default.red('Failed to install socat. Please install it manually and try again.'));
381
+ console.log(chalk_1.default.yellow(' Mac: brew install socat'));
382
+ console.log(chalk_1.default.yellow(' Debian/Ubuntu: apt-get install socat'));
383
+ console.log(chalk_1.default.yellow(' Red Hat/CentOS: yum install socat'));
384
+ process.exit(1);
385
+ }
386
+ }
387
+ else {
388
+ console.log(chalk_1.default.red('socat is required to connect to the VM console. Please install it manually.'));
389
+ process.exit(1);
390
+ }
391
+ }
392
+ // Print usage instructions before connecting
393
+ console.log('');
394
+ console.log(chalk_1.default.green('=== PhyOS VM Console Connection ==='));
395
+ console.log(chalk_1.default.blue('• To exit the console:') + chalk_1.default.yellow(' Press Ctrl+]'));
396
+ console.log(chalk_1.default.blue('• To log in:') + chalk_1.default.green(' Use username "phygrid" (no password required)'));
397
+ console.log('');
398
+ await connectWithRetry(serialSocketPath, name);
399
+ }
400
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/commands/vm/shell.ts"],"names":[],"mappings":"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"}