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.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";
private static String version = "CLI Client 2.0.0 (2011/May/21 09:00 MEST)";
// 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 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";
static Properties config;
static String userName;
static String passWord;
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 boolean stop = false;
private static class PasswordMaskingThread extends Thread {
public void interrupt()
{
stop = true;
super.interrupt();
}
private boolean stop = false;
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();
}
}
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<String, List<String>> responseHeaders;
private StringBuilder requestData;
@ -71,397 +72,385 @@ public class HSadmin
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() );
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();
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);
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();
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 )
public void addParam(String name, String value)
throws UnsupportedEncodingException {
if (requestData == null) {
requestData = new StringBuilder();
else
} 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<String> getResponseHeader(String key)
{
public List<String> 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;
}
/// 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();
/**
* 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;
}
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 )
{
Console console = System.console();
if ( console != null )
{
char [] input = console.readPassword("Password: ");
passWord = new String(input);
/**
* 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();
}
else
{
} 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." + authenticatedUserName,
config.getProperty("passWord"));
if (passWord == null) {
Console console = System.console();
if (console != null) {
char[] input = console.readPassword("Password: ");
passWord = new String(input);
} 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<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() );
/**
* 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;
}
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
{
/**
* 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)) );
try {
properties.load(new FileInputStream(new File(System
.getProperty("user.home"), fileName)));
return properties.getProperty(user);
}
catch ( FileNotFoundException exc )
{
} 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<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");
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<String> createRemoteArgs(String[] args) throws IOException
{
private static ArrayList<String> createRemoteArgs(String[] args)
throws IOException {
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];
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<String>();
break;
}
else if ( arg.startsWith("--version") )
{
} else if (arg.startsWith("--version")) {
System.out.println(version);
remoteArgs = new ArrayList<String>();
break;
}
else if ( arg.equals("-h") )
{
} else if (arg.equals("-h")) {
// TODO: out of bounds error
printHelp();
remoteArgs = new ArrayList<String>();
remoteArgs.add("-h");
break;
}
else if ( arg.startsWith("--help") )
{
} else if (arg.startsWith("--help")) {
printHelp();
remoteArgs = new ArrayList<String>();
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<String> remoteArgs = createRemoteArgs(args);
if (remoteArgs.size() > 0) {
try {
String st = createSessionTicket();
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
}
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
}
}
}