Merge pull request #2108 from balena-io/scan_prod_devices

scan: Print production devices' info on scan
This commit is contained in:
bulldozer-balena[bot] 2020-12-01 14:04:58 +00:00 committed by GitHub
commit 40ab27df26
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 39 additions and 5 deletions

View File

@ -1524,6 +1524,11 @@ Only show system logs. This can be used in combination with --service.
Scan for balenaOS devices on your local network. Scan for balenaOS devices on your local network.
The output includes device information collected through balenaEngine for
devices running a development image of balenaOS. Devices running a production
image do not expose balenaEngine (on TCP port 2375), which is why less
information is printed about them.
Examples: Examples:
$ balena scan $ balena scan

View File

@ -33,6 +33,11 @@ export default class ScanCmd extends Command {
Scan for balenaOS devices on your local network. Scan for balenaOS devices on your local network.
Scan for balenaOS devices on your local network. Scan for balenaOS devices on your local network.
The output includes device information collected through balenaEngine for
devices running a development image of balenaOS. Devices running a production
image do not expose balenaEngine (on TCP port 2375), which is why less
information is printed about them.
`; `;
public static examples = [ public static examples = [
@ -99,13 +104,33 @@ export default class ScanCmd extends Command {
} }
}), }),
); );
const activeLocalDevices: LocalBalenaOsDevice[] = localDevices.filter(
const developmentDevices: LocalBalenaOsDevice[] = localDevices.filter(
(_localDevice, index) => engineReachableDevices[index], (_localDevice, index) => engineReachableDevices[index],
); );
const productionDevices = _.differenceWith(
localDevices,
developmentDevices,
_.isEqual,
);
const productionDevicesInfo = _.map(
productionDevices,
(device: LocalBalenaOsDevice) => {
return {
host: device.host,
address: device.address,
osVariant: 'production',
dockerInfo: undefined,
dockerVersion: undefined,
};
},
);
// Query devices for info // Query devices for info
const devicesInfo = await Promise.all( const devicesInfo = await Promise.all(
activeLocalDevices.map(async ({ host, address }) => { developmentDevices.map(async ({ host, address }) => {
const docker = dockerUtils.createClient({ const docker = dockerUtils.createClient({
host: address, host: address,
port: dockerPort, port: dockerPort,
@ -118,6 +143,7 @@ export default class ScanCmd extends Command {
return { return {
host, host,
address, address,
osVariant: 'development',
dockerInfo, dockerInfo,
dockerVersion, dockerVersion,
}; };
@ -138,8 +164,10 @@ export default class ScanCmd extends Command {
}); });
} }
const cmdOutput = productionDevicesInfo.concat(devicesInfo);
// Output results // Output results
if (!options.json && devicesInfo.length === 0) { if (!options.json && cmdOutput.length === 0) {
console.error( console.error(
process.platform === 'win32' process.platform === 'win32'
? ScanCmd.noDevicesFoundMessage + ScanCmd.windowsTipMessage ? ScanCmd.noDevicesFoundMessage + ScanCmd.windowsTipMessage
@ -149,8 +177,8 @@ export default class ScanCmd extends Command {
} }
console.log( console.log(
options.json options.json
? JSON.stringify(devicesInfo, null, 4) ? JSON.stringify(cmdOutput, null, 4)
: prettyjson.render(devicesInfo, { noColor: true }), : prettyjson.render(cmdOutput, { noColor: true }),
); );
} }

View File

@ -23,6 +23,7 @@ declare module 'balena-sync' {
export interface LocalBalenaOsDevice { export interface LocalBalenaOsDevice {
address: string; address: string;
host: string; host: string;
osVariant: string;
port: number; port: number;
} }