@mirai73/gg-inspector
Version:
A CLI tool to inspect the AWS IoT Greengrass group running on the device
106 lines (96 loc) • 4.42 kB
text/typescript
// Copyright 2020 angmas
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import * as fs from 'fs'
import { Command } from 'commander'
import * as chalk from 'chalk'
import {Tail} from 'tail'
function parseElement(e: string): string {
if (e.indexOf('arn:aws') > -1) {
return e.split(':')[6]
}
return e
}
(async () => {
const program = new Command();
program.version('1.1.0');
program.command('show', {
isDefault: true
}).option('-f, --file <file>', 'group.json file', '/greengrass/ggc/deployment/group/group.json').action(async (cmdObj: any) => {
try {
const f = await fs.promises.readFile(cmdObj.file);
const group = JSON.parse(f.toString('utf8'));
if (group.Cores.length === 0) {
console.log('This group has not been deployed yet');
return;
}
console.log(`${chalk.yellowBright('Group:')} ${group.Arn.split('/')[3]}, version: ${group.Arn.split('/')[5]}`)
console.log(chalk.greenBright('Region: ') + `${group.Region}`);
console.log(`${chalk.greenBright('Core:')} ${group.Cores[0].thingArn.split('/')[1]}\n`)
console.log(chalk.greenBright('Devices:'));
group.Devices.forEach((d: any) => console.log(`\t${d.thingArn.split('/')[1]}`))
console.log(chalk.greenBright('Lambdas:'));
const group_def = group.GroupDefinitions;
group_def.Lambdas.Content.forEach((l: any) => {
console.log(`\t${l.FunctionArn.split(':')[6]} [${l.DeploymentConfiguration.CodeSize}]`);
})
console.log(chalk.greenBright('Subscriptions:'));
group_def.Subscriptions.Content.forEach((s: any) => {
console.log(`\t${parseElement(s.Source)} \u2794 ${chalk.blueBright(s.Subject)} \u2794 ${parseElement(s.Target)}`)
})
console.log(chalk.greenBright('Resources:'));
group_def.Resources.Content.forEach((r: any) => {
console.log(`\t${r.Type} ${JSON.stringify(r.Data, undefined, 2)}`)
})
console.log(chalk.greenBright('Logging:'));
group_def.Logging.Content.forEach((l: any) => {
console.log(`\t${l.Level} ${l.Type} ${l.Component}`);
})
} catch (err) {
if (err.name === 'TypeError') {
console.log('Please install Node.js v10 or higher');
process.exit(1);
} else if (err.name === 'Error' && err.errno === -13) {
console.log('Run this command from a root or user with enough privileges to access ${cdmObj.file}');
process.exit(1);
}
console.error(err);
process.exit(1);
}
})
program.command('logs').option('-r, --root <dir>', 'The root folder for the logs', '/greengrass/ggc/var/log/system').action(async (cmdObj: any) => {
try {
let files = await fs.promises.readdir(cmdObj.root)
files.forEach((f) => {
let t = new Tail(cmdObj.root+'/'+f);
t.on("line", (d) => {
console.log(`${chalk.blueBright(f)}\t- ${d}`);
});
t.on("error", (e) => { console.log(e); t.unwatch(); });
t.watch();
})
} catch (err) {
if (err.name === 'TypeError') {
console.log('Please install Node.js v10 or higher');
process.exit(1);
} else if (err.name === 'Error' && err.errno === -13) {
console.log('Run this command from a root or user with enough privileges to access the ${cdmObj.root} folder');
process.exit(1);
}
console.error(err);
process.exit(1);
}
})
await program.parse(process.argv);
})()