UNPKG

meshcentral

Version:

Web based remote computer management server

684 lines (679 loc) • 176 kB
#!/usr/bin/env node // Make sure we have the dependency modules try { require('minimist'); } catch (ex) { console.log('Missing module "minimist", type "npm install minimist" to install it.'); return; } try { require('ws'); } catch (ex) { console.log('Missing module "ws", type "npm install ws" to install it.'); return; } var settings = {}; const crypto = require('crypto'); const args = require('minimist')(process.argv.slice(2)); const path = require('path'); const possibleCommands = ['edituser', 'listusers', 'listusersessions', 'listdevicegroups', 'listdevices', 'listusersofdevicegroup', 'listevents', 'logintokens', 'serverinfo', 'userinfo', 'adduser', 'removeuser', 'adddevicegroup', 'removedevicegroup', 'editdevicegroup', 'broadcast', 'showevents', 'addusertodevicegroup', 'removeuserfromdevicegroup', 'addusertodevice', 'removeuserfromdevice', 'sendinviteemail', 'generateinvitelink', 'config', 'movetodevicegroup', 'deviceinfo', 'editdevice', 'addusergroup', 'listusergroups', 'removeusergroup', 'runcommand', 'shell', 'upload', 'download', 'deviceopenurl', 'devicemessage', 'devicetoast', 'addtousergroup', 'removefromusergroup', 'removeallusersfromusergroup', 'devicesharing', 'devicepower', 'indexagenterrorlog', 'agentdownload']; if (args.proxy != null) { try { require('https-proxy-agent'); } catch (ex) { console.log('Missing module "https-proxy-agent", type "npm install https-proxy-agent" to install it.'); return; } } if (args['_'].length == 0) { console.log("MeshCtrl performs command line actions on a MeshCentral server."); console.log("Information at: https://meshcentral.com"); console.log("No action specified, use MeshCtrl like this:\r\n\r\n meshctrl [action] [arguments]\r\n"); console.log("Supported actions:"); console.log(" Help [action] - Get help on an action."); console.log(" ServerInfo - Show server information."); console.log(" UserInfo - Show user information."); console.log(" ListUsers - List user accounts."); console.log(" ListUserSessions - List online users."); console.log(" ListUserGroups - List user groups."); console.log(" ListDevices - List devices."); console.log(" ListDeviceGroups - List device groups."); console.log(" ListUsersOfDeviceGroup - List the users in a device group."); console.log(" ListEvents - List server events."); console.log(" LoginTokens - List, create and remove login tokens."); console.log(" DeviceInfo - Show information about a device."); console.log(" EditDevice - Make changes to a device."); console.log(" Config - Perform operation on config.json file."); console.log(" AddUser - Create a new user account."); console.log(" EditUser - Change a user account."); console.log(" RemoveUser - Delete a user account."); console.log(" AddUserGroup - Create a new user group."); console.log(" RemoveUserGroup - Delete a user group."); console.log(" AddToUserGroup - Add a user, device or device group to a user group."); console.log(" RemoveFromUserGroup - Remove a user, device or device group from a user group."); console.log(" RemoveAllUsersFromUserGroup - Remove all users from a user group."); console.log(" AddDeviceGroup - Create a new device group."); console.log(" RemoveDeviceGroup - Delete a device group."); console.log(" EditDeviceGroup - Change a device group values."); console.log(" MoveToDeviceGroup - Move a device to a different device group."); console.log(" AddUserToDeviceGroup - Add a user to a device group."); console.log(" RemoveUserFromDeviceGroup - Remove a user from a device group."); console.log(" AddUserToDevice - Add a user to a device."); console.log(" RemoveUserFromDevice - Remove a user from a device."); console.log(" SendInviteEmail - Send an agent install invitation email."); console.log(" GenerateInviteLink - Create an invitation link."); console.log(" Broadcast - Display a message to all online users."); console.log(" ShowEvents - Display real-time server events in JSON format."); console.log(" RunCommand - Run a shell command on a remote device."); console.log(" Shell - Access command shell of a remote device."); console.log(" Upload - Upload a file to a remote device."); console.log(" Download - Download a file from a remote device."); console.log(" DeviceOpenUrl - Open a URL on a remote device."); console.log(" DeviceMessage - Open a message box on a remote device."); console.log(" DeviceToast - Display a toast notification on a remote device."); console.log(" DevicePower - Perform wake/sleep/reset/off operations on remote devices."); console.log(" DeviceSharing - View, add and remove sharing links for a given device."); console.log(" AgentDownload - Download an agent of a specific type for a device group."); console.log("\r\nSupported login arguments:"); console.log(" --url [wss://server] - Server url, wss://localhost:443 is default."); console.log(" - Use wss://localhost:443?key=xxx if login key is required."); console.log(" --loginuser [username] - Login username, admin is default."); console.log(" --loginpass [password] - Login password."); console.log(" --token [number] - 2nd factor authentication token."); console.log(" --loginkey [hex] - Server login key in hex."); console.log(" --loginkeyfile [file] - File containing server login key in hex."); console.log(" --logindomain [domainid] - Domain id, default is empty, only used with loginkey."); console.log(" --proxy [http://proxy:123] - Specify an HTTP proxy."); return; } else { settings.cmd = args['_'][0].toLowerCase(); if ((possibleCommands.indexOf(settings.cmd) == -1) && (settings.cmd != 'help')) { console.log("Invalid command. Possible commands are: " + possibleCommands.join(', ') + '.'); return; } //console.log(settings.cmd); var ok = false; switch (settings.cmd) { case 'config': { performConfigOperations(args); return; } case 'indexagenterrorlog': { indexAgentErrorLog(); return; } case 'serverinfo': { ok = true; break; } case 'userinfo': { ok = true; break; } case 'listusers': { ok = true; break; } case 'listusersessions': { ok = true; break; } case 'listusergroups': { ok = true; break; } case 'listdevicegroups': { ok = true; break; } case 'listdevices': { ok = true; break; } case 'listevents': { ok = true; break; } case 'logintokens': { ok = true; break; } case 'listusersofdevicegroup': { if (args.id == null) { console.log(winRemoveSingleQuotes("Missing group id, use --id '[groupid]'")); } else { ok = true; } break; } case 'deviceinfo': { if (args.id == null) { console.log(winRemoveSingleQuotes("Missing device id, use --id '[deviceid]'")); } else { ok = true; } break; } case 'editdevice': { if (args.id == null) { console.log(winRemoveSingleQuotes("Missing device id, use --id '[deviceid]'")); } else { ok = true; } break; } case 'addusertodevicegroup': { if ((args.id == null) && (args.group == null)) { console.log(winRemoveSingleQuotes("Device group identifier missing, use --id '[groupid]' or --group [groupname]")); } else if (args.userid == null) { console.log("Add user to group missing useid, use --userid [userid]"); } else { ok = true; } break; } case 'removeuserfromdevicegroup': { if ((args.id == null) && (args.group == null)) { console.log(winRemoveSingleQuotes("Device group identifier missing, use --id '[groupid]' or --group [groupname]")); } else if (args.userid == null) { console.log("Remove user from group missing useid, use --userid [userid]"); } else { ok = true; } break; } case 'addusertodevice': { if (args.userid == null) { console.log("Add user to device missing userid, use --userid [userid]"); } else if (args.id == null) { console.log(winRemoveSingleQuotes("Add user to device missing device id, use --id '[deviceid]'")); } else { ok = true; } break; } case 'removeuserfromdevice': { if (args.userid == null) { console.log("Remove user from device missing userid, use --userid [userid]"); } else if (args.id == null) { console.log(winRemoveSingleQuotes("Remove user from device missing device id, use --id '[deviceid]'")); } else { ok = true; } break; } case 'adddevicegroup': { if (args.name == null) { console.log("Message group name, use --name [name]"); } else { ok = true; } break; } case 'editdevicegroup': case 'removedevicegroup': { if ((args.id == null) && (args.group == null)) { console.log(winRemoveSingleQuotes("Device group identifier missing, use --id '[groupid]' or --group [groupname]")); } else { ok = true; } break; } case 'movetodevicegroup': { if ((args.id == null) && (args.group == null)) { console.log(winRemoveSingleQuotes("Device group identifier missing, use --id '[groupid]' or --group [groupname]")); } else if (args.devid == null) { console.log(winRemoveSingleQuotes("Device identifier missing, use --devid '[deviceid]'")); } else { ok = true; } break; } case 'broadcast': { if (args.msg == null) { console.log("Message missing, use --msg [message]"); } else { ok = true; } break; } case 'showevents': { ok = true; break; } case 'adduser': { if (args.user == null) { console.log("New account name missing, use --user [name]"); } else if ((args.pass == null) && (args.randompass == null)) { console.log("New account password missing, use --pass [password] or --randompass"); } else { ok = true; } break; } case 'edituser': { if (args.userid == null) { console.log("Edit account user missing, use --userid [id]"); } else { ok = true; } break; } case 'removeuser': { if (args.userid == null) { console.log("Remove account userid missing, use --userid [id]"); } else { ok = true; } break; } case 'addusergroup': { if (args.name == null) { console.log("New user group name missing, use --name [name]"); } else { ok = true; } break; } case 'removeusergroup': { if (args.groupid == null) { console.log(winRemoveSingleQuotes("Remove user group id missing, use --groupid '[id]'")); } else { ok = true; } break; } case 'addtousergroup': { if (args.groupid == null) { console.log(winRemoveSingleQuotes("Group id missing, use --groupid '[id]'")); } if (args.id == null) { console.log(winRemoveSingleQuotes("Missing identifier to add, use --id [id]")); } else { ok = true; } break; } case 'removefromusergroup': { if (args.groupid == null) { console.log(winRemoveSingleQuotes("Group id missing, use --groupid '[id]'")); } if (args.id == null) { console.log(winRemoveSingleQuotes("Missing identifier to remove, use --id [id]")); } else { ok = true; } break; } case 'removeallusersfromusergroup': { if (args.groupid == null) { console.log(winRemoveSingleQuotes("Group id missing, use --groupid '[id]'")); } else { ok = true; } break; } case 'sendinviteemail': { if ((args.id == null) && (args.group == null)) { console.log("Device group identifier missing, use --id '[groupid]' or --group [groupname]"); } else if (args.email == null) { console.log("Device email is missing, use --email [email]"); } else { ok = true; } break; } case 'generateinvitelink': { if ((args.id == null) && (args.group == null)) { console.log("Device group identifier missing, use --id '[groupid]' or --group [groupname]"); } else if (args.hours == null) { console.log("Invitation validity period missing, use --hours [hours]"); } else { ok = true; } break; } case 'runcommand': { if (args.id == null) { console.log(winRemoveSingleQuotes("Missing device id, use --id '[deviceid]'")); } else if (args.run == null) { console.log("Missing run, use --run \"command\""); } else { ok = true; } break; } case 'shell': { if (args.id == null) { console.log(winRemoveSingleQuotes("Missing device id, use --id '[deviceid]'")); } else { ok = true; } break; } case 'devicepower': { if (args.id == null) { console.log(winRemoveSingleQuotes("Missing device id, use --id '[deviceid]'")); } else { ok = true; } break; } case 'devicesharing': { if (args.id == null) { console.log(winRemoveSingleQuotes("Missing device id, use --id '[deviceid]'")); } else { ok = true; } break; } case 'agentdownload': { if (args.type == null) { console.log(winRemoveSingleQuotes("Missing device type, use --type [agenttype]")); } var at = parseInt(args.type); if ((at == null) || isNaN(at) || (at < 1) || (at > 11000)) { console.log(winRemoveSingleQuotes("Invalid agent type, must be a number.")); } if (args.id == null) { console.log(winRemoveSingleQuotes("Missing device id, use --id '[meshid]'")); } if ((typeof args.id != 'string') || (args.id.length != 64)) { console.log(winRemoveSingleQuotes("Invalid meshid.")); } else { ok = true; } break; } case 'upload': { if (args.id == null) { console.log(winRemoveSingleQuotes("Missing device id, use --id '[deviceid]'")); } else if (args.file == null) { console.log("Local file missing, use --file [file] specify the file to upload"); } else if (args.target == null) { console.log("Remote target path missing, use --target [path] to specify the remote location"); } else if (require('fs').existsSync(args.file) == false) { console.log("Local file does not exists, check --file"); } else { ok = true; } break; } case 'download': { if (args.id == null) { console.log(winRemoveSingleQuotes("Missing device id, use --id '[deviceid]'")); } else if (args.file == null) { console.log("Remote file missing, use --file [file] specify the remote file to download"); } else if (args.target == null) { console.log("Target path missing, use --target [path] to specify the local download location"); } else { ok = true; } break; } case 'deviceopenurl': { if (args.id == null) { console.log(winRemoveSingleQuotes("Missing device id, use --id '[deviceid]'")); } else if (args.openurl == null) { console.log("Remote URL, use --openurl [url] specify the link to open."); } else { ok = true; } break; } case 'devicemessage': { if (args.id == null) { console.log(winRemoveSingleQuotes("Missing device id, use --id '[deviceid]'")); } else if (args.msg == null) { console.log("Remote message, use --msg \"[message]\" specify a remote message."); } else { ok = true; } break; } case 'devicetoast': { if (args.id == null) { console.log(winRemoveSingleQuotes("Missing device id, use --id '[deviceid]'")); } else if (args.msg == null) { console.log("Remote message, use --msg \"[message]\" specify a remote message."); } else { ok = true; } break; } case 'help': { if (args['_'].length < 2) { console.log("Get help on an action. Type:\r\n\r\n help [action]\r\n\r\nPossible actions are: " + possibleCommands.join(', ') + '.'); } else { switch (args['_'][1].toLowerCase()) { case 'config': { displayConfigHelp(); break; } case 'sendinviteemail': { console.log("Send invitation email with instructions on how to install the mesh agent for a specific device group. Example usage:\r\n"); console.log(winRemoveSingleQuotes(" MeshCtrl SendInviteEmail --id 'groupid' --message \"msg\" --email user@sample.com")); console.log(winRemoveSingleQuotes(" MeshCtrl SendInviteEmail --group \"My Computers\" --name \"Jack\" --email user@sample.com")); console.log("\r\nRequired arguments:\r\n"); if (process.platform == 'win32') { console.log(" --id [groupid] - Device group identifier (or --group)."); } else { console.log(" --id '[groupid]' - Device group identifier (or --group)."); } console.log(" --group [groupname] - Device group name (or --id)."); console.log(" --email [email] - Email address."); console.log("\r\nOptional arguments:\r\n"); console.log(" --name (name) - Name of recipient to be included in the email."); console.log(" --message (msg) - Message to be included in the email."); break; } case 'generateinvitelink': { console.log("Generate a agent invitation URL for a given group. Example usage:\r\n"); console.log(winRemoveSingleQuotes(" MeshCtrl GenerateInviteLink --id 'groupid' --hours 24")); console.log(" MeshCtrl GenerateInviteLink --group \"My Computers\" --hours 0"); console.log("\r\nRequired arguments:\r\n"); if (process.platform == 'win32') { console.log(" --id [groupid] - Device group identifier (or --group)."); } else { console.log(" --id '[groupid]' - Device group identifier (or --group)."); } console.log(" --group [groupname] - Device group name (or --id)."); console.log(" --hours [hours] - Validity period in hours or 0 for infinit."); console.log("\r\nOptional arguments:\r\n"); console.log(" --flags [mode] - Mode flag for link type (0 = both, 1 = interactive only, 2 = background only)"); break; } case 'showevents': { console.log("Show the server's event stream for this user account. Example usage:\r\n"); console.log(" MeshCtrl ShowEvents"); console.log(" MeshCtrl ShowEvents --filter nodeconnect"); console.log(" MeshCtrl ShowEvents --filter uicustomevent,changenode"); console.log("\r\nOptional arguments:\r\n"); console.log(" --filter [actions] - Show only specified actions."); break; } case 'serverinfo': { console.log("Get information on the MeshCentral server, Example usages:\r\n"); console.log(" MeshCtrl ServerInfo --loginuser myaccountname --loginpass mypassword"); console.log(" MeshCtrl ServerInfo --loginuser myaccountname --loginkeyfile key.txt"); console.log("\r\nOptional arguments:\r\n"); console.log(" --json - Show result as JSON."); break; } case 'userinfo': { console.log("Get account information for the login account, Example usages:\r\n"); console.log(" MeshCtrl UserInfo --loginuser myaccountname --loginpass mypassword"); console.log(" MeshCtrl UserInfo --loginuser myaccountname --loginkeyfile key.txt"); console.log("\r\nOptional arguments:\r\n"); console.log(" --json - Show result as JSON."); break; } case 'listusers': { console.log("List the account on the MeshCentral server, Example usages:\r\n"); console.log(" MeshCtrl ListUsers"); console.log(" MeshCtrl ListUsers --json"); console.log(" MeshCtrl ListUsers --nameexists \"bob\""); console.log(" MeshCtrl ListUsers --filter 2fa"); console.log("\r\nOptional arguments:\r\n"); console.log(" --idexists [id] - Return 1 if id exists, 0 if not."); console.log(" --nameexists [name] - Return id if name exists."); console.log(" --filter [filter1,...] - Filter user names: 2FA, NO2FA."); console.log(" --json - Show result as JSON."); break; } case 'listusersessions': { console.log("List active user sessions on the MeshCentral server, Example usages:\r\n"); console.log(" MeshCtrl ListUserSessions"); console.log(" MeshCtrl ListUserSessions --json"); break; } case 'listusergroups': { console.log("List user groups on the MeshCentral server, Example usages:\r\n"); console.log(" MeshCtrl ListUserGroups"); console.log(" MeshCtrl ListUserGroups --json"); break; } case 'listdevicegroups': { console.log("List the device groups for this account. Example usages:\r\n"); console.log(" MeshCtrl ListDeviceGroups "); console.log(" MeshCtrl ListDeviceGroups --json"); console.log("\r\nOptional arguments:\r\n"); console.log(" --idexists [id] - Return 1 if id exists, 0 if not."); console.log(" --nameexists [name] - Return id if name exists."); console.log(" --emailexists [email] - Return id if email exists."); console.log(" --hex - Display meshid in hex format."); console.log(" --json - Show result as JSON."); break; } case 'listdevices': { console.log("List devices. Example usages:\r\n"); console.log(" MeshCtrl ListDevices"); console.log(winRemoveSingleQuotes(" MeshCtrl ListDevices -id '[groupid]' --json")); console.log("\r\nOptional arguments:\r\n"); if (process.platform == 'win32') { console.log(" --id [groupid] - Filter by group identifier (or --group)."); } else { console.log(" --id '[groupid]' - Filter by group identifier (or --group)."); } console.log(" --group [groupname] - Filter by group name (or --id)."); console.log(" --count - Only return the device count."); console.log(" --json - Show result as JSON."); console.log(" --csv - Show result as comma seperated values."); console.log(" --filter \"[filter]\" - Filter devices using a filter string."); console.log(" \"x\" - Devices with \"x\" in the name."); console.log(" \"user:x or u:x\" - Devices with \"x\" in the name of currently logged in user."); console.log(" \"ip:x\" - Devices \"x\" IP address."); console.log(" \"group:x or g:x\" - Devices with \"x\" in device group name."); console.log(" \"tag:x or t:x\" - Devices with \"x\" in device tag."); console.log(" \"atag:x or a:x\" - Devices with \"x\" in device agent tag."); console.log(" \"os:x\" - Devices with \"x\" in the device OS description."); console.log(" \"amt:x\" - Devices with Intel AMT provisioning state (0, 1, 2)."); console.log(" \"desc:x\" - Devices with \"x\" in device description."); console.log(" \"wsc:ok\" - Devices with Windows Security Center ok."); console.log(" \"wsc:noav\" - Devices with Windows Security Center with anti-virus problem."); console.log(" \"wsc:noupdate\" - Devices with Windows Security Center with update problem."); console.log(" \"wsc:nofirewall\" - Devices with Windows Security Center with firewall problem."); console.log(" \"wsc:any\" - Devices with Windows Security Center with any problem."); console.log(" \"a and b\" - Match both conditions with precedence over OR. For example: \"lab and g:home\"."); console.log(" \"a or b\" - Math one of the conditions, for example: \"lab or g:home\"."); console.log(" --filterid [id,id...] - Show only results for devices with included id."); console.log(" --details - Show all device details."); break; } case 'listusersofdevicegroup': { console.log("List users that have permissions for a given device group. Example usage:\r\n"); console.log(" MeshCtrl ListUserOfDeviceGroup "); console.log("\r\nRequired arguments:\r\n"); if (process.platform == 'win32') { console.log(" --id [groupid] - Device group identifier."); } else { console.log(" --id '[groupid]' - Device group identifier."); } console.log("\r\nOptional arguments:\r\n"); console.log(" --json - Show result as JSON."); break; } case 'listevents': { console.log("List server events optionally filtered by user or device. Example usage:\r\n"); console.log(" MeshCtrl ListEvents "); console.log("\r\nOptional arguments:\r\n"); console.log(" --userid [name] - User account identifier."); console.log(" --id [deviceid] - The device identifier."); console.log(" --limit [number] - Maximum number of events to list."); console.log(" --raw - Output raw data in JSON format."); console.log(" --json - Give results in JSON format."); break; } case 'logintokens': { console.log("List account login tokens and allow addition and removal. Example usage:\r\n"); console.log(" MeshCtrl LoginTokens "); console.log("\r\nOptional arguments:\r\n"); console.log(" --remove [name] - Remove a login token."); console.log(" --add [name] - Add a login token."); console.log(" --expire [minutes] - When adding a token, minutes until expire."); console.log(" --json - Show login tokens in JSON format."); break; } case 'adduser': { console.log("Add a new user account. Example usages:\r\n"); console.log(" MeshCtrl AddUser --user newaccountname --pass newpassword"); console.log(" MeshCtrl AddUser --user newaccountname --randompass --rights full"); console.log("\r\nRequired arguments:\r\n"); console.log(" --user [name] - New account name."); console.log(" --pass [password] - New account password."); console.log(" --randompass - Create account with a random password."); console.log("\r\nOptional arguments:\r\n"); console.log(" --domain [domain] - Account domain, only for cross-domain admins."); console.log(" --email [email] - New account email address."); console.log(" --emailverified - New account email is verified."); console.log(" --resetpass - Request password reset on next login."); console.log(" --realname [name] - Set the real name for this account."); console.log(" --phone [number] - Set the account phone number."); console.log(" --rights [none|full|a,b,c] - Comma seperated list of server permissions. Possible values:"); console.log(" manageusers,backup,restore,update,fileaccess,locked,nonewgroups,notools,usergroups,recordings,locksettings,allevents"); break; } case 'edituser': { console.log("Edit a user account, Example usages:\r\n"); console.log(" MeshCtrl EditUser --userid user --rights locked,locksettings"); console.log(" MeshCtrl EditUser --userid user --realname Jones"); console.log("\r\nRequired arguments:\r\n"); console.log(" --userid [name] - User account identifier."); console.log("\r\nOptional arguments:\r\n"); console.log(" --domain [domain] - Account domain, only for cross-domain admins."); console.log(" --email [email] - Account email address."); console.log(" --emailverified - Account email is verified."); console.log(" --resetpass - Request password reset on next login."); console.log(" --realname [name] - Set the real name for this account."); console.log(" --phone [number] - Set the account phone number."); console.log(" --rights [none|full|a,b,c] - Comma seperated list of server permissions. Possible values:"); console.log(" manageusers,backup,restore,update,fileaccess,locked,nonewgroups,notools,usergroups,recordings,locksettings,allevents"); break; } case 'removeuser': { console.log("Delete a user account, Example usages:\r\n"); console.log(" MeshCtrl RemoveUser --userid accountid"); console.log("\r\nRequired arguments:\r\n"); console.log(" --userid [id] - Account identifier."); break; } case 'addusergroup': { console.log("Create a new user group, Example usages:\r\n"); console.log(" MeshCtrl AddUserGroup --name \"Test Group\""); console.log("\r\nRequired arguments:\r\n"); console.log(" --name [name] - Name of the user group."); break; } case 'removeusergroup': { console.log("Remove a user group, Example usages:\r\n"); console.log(winRemoveSingleQuotes(" MeshCtrl RemoveUserGroup --groupid 'ugrp//abcdf'")); console.log("\r\nRequired arguments:\r\n"); if (process.platform == 'win32') { console.log(" --groupid [groupid] - User group identifier."); } else { console.log(" --groupid '[groupid]' - User group identifier."); } break; } case 'addtousergroup': { console.log("Add a user, device or device group to a user group, Example usages:\r\n"); console.log(winRemoveSingleQuotes(" MeshCtrl AddToUserGroup --id 'user//abcdef' --groupid 'ugrp//abcdf'")); console.log(winRemoveSingleQuotes(" MeshCtrl AddToUserGroup --id 'node//abcdef' --groupid 'ugrp//abcdf' --rights [rights]")); console.log(winRemoveSingleQuotes(" MeshCtrl AddToUserGroup --id 'mesh//abcdef' --groupid 'ugrp//abcdf' --rights [rights]")); console.log("\r\nRequired arguments:\r\n"); if (process.platform == 'win32') { console.log(" --id [id] - Identifier to add."); console.log(" --groupid [groupid] - User group identifier."); } else { console.log(" --id '[id]' - Identifier to add."); console.log(" --groupid '[groupid]' - User group identifier."); } console.log("\r\nOptional arguments:\r\n"); console.log(" --rights [number] - Rights granted for adding device or device group."); console.log(" - 4294967295 for full admin or the sum of the following numbers."); console.log(" 1 = Edit Device Group 2 = Manage Users "); console.log(" 4 = Manage Computers 8 = Remote Control "); console.log(" 16 = Agent Console 32 = Server Files "); console.log(" 64 = Wake Device 128 = Set Notes "); console.log(" 256 = Remote View Only 512 = No Terminal "); console.log(" 1024 = No Files 2048 = No Intel AMT "); console.log(" 4096 = Desktop Limited Input 8192 = Limit Events "); console.log(" 16384 = Chat / Notify 32768 = Uninstall Agent "); console.log(" 65536 = No Remote Desktop 131072 = Remote Commands "); console.log(" 262144 = Reset / Power off "); break; } case 'removefromusergroup': { console.log("Remove a user, device or device group from a user group, Example usages:\r\n"); console.log(winRemoveSingleQuotes(" MeshCtrl RemoveUserFromUserGroup --userid 'user//abcdef' --groupid 'ugrp//abcdf'")); console.log(winRemoveSingleQuotes(" MeshCtrl RemoveUserFromUserGroup --userid 'node//abcdef' --groupid 'ugrp//abcdf'")); console.log(winRemoveSingleQuotes(" MeshCtrl RemoveUserFromUserGroup --userid 'mesh//abcdef' --groupid 'ugrp//abcdf'")); console.log("\r\nRequired arguments:\r\n"); if (process.platform == 'win32') { console.log(" --id [userid] - Identifier to remove."); console.log(" --groupid [groupid] - User group identifier."); } else { console.log(" --id '[userid]' - Identifier to remove."); console.log(" --groupid '[groupid]' - User group identifier."); } break; } case 'removeallusersfromusergroup': { console.log("Remove all users from a user group, Example usages:\r\n"); console.log(winRemoveSingleQuotes(" MeshCtrl RemoveAllUsersFromUserGroup --groupid 'ugrp//abcdf'")); console.log("\r\nRequired arguments:\r\n"); if (process.platform == 'win32') { console.log(" --groupid [groupid] - User group identifier."); } else { console.log(" --groupid '[groupid]' - User group identifier."); } break; } case 'adddevicegroup': { console.log("Add a device group, Example usages:\r\n"); console.log(" MeshCtrl AddDeviceGroup --name newgroupname"); console.log(" MeshCtrl AddDeviceGroup --name newgroupname --desc description --amtonly"); console.log(" MeshCtrl AddDeviceGroup --name newgroupname --features 1 --consent 7"); console.log("\r\nRequired arguments:\r\n"); console.log(" --name [name] - Name of the new group."); console.log("\r\nOptional arguments:\r\n"); console.log(" --desc [description] - New group description."); console.log(" --amtonly - New group is agent-less, Intel AMT only."); console.log(" --features [number] - Set device group features, sum of numbers below."); console.log(" 1 = Auto-Remove 2 = Hostname Sync"); console.log(" 4 = Record Sessions"); console.log(" --consent [number] - Set device group user consent, sum of numbers below."); console.log(" 1 = Desktop notify user 2 = Terminal notify user "); console.log(" 4 = Files notify user 8 = Desktop prompt user "); console.log(" 16 = Terminal prompt user 32 = Files prompt user "); console.log(" 64 = Desktop Toolbar "); break; } case 'removedevicegroup': { console.log("Remove a device group, Example usages:\r\n"); console.log(winRemoveSingleQuotes(" MeshCtrl RemoveDeviceGroup --id 'groupid'")); console.log("\r\nRequired arguments:\r\n"); if (process.platform == 'win32') { console.log(" --id [groupid] - Device group identifier (or --group)."); } else { console.log(" --id '[groupid]' - Device group identifier (or --group)."); } console.log(" --group [groupname] - Device group name (or --id)."); break; } case 'editdevicegroup': { console.log("Edit a device group, Example usages:\r\n"); console.log(winRemoveSingleQuotes(" MeshCtrl EditDeviceGroup --id 'groupid' --name \"New Name\"")); console.log(winRemoveSingleQuotes(" MeshCtrl EditDeviceGroup --id 'groupid' --desc \"Description\" --consent 63")); console.log(winRemoveSingleQuotes(" MeshCtrl EditDeviceGroup --id 'groupid' --invitecodes \"code1,code2\" --backgroundonly")); console.log("\r\nRequired arguments:\r\n"); if (process.platform == 'win32') { console.log(" --id [groupid] - Device group identifier (or --group)."); } else { console.log(" --id '[groupid]' - Device group identifier (or --group)."); } console.log(" --group [groupname] - Device group name (or --id)."); console.log("\r\nOptional arguments:\r\n"); console.log(" --name [name] - Set new device group name."); console.log(" --desc [description] - Set new device group description, blank to clear."); console.log(" --flags [number] - Set device group flags, sum of the values below, 0 for none."); console.log(" 1 = Auto remove device on disconnect."); console.log(" 2 = Sync hostname."); console.log(" --consent [number] - Set device group consent options, sum of the values below, 0 for none."); console.log(" 1 = Desktop notify user."); console.log(" 2 = Terminal notify user."); console.log(" 4 = Files notify user."); console.log(" 8 = Desktop prompt for user consent."); console.log(" 16 = Terminal prompt for user consent."); console.log(" 32 = Files prompt for user consent."); console.log(" 64 = Desktop show connection toolbar."); console.log(" --invitecodes [aa,bb] - Comma seperated list of invite codes, blank to clear."); console.log(" --backgroundonly - When used with invitecodes, set agent to only install in background."); console.log(" --interactiveonly - When used with invitecodes, set agent to only run on demand."); break; } case 'movetodevicegroup': { console.log("Move a device to a new device group, Example usages:\r\n"); console.log(winRemoveSingleQuotes(" MeshCtrl MoveToDeviceGroup --devid 'deviceid' --id 'groupid'")); console.log("\r\nRequired arguments:\r\n"); if (process.platform == 'win32') { console.log(" --id [groupid] - Device group identifier (or --group)."); } else { console.log(" --id '[groupid]' - Device group identifier (or --group)."); } console.log(" --group [groupname] - Device group name (or --id)."); if (process.platform == 'win32') { console.log(" --devid [deviceid] - Device identifier."); } else { console.log(" --devid '[deviceid]' - Device identifier."); } break; } case 'addusertodevicegroup': { console.log("Add a user to a device group, Example usages:\r\n"); console.log(winRemoveSingleQuotes(" MeshCtrl AddUserToDeviceGroup --id 'groupid' --userid userid --fullrights")); console.log(" MeshCtrl AddUserToDeviceGroup --group groupname --userid userid --editgroup --manageusers"); console.log("\r\nRequired arguments:\r\n"); if (process.platform == 'win32') { console.log(" --id [groupid] - Device group identifier (or --group)."); } else { console.log(" --id '[groupid]' - Device group identifier (or --group)."); } console.log(" --group [groupname] - Device group name (or --id)."); console.log(" --userid [userid] - The user identifier."); console.log("\r\nOptional arguments:\r\n"); console.log(" --fullrights - Allow full rights over this device group."); console.log(" --editgroup - Allow the user to edit group information."); console.log(" --manageusers - Allow the user to add/remove users."); console.log(" --managedevices - Allow the user to edit device information."); console.log(" --remotecontrol - Allow device remote control operations."); console.log(" --agentconsole - Allow agent console operations."); console.log(" --serverfiles - Allow access to group server files."); console.log(" --wakedevices - Allow device wake operation."); console.log(" --notes - Allow editing of device notes."); console.log(" --desktopviewonly - Restrict user to view-only remote desktop."); console.log(" --limiteddesktop - Limit remote desktop keys."); console.log(" --noterminal - Hide the terminal tab from this user."); console.log(" --nofiles - Hide the files tab from this user."); console.log(" --noamt - Hide the Intel AMT tab from this user."); console.log(" --limitedevents - User can only see his own events."); console.log(" --chatnotify - Allow chat and notification options."); console.log(" --uninstall - Allow remote uninstall of the agent."); if (args.limiteddesktop) { meshrights |= 4096; } if (args.limitedevents) { meshrights |= 8192; } if (args.chatnotify) { meshrights |= 16384; } if (args.uninstall) { meshrights |= 32768; } break; } case 'removeuserfromdevicegroup': { console.log("Remove a user from a device group, Example usages:\r\n"); console.log(winRemoveSingleQuotes(" MeshCtrl RemoveuserFromDeviceGroup --id 'groupid' --userid userid")); console.log("\r\nRequired arguments:\r\n"); if