Skip to content

Commit

Permalink
chore: wip
Browse files Browse the repository at this point in the history
  • Loading branch information
davlgd committed Jan 26, 2025
1 parent 83849d3 commit fef1f02
Show file tree
Hide file tree
Showing 8 changed files with 306 additions and 229 deletions.
54 changes: 24 additions & 30 deletions bin/clever.js
Original file line number Diff line number Diff line change
Expand Up @@ -97,27 +97,22 @@ async function run () {
kvIdOrName: cliparse.argument('kv-id', {
description: 'Add-on/Real ID (or name, if unambiguous) of a Materia KV or Redis® add-on',
}),
ngId: cliparse.argument('ng-id', {
ngId: cliparse.argument('id', {
description: 'The Network Group ID',
}),
ngLabel: cliparse.argument('ng-label', {
ngLabel: cliparse.argument('label', {
description: 'Network Group label, also used for DNS context',
}),
ngIdOrLabel: cliparse.argument('id-or-label', {
ngIdOrLabel: cliparse.argument('ng-id-or-label', {
description: 'Network Group ID or label',
parser: Parsers.ngIdOrLabel,
}),
ngDescription: cliparse.argument('ng-description', {
description: 'Network Group description',
}),
ngAnyIdOrLabel: cliparse.argument('id-or-label', {

description: 'ID or Label of a Network group, a member or an (external) peer',
parser: Parsers.ngRessourceType,
}),
ngRessourceIdOrLabel: cliparse.argument('id-or-label', {
description: 'ID or Label of Network groups\'s member or (external) peer',
parser: Parsers.ngRessourceType,
parser: Parsers.ngResourceType,
}),
addonIdOrName: cliparse.argument('addon-id', {
description: 'Add-on ID (or name, if unambiguous)',
Expand Down Expand Up @@ -177,24 +172,23 @@ async function run () {
metavar: 'ng_id_or_label',
description: 'Network Group ID or label',
parser: Parsers.ngIdOrLabel,
// complete: NetworkGroup('xxx'),
}),
ngMembersIds: cliparse.option('members-ids', {
metavar: 'members_ids',
description: "Comma separated list of Network Group members IDs ('app_xxx', 'addon_xxx', 'external_xxx')",
parser: Parsers.commaSeparated,
}),
ngDescription: cliparse.option('description', {
metavar: 'ng_description',
metavar: 'description',
description: 'Network Group description',
}),
ngMembersIdsToLink: cliparse.option('link', {
metavar: 'members_ids',
description: "Comma separated list of members IDs to link to a Network Group ('app_xxx', 'addon_xxx', 'external_xxx')",
parser: Parsers.commaSeparated,
}),
ngMemberLabel: cliparse.option('label', {
required: false,
metavar: 'member_label',
description: 'The member label',
}),
ngPeerGetConfig: cliparse.flag('config', {
description: 'Get the Wireguard configuration of an external node',
description: 'Get the Wireguard configuration of an external peer',
}),
wgPublicKey: cliparse.option('public-key', {
required: false,
Expand Down Expand Up @@ -801,19 +795,19 @@ async function run () {
}, makeDefault.makeDefault);

// NETWORK GROUP COMMANDS
/* const ngCreateExternalPeerCommand = cliparse.command('external-peer', {
const ngCreateExternalPeerCommand = cliparse.command('external-peer', {
description: 'Create an external peer in a Network Group',
args: [args.ngRessourceIdOrLabel, args.publicKey, args.ngIdOrLabel],
}, ng.createExternalPeer); */
args: [args.ngAnyIdOrLabel, args.publicKey, args.ngIdOrLabel],
}, ng.createExternalPeer);
const ngDeleteExternalPeerCommand = cliparse.command('external-peer', {
description: 'Delete an external peer from a Network Group',
args: [args.ngRessourceIdOrLabel, args.ngIdOrLabel],
args: [args.ngAnyIdOrLabel, args.ngIdOrLabel],
}, ng.deleteExternalPeer);
const ngCreateCommand = cliparse.command('create', {
description: 'Create a Network Group',
args: [args.ngLabel],
privateOptions: [opts.ngMembersIds, opts.ngDescription, opts.optTags],
// commands: [ngCreateExternalPeerCommand],
privateOptions: [opts.ngMembersIdsToLink, opts.ngDescription, opts.optTags],
commands: [ngCreateExternalPeerCommand],
}, ng.createNg);
const ngDeleteCommand = cliparse.command('delete', {
description: 'Delete a Network Group',
Expand All @@ -822,31 +816,31 @@ async function run () {
}, ng.deleteNg);
const ngLinkCommand = cliparse.command('link', {
description: 'Link a member or an external peer to a Network Group',
args: [args.ngRessourceIdOrLabel, args.ngIdOrLabel],
args: [args.ngAnyIdOrLabel, args.ngIdOrLabel],
}, ng.linkToNg);
const ngUnlinkCommand = cliparse.command('unlink', {
description: 'Unlink a member or an external peer from a Network Group',
args: [args.ngRessourceIdOrLabel, args.ngIdOrLabel],
args: [args.ngAnyIdOrLabel, args.ngIdOrLabel],
}, ng.unlinkFromNg);
const ngGetCommand = cliparse.command('get', {
description: 'Get details about a Network Group, a member or a peer',
args: [args.ngAnyIdOrLabel],
options: [opts.humanJsonOutputFormat],
}, ng.printNgOrRessource);
}, ng.get);
const ngGetConfigCommand = cliparse.command('get-config', {
description: 'Get the Wireguard configuration of a peer',
args: [args.ngRessourceIdOrLabel],
args: [args.ngAnyIdOrLabel],
options: [opts.humanJsonOutputFormat],
}, ng.printConfig);
/* const ngJoinCommand = cliparse.command('join', {
const ngJoinCommand = cliparse.command('join', {
description: 'Join a Network Group',
args: [args.ngIdOrLabel],
}, ng.joinNg); */
}, ng.joinNg);
const networkGroupsCommand = cliparse.command('ng', {
description: 'List Network Groups',
options: [opts.orgaIdOrName],
privateOptions: [opts.humanJsonOutputFormat],
commands: [ngCreateCommand, ngDeleteCommand, ngLinkCommand, ngUnlinkCommand, ngGetCommand, ngGetConfigCommand],
commands: [ngCreateCommand, ngDeleteCommand, ngLinkCommand, ngUnlinkCommand, ngGetCommand, ngGetConfigCommand, ngJoinCommand],
}, ng.listNg);

// NOTIFY-EMAIL COMMAND
Expand Down
2 changes: 1 addition & 1 deletion docs/ng.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ To get information about a network group or a resource (a `json` formatted outpu

```
clever ng get ngIdOrLabel -F json
clever ng get ressourceIdOrName
clever ng get resourceIdOrName
```

## Get Wireguard configuration of a Peer
Expand Down
129 changes: 129 additions & 0 deletions src/commands/ng-print.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
import colors from 'colors/safe.js';
import { Logger } from '../logger.js';

/** Print a Network Group
* @param {Object} ng
* @param {string} format Output format
* @private
*/
export function printNG (ng, format, full = false) {

switch (format) {
case 'json': {
Logger.printJson(ng);
break;
}
case 'human':
default: {
const ngData = {
id: ng.id,
label: ng.label,
description: ng.description,
network: `${ng.networkIp}`,
'members/peers': `${Object.keys(ng.members)?.length}/${Object.keys(ng.peers)?.length}`,
};

console.table(ngData);

if (full) {
const members = Object.entries(ng.members)
.sort((a, b) => a[1].domainName.localeCompare(b[1].domainName))
.map(([id, member]) => ({
'Domain name': member.domainName,
Peers: member.peers?.length || 0,
}));
if (members.length) {
Logger.println(`${colors.bold(' • Members:')}`);
console.table(members);
}

const peers = Object.entries(ng.peers)
.sort((a, b) => a[1].parentMember.localeCompare(b[1].parentMember))
.map(([id, peer]) => peerToPrint(peer));
if (peers.length) {
Logger.println(`${colors.bold(' • Peers:')}`);
console.table(peers);
}
}
}
}
}

/** Print a Network Group member
* @param {Object} member
* @param {string} format Output format
*/
export function printMember (member, format) {
switch (format) {
case 'json': {
Logger.println(JSON.stringify(member, null, 2));
break;
}
case 'human':
default: {
const itemsToPrint = [member]
.map((item) => ({
'Domain name': item.domainName,
Peers: item.peers?.length || 0,
}));
console.table(itemsToPrint);

if (member.peers) {
const peers = member.peers
.sort((a, b) => a.parentMember.localeCompare(b.parentMember))
.map((peer) => peerToPrint(peer));
if (peers.length) {
Logger.println('Peers:');
console.table(peers);
}
}
}
}
}

/** Print a Network Group peer
* @param {Object} peer
* @param {string} format Output format
* @param {boolean} full Print full peer details
* @private
*/
export function printPeer (peer, format, full = false) {
switch (format) {
case 'json': {
Logger.println(JSON.stringify(peer, null, 2));
break;
}
case 'human':
default: {
console.table(peerToPrint(peer, full));
}
}
}

/** Print a Network Group peer
* @param {Object} peer
* @param {boolean} full Print more peer details
* @private
*/
export function peerToPrint (peer, full = false) {
let peerToPrint = {
'Parent Member': peer.parentMember,
ID: peer.id,
Label: peer.label,
Type: peer.type,
};

if (full) {
peerToPrint = {
...peerToPrint,
[peer.endpoint.ngTerm ? 'Host:IP' : 'Host']: peer.endpoint.ngTerm
? `${peer.endpoint.ngTerm.host}:${peer.endpoint.ngTerm.port}`
: peer.endpoint.ngIp,
...(peer.endpoint.publicTerm && {
'Public Term': `${peer.endpoint.publicTerm.host}:${peer.endpoint.publicTerm.port}`,
}),
'Public Key': peer.publicKey,
};
}
return peerToPrint;
}
Loading

0 comments on commit fef1f02

Please sign in to comment.