package cn.edu.sjtu.omnilab.syslogcleanser.apps; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import cn.edu.sjtu.omnilab.syslogcleanser.wifilogfilter.Utils; import org.apache.commons.io.FilenameUtils; import cn.edu.sjtu.omnilab.syslogcleanser.wifilogfilter.SessionExtraction; /** * Extract wifi sessions from filtered logs (RawLogFilter.java). * Its a simple combination of UserSplitter.java and SessionExtractor.java. * @author chenxm * */ public class UserSessions { public static void main(String[] args) throws IOException, ParseException { //Initial options String input_location = ""; String output_location = ""; // fetch command line options int optSetting = 0; for (; optSetting < args.length; optSetting++) { if ("-i".equals(args[optSetting])) { input_location = args[++optSetting]; } else if ("-o".equals(args[optSetting])) { output_location = args[++optSetting]; } } if(input_location.length() == 0 || output_location.length() == 0 ) { System.out.println("Usage: UserSessions -i <source> -o <destination>"); System.exit(-1); } // for statistics long start = System.currentTimeMillis(); // split the raw data into individual users splitAndExtract(input_location, output_location); // print time System.out.println(String.format("Total time: %.3f sec", (System.currentTimeMillis() - start)/1000.0)); } /** * Split the whole wifilogs into individual users. * @param input * @param output * @throws IOException * @throws ParseException */ private static void splitAndExtract(String input, String output) throws IOException, ParseException{ File[] files = Utils.getInputFiles(input); Utils.createFolder(output); Arrays.sort(files); for ( File file : files){ Map<String, List<String>> macRecordMap = new HashMap<String, List<String>>(); long start = System.currentTimeMillis(); System.out.println(start/1000 + " " + file.getName()); String line = null; BufferedReader iReader = new BufferedReader(new FileReader(file)); System.out.println("Split syslogs into users..."); while ((line = iReader.readLine()) != null) { String[] parts = line.split("\t", 2); if (parts.length == 2){ String mac = parts[0]; if ( !macRecordMap.containsKey(mac) ){ macRecordMap.put(mac, new ArrayList<String>()); } macRecordMap.get(mac).add(line); } } iReader.close(); System.out.println("Extract sessions..."); for ( String umac : macRecordMap.keySet()){ if ( Utils.debug ) System.out.println(umac); // extract session and save to file List<String> finalLines = SessionExtraction.extractSessions(macRecordMap.get(umac)); // write into file BufferedWriter bw = new BufferedWriter(new FileWriter(FilenameUtils.concat(output, FilenameUtils.getName(file.getName())), true)); for ( String l : finalLines ) bw.write(l + "\n"); bw.close(); } macRecordMap.clear(); System.out.println(String.format("Elapsed time: %.3f sec", (System.currentTimeMillis() - start)/1000.0)); } } }