latest version

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

View File

@ -19,30 +19,28 @@ 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"; private static String loginURL = "https://login.hostsharing.net/cas/v1/tickets";
// static String servletURL = "https://hsh93-test.hostsharing.net:443/hsar/hsadmin/cli-interface/"; private static String servletURL = "https://admin.hostsharing.net/hsar/hsadmin/cli-interface/";
// static String backendURL = "https://hsh93-test.hostsharing.net:443/hsar/backend"; private static String backendURL = "https://admin.hostsharing.net:443/hsar/backend";
static Properties config; private static Properties config;
static String userName; private static String authenticatedUserName;
static String passWord; private static String passWord;
static int verbosity = 0; 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();
} }
@ -51,18 +49,21 @@ public class HSadmin
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.print("\rPassword: "
+ "\rPassword: ");
}
System.out.flush(); 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;
@ -71,38 +72,34 @@ public class HSadmin
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 public int doRequest(String method) throws IOException {
{
echoVerbose(method + ": " + url.toString()); echoVerbose(method + ": " + url.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true); conn.setDoOutput(true);
conn.setDoInput(true); conn.setDoInput(true);
conn.setUseCaches(false); conn.setUseCaches(false);
conn.setAllowUserInteraction(false); conn.setAllowUserInteraction(false);
conn.setRequestProperty("Content-type", "application/x-www-form-urlencoded; charset=" + "UTF-8"); conn.setRequestProperty("Content-type",
"application/x-www-form-urlencoded; charset=" + "UTF-8");
if (username != null) if (username != null)
conn.setRequestProperty("Authorization", createAuthorizationHeader(username, password) ); conn.setRequestProperty("Authorization",
createAuthorizationHeader(username, password));
conn.setRequestMethod(method); conn.setRequestMethod(method);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); OutputStreamWriter wr = new OutputStreamWriter(conn
if ( requestData == null ) .getOutputStream(), "UTF-8");
{ if (requestData == null) {
if (username != null) if (username != null)
addParam("username", username); addParam("username", username);
if (password != null) if (password != null)
@ -117,26 +114,23 @@ public class HSadmin
echoResponseHeaders(conn); echoResponseHeaders(conn);
responseData = new StringBuilder(); responseData = new StringBuilder();
try try {
{ BufferedReader rd = new BufferedReader(new InputStreamReader(
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream(), "ISO-8859-1")); conn.getInputStream(), "ISO-8859-1"));
String line; String line;
while ((line = rd.readLine()) != null) { while ((line = rd.readLine()) != null) {
responseData.append(line + "\n"); responseData.append(line + "\n");
} }
rd.close(); rd.close();
} } catch (IOException exc) {
catch ( IOException exc )
{
} }
wr.close(); wr.close();
responseMessage = conn.getResponseMessage(); responseMessage = conn.getResponseMessage();
return conn.getResponseCode(); 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;
@ -144,114 +138,108 @@ public class HSadmin
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.
{ */
private void echoResponseHeaders(HttpURLConnection conn)
throws IOException {
// TODO: just for debugging - remove
System.out.println("ResponseCode: " + conn.getResponseCode()); System.out.println("ResponseCode: " + conn.getResponseCode());
System.out.println("ResponseMessage: " + conn.getResponseMessage()); System.out.println("ResponseMessage: " + conn.getResponseMessage());
for ( String key: responseHeaders.keySet() ) for (String key : responseHeaders.keySet()) {
{
System.out.println(key + ": " + responseHeaders.get(key)); 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
{ */
private static String getTGT() throws IOException {
HttpRequest postReq = new HttpRequest(loginURL); HttpRequest postReq = new HttpRequest(loginURL);
echoVerbose("using userName=" + userName + " for login"); echoVerbose("using userName=" + authenticatedUserName + " for login");
postReq.setUsername(authenticatedUserName);
postReq.setUsername(userName);
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 {
else
return null; 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 ) } catch (Exception exc) { /* ignore */
{ /* ignore */ } }
echoVerbose("ST: " + st); echoVerbose("ST: " + st);
return 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.
*/
private static String getPassWord() throws IOException {
if (passWord == null) if (passWord == null)
passWord = config.getProperty( "passWord." + userName, config.getProperty("passWord") ); passWord = config.getProperty("passWord." + authenticatedUserName,
config.getProperty("passWord"));
if ( passWord == null ) 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();
@ -262,94 +250,112 @@ public class HSadmin
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'.
{ */
private static String exec(String st, String[] args) throws IOException {
HttpRequest httpReq = new HttpRequest(servletURL); HttpRequest httpReq = new HttpRequest(servletURL);
echoVerbose("using userName=" + userName + " for exec"); if (runAsUserName == null) {
httpReq.setUsername(userName); runAsUserName = authenticatedUserName;
}
echoVerbose("using userName=" + runAsUserName + " for exec");
httpReq.setUsername(runAsUserName);
httpReq.setPassword(st); httpReq.setPassword(st);
StringBuilder argsAsString = new StringBuilder(); StringBuilder argsAsString = new StringBuilder();
for ( String arg: args ) for (String arg : args) {
argsAsString.append(arg + "\n"); argsAsString.append(arg + "\n");
echoVerbose("--- remote args: ---\n" + argsAsString.toString() + "\n--- end of args. ---"); }
echoVerbose("--- remote args: ---\n" + argsAsString.toString()
+ "\n--- end of args. ---");
httpReq.setRequestData(argsAsString.toString()); httpReq.setRequestData(argsAsString.toString());
int code = httpReq.put(); int code = httpReq.put();
List<String> hsadminErrors = httpReq.getResponseHeader("X-hsadmin-error"); List<String> hsadminErrors = httpReq
if ( hsadminErrors != null && hsadminErrors.size() > 0 && hsadminErrors.get(0) != null ) .getResponseHeader("X-hsadmin-error");
if (hsadminErrors != null && hsadminErrors.size() > 0
&& hsadminErrors.get(0) != null) {
throw new RuntimeException(hsadminErrors.get(0)); throw new RuntimeException(hsadminErrors.get(0));
else if ( 200 == code ) }
return httpReq.getResponseData(); else {
throw new RuntimeException( "HTTP error #" + code + ": " + httpReq.getResponseMessage() ); 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(); 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)));
return properties.getProperty(user); return properties.getProperty(user);
} } catch (FileNotFoundException exc) {
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(
new FileInputStream(
new File(System.getProperty("user.home"), ".hsadmin.conf")));
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
} }
authenticatedUserName = config.getProperty("userName", System.getenv("USER"));
userName = 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;
@ -360,107 +366,90 @@ public class HSadmin
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(); tgt = getTGT();
if ( tgt == null ) if (tgt == null) {
{ System.err
System.err.println("ERROR: login failure - cannot get ticket granting ticket"); .println("ERROR: login failure - cannot get ticket granting ticket");
System.exit(1); System.exit(1);
} }
storeTGT(".hsadmin.tgt", userName, tgt ); storeTGT(".hsadmin.tgt", authenticatedUserName, tgt);
st = getST(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) {
if ( remoteArgs.size() > 0 )
{
try { try {
String st = createSessionTicket(); String st = createSessionTicket();
String response = exec(st, remoteArgs.toArray(new String[remoteArgs.size()])); String response = exec(st, remoteArgs
.toArray(new String[remoteArgs.size()]));
if (response != null) if (response != null)
System.out.print(response); System.out.print(response);
} } catch (Exception exc) {
catch ( Exception exc )
{
System.err.println(exc.getMessage()); System.err.println(exc.getMessage());
System.exit(1); // TODO: be more specific, like: 1=unknown, 2=remoting, 3=functional System.exit(1); // TODO: be more specific,
// like: 1=unknown, 2=remoting, 3=functional
} }
} }
} }