@phystack/cli 4.3.40-dev
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/LICENSE.md +19 -0
- package/README.md +24 -0
- package/bin/index.js +2 -0
- package/dist/commands/app/build-apps.js +66 -0
- package/dist/commands/app/build-apps.js.map +1 -0
- package/dist/commands/app/build-container-remote.js +171 -0
- package/dist/commands/app/build-container-remote.js.map +1 -0
- package/dist/commands/app/build-container.js +330 -0
- package/dist/commands/app/build-container.js.map +1 -0
- package/dist/commands/app/build.js +393 -0
- package/dist/commands/app/build.js.map +1 -0
- package/dist/commands/app/create.js +451 -0
- package/dist/commands/app/create.js.map +1 -0
- package/dist/commands/app/deploy.js +176 -0
- package/dist/commands/app/deploy.js.map +1 -0
- package/dist/commands/app/device-picker.js +150 -0
- package/dist/commands/app/device-picker.js.map +1 -0
- package/dist/commands/app/import.js +303 -0
- package/dist/commands/app/import.js.map +1 -0
- package/dist/commands/app/list.js +26 -0
- package/dist/commands/app/list.js.map +1 -0
- package/dist/commands/app/publish.js +327 -0
- package/dist/commands/app/publish.js.map +1 -0
- package/dist/commands/app/settings.js +129 -0
- package/dist/commands/app/settings.js.map +1 -0
- package/dist/commands/app/types.js +13 -0
- package/dist/commands/app/types.js.map +1 -0
- package/dist/commands/app/upload-description.js +139 -0
- package/dist/commands/app/upload-description.js.map +1 -0
- package/dist/commands/app/upload-settings.js +29 -0
- package/dist/commands/app/upload-settings.js.map +1 -0
- package/dist/commands/app/utils.js +86 -0
- package/dist/commands/app/utils.js.map +1 -0
- package/dist/commands/auth/login.js +111 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.js +19 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/descriptor/create.js +143 -0
- package/dist/commands/descriptor/create.js.map +1 -0
- package/dist/commands/descriptor/index.js +36 -0
- package/dist/commands/descriptor/index.js.map +1 -0
- package/dist/commands/descriptor/publish.js +163 -0
- package/dist/commands/descriptor/publish.js.map +1 -0
- package/dist/commands/descriptor/show.js +68 -0
- package/dist/commands/descriptor/show.js.map +1 -0
- package/dist/commands/dev/develop.js +175 -0
- package/dist/commands/dev/develop.js.map +1 -0
- package/dist/commands/dev/forward.js +118 -0
- package/dist/commands/dev/forward.js.map +1 -0
- package/dist/commands/dev/index.js +66 -0
- package/dist/commands/dev/index.js.map +1 -0
- package/dist/commands/dev/list.js +96 -0
- package/dist/commands/dev/list.js.map +1 -0
- package/dist/commands/dev/screen-devtools.js +156 -0
- package/dist/commands/dev/screen-devtools.js.map +1 -0
- package/dist/commands/dev/select.js +118 -0
- package/dist/commands/dev/select.js.map +1 -0
- package/dist/commands/dev/shell.js +171 -0
- package/dist/commands/dev/shell.js.map +1 -0
- package/dist/commands/dev/vnc.js +75 -0
- package/dist/commands/dev/vnc.js.map +1 -0
- package/dist/commands/device/select.js +118 -0
- package/dist/commands/device/select.js.map +1 -0
- package/dist/commands/flash.js +1120 -0
- package/dist/commands/flash.js.map +1 -0
- package/dist/commands/inst/create.js +55 -0
- package/dist/commands/inst/create.js.map +1 -0
- package/dist/commands/inst/index.js +15 -0
- package/dist/commands/inst/index.js.map +1 -0
- package/dist/commands/inst/list.js +26 -0
- package/dist/commands/inst/list.js.map +1 -0
- package/dist/commands/legacydev/debug.js +11 -0
- package/dist/commands/legacydev/debug.js.map +1 -0
- package/dist/commands/legacydev/deploy.js +15 -0
- package/dist/commands/legacydev/deploy.js.map +1 -0
- package/dist/commands/legacydev/dumpTwin.js +27 -0
- package/dist/commands/legacydev/dumpTwin.js.map +1 -0
- package/dist/commands/legacydev/forward.js +104 -0
- package/dist/commands/legacydev/forward.js.map +1 -0
- package/dist/commands/legacydev/index.js +188 -0
- package/dist/commands/legacydev/index.js.map +1 -0
- package/dist/commands/legacydev/invoke.js +29 -0
- package/dist/commands/legacydev/invoke.js.map +1 -0
- package/dist/commands/legacydev/js.js +69 -0
- package/dist/commands/legacydev/js.js.map +1 -0
- package/dist/commands/legacydev/list.js +196 -0
- package/dist/commands/legacydev/list.js.map +1 -0
- package/dist/commands/legacydev/logs.js +60 -0
- package/dist/commands/legacydev/logs.js.map +1 -0
- package/dist/commands/legacydev/modules.js +50 -0
- package/dist/commands/legacydev/modules.js.map +1 -0
- package/dist/commands/legacydev/move.js +23 -0
- package/dist/commands/legacydev/move.js.map +1 -0
- package/dist/commands/legacydev/ota.js +88 -0
- package/dist/commands/legacydev/ota.js.map +1 -0
- package/dist/commands/legacydev/patchTwin.js +21 -0
- package/dist/commands/legacydev/patchTwin.js.map +1 -0
- package/dist/commands/legacydev/pin.js +23 -0
- package/dist/commands/legacydev/pin.js.map +1 -0
- package/dist/commands/legacydev/pub.js +25 -0
- package/dist/commands/legacydev/pub.js.map +1 -0
- package/dist/commands/legacydev/rdp.js +64 -0
- package/dist/commands/legacydev/rdp.js.map +1 -0
- package/dist/commands/legacydev/screen-devtools.js +142 -0
- package/dist/commands/legacydev/screen-devtools.js.map +1 -0
- package/dist/commands/legacydev/settingsShow.js +89 -0
- package/dist/commands/legacydev/settingsShow.js.map +1 -0
- package/dist/commands/legacydev/settingsUpdate.js +114 -0
- package/dist/commands/legacydev/settingsUpdate.js.map +1 -0
- package/dist/commands/legacydev/shell.js +167 -0
- package/dist/commands/legacydev/shell.js.map +1 -0
- package/dist/commands/legacydev/showTwin.js +9 -0
- package/dist/commands/legacydev/showTwin.js.map +1 -0
- package/dist/commands/legacydev/statusLog.js +56 -0
- package/dist/commands/legacydev/statusLog.js.map +1 -0
- package/dist/commands/legacydev/sub.js +39 -0
- package/dist/commands/legacydev/sub.js.map +1 -0
- package/dist/commands/legacydev/vnc.js +61 -0
- package/dist/commands/legacydev/vnc.js.map +1 -0
- package/dist/commands/tenant/index.js +21 -0
- package/dist/commands/tenant/index.js.map +1 -0
- package/dist/commands/tenant/list.js +14 -0
- package/dist/commands/tenant/list.js.map +1 -0
- package/dist/commands/tenant/select.js +87 -0
- package/dist/commands/tenant/select.js.map +1 -0
- package/dist/commands/vm/create.js +718 -0
- package/dist/commands/vm/create.js.map +1 -0
- package/dist/commands/vm/index.js +130 -0
- package/dist/commands/vm/index.js.map +1 -0
- package/dist/commands/vm/list.js +124 -0
- package/dist/commands/vm/list.js.map +1 -0
- package/dist/commands/vm/logs.js +66 -0
- package/dist/commands/vm/logs.js.map +1 -0
- package/dist/commands/vm/remove.js +180 -0
- package/dist/commands/vm/remove.js.map +1 -0
- package/dist/commands/vm/shell.js +400 -0
- package/dist/commands/vm/shell.js.map +1 -0
- package/dist/commands/vm/start.js +861 -0
- package/dist/commands/vm/start.js.map +1 -0
- package/dist/commands/vm/stop.js +232 -0
- package/dist/commands/vm/stop.js.map +1 -0
- package/dist/index.js +158 -0
- package/dist/index.js.map +1 -0
- package/dist/services/admin-api/admin-api.types.js +3 -0
- package/dist/services/admin-api/admin-api.types.js.map +1 -0
- package/dist/services/admin-api/device-modules.admin-api.service.js +58 -0
- package/dist/services/admin-api/device-modules.admin-api.service.js.map +1 -0
- package/dist/services/admin-api/devices-admin-api.service.js +213 -0
- package/dist/services/admin-api/devices-admin-api.service.js.map +1 -0
- package/dist/services/admin-api/gridapps-admin-api.service.js +59 -0
- package/dist/services/admin-api/gridapps-admin-api.service.js.map +1 -0
- package/dist/services/admin-api/index.js +157 -0
- package/dist/services/admin-api/index.js.map +1 -0
- package/dist/services/admin-api/installations-admin-api.service.js +29 -0
- package/dist/services/admin-api/installations-admin-api.service.js.map +1 -0
- package/dist/services/admin-api/organizations-admin-api.service.js +53 -0
- package/dist/services/admin-api/organizations-admin-api.service.js.map +1 -0
- package/dist/services/auth/device-grant-auth.service.js +224 -0
- package/dist/services/auth/device-grant-auth.service.js.map +1 -0
- package/dist/services/phyhub/index.js +200 -0
- package/dist/services/phyhub/index.js.map +1 -0
- package/dist/services/phyhub/phyhub.types.js +3 -0
- package/dist/services/phyhub/phyhub.types.js.map +1 -0
- package/dist/utils/device-fetcher.js +92 -0
- package/dist/utils/device-fetcher.js.map +1 -0
- package/dist/utils/devices.js +41 -0
- package/dist/utils/devices.js.map +1 -0
- package/dist/utils/docker-credentials.js +720 -0
- package/dist/utils/docker-credentials.js.map +1 -0
- package/dist/utils/emulated-device.js +91 -0
- package/dist/utils/emulated-device.js.map +1 -0
- package/dist/utils/index.js +180 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/modules.js +36 -0
- package/dist/utils/modules.js.map +1 -0
- package/dist/utils/org-selector.js +108 -0
- package/dist/utils/org-selector.js.map +1 -0
- package/dist/utils/proxy.js +31 -0
- package/dist/utils/proxy.js.map +1 -0
- package/dist/utils/registry-credentials.js +113 -0
- package/dist/utils/registry-credentials.js.map +1 -0
- package/dist/utils/statuses.js +124 -0
- package/dist/utils/statuses.js.map +1 -0
- package/dist/utils/templates.js +197 -0
- package/dist/utils/templates.js.map +1 -0
- package/dist/utils/tenant-storage.js +88 -0
- package/dist/utils/tenant-storage.js.map +1 -0
- package/dist/utils/vm.js +434 -0
- package/dist/utils/vm.js.map +1 -0
- package/dist/utils/with-spinner.js +20 -0
- package/dist/utils/with-spinner.js.map +1 -0
- 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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"}
|