| 1 package freecs.external; 2 3 import java.io.IOException ; 4 import java.io.InputStream ; 5 import java.util.Hashtable ; 6 import java.util.StringTokenizer ; 7 import java.util.Vector ; 8 9 import org.apache.xmlrpc.WebServer; 10 import org.apache.xmlrpc.XmlRpcException; 11 import org.apache.xmlrpc.XmlRpcHandler; 12 13 import freecs.Server; 14 import freecs.core.RequestReader; 15 import freecs.core.UserManager; 16 17 public class XmlRpcManager implements XmlRpcHandler { 18 19 public static final XmlRpcManager mgr = new XmlRpcManager (); 20 private WebServer webserver; 21 22 26 public static void startManager(){ 27 mgr.start(); 28 } 29 30 private XmlRpcManager() { 31 } 32 33 private void start() { 34 if (Server.srv.ADMIN_XMLRPC_PORT == 0) { 36 return; 37 } 38 webserver = new WebServer(Server.srv.ADMIN_XMLRPC_PORT); 39 webserver.addHandler("freecs", this); 40 webserver.setParanoid(true); 41 StringBuffer sb = new StringBuffer ("Started XmlRpc-Server on port " + Server.srv.ADMIN_XMLRPC_PORT + ", open for addresses: "); 42 StringTokenizer tok = new StringTokenizer (Server.srv.ADMIN_XMLRPC_ALLOWED, ","); 44 while (tok.hasMoreTokens()) { 45 String ip = tok.nextToken().trim(); 46 webserver.acceptClient(ip); 47 sb.append (ip + ", "); 48 } 49 webserver.start(); 50 Server.log(this, sb.toString().substring(0, sb.toString().length()-2), Server.MSG_CONFIG, Server.LVL_MINOR); 51 } 52 53 58 public Object execute(String name, Vector args) throws Exception { 59 boolean reval = false; 60 if ("freecs.kick".equals(name)) { 61 reval = kick(args); 62 } else if ("freecs.removeUser".equals(name)) { 63 reval = removeUser(args); 64 } else if ("freecs.messageToAll".equals(name)) { 65 reval = messageToAll(args); 66 } else if ("freecs.messageToGroup".equals(name)) { 67 reval = messageToGroup(args); 68 } else if ("freecs.messageToUser".equals(name)) { 69 reval = messageToUser(args); 70 } else if ("freecs.state".equals(name)) { 71 return xmlRpcStateReport(args); 72 } 73 return Boolean.valueOf(reval); 74 } 75 76 private Hashtable xmlRpcStateReport(Vector args) { 77 Hashtable result = new Hashtable (); 78 result.put("error", ""); 79 result.put("freeThreads", new Integer (Server.srv.MAX_READERS - RequestReader.activeReaders())); 80 result.put("maxThreads", new Integer (Server.srv.MAX_READERS)); 81 result.put("usersHighWaterMark", new Integer (UserManager.mgr.getHighWaterMark())); 82 result.put("users", new Integer (UserManager.mgr.getActiveUserCount())); 83 Runtime r = Runtime.getRuntime(); 84 result.put("vmFreeMem", new Integer (Math.round(r.freeMemory()/1024))); 85 result.put("vmTotalMem", new Integer (Math.round(r.totalMemory()/1024))); 86 Hashtable lomd = getLinuxMemoryDetails(r); 88 if (lomd != null) { 89 result.putAll(lomd); 90 } 91 return result; 92 } 93 94 97 private Hashtable getLinuxMemoryDetails(Runtime r) { 98 99 try { 100 Process p = r.exec("cat /proc/meminfo"); 102 try { 103 int returnCode = p.waitFor(); 104 if (returnCode>0) { 105 return null; 107 } 108 } catch (InterruptedException ie) {} 109 110 StringBuffer out = new StringBuffer (); 112 StringBuffer err = new StringBuffer (); 113 InputStream os = p.getInputStream(); 114 int b = os.read(); 115 while (b != -1) { 116 out.append((char) b); 117 b = os.read(); 118 } 119 os = p.getErrorStream(); 120 b = os.read(); 121 while (b != -1) { 122 err.append((char) b); 123 b = os.read(); 124 } 125 126 Hashtable ht = new Hashtable (); 127 if (err.length() > 0) { 129 Server.log("XmlRpc", "error while getting System-Memory-Information: " + err.toString(), Server.MSG_ERROR, Server.LVL_MINOR); 130 ht.put("error", err.toString()); 131 return ht; 132 } 133 134 StringTokenizer st = new StringTokenizer (out.toString(), "\r\n"); 136 String props[] = st.nextToken().trim().split(":"); 137 StringTokenizer vst = new StringTokenizer (st.nextToken(), " "); 138 String prefix = vst.nextToken().trim(); 139 int i = 0; 140 while (vst.hasMoreTokens() && i < props.length) { 141 props[i]=props[i].trim(); 142 ht.put(prefix + props[i], new Integer (Integer.parseInt(vst.nextToken()))); 143 i++; 144 } 145 vst = new StringTokenizer (st.nextToken(), " "); 146 prefix = vst.nextToken().trim(); 147 i = 0; 148 while (vst.hasMoreTokens() && i < props.length) { 149 ht.put(prefix + props[i], new Integer (Integer.parseInt(vst.nextToken()))); 150 i++; 151 } 152 153 while (st.hasMoreTokens()) { 154 String line = st.nextToken(); 155 int idx = line.indexOf(":"); 156 if (idx < 0) 157 continue; 158 String key = line.substring(0, idx); 159 Integer iObj = new Integer ( 160 Integer.parseInt( 161 line.substring(idx+1, line.length()-3).trim())); 162 ht.put(key, iObj); 163 } 164 return ht; 165 } catch (IOException e) { 166 } 168 return null; 169 } 170 171 175 public boolean kick(Vector args) throws Exception { 176 String username; 177 long timeout = 2000; 178 boolean blockIp = false; 179 try { 180 username = (String )args.elementAt(0); 181 if (args.size()>1) { 182 Object arg1 = args.elementAt(1); 183 if (arg1 instanceof String ) { 184 timeout = Long.parseLong((String )arg1); 185 } else if (arg1 instanceof Number ) { 186 timeout = ((Number )args.elementAt(1)).longValue(); 187 } else { 188 throw new XmlRpcException (0, "illegal arguments for freecs.kick: couldn't parse timeout"); 189 } 190 } 191 if (args.size()>2) { 192 Object obj = args.elementAt(2); 193 if((obj instanceof Boolean && ((Boolean )obj).booleanValue()==true) 194 || (obj instanceof String && "true".equalsIgnoreCase((String )obj)) ) { 195 blockIp = true; 196 } 197 } 198 } catch (Exception any) { 199 throw new XmlRpcException (0, "illegal arguments for freecs.kick: " + any.toString()); 200 } 201 return AdminCore.kick(username, timeout, blockIp, "xmlrpc-remote"); 202 } 203 204 208 public boolean removeUser(Vector args) throws Exception { 209 String username; 210 try { 211 username = (String ) args.elementAt(0); 212 } catch (Exception ex) { 213 throw new XmlRpcException (0, "illegal arguments for freecs.removeUser: " + ex.toString()); 214 } 215 return AdminCore.removeUser(username); 216 } 217 218 222 public boolean messageToAll(Vector args) throws Exception { 223 String msg; 224 try { 225 msg = (String ) args.elementAt(0); 226 } catch (Exception ex) { 227 throw new XmlRpcException (0, "illegal arguments for freecs.messageToAll: " + ex.toString()); 228 } 229 return AdminCore.messageToAll(msg); 230 } 231 232 236 public boolean messageToGroup(Vector args) throws Exception { 237 String msg, groupname; 238 try { 239 msg = (String ) args.elementAt(0); 240 groupname = (String ) args.elementAt(1); 241 } catch (Exception ex) { 242 throw new XmlRpcException (0, "illegal arguments for freecs.messageToGroup: " + ex.toString()); 243 } 244 return AdminCore.messageToGroup(msg, groupname); 245 } 246 247 251 public boolean messageToUser(Vector args) throws Exception { 252 String msg, username; 253 try { 254 msg = (String ) args.elementAt(0); 255 username = (String ) args.elementAt(1); 256 } catch (Exception ex) { 257 throw new XmlRpcException (0, "illegal arguments for freecs.messageToUser: " + ex.toString()); 258 } 259 return AdminCore.messageToUser(msg, username); 260 } 261 262 } 263 | Popular Tags |