/* * Copyright 2016 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.batch.netio.data.net; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.Socket; import java.util.zip.ZipOutputStream; import scouter.agent.batch.Configure; import scouter.io.DataInputX; import scouter.io.DataOutputX; import scouter.net.NetCafe; import scouter.net.TcpFlag; import scouter.util.FileUtil; import scouter.util.IntKeyLinkedMap; import scouter.util.ZipFileUtil; public class TCPStackZipWorker implements Runnable { private Socket socket; private DataInputX in; private DataOutputX out; private int objHash; private TcpAgentReqMgr tcpAgentReqMgr; public static IntKeyLinkedMap<TCPStackZipWorker> LIVE = new IntKeyLinkedMap<TCPStackZipWorker>(); public TCPStackZipWorker(TcpAgentReqMgr tcpAgentReqMgr){ this.tcpAgentReqMgr = tcpAgentReqMgr; this.objHash = Configure.getInstance().getObjHash(); } public boolean prepare(boolean reConnect) { if(reConnect){ close(false); } Configure conf = Configure.getInstance(); String host = conf.net_collector_ip; int port = conf.net_collector_tcp_port; int so_timeout = conf.net_collector_tcp_so_timeout_ms; int connection_timeout = conf.net_collector_tcp_connection_timeout_ms; socket = new Socket(); try { socket.connect(new InetSocketAddress(host, port), connection_timeout); socket.setSoTimeout(so_timeout); if(!reConnect){ LIVE.put(this.hashCode(), this); } in = new DataInputX(new BufferedInputStream(socket.getInputStream())); out = new DataOutputX(new BufferedOutputStream(socket.getOutputStream())); out.writeInt(NetCafe.TCP_AGENT_REQ); out.writeInt(objHash); out.flush(); return true; } catch (Exception e) { e.printStackTrace(); return false; } } public void run() { if (socket == null) return; byte [] job = null; try { while((job = tcpAgentReqMgr.getJob()) != null){ process(job); } } catch (Exception ex) { ex.printStackTrace(); } finally { prepare(true); } //System.out.println("TcpStackSzipWorker close: " + this.hashCode()); LIVE.remove(this.hashCode()); } public void process(byte [] job) throws Exception{ long startTime = 0L; String objName = null; String filename = null; DataInputX reader = new DataInputX(job); startTime = reader.readLong(); objName = reader.readText(); filename = reader.readText(); //System.out.println("==>" + startTime + " - " + objName + " : " + filename); if(startTime == 0L || filename == null){ return; } File [] files = null; boolean isSuccess = false; BufferedInputStream bin = null; try { files = makeZipFile(filename); long fileSize = files[0].length(); out.writeInt(NetCafe.TCP_SEND_STACK); out.writeLong(startTime); out.writeText(objName); int index = filename.lastIndexOf(File.separator); String pureName; if(index >= 0){ pureName = filename.substring(index + 1); }else{ pureName = filename; } out.writeText(pureName); out.writeLong(fileSize); out.flush(); bin = new BufferedInputStream(new FileInputStream(files[0])); byte [] buffer = new byte[4096]; OutputStream os = socket.getOutputStream(); while((index = bin.read(buffer)) != -1){ os.write(buffer, 0, index); } os.flush(); bin.close(); bin = null; if(in.readByte() == TcpFlag.OK){ isSuccess = true; } }finally{ if(bin != null){ try { bin.close(); }catch(Exception ex){} } } if(!isSuccess){ //System.out.println("Send Fail!!!"); return; } //System.out.println("Send Success!!!"); try { for(File file : files){ if(!file.delete()){ TcpAgentReqMgr.getInstance().addFile(file); } } }catch(Exception ex){ ex.printStackTrace(); } } public void close(boolean remove) { FileUtil.close(in); FileUtil.close(out); FileUtil.close(socket); socket = null; if(remove){ LIVE.remove(this.hashCode()); } } public File [] makeZipFile(String filename ){ File indexFile = null; File stackFile = null; ZipOutputStream zos = null; File zipFile = new File(filename + ".zip"); try { zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile))); zos.setLevel(9); indexFile = new File(filename + ".inx"); // Index file if(!indexFile.exists()){ return null; } ZipFileUtil.sendZipFile(zos, indexFile); stackFile = new File(filename + ".log"); // stack log file if(!stackFile.exists()){ return null; } ZipFileUtil.sendZipFile(zos, stackFile); zos.flush(); }catch(Exception ex){ ex.printStackTrace(); return null; }finally{ if(zos != null){ try{ zos.close(); }catch(Exception ex){} } } File [] files = new File[3]; files[0] = zipFile; files[1] = indexFile; files[2] = stackFile; return files; } }