/* * Copyright 2015 the original author or authors. * @https://github.com/scouter-project/scouter * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package scouter.agent.netio.request.handle; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Properties; import scouter.agent.Configure; import scouter.agent.JavaAgent; import scouter.agent.Logger; import scouter.agent.netio.data.DataProxy; import scouter.agent.netio.request.anotation.RequestHandler; import scouter.io.DataInputX; import scouter.io.DataOutputX; import scouter.lang.pack.MapPack; import scouter.lang.pack.Pack; import scouter.lang.value.ListValue; import scouter.lang.value.TextValue; import scouter.net.RequestCmd; import scouter.net.TcpFlag; import scouter.util.StringUtil; public class AgentEnv { @RequestHandler(RequestCmd.OBJECT_SYSTEM_GC) public Pack systemGc(Pack param) { MapPack m = new MapPack(); System.gc(); Logger.println("A127", RequestCmd.OBJECT_SYSTEM_GC); return m; } @RequestHandler(RequestCmd.OBJECT_ENV) public Pack getAgentEnv(Pack param) { MapPack m = new MapPack(); Properties p = System.getProperties(); @SuppressWarnings("rawtypes") Enumeration en = p.keys(); while (en.hasMoreElements()) { String key = (String) en.nextElement(); String value = p.getProperty(key); m.put(key, new TextValue(value)); } return m; } Configure conf = Configure.getInstance(); @RequestHandler(RequestCmd.OBJECT_INFO) public Pack getAgentInfo(Pack param) { MapPack p = new MapPack(); p.put("objHash", conf.getObjHash()); p.put("objName", conf.getObjName()); p.put("java.version", System.getProperty("java.version")); p.put("os.name", System.getProperty("os.name")); p.put("user.home", System.getProperty("user.home")); p.put("work.dir", new File(".").getAbsolutePath()); return p; } @RequestHandler(RequestCmd.OBJECT_RESET_CACHE) public Pack getAgentCacheReseto(Pack param) { DataProxy.reset(); return param; } @RequestHandler(RequestCmd.OBJECT_DUMP_FILE_LIST) public Pack getDumpFileList(Pack param) { MapPack result = new MapPack(); ListValue nameLv = result.newList("name"); ListValue sizeLv = result.newList("size"); ListValue lastModifedLv = result.newList("last_modified"); File dumpDir = Configure.getInstance().dump_dir; if (dumpDir.canRead()) { for (File file : dumpDir.listFiles()) { if (file.isFile()) { nameLv.add(file.getName()); sizeLv.add(file.length()); lastModifedLv.add(file.lastModified()); } } } return result; } @RequestHandler(RequestCmd.OBJECT_DUMP_FILE_DETAIL) public Pack getDumpFileDetail(Pack param, DataInputX in, DataOutputX out) { MapPack p = (MapPack) param; String name = p.getText("name"); File dumpDir = Configure.getInstance().dump_dir; File dumpFile = new File(dumpDir, name); if (dumpFile.canRead()) { try { int buff = 4 * 1024; InputStream stream = new FileInputStream(dumpFile); byte[] buffer = new byte[buff]; int n; while ((n = stream.read(buffer, 0, buffer.length)) != -1) { out.writeByte(TcpFlag.HasNEXT); out.writeBlob(buffer, 0, n); } } catch (Throwable e) { e.printStackTrace(); } } return null; } @RequestHandler(RequestCmd.OBJECT_CLASS_LIST) public Pack getLoadedClassList(Pack param) { final int COUNT_PER_PAGE = 100; MapPack mPack = (MapPack) param; int page = mPack.getInt("page"); if (page < 1) { page = 1; } String filter = mPack.getText("filter"); MapPack p = new MapPack(); ListValue indexLv = p.newList("index"); ListValue typeLv = p.newList("type"); ListValue nameLv = p.newList("name"); ListValue superClassLv = p.newList("superClass"); ListValue interfacesLv = p.newList("interfaces"); ListValue resourceLv = p.newList("resource"); p.put("page", page); p.put("totalPage", 0); Class[] loadedClasses = JavaAgent.getInstrumentation().getAllLoadedClasses(); if (loadedClasses != null) { List<Class> classList = new ArrayList<Class>(); for (int i = 0; i < loadedClasses.length; i++) { Class clazz = loadedClasses[i]; if (StringUtil.isNotEmpty(filter)) { String lowerName = clazz.getName().toLowerCase(); if (lowerName.contains(filter.toLowerCase()) == false) { continue; } } classList.add(clazz); } int totalCount = classList.size(); p.put("totalPage", (totalCount / COUNT_PER_PAGE) + 1); int start = (page - 1) * COUNT_PER_PAGE; for (int i = start; i < start + COUNT_PER_PAGE; i++) { if (i > totalCount - 1) { break; } try { indexLv.add(i + 1); Class clazz = classList.get(i); typeLv.add(clazz.isInterface() ? "I" : (clazz.isPrimitive() ? "P" : "C")); nameLv.add(clazz.getName()); String superClassName = ""; Class superClass = clazz.getSuperclass(); if (superClass != null) { superClassName = superClass.getName(); } superClassLv.add(superClassName); StringBuffer sb = new StringBuffer(); Class[] interfaces = clazz.getInterfaces(); if (interfaces != null) { for (int j = 0; j < interfaces.length; j++) { sb.append(interfaces[j].getName()); if (j < interfaces.length - 1) { sb.append(","); } } } interfacesLv.add(sb.toString()); ClassLoader classLoader = clazz.getClassLoader(); if (classLoader == null) { classLoader = ClassLoader.getSystemClassLoader(); } String resource = ""; try{ URL url = classLoader.getResource(clazz.getName().replace('.', '/') + ".class"); if (url != null) { resource = url.toString(); } }catch(Throwable t){} resourceLv.add(resource); } catch (Exception e) { e.printStackTrace(); break; } } } return p; } }