diff --git a/hsarjcli/src/de/hsadmin/cli/HSadmin.java b/hsarjcli/src/de/hsadmin/cli/HSadmin.java index 9c469d9..0cd457c 100644 --- a/hsarjcli/src/de/hsadmin/cli/HSadmin.java +++ b/hsarjcli/src/de/hsadmin/cli/HSadmin.java @@ -19,50 +19,51 @@ import java.util.List; import java.util.Map; import java.util.Properties; -/// command line client for hsadmin -public class HSadmin -{ - static String version = "1.0.8 (2009/June/05 17:25 MEST)"; +/** + * command line client for hsadmin. + */ +public class HSadmin { - static String loginURL = "https://agnes.ostwall195.de:8443/cas/v1/tickets"; - static String servletURL = "https://agnes.ostwall195.de:8443/hsar/hsadmin/cli-interface/"; - static String backendURL = "https://agnes.ostwall195.de:8443/hsar/backend"; - -// static String loginURL = "https://login.hostsharing.net:443/cas/v1/tickets"; -// static String servletURL = "https://hsh93-test.hostsharing.net:443/hsar/hsadmin/cli-interface/"; -// static String backendURL = "https://hsh93-test.hostsharing.net:443/hsar/backend"; + private static String version = "CLI Client 2.0.0 (2011/May/21 09:00 MEST)"; - static Properties config; - static String userName; - static String passWord; - static int verbosity = 0; + private static String loginURL = "https://login.hostsharing.net/cas/v1/tickets"; + private static String servletURL = "https://admin.hostsharing.net/hsar/hsadmin/cli-interface/"; + private static String backendURL = "https://admin.hostsharing.net:443/hsar/backend"; + + private static Properties config; + private static String authenticatedUserName; + private static String passWord; + private static String runAsUserName; + private static int verbosity = 0; - private static class PasswordMaskingThread extends Thread - { - private boolean stop = false; - - public void interrupt() - { - stop = true; - super.interrupt(); - } - - public void run() { - while(!stop) { - try { - Thread.sleep(50); // rate at which attempts to mask - } catch (InterruptedException ie) {} - // in case I was sleeping while stop was changed, don't print - // I might be on the next line because of enter key being - // pressed - if (!stop) System.out.print("\rPassword: " + "\rPassword: " ); - System.out.flush(); - } - } + private static class PasswordMaskingThread extends Thread { + + private boolean stop = false; + + public void interrupt() { + stop = true; + super.interrupt(); + } + + public void run() { + while (!stop) { + try { + Thread.sleep(50); // rate at which attempts to mask + } catch (InterruptedException ie) { + } + // in case I was sleeping while stop was changed, don't print + // I might be on the next line because of enter key being + // pressed + if (!stop) { + System.out.print("\rPassword: " + + "\rPassword: "); + } + System.out.flush(); + } + } } - static class HttpRequest - { + private static class HttpRequest { private URL url; private Map> responseHeaders; private StringBuilder requestData; @@ -70,398 +71,386 @@ public class HSadmin private String password; private String username; private String responseMessage; - - public HttpRequest(String url) - throws MalformedURLException - { - this.url = new URL( url ); + + public HttpRequest(String url) throws MalformedURLException { + this.url = new URL(url); } - public int post() throws IOException - { + public int post() throws IOException { return doRequest("POST"); } - - public int put() throws IOException - { + + public int put() throws IOException { return doRequest("PUT"); } - - public int doRequest(String method) throws IOException - { - echoVerbose(method + ": " + url.toString() ); - - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); - conn.setDoOutput(true); - conn.setDoInput(true); - conn.setUseCaches(false); - conn.setAllowUserInteraction(false); - conn.setRequestProperty("Content-type", "application/x-www-form-urlencoded; charset=" + "UTF-8"); - if ( username != null ) - conn.setRequestProperty("Authorization", createAuthorizationHeader(username, password) ); - conn.setRequestMethod(method); - OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); - if ( requestData == null ) - { - if ( username != null ) - addParam("username", username); - if ( password != null ) - addParam("password", password); - } - if ( requestData != null ) - wr.write(requestData.toString()); - wr.flush(); - responseHeaders = conn.getHeaderFields(); - if (verbosity > 1) - echoResponseHeaders(conn); - - responseData = new StringBuilder(); - try - { - BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream(), "ISO-8859-1")); - String line; - while ((line = rd.readLine()) != null) { - responseData.append(line + "\n"); - } - rd.close(); - } - catch ( IOException exc ) - { - } - wr.close(); - - responseMessage = conn.getResponseMessage(); - return conn.getResponseCode(); + public int doRequest(String method) throws IOException { + echoVerbose(method + ": " + url.toString()); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setUseCaches(false); + conn.setAllowUserInteraction(false); + conn.setRequestProperty("Content-type", + "application/x-www-form-urlencoded; charset=" + "UTF-8"); + if (username != null) + conn.setRequestProperty("Authorization", + createAuthorizationHeader(username, password)); + conn.setRequestMethod(method); + OutputStreamWriter wr = new OutputStreamWriter(conn + .getOutputStream(), "UTF-8"); + if (requestData == null) { + if (username != null) + addParam("username", username); + if (password != null) + addParam("password", password); + } + if (requestData != null) + wr.write(requestData.toString()); + wr.flush(); + + responseHeaders = conn.getHeaderFields(); + if (verbosity > 1) + echoResponseHeaders(conn); + + responseData = new StringBuilder(); + try { + BufferedReader rd = new BufferedReader(new InputStreamReader( + conn.getInputStream(), "ISO-8859-1")); + String line; + while ((line = rd.readLine()) != null) { + responseData.append(line + "\n"); + } + rd.close(); + } catch (IOException exc) { + } + wr.close(); + responseMessage = conn.getResponseMessage(); + return conn.getResponseCode(); } - private String createAuthorizationHeader(String username, String password) throws IOException - { - if ( password == null ) - password = getPassWord(); - String authValue = username + ":" + password; - String encodedAuth = Base64.byteArrayToBase64(authValue.getBytes()); - return "Basic " + encodedAuth; + private String createAuthorizationHeader(String username, + String password) throws IOException { + if (password == null) + password = getPassWord(); + String authValue = username + ":" + password; + String encodedAuth = Base64.byteArrayToBase64(authValue.getBytes()); + return "Basic " + encodedAuth; } - /// printing the response header (TODO: just for debugging - remove) - private void echoResponseHeaders(HttpURLConnection conn) throws IOException - { - System.out.println("ResponseCode: " + conn.getResponseCode()); - System.out.println("ResponseMessage: " + conn.getResponseMessage()); - for ( String key: responseHeaders.keySet() ) - { - System.out.println( key + ": " + responseHeaders.get(key) ); - } + /** + * printing the response header. + */ + private void echoResponseHeaders(HttpURLConnection conn) + throws IOException { + // TODO: just for debugging - remove + System.out.println("ResponseCode: " + conn.getResponseCode()); + System.out.println("ResponseMessage: " + conn.getResponseMessage()); + for (String key : responseHeaders.keySet()) { + System.out.println(key + ": " + responseHeaders.get(key)); + } } - public void addParam(String name, String value) throws UnsupportedEncodingException - { - if ( requestData == null ) - requestData = new StringBuilder(); - else + public void addParam(String name, String value) + throws UnsupportedEncodingException { + if (requestData == null) { + requestData = new StringBuilder(); + } else { requestData.append("&"); - requestData.append( - URLEncoder.encode(name, "UTF-8") + "=" + URLEncoder.encode(value, "UTF-8") ); + } + requestData.append(URLEncoder.encode(name, "UTF-8") + "=" + + URLEncoder.encode(value, "UTF-8")); } - public String getResponseData() - { - return responseData.toString(); + public String getResponseData() { + return responseData.toString(); } - public void setUsername(String username) - { + public void setUsername(String username) { this.username = username; } - public void setPassword(String password) - { + public void setPassword(String password) { this.password = password; } - public List getResponseHeader(String key) - { + public List getResponseHeader(String key) { return responseHeaders.get(key); } - public void setRequestData(String data) - { + public void setRequestData(String data) { requestData = new StringBuilder(data); } - public String getResponseMessage() - { + public String getResponseMessage() { return responseMessage; } } - /// returns the TGT, either from a special user config file or from stdin - private static String getTGT() throws IOException - { - HttpRequest postReq = new HttpRequest( loginURL ); - echoVerbose("using userName=" + userName + " for login"); - - postReq.setUsername(userName); - String pw = getPassWord(); - postReq.setPassword(pw); - if ( 201 == postReq.post() ) - { - String tgt = postReq.getResponseHeader("Location").get(0); - echoVerbose("TGT: " + tgt); - return tgt; - } - else - return null; + /** + * returns the TGT, either from a special user config file or from stdin + */ + private static String getTGT() throws IOException { + HttpRequest postReq = new HttpRequest(loginURL); + echoVerbose("using userName=" + authenticatedUserName + " for login"); + postReq.setUsername(authenticatedUserName); + String pw = getPassWord(); + postReq.setPassword(pw); + if (201 == postReq.post()) { + String tgt = postReq.getResponseHeader("Location").get(0); + echoVerbose("TGT: " + tgt); + return tgt; + } else { + return null; + } } - /// retrieves a new session ticket using the given ticket granting ticket - private static String getST(String tgt) - { + /** + * retrieves a new session ticket using the given ticket granting ticket + */ + private static String getST(String tgt) { String st = null; - try - { - HttpRequest httpReq = new HttpRequest( tgt ); - httpReq.setRequestData( "service=" + backendURL ); - if ( 200 == httpReq.post() ) - st = httpReq.getResponseData(); - } - catch ( Exception exc ) - { /* ignore */ } - - echoVerbose("ST: " + st); - return st; + try { + HttpRequest httpReq = new HttpRequest(tgt); + httpReq.setRequestData("service=" + backendURL); + if (200 == httpReq.post()) { + st = httpReq.getResponseData(); + } + } catch (Exception exc) { /* ignore */ + } + echoVerbose("ST: " + st); + return st; } - /// returns the password, either from parameter, user config file or from stdin - private static String getPassWord() throws IOException - { - if ( passWord == null ) - passWord = config.getProperty( "passWord." + userName, config.getProperty("passWord") ); - - if ( passWord == null ) - { + /** + * returns the password, either from parameter, user config file or from + * stdin. + */ + private static String getPassWord() throws IOException { + if (passWord == null) + passWord = config.getProperty("passWord." + authenticatedUserName, + config.getProperty("passWord")); + if (passWord == null) { Console console = System.console(); - if ( console != null ) - { - char [] input = console.readPassword("Password: "); + if (console != null) { + char[] input = console.readPassword("Password: "); passWord = new String(input); - } - else - { + } else { System.out.print("Password: "); System.out.flush(); - BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); - + BufferedReader reader = new BufferedReader( + new InputStreamReader(System.in)); + PasswordMaskingThread thread = new PasswordMaskingThread(); - thread.start(); - passWord = reader.readLine(); - thread.interrupt(); + thread.start(); + passWord = reader.readLine(); + thread.interrupt(); } } return passWord; } - /// calls the remote service using the given service ticket 'st' - private static String exec(String st, String[] args) throws IOException - { - HttpRequest httpReq = new HttpRequest( servletURL ); - echoVerbose("using userName=" + userName + " for exec"); - httpReq.setUsername(userName); - httpReq.setPassword(st); - StringBuilder argsAsString = new StringBuilder(); - for ( String arg: args ) - argsAsString.append(arg + "\n"); - echoVerbose("--- remote args: ---\n" + argsAsString.toString() + "\n--- end of args. ---"); - httpReq.setRequestData(argsAsString.toString()); - - int code = httpReq.put(); - List hsadminErrors = httpReq.getResponseHeader("X-hsadmin-error"); - if ( hsadminErrors != null && hsadminErrors.size() > 0 && hsadminErrors.get(0) != null ) - throw new RuntimeException( hsadminErrors.get(0) ); - else if ( 200 == code ) - return httpReq.getResponseData(); - throw new RuntimeException( "HTTP error #" + code + ": " + httpReq.getResponseMessage() ); - } - - /// reads session information (in users home dir) - private static String loadTGT(String user, String fileName) throws IOException - { - Properties properties = new Properties(); - try - { - properties.load( new FileInputStream( new File( System.getProperty("user.home"), fileName)) ); - return properties.getProperty(user); + /** + * calls the remote service using the given service ticket 'st'. + */ + private static String exec(String st, String[] args) throws IOException { + HttpRequest httpReq = new HttpRequest(servletURL); + if (runAsUserName == null) { + runAsUserName = authenticatedUserName; } - catch ( FileNotFoundException exc ) - { + echoVerbose("using userName=" + runAsUserName + " for exec"); + httpReq.setUsername(runAsUserName); + httpReq.setPassword(st); + StringBuilder argsAsString = new StringBuilder(); + for (String arg : args) { + argsAsString.append(arg + "\n"); + } + echoVerbose("--- remote args: ---\n" + argsAsString.toString() + + "\n--- end of args. ---"); + httpReq.setRequestData(argsAsString.toString()); + int code = httpReq.put(); + List hsadminErrors = httpReq + .getResponseHeader("X-hsadmin-error"); + if (hsadminErrors != null && hsadminErrors.size() > 0 + && hsadminErrors.get(0) != null) { + throw new RuntimeException(hsadminErrors.get(0)); + } + else { + if (200 == code) return httpReq.getResponseData(); + } + throw new RuntimeException("HTTP error #" + code + ": " + + httpReq.getResponseMessage()); + } + + /** + * reads session information (in users home dir). + */ + private static String loadTGT(String user, String fileName) + throws IOException { + Properties properties = new Properties(); + try { + properties.load(new FileInputStream(new File(System + .getProperty("user.home"), fileName))); + return properties.getProperty(user); + } catch (FileNotFoundException exc) { return null; } } - /// stores session information (in users home dir) - private static void storeTGT(String fileName, String user, String tgt) throws IOException - { + /** + * stores session information (in users home dir). + */ + private static void storeTGT(String fileName, String user, String tgt) + throws IOException { Properties properties = new Properties(); - try - { - properties.load( new FileInputStream( new File( System.getProperty("user.home"), fileName)) ); + try { + properties.load(new FileInputStream(new File(System + .getProperty("user.home"), fileName))); + } catch (Exception exc) { /* ignore */ } - catch ( Exception exc ) - { /* ignore */ } properties.setProperty(user, tgt); - properties.store( new FileOutputStream( new File( System.getProperty("user.home"), fileName)), "" ); + properties.store(new FileOutputStream(new File(System + .getProperty("user.home"), fileName)), ""); } - /// reads the settings from the given config file (looked up in users home dir) - private static void readUserConfig(String string) throws IOException - { + /** + * reads the settings from the given config file (looked up in users home + * dir). + */ + private static void readUserConfig(String string) throws IOException { // Read properties file. - config = new Properties(); - try { - config.load(new FileInputStream( new File(System.getProperty("user.home"), ".hsadmin.conf"))); - } catch (FileNotFoundException e) { - } - - userName = config.getProperty("userName", System.getenv("USER")); + config = new Properties(); + try { + config.load( + new FileInputStream( + new File(System.getProperty("user.home"), ".hsadmin.conf"))); + } catch (FileNotFoundException e) { + } + authenticatedUserName = config.getProperty("userName", System.getenv("USER")); loginURL = config.getProperty("loginURL", loginURL); servletURL = config.getProperty("servletURL", servletURL); backendURL = config.getProperty("backendURL", backendURL); - verbosity = Integer.parseInt( config.getProperty("verbosity", "0") ); + verbosity = Integer.parseInt(config.getProperty("verbosity", "0")); } - /// echoes the string to stdout depending on verbosity level - private static void echoVerbose(String string) - { - if (verbosity > 0) + /** + * echoes the string to stdout depending on verbosity level. + */ + private static void echoVerbose(String string) { + if (verbosity > 0) { System.out.println("]" + string); + } } - private static void printHelp() - { - System.out.println("syntax: hsadmin [-h|--help] [-V (0|1|2)|--verbosity=(0|1|2)] [-v|--version]\n" + - " [-u USER|--user=USER] [-|REMOTE-ARGUMENTS]"); + private static void printHelp() { + System.out.println("syntax: hsadmin [-h|--help] [-V (0|1|2)|--verbosity=(0|1|2)] [-v|--version]\n" + + " [-u USER|--user=USER] [-|REMOTE-ARGUMENTS]"); System.out.println("sample: hsadmin -V 0 -u xyz00 -c user.search"); System.out.println("version: " + version); System.out.println(""); System.out.println("REMOTE-ARGUMENTS ('-' on command line => read from stdin):"); } - /// reads remote arguments from stdin into 'remoteArgs' - private static void readArgsFromStdIn(ArrayList remoteArgs) throws IOException - { + /** + * reads remote arguments from stdin into 'remoteArgs'. + */ + private static void readArgsFromStdIn(ArrayList remoteArgs) + throws IOException { echoVerbose("READING ARGS FROM STDIN"); - BufferedReader rd = new BufferedReader(new InputStreamReader(System.in)); - String line; - while ((line = rd.readLine()) != null) { - echoVerbose("ADDING REMOTE ARG:" + line); - remoteArgs.add(line); - } - rd.close(); + BufferedReader rd = new BufferedReader(new InputStreamReader(System.in)); + String line; + while ((line = rd.readLine()) != null) { + echoVerbose("ADDING REMOTE ARG:" + line); + remoteArgs.add(line); + } + rd.close(); } - private static String createSessionTicket() throws IOException - { - String tgt = loadTGT(userName, ".hsadmin.tgt"); - String st = getST(tgt); - if ( st == null) - { - tgt = getTGT(); - if ( tgt == null ) - { - System.err.println("ERROR: login failure - cannot get ticket granting ticket"); - System.exit(1); - } - storeTGT(".hsadmin.tgt", userName, tgt ); - st = getST(tgt); - } + private static String createSessionTicket() throws IOException { + String tgt = loadTGT(authenticatedUserName, ".hsadmin.tgt"); + String st = getST(tgt); + if (st == null) { + tgt = getTGT(); + if (tgt == null) { + System.err + .println("ERROR: login failure - cannot get ticket granting ticket"); + System.exit(1); + } + storeTGT(".hsadmin.tgt", authenticatedUserName, tgt); + st = getST(tgt); + } return st; } - private static ArrayList createRemoteArgs(String[] args) throws IOException - { + private static ArrayList createRemoteArgs(String[] args) + throws IOException { ArrayList remoteArgs = new ArrayList(); - for ( int n = 0; n < args.length; ++n ) - { + for (int n = 0; n < args.length; ++n) { String arg = args[n]; - if ( arg.equals("-u") ) - { + if (arg.equals("-u")) { // TODO: out of bounds error - userName = args[++n]; - } - else if ( arg.startsWith("--user=") || arg.startsWith("--user:") ) - { - userName = args[n].substring(7); - } - else if ( arg.equals("-V") ) - { + authenticatedUserName = args[++n]; + } else if (arg.startsWith("--user=") || arg.startsWith("--user:")) { + authenticatedUserName = args[n].substring(7); + } else if (arg.equals("-r")) { + // TODO: out of bounds error + runAsUserName = args[++n]; + } else if (arg.toLowerCase().startsWith("--runas=") || arg.toLowerCase().startsWith("--runas:")) { + runAsUserName = args[n].substring(8); + } else if (arg.equals("-V")) { // TODO: out of bounds error verbosity = Integer.parseInt(args[++n]); - } - else if ( arg.startsWith("--verbosity:") || arg.startsWith("--verbosity=") ) - { + } else if (arg.startsWith("--verbosity:") + || arg.startsWith("--verbosity=")) { verbosity = Integer.parseInt(args[n].substring(12)); - } - else if ( arg.equals("-v") ) - { + } else if (arg.equals("-v")) { System.out.println(version); remoteArgs = new ArrayList(); break; - } - else if ( arg.startsWith("--version") ) - { + } else if (arg.startsWith("--version")) { System.out.println(version); remoteArgs = new ArrayList(); break; - } - else if ( arg.equals("-h") ) - { + } else if (arg.equals("-h")) { // TODO: out of bounds error printHelp(); remoteArgs = new ArrayList(); remoteArgs.add("-h"); break; - } - else if ( arg.startsWith("--help") ) - { + } else if (arg.startsWith("--help")) { printHelp(); remoteArgs = new ArrayList(); remoteArgs.add("-h"); break; - } - else if ( arg.equals("-") ) + } else if (arg.equals("-")) readArgsFromStdIn(remoteArgs); - else - { + else { echoVerbose("ADDING REMOTE ARG:" + args[n]); remoteArgs.add(args[n]); } } - return remoteArgs; } - /// main program - public static void main(String[] args) throws IOException - { + /** + * main program. + */ + public static void main(String[] args) throws IOException { readUserConfig(".hsadmin.conf"); - - ArrayList remoteArgs = createRemoteArgs(args); - - if ( remoteArgs.size() > 0 ) - { - try { - String st = createSessionTicket(); - - String response = exec(st, remoteArgs.toArray(new String[remoteArgs.size()])); - if ( response != null ) - System.out.print(response); - } - catch ( Exception exc ) - { - System.err.println(exc.getMessage()); - System.exit(1); // TODO: be more specific, like: 1=unknown, 2=remoting, 3=functional - } + ArrayList remoteArgs = createRemoteArgs(args); + if (remoteArgs.size() > 0) { + try { + String st = createSessionTicket(); + + String response = exec(st, remoteArgs + .toArray(new String[remoteArgs.size()])); + if (response != null) + System.out.print(response); + } catch (Exception exc) { + System.err.println(exc.getMessage()); + System.exit(1); // TODO: be more specific, + // like: 1=unknown, 2=remoting, 3=functional + } } }