001 /* 002 * Cumulus4j - Securing your data in the cloud - http://cumulus4j.org 003 * Copyright (C) 2011 NightLabs Consulting GmbH 004 * 005 * This program is free software: you can redistribute it and/or modify 006 * it under the terms of the GNU Affero General Public License as 007 * published by the Free Software Foundation, either version 3 of the 008 * License, or (at your option) any later version. 009 * 010 * This program is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 013 * GNU Affero General Public License for more details. 014 * 015 * You should have received a copy of the GNU Affero General Public License 016 * along with this program. If not, see <http://www.gnu.org/licenses/>. 017 */ 018 package org.cumulus4j.keymanager.cli; 019 020 import java.io.IOException; 021 import java.util.ArrayList; 022 import java.util.Collections; 023 import java.util.HashMap; 024 import java.util.List; 025 import java.util.Map; 026 027 import org.cumulus4j.keystore.KeyStore; 028 import org.kohsuke.args4j.CmdLineException; 029 import org.kohsuke.args4j.CmdLineParser; 030 031 /** 032 * <p> 033 * Command line tool for the key store. 034 * </p> 035 * <p> 036 * Though this is the main class of the CLI, the actual logic for all command line 037 * operations is implemented in subclasses of {@link SubCommand}. 038 * </p> 039 * 040 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de 041 */ 042 public class KeyManagerCLI 043 { 044 public static final List<Class<? extends SubCommand>> subCommandClasses; 045 static { 046 ArrayList<Class<? extends SubCommand>> l = new ArrayList<Class<? extends SubCommand>>(); 047 048 l.add(PutUserSubCommand.class); 049 l.add(DeleteUserSubCommand.class); 050 l.add(HelpSubCommand.class); 051 l.add(InfoSubCommand.class); 052 l.add(InitDateDependentKeyStrategySubCommand.class); 053 l.add(LicenceSubCommand.class); 054 l.add(LicenseSubCommand.class); 055 l.add(VersionSubCommand.class); 056 057 l.trimToSize(); 058 subCommandClasses = Collections.unmodifiableList(l); 059 }; 060 061 public static final List<SubCommand> subCommands; 062 public static final Map<String, SubCommand> subCommandName2subCommand; 063 static { 064 try { 065 ArrayList<SubCommand> l = new ArrayList<SubCommand>(); 066 Map<String, SubCommand> m = new HashMap<String, SubCommand>(); 067 for (Class<? extends SubCommand> c : subCommandClasses) { 068 SubCommand subCommand = c.newInstance(); 069 l.add(subCommand); 070 m.put(subCommand.getSubCommandName(), subCommand); 071 } 072 073 l.trimToSize(); 074 subCommands = Collections.unmodifiableList(l); 075 subCommandName2subCommand = Collections.unmodifiableMap(m); 076 } catch (Exception e) { 077 throw new RuntimeException(e); 078 } 079 } 080 081 private static final String CMD_PREFIX; 082 static { 083 try { 084 CMD_PREFIX = "java -jar org.cumulus4j.keymanager.cli-" + VersionSubCommand.getVersion() + ".jar"; 085 } catch (IOException e) { 086 throw new RuntimeException(e); 087 } 088 } 089 090 private static final String[] stripSubCommand(String[] args) 091 { 092 String[] result = new String[args.length - 1]; 093 for (int i = 0; i < result.length; i++) 094 result[i] = args[i + 1]; 095 096 return result; 097 } 098 099 /** 100 * Main method providing a command line interface (CLI) to the {@link KeyStore}. 101 * 102 * @param args the program arguments. 103 */ 104 public static void main(String[] args) 105 { 106 int programExitStatus = 1; 107 boolean displayHelp = true; 108 String subCommandName = null; 109 SubCommand subCommand = null; 110 111 if (args.length > 0) { 112 subCommandName = args[0]; 113 114 if ("help".equals(subCommandName)) { 115 if (args.length > 1) { 116 subCommandName = args[1]; 117 subCommand = subCommandName2subCommand.get(subCommandName); 118 if (subCommand == null) { 119 System.err.println("Unknown sub-command: " + subCommandName); 120 subCommandName = null; 121 } 122 } 123 } 124 else { 125 subCommand = subCommandName2subCommand.get(subCommandName); 126 if (subCommand == null) { 127 System.err.println("Unknown sub-command: " + subCommandName); 128 subCommandName = null; 129 } 130 else { 131 displayHelp = false; 132 133 CmdLineParser parser = new CmdLineParser(subCommand); 134 try { 135 String[] argsWithoutSubCommand = stripSubCommand(args); 136 parser.parseArgument(argsWithoutSubCommand); 137 subCommand.prepare(); 138 subCommand.run(); 139 programExitStatus = 0; 140 } catch (CmdLineException e) { 141 // handling of wrong arguments 142 programExitStatus = 2; 143 displayHelp = true; 144 System.err.println("Error: " + e.getMessage()); 145 System.err.println(); 146 } catch (Exception x) { 147 programExitStatus = 3; 148 x.printStackTrace(); 149 } 150 } 151 } 152 } 153 154 if (displayHelp) { 155 if (subCommand == null) { 156 System.err.println("Syntax: " + CMD_PREFIX + " <sub-command> <options>"); 157 System.err.println(); 158 System.err.println("Get help for a specific sub-command: " + CMD_PREFIX + " help <sub-command>"); 159 System.err.println(); 160 System.err.println("Available sub-commands:"); 161 for (SubCommand sc : subCommands) { 162 System.err.println(" " + sc.getSubCommandName()); 163 } 164 } 165 else { 166 CmdLineParser parser = new CmdLineParser(subCommand); 167 System.err.println(subCommand.getSubCommandName() + ": " + subCommand.getSubCommandDescription()); 168 System.err.println(); 169 System.err.print("Syntax: " + CMD_PREFIX + " " + subCommand.getSubCommandName()); 170 parser.printSingleLineUsage(System.err); 171 System.err.println(); 172 System.err.println(); 173 System.err.println("Options:"); 174 parser.printUsage(System.err); 175 } 176 } 177 178 System.exit(programExitStatus); 179 } 180 181 }