package nagini.client.command; import java.io.IOException; import java.io.PrintStream; import java.util.Arrays; import java.util.List; import java.util.Set; import joptsimple.OptionParser; import joptsimple.OptionSet; import nagini.client.NaginiClient; import com.google.common.collect.Sets; /** * Implements all watch commands. */ public class NaginiCommandWatch extends AbstractCommand { /** * Parses command-line and directs to sub-commands. * * @param args Command-line input * @throws Exception */ public static void executeCommand(String[] args) throws Exception { String subCmd = (args.length > 0) ? args[0] : ""; args = CommandUtils.copyArrayCutFirst(args); if(subCmd.equals("app")) { SubCommandWatchApplication.executeCommand(args); } else { printHelp(System.out); } } /** * Prints command-line help menu. * */ public static void printHelp(PrintStream stream) { stream.println(); stream.println("Nagini Watch Commands"); stream.println("---------------------"); stream.println("app Watch all application node output on remote hosts."); stream.println(); stream.println("To get more information on each command,"); stream.println("please try \'help watch <command-name>\'."); stream.println(); } /** * Parses command-line input and prints help menu. * * @throws Exception */ public static void executeHelp(String[] args, PrintStream stream) throws Exception { String subCmd = (args.length > 0) ? args[0] : ""; if(subCmd.equals("app")) { SubCommandWatchApplication.printHelp(stream); } else { printHelp(stream); } } private static final String OPT_I = "i"; private static final String OPT_INTERVAL = "interval"; private static final String OPT_T = "t"; private static final String OPT_TAIL = "tail"; /** * watch application command */ public static class SubCommandWatchApplication extends AbstractCommand { /** * Initializes parser * * @return OptionParser object with all available options */ protected static OptionParser getParser() { OptionParser parser = new OptionParser(); // help options ParserUtils.acceptsHelp(parser); // required options ParserUtils.acceptsConfig(parser); parser.acceptsAll(Arrays.asList(OPT_I, OPT_INTERVAL), "interval seconds to print output") .withRequiredArg() .describedAs("second") .ofType(Integer.class); // optional options ParserUtils.acceptsAllNodes(parser); ParserUtils.acceptsNodeMultiple(parser); parser.acceptsAll(Arrays.asList(OPT_T, OPT_TAIL), "number of tail lines to print output") .withRequiredArg() .describedAs("line-number") .ofType(Integer.class); return parser; } /** * Prints help menu for command. * * @param stream PrintStream object for output * @throws IOException */ public static void printHelp(PrintStream stream) throws IOException { stream.println(); stream.println("NAME"); stream.println(" watch app - Watch all application node output on remote hosts"); stream.println(); stream.println("SYNOPSIS"); stream.println(" watch app --config <config-path> --interval <second>"); stream.println(" [-n <node-id-list> | --all-nodes] [--tail <line-number>]"); stream.println(); getParser().printHelpOn(stream); stream.println(); } /** * Parses command-line and executes command. * * @param args Command-line input * @param printHelp Tells whether to print help only or execute command * actually * @throws IOException * */ @SuppressWarnings("unchecked") public static void executeCommand(String[] args) throws IOException { OptionParser parser = getParser(); // declare parameters String configPath = null; Boolean allNodes = true; List<Integer> nodeIds = null; Integer interval = 0; Integer tail = 0; // parse command-line input OptionSet options = parser.parse(args); if(options.has(ParserUtils.OPT_HELP)) { printHelp(System.out); return; } // check required options and/or conflicting options ParserUtils.checkRequired(options, ParserUtils.OPT_CONFIG); ParserUtils.checkOptional(options, ParserUtils.OPT_NODE, ParserUtils.OPT_ALL_NODES); ParserUtils.checkRequired(options, OPT_INTERVAL); // load parameters configPath = (String) options.valueOf(ParserUtils.OPT_CONFIG); if(options.has(ParserUtils.OPT_NODE)) { nodeIds = (List<Integer>) options.valuesOf(ParserUtils.OPT_NODE); allNodes = false; } interval = (Integer) options.valueOf(OPT_INTERVAL); if(options.has(OPT_TAIL)) { tail = (Integer) options.valueOf(OPT_TAIL); } // execute command NaginiClient naginiClient = new NaginiClient(configPath); if(allNodes) { naginiClient.serviceOps.watchApplicationAllNodes(interval, tail); } else { Set<Integer> nodeIdSet = Sets.newHashSet(); for(Integer nodeId: nodeIds) { nodeIdSet.add(nodeId); } naginiClient.serviceOps.watchApplicationMultipleNodes(nodeIdSet, interval, tail); } } } }