P3
1 package p3.hadoop.mapred; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import org.apache.hadoop.conf.Configuration; 6 import org.apache.hadoop.io.BytesWritable; 7 import p3.common.lib.BinaryUtils; 8 import p3.common.lib.Bytes; 9 10 public class PcapLineReader 11 { 12 private static final int DEFAULT_BUFFER_SIZE = 2048; 13 private int bufferSize; 14 private static final int PCAP_FILE_HEADER_LENGTH = 24; 15 private static final int PCAP_PACKET_HEADER_LENGTH = 16; 16 private static final int PCAP_PACKET_HEADER_CAPLEN_POS = 8; 17 private static final int PCAP_PACKET_HEADER_WIREDLEN_POS = 12; 18 private static final int PCAP_PACKET_HEADER_CAPLEN_LEN = 4; 19 private static final int PCAP_PACKET_HEADER_TIMESTAMP_LEN = 4; 20 private static final int PCAP_PACKET_MIN_LEN = 53; 21 private static final int PCAP_PACKET_MAX_LEN = 1519; 22 private static final int MAGIC_NUMBER = -725372255; 23 private static final int MIN_PKT_SIZE = 42; 24 private long min_captime; 25 private long max_captime; 26 private InputStream in; 27 private byte[] buffer; 28 byte[] pcap_header; 29 private int bufferLength; 30 int consumed; 31 32 public PcapLineReader(InputStream in, int bufferSize, long min_captime, long max_captime) 33 { 34 this.bufferSize = 2048; 35 36 this.bufferLength = 0; 37 this.consumed = 0; 38 39 this.in = in; 40 this.bufferSize = bufferSize; 41 this.buffer = new byte[this.bufferSize]; 42 this.min_captime = min_captime; 43 this.max_captime = max_captime; 44 } 45 46 public PcapLineReader(InputStream in, Configuration conf) 47 throws IOException 48 { 49 this(in, 2048, 50 conf.getLong("pcap.file.captime.min", 1309412600L), 51 conf.getLong("pcap.file.captime.max", conf.getLong("pcap.file.captime.max", 1309412600L) + 172800L)); 52 } 53 54 public void close() 55 throws IOException 56 { 57 this.in.close(); 58 } 59 60 int skipPartialRecord(int fraction) 61 throws IOException 62 { 63 int pos = 0; 64 byte[] captured = new byte[fraction]; 65 byte[] tmpTimestamp1 = new byte[4]; 66 byte[] tmpTimestamp2 = new byte[4]; 67 byte[] tmpCapturedLen1 = new byte[4]; 68 byte[] tmpWiredLen1 = new byte[4]; 69 byte[] tmpCapturedLen2 = new byte[4]; 70 byte[] tmpWiredLen2 = new byte[4]; 71 int caplen1 = 0; 72 int wiredlen1 = 0; 73 int caplen2 = 0; 74 int wiredlen2 = 0; 75 long timestamp2 = 0L; 76 77 int size = 0; 78 long endureTime = 100L; 79 80 if ((size = this.in.read(captured)) < 42) return 0; 81 82 do 83 { 84 if ((size - pos < 32) || (size - pos < 53)) { 85 pos = size; 86 break; 87 } 88 89 System.arraycopy(captured, pos, tmpTimestamp1, 0, 4); 90 long timestamp1 = Bytes.toLong(BinaryUtils.flipBO(tmpTimestamp1, 4)); 91 92 System.arraycopy(captured, pos + 8, tmpCapturedLen1, 0, 4); 93 caplen1 = Bytes.toInt(BinaryUtils.flipBO(tmpCapturedLen1, 4)); 94 95 System.arraycopy(captured, pos + 12, tmpWiredLen1, 0, 4); 96 wiredlen1 = Bytes.toInt(BinaryUtils.flipBO(tmpWiredLen1, 4)); 97 98 if ((caplen1 > 53) && (caplen1 < 1519) && (size - pos - 32 - caplen1 > 0)) 99 { 100 System.arraycopy(captured, pos + 16 + caplen1 + 8, tmpCapturedLen2, 0, 4); 101 caplen2 = Bytes.toInt(BinaryUtils.flipBO(tmpCapturedLen2, 4)); 102 103 System.arraycopy(captured, pos + 16 + caplen1 + 12, tmpWiredLen2, 0, 4); 104 wiredlen2 = Bytes.toInt(BinaryUtils.flipBO(tmpWiredLen2, 4)); 105 106 System.arraycopy(captured, pos + 16 + caplen1, tmpTimestamp2, 0, 4); 107 timestamp2 = Bytes.toLong(BinaryUtils.flipBO(tmpTimestamp2, 4)); 108 109 if ((timestamp1 >= this.min_captime) && (timestamp1 < this.max_captime) && (this.min_captime <= timestamp2) && (timestamp2 < this.max_captime) && 110 (wiredlen1 > 53) && (wiredlen1 < 1519) && (wiredlen2 > 53) && (wiredlen2 < 1519) && 111 (caplen1 > 0) && (caplen1 <= wiredlen1) && (caplen2 > 0) && (caplen2 <= wiredlen2) && 112 (timestamp2 >= timestamp1) && (timestamp2 - timestamp1 < endureTime)) { 113 return pos; 114 } 115 116 } 117 118 ++pos; 119 } 120 while (pos < size); 121 122 return pos; 123 } 124 125 int readPacket(int packetLen) 126 throws IOException 127 { 128 int bufferPosn = 16; 129 byte[] tmp_buffer = new byte[packetLen]; 130 131 if ((this.bufferLength = this.in.read(tmp_buffer)) < packetLen) { 132 System.arraycopy(tmp_buffer, 0, this.buffer, bufferPosn, this.bufferLength); 133 bufferPosn += this.bufferLength; 134 135 byte[] newpacket = new byte[packetLen - this.bufferLength]; 136 137 if ((this.bufferLength = this.in.read(newpacket)) < 0) return bufferPosn; 138 System.arraycopy(newpacket, 0, this.buffer, bufferPosn, this.bufferLength); 139 } 140 else 141 { 142 System.arraycopy(tmp_buffer, 0, this.buffer, bufferPosn, this.bufferLength); 143 } 144 bufferPosn += this.bufferLength; 145 146 return bufferPosn; 147 } 148 149 int readPacketHeader() 150 { 151 int headerLength = 0; 152 int headerPosn = 0; 153 this.pcap_header = new byte[16]; 154 155 byte[] tmp_header = new byte[16]; 156 BytesWritable capturedLen = new BytesWritable(); 157 try 158 { 159 if ((headerLength = this.in.read(this.pcap_header)) < 16) 160 { 161 if (headerLength == -1) return 0; 162 headerPosn += headerLength; 163 164 byte[] newheader = new byte[16 - headerLength]; 165 166 if ((headerLength = this.in.read(newheader)) < 0) { 167 this.consumed = headerPosn; 168 return -1; 169 } 170 System.arraycopy(newheader, 0, this.pcap_header, headerPosn, headerLength); 171 } 172 capturedLen.set(this.pcap_header, 8, 4); 173 System.arraycopy(this.pcap_header, 0, this.buffer, 0, 16); 174 headerPosn = 0; 175 } 176 catch (IOException e) 177 { 178 e.printStackTrace(); 179 } 180 return Bytes.toInt(BinaryUtils.flipBO(capturedLen.getBytes(), 4)); 181 } 182 183 public int readFileHeader() 184 { 185 try { 186 byte[] magic = new byte[4]; 187 this.bufferLength = this.in.read(this.buffer, 0, 24); 188 System.arraycopy(this.buffer, 0, magic, 0, magic.length); 189 190 if (Bytes.toInt(magic) == -725372255) break label50; 191 return 0; 192 } 193 catch (IOException e) { 194 e.printStackTrace(); 195 } 196 label50: return this.bufferLength; 197 } 198 199 public int readLine(BytesWritable bytes, int maxLineLength, int maxBytesToConsume) 200 throws IOException 201 { 202 bytes.set(new BytesWritable()); 203 boolean hitEndOfFile = false; 204 long bytesConsumed = 0L; 205 206 int caplen = readPacketHeader(); 207 208 if (caplen == 0) { 209 bytesConsumed = 0L; 210 } else if (caplen == -1) { 211 bytesConsumed += this.consumed; 212 } 213 else if ((caplen > 0) && (caplen < 1519)) { 214 if ((this.bufferLength = readPacket(caplen)) < caplen + 16) { 215 hitEndOfFile = true; 216 } 217 bytesConsumed += this.bufferLength; 218 219 if (!(hitEndOfFile)) { 220 bytes.set(this.buffer, 0, caplen + 16); 221 } 222 } 223 224 return (int)Math.min(bytesConsumed, 2147483647L); 225 } 226 227 public int readLine(BytesWritable str, int maxLineLength) 228 throws IOException 229 { 230 return readLine(str, maxLineLength, 2147483647); 231 } 232 233 public int readLine(BytesWritable str) 234 throws IOException 235 { 236 return readLine(str, 2147483647, 2147483647); 237 } 238 }
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://kpdus.tripod.com/jad.html // Decompiler options: packimports(3) fieldsfirst ansi space // Source File Name: PcapVlenRecordReader.java package p3.hadoop.mapred; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import org.apache.hadoop.io.BytesWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.compress.CompressionCodec; import org.apache.hadoop.io.compress.CompressionCodecFactory; import org.apache.hadoop.mapred.FileSplit; import org.apache.hadoop.mapred.RecordReader; // Referenced classes of package p3.hadoop.mapred: // PcapLineReader public class PcapVlenRecordReader implements RecordReader { private CompressionCodecFactory compressionCodecs; private long start; private long pos; private long end; private PcapLineReader in; int maxLineLength; private boolean fileheader_skip; public PcapVlenRecordReader(Configuration job, FileSplit split) throws IOException { compressionCodecs = null; fileheader_skip = true; maxLineLength = job.getInt("mapred.linerecordreader.maxlength", 0x7fffffff); fileheader_skip = job.getBoolean("pcap.file.header.skip", true); start = split.getStart(); end = start + split.getLength(); Path file = split.getPath(); compressionCodecs = new CompressionCodecFactory(job); CompressionCodec codec = compressionCodecs.getCodec(file); FileSystem fs = file.getFileSystem(job); FSDataInputStream fileIn = fs.open(split.getPath()); boolean skipFileHeader = false; boolean skipPartialRecord = false; int fraction = 4000; if (codec != null) { in = new PcapLineReader(codec.createInputStream(fileIn), job); end = 0x7fffffffffffffffL; skipFileHeader = true; } else { if (start == 0L) { skipFileHeader = true; } else { skipPartialRecord = true; fileIn.seek(start); } in = new PcapLineReader(fileIn, job); } if (skipFileHeader) start += in.readFileHeader(); if (skipPartialRecord) { int skip; for (skip = in.skipPartialRecord(fraction); skip == fraction; skip = in.skipPartialRecord(fraction)) start += skip; start += skip; fileIn.seek(start); in = new PcapLineReader(fileIn, job); } pos = start; } public LongWritable createKey() { return new LongWritable(); } public BytesWritable createValue() { return new BytesWritable(); } public synchronized boolean next(LongWritable key, BytesWritable value) throws IOException { while (pos < end) { key.set(pos); int newSize = in.readLine(value, maxLineLength, Math.max((int)Math.min(0x7fffffffL, end - pos), maxLineLength)); if (newSize == 0) { pos = end; return false; } pos += newSize; if (newSize < maxLineLength) return true; } return false; } public float getProgress() { if (start == end) return 0.0F; else return Math.min(1.0F, (float)(pos - start) / (float)(end - start)); } public synchronized long getPos() throws IOException { return pos; } public synchronized void close() throws IOException { if (in != null) in.close(); } public volatile boolean next(Object obj, Object obj1) throws IOException { return next((LongWritable)obj, (BytesWritable)obj1); } public volatile Object createValue() { return createValue(); } public volatile Object createKey() { return createKey(); } }
坚持不懈