latest version

This commit is contained in:
Peter Hormanns 2011-05-16 13:46:34 +00:00
parent b7df964612
commit 2efa12790b

View File

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