May slow maxscale down when used. Only supported for "list sessions", "show sessions" and "show session <id>".
		
			
				
	
	
		
			206 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			206 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (c) 2016 MariaDB Corporation Ab
 | 
						|
 *
 | 
						|
 * Use of this software is governed by the Business Source License included
 | 
						|
 * in the LICENSE.TXT file and at www.mariadb.com/bsl11.
 | 
						|
 *
 | 
						|
 * Change Date: 2022-01-01
 | 
						|
 *
 | 
						|
 * On the date above, in accordance with the Business Source License, use
 | 
						|
 * of this software will be governed by version 2 or later of the General
 | 
						|
 * Public License.
 | 
						|
 */
 | 
						|
 | 
						|
require('./common.js')()
 | 
						|
 | 
						|
exports.command = 'list <command>'
 | 
						|
exports.desc = 'List objects'
 | 
						|
exports.handler = function() {}
 | 
						|
exports.builder = function(yargs) {
 | 
						|
    yargs
 | 
						|
        .command('servers', 'List servers', function(yargs) {
 | 
						|
            return yargs.epilog('List all servers in MaxScale.')
 | 
						|
                .usage('Usage: list servers')
 | 
						|
        }, function(argv) {
 | 
						|
            maxctrl(argv, function(host) {
 | 
						|
                fields = [
 | 
						|
                    {'Server': 'id'},
 | 
						|
                    {'Address': 'attributes.parameters.address'},
 | 
						|
                    {'Port': 'attributes.parameters.port'},
 | 
						|
                    {'Connections': 'attributes.statistics.connections'},
 | 
						|
                    {'State': 'attributes.state'},
 | 
						|
                    {'GTID': 'attributes.gtid_current_pos'}
 | 
						|
                ]
 | 
						|
 | 
						|
                // First, get the list of all servers
 | 
						|
                return getJson(host, 'servers')
 | 
						|
                    .then((res) => {
 | 
						|
 | 
						|
                        // Build a set of unique monitors, flatten it into an array of strings and
 | 
						|
                        // filter out any duplicate or undefined values (from servers that aren't
 | 
						|
                        // monitored).
 | 
						|
                        var v = _.uniq(_.flatten(_.getPath(res, 'data[].relationships.monitors.data[].id'))).filter(i => i)
 | 
						|
 | 
						|
                        // Get the server_info object for each monitor (if it defines one)
 | 
						|
                        var infos = []
 | 
						|
                        var promises = v.map((i) => getJson(host, 'monitors/' + i)
 | 
						|
                                             .then((j) => {
 | 
						|
                                                 info = _.get(j, 'data.attributes.monitor_diagnostics.server_info')
 | 
						|
                                                 if (info) {
 | 
						|
                                                     info.forEach((k) => infos.push(k))
 | 
						|
                                                 }
 | 
						|
                                             }))
 | 
						|
 | 
						|
                        // Wait for promises to resolve
 | 
						|
                        return Promise.all(promises)
 | 
						|
                            .then(() => {
 | 
						|
                                res.data.forEach((i) => {
 | 
						|
 | 
						|
                                    // Get the gtid_current_pos value for each server from the server_info list
 | 
						|
                                    var idx = infos.findIndex((info) => info.name == i.id)
 | 
						|
 | 
						|
                                    if (idx != -1 && infos[idx].gtid_current_pos) {
 | 
						|
                                        // Found the GTID position of this server
 | 
						|
                                        i.attributes.gtid_current_pos = infos[idx].gtid_current_pos
 | 
						|
                                    } else {
 | 
						|
                                        // Assign an empty value so we always have something to print
 | 
						|
                                        i.attributes.gtid_current_pos = ''
 | 
						|
                                    }
 | 
						|
                                })
 | 
						|
                            })
 | 
						|
                            .then(() => filterResource(res, fields))
 | 
						|
                            .then((res) => rawCollectionAsTable(res, fields))
 | 
						|
                    })
 | 
						|
            })
 | 
						|
        })
 | 
						|
        .command('services', 'List services', function(yargs) {
 | 
						|
            return yargs.epilog('List all services and the servers they use.')
 | 
						|
                .usage('Usage: list services')
 | 
						|
        }, function(argv) {
 | 
						|
            maxctrl(argv, function(host) {
 | 
						|
                return getCollection(host, 'services',[
 | 
						|
                    {'Service': 'id'},
 | 
						|
                    {'Router': 'attributes.router'},
 | 
						|
                    {'Connections': 'attributes.connections'},
 | 
						|
                    {'Total Connections': 'attributes.total_connections'},
 | 
						|
                    {'Servers': 'relationships.servers.data[].id'}
 | 
						|
                ])
 | 
						|
            })
 | 
						|
        })
 | 
						|
        .command('listeners <service>', 'List listeners of a service', function(yargs) {
 | 
						|
            return yargs.epilog('List listeners for a service.')
 | 
						|
                .usage('Usage: list listeners <service>')
 | 
						|
        }, function(argv) {
 | 
						|
            maxctrl(argv, function(host) {
 | 
						|
                return getSubCollection(host, 'services/' + argv.service, 'attributes.listeners', [
 | 
						|
                    {'Name': 'id'},
 | 
						|
                    {'Port': 'attributes.parameters.port'},
 | 
						|
                    {'Host': 'attributes.parameters.host'},
 | 
						|
                    {'State': 'attributes.state'}
 | 
						|
                ])
 | 
						|
            })
 | 
						|
        })
 | 
						|
        .command('monitors', 'List monitors', function(yargs) {
 | 
						|
            return yargs.epilog('List all monitors in MaxScale.')
 | 
						|
                .usage('Usage: list monitors')
 | 
						|
        }, function(argv) {
 | 
						|
            maxctrl(argv, function(host) {
 | 
						|
                return getCollection(host, 'monitors', [
 | 
						|
                    {'Monitor': 'id'},
 | 
						|
                    {'State': 'attributes.state'},
 | 
						|
                    {'Servers': 'relationships.servers.data[].id'}
 | 
						|
                ])
 | 
						|
            })
 | 
						|
        })
 | 
						|
        .command('sessions', 'List sessions', function(yargs) {
 | 
						|
            return yargs.epilog('List all client sessions.')
 | 
						|
                .usage('Usage: list sessions')
 | 
						|
                .group([rDnsOption.shortname], 'Options:')
 | 
						|
                .option(rDnsOption.shortname, rDnsOption.definition)
 | 
						|
        }, function(argv) {
 | 
						|
            maxctrl(argv, function(host) {
 | 
						|
                var resource = 'sessions'
 | 
						|
                if (argv[this.rDnsOption.shortname]) {
 | 
						|
                    resource += '?' + this.rDnsOption.optionOn
 | 
						|
                }
 | 
						|
                return getCollection(host, resource,[
 | 
						|
                    {'Id': 'id'},
 | 
						|
                    {'User': 'attributes.user'},
 | 
						|
                    {'Host': 'attributes.remote'},
 | 
						|
                    {'Connected': 'attributes.connected'},
 | 
						|
                    {'Idle': 'attributes.idle'},
 | 
						|
                    {'Service': 'relationships.services.data[].id'}
 | 
						|
                ])
 | 
						|
            })
 | 
						|
        })
 | 
						|
        .command('filters', 'List filters', function(yargs) {
 | 
						|
            return yargs.epilog('List all filters in MaxScale.')
 | 
						|
                .usage('Usage: list filters')
 | 
						|
        }, function(argv) {
 | 
						|
            maxctrl(argv, function(host) {
 | 
						|
                return getCollection(host, 'filters', [
 | 
						|
                    {'Filter': 'id'},
 | 
						|
                    {'Service': 'relationships.services.data[].id'},
 | 
						|
                    {'Module': 'attributes.module'}
 | 
						|
                ])
 | 
						|
            })
 | 
						|
        })
 | 
						|
        .command('modules', 'List loaded modules', function(yargs) {
 | 
						|
            return yargs.epilog('List all currently loaded modules.')
 | 
						|
                .usage('Usage: list modules')
 | 
						|
        }, function(argv) {
 | 
						|
            maxctrl(argv, function(host) {
 | 
						|
                return getCollection(host, 'maxscale/modules',[
 | 
						|
                    {'Module':'id'},
 | 
						|
                    {'Type':'attributes.module_type'},
 | 
						|
                    {'Version': 'attributes.version'}
 | 
						|
                ])
 | 
						|
            })
 | 
						|
        })
 | 
						|
        .command('threads', 'List threads', function(yargs) {
 | 
						|
            return yargs.epilog('List all worker threads.')
 | 
						|
                .usage('Usage: list threads')
 | 
						|
        }, function(argv) {
 | 
						|
            maxctrl(argv, function(host) {
 | 
						|
                return getCollection(host, 'maxscale/threads', [
 | 
						|
                    {'Id': 'id'},
 | 
						|
                    {'Current FDs': 'attributes.stats.current_descriptors'},
 | 
						|
                    {'Total FDs': 'attributes.stats.total_descriptors'},
 | 
						|
                    {'Load (1s)': 'attributes.stats.load.last_second'},
 | 
						|
                    {'Load (1m)': 'attributes.stats.load.last_minute'},
 | 
						|
                    {'Load (1h)': 'attributes.stats.load.last_hour'}
 | 
						|
                ])
 | 
						|
            })
 | 
						|
        })
 | 
						|
        .command('users', 'List created users', function(yargs) {
 | 
						|
            return yargs.epilog('List network the users that can be used to connect to the MaxScale REST API as well as enabled local accounts.')
 | 
						|
                .usage('Usage: list users')
 | 
						|
        }, function(argv) {
 | 
						|
            maxctrl(argv, function(host) {
 | 
						|
                return getCollection(host, 'users',[
 | 
						|
                    {'Name':'id'},
 | 
						|
                    {'Type':'type'},
 | 
						|
                    {'Privileges':'attributes.account'},
 | 
						|
                ])
 | 
						|
            })
 | 
						|
        })
 | 
						|
        .command('commands', 'List module commands', function(yargs) {
 | 
						|
            return yargs.epilog('List all available module commands.')
 | 
						|
                .usage('Usage: list commands')
 | 
						|
        }, function(argv) {
 | 
						|
            maxctrl(argv, function(host) {
 | 
						|
                return getCollection(host, 'maxscale/modules',[
 | 
						|
                    {'Module':'id'},
 | 
						|
                    {'Commands': 'attributes.commands[].id'}
 | 
						|
                ])
 | 
						|
            })
 | 
						|
        })
 | 
						|
        .usage('Usage: list <command>')
 | 
						|
        .help()
 | 
						|
        .command('*', 'the default command', {}, function(argv) {
 | 
						|
            maxctrl(argv, function(host) {
 | 
						|
                return error('Unknown command. See output of `help list` for a list of commands.')
 | 
						|
            })
 | 
						|
        })
 | 
						|
}
 |