package com.alimama.quanjingmonitor.parser; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import org.apache.log4j.Logger; import org.apache.lucene.util.cache.Cache; import org.apache.lucene.util.cache.SimpleLRUCache; import com.alimama.mdrill.json.JSONArray; import com.alimama.mdrill.json.JSONException; import com.alimama.mdrill.json.JSONObject; public class ArmoryGroup { private static Logger LOG = Logger.getLogger(ArmoryGroup.class); public static class ArmoryInfo{ public ArrayList<ArmoryItemInfo> info=new ArrayList<ArmoryItemInfo>(); @Override public String toString() { return "ArmoryInfo [info=" + info + "]"; } public long ts=System.currentTimeMillis(); } public static void main(String[] args) { ArmoryGroup.getInfo(args[0]); } public static String[] getEnv(){ HashMap<String,String> map=new HashMap<String, String>(); Map<String, String> sysenv=System.getenv(); if(sysenv!=null) { for(Entry<String, String> e:System.getenv().entrySet()) { String ekey=e.getKey(); String evalue=e.getValue(); if(ekey.length()>1&&evalue.length()>1) { map.put(ekey, evalue); } } } String[] env = new String[map.size()]; int index=0; for(Entry<String, String> e:map.entrySet()) { env[index]=e.getKey()+"="+e.getValue(); index++; } return env; } private static HashSet<String> SELECT_KEY=new HashSet<String>(); static{ SELECT_KEY.add("nodename"); SELECT_KEY.add("dns_ip"); SELECT_KEY.add("nodegroup"); SELECT_KEY.add("product_name"); SELECT_KEY.add("site"); } public static class ArmoryItemInfo{ public String nodename; @Override public String toString() { return "ArmoryItemInfo [nodename=" + nodename + ", dns_ip=" + dns_ip + ", nodegroup=" + nodegroup + ", product_name=" + product_name + ", site=" + site + ", groupName=" + groupName + "]"; } public String dns_ip; public String nodegroup; public String product_name; public String site; public String groupName; public static ArmoryItemInfo INSTANCE(HashMap<String,String> d) { ArmoryItemInfo rtn=new ArmoryItemInfo(); rtn.nodename=d.get("nodename"); rtn.dns_ip=d.get("dns_ip"); rtn.nodegroup=d.get("nodegroup"); rtn.product_name=d.get("product_name"); rtn.site=d.get("site"); // String[] cols=String.valueOf(rtn.nodegroup).split("_"); rtn.groupName=rtn.nodegroup; return rtn; } public HashMap<String,String> tomap() { HashMap<String,String> d=new HashMap<String, String>(); d.put("nodename", this.nodename); d.put("dns_ip", this.dns_ip); d.put("nodegroup", this.nodegroup); d.put("product_name", this.product_name); d.put("site", this.site); return d; } } private static ConcurrentHashMap<String, ArmoryInfo> termsCache = new ConcurrentHashMap<String, ArmoryInfo>(); private static class GetBytesThreadError extends Thread { BufferedReader reader = null; GetBytesThreadError(InputStream input, ArmoryInfo ramoryInfo,String name) { this.reader = new BufferedReader(new InputStreamReader(input)); } public void run() { String s = null; try { Integer index=0; while ((s = reader.readLine()) != null&&index<100000) { index++; } this.reader.close(); } catch (Throwable e) { LOG.error("armory readLine:",e); } } } private static class GetBytesThread extends Thread { BufferedReader reader = null; ArmoryInfo ramoryInfo; String name=""; GetBytesThread(InputStream input, ArmoryInfo ramoryInfo,String name) { this.name=name; this.ramoryInfo=ramoryInfo; this.reader = new BufferedReader(new InputStreamReader(input)); } public void run() { String s = null; try { Integer index=0; HashMap<String,String> info=new HashMap<String, String>(); while ((s = reader.readLine()) != null&&index<100000) { index++; if(s.indexOf("---------")>=0) { if(info.size()>0) { ramoryInfo.info.add(ArmoryItemInfo.INSTANCE(info)); } info=new HashMap<String, String>(); continue; } String[] cols=s.split("[ ]+",-1); if(cols.length>=2&&!cols[0].isEmpty()&&!cols[1].isEmpty()) { if(SELECT_KEY.contains(cols[0])) { info.put(cols[0], cols[1]); } } } this.reader.close(); if(info.size()>0) { ramoryInfo.info.add(ArmoryItemInfo.INSTANCE(info)); } } catch (Throwable e) { LOG.error("armory readLine:",e); } } } private static long DELAYTIME=1000l*3600; public static String getJson(String name) throws JSONException { ArmoryInfo info=getInfo(name); JSONObject jsonObj = new JSONObject(); jsonObj.put("code", "1"); JSONObject jsonObj2 = new JSONObject(); JSONArray jsonArray = new JSONArray(); for(ArmoryItemInfo i:info.info) { jsonArray.put(i.tomap()); } jsonObj2.put("docs", jsonArray); jsonObj.put("data", jsonObj2); return jsonObj.toString(); } public static ArmoryInfo getInfo(String name) { ArmoryInfo rtn=termsCache.get(name); long ts= System.currentTimeMillis()-DELAYTIME; if(rtn!=null&&rtn.ts>ts) { return rtn; } synchronized (termsCache) { rtn=termsCache.get(name); if(rtn!=null&&rtn.ts>ts) { return rtn; } rtn=new ArmoryInfo(); String[] execmd = { "/bin/sh", "-c" ,"/home/taobao/armory/armory_group.sh "+name+""}; String[] env = getEnv(); Process process = null; try { process = Runtime.getRuntime().exec(execmd, env); } catch (Throwable e) { LOG.error("armory Runtime:", e); } try { if (process != null) { GetBytesThreadError thr2 = new GetBytesThreadError(process.getErrorStream(), rtn, name); GetBytesThread thr = new GetBytesThread(process.getInputStream(), rtn, name); thr2.start(); thr.start(); process.waitFor(); thr2.join(); thr.join(); int exitValue = process.exitValue(); } } catch (Throwable e) { LOG.error("armory Runtime:", e); } LOG.info("armory:"+rtn.toString()+","+termsCache.size()+",name="+name); if(termsCache.size()>100000) { termsCache.clear(); } termsCache.put(name, rtn); } return rtn; } }