/** * Capture Logs from dmesg and return the formatted string * * * Copyright (C) 2014 Umakanthan Chandran * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * @author Umakanthan Chandran * @version 1.0 */ package dev.ukanth.ufirewall.log; import java.io.BufferedReader; import java.io.StringReader; import java.util.HashMap; import java.util.List; import android.content.Context; import android.util.Log; import android.util.SparseArray; import android.widget.TextView; import dev.ukanth.ufirewall.Api; import dev.ukanth.ufirewall.Api.PackageInfoData; import dev.ukanth.ufirewall.util.G; import dev.ukanth.ufirewall.R; public class LogInfo { String uidString; String in; String out; String proto; String spt; String dst; String len; String src; String dpt; String timestamp; int totalBlocked; private HashMap<String, Integer> dstBlocked; // Number of packets blocked per destination IP address private LogInfo() { this.dstBlocked = new HashMap<String, Integer>(); } public static String parseLog(Context ctx, String dmesg) { final BufferedReader r = new BufferedReader(new StringReader(dmesg.toString())); final Integer unknownUID = -11; StringBuilder res = new StringBuilder(); String line; int start, end; Integer appid; String out, src, dst, proto, spt, dpt, len; final SparseArray<LogInfo> map = new SparseArray<LogInfo>(); LogInfo loginfo = null; try { while ((line = r.readLine()) != null) { if (line.indexOf("{AFL}") == -1) continue; appid = unknownUID; if (((start=line.indexOf("UID=")) != -1) && ((end=line.indexOf(" ", start)) != -1)) { appid = Integer.parseInt(line.substring(start+4, end)); } loginfo = map.get(appid); if (loginfo == null) { loginfo = new LogInfo(); } if (((start=line.indexOf("DST=")) != -1) && ((end=line.indexOf(" ", start)) != -1)) { dst = line.substring(start+4, end); loginfo.dst = dst; } if (((start=line.indexOf("DPT=")) != -1) && ((end=line.indexOf(" ", start)) != -1)) { dpt = line.substring(start+4, end); loginfo.dpt = dpt; } if (((start=line.indexOf("SPT=")) != -1) && ((end=line.indexOf(" ", start)) != -1)) { spt = line.substring(start+4, end); loginfo.spt = spt; } if (((start=line.indexOf("PROTO=")) != -1) && ((end=line.indexOf(" ", start)) != -1)) { proto = line.substring(start+6, end); loginfo.proto = proto; } if (((start=line.indexOf("LEN=")) != -1) && ((end=line.indexOf(" ", start)) != -1)) { len = line.substring(start+4, end); loginfo.len = len; } if (((start=line.indexOf("SRC=")) != -1) && ((end=line.indexOf(" ", start)) != -1)) { src = line.substring(start+4, end); loginfo.src = src; } if (((start=line.indexOf("OUT=")) != -1) && ((end=line.indexOf(" ", start)) != -1)) { out = line.substring(start+4, end); loginfo.out = out; } map.put(appid, loginfo); loginfo.totalBlocked += 1; String unique = "[" + loginfo.proto + "]" + loginfo.dst + ":" + loginfo.dpt; if (loginfo.dstBlocked.containsKey(unique)) { loginfo.dstBlocked.put(unique, loginfo.dstBlocked.get(unique) + 1); } else { loginfo.dstBlocked.put(unique, 1); } } final List<PackageInfoData> apps = Api.getApps(ctx,null); Integer id; String appName = ""; int appId = -11; int totalBlocked; for(int i = 0; i < map.size(); i++) { StringBuilder address = new StringBuilder(); id = map.keyAt(i); if (id != unknownUID) { for (PackageInfoData app : apps) { if (app.uid == id) { appId = id; appName = app.names.get(0); break; } } } else { appName = ctx.getString(R.string.kernel_item); } loginfo = map.valueAt(i); totalBlocked = loginfo.totalBlocked; if (loginfo.dstBlocked.size() > 0) { for (String unique : loginfo.dstBlocked.keySet()) { address.append( unique + "(" + loginfo.dstBlocked.get(unique) + ")"); address.append("\n"); } } res.append("AppID :\t" + appId + "\n" + ctx.getString(R.string.LogAppName) +":\t" + appName + "\n" + ctx.getString(R.string.LogPackBlock) + ":\t" + totalBlocked + "\n"); res.append(address.toString()); res.append("\n\t---------\n"); } } catch (Exception e) { return null; } if (res.length() == 0) { res.append(ctx.getString(R.string.no_log)); } return res.toString(); } public static void parseLog(Context ctx, String dmesg, TextView textView) { final BufferedReader r = new BufferedReader(new StringReader(dmesg.toString())); final Integer unknownUID = -11; StringBuilder address = new StringBuilder(); String line; int start, end; Integer uid; String out, src, dst, proto, spt, dpt, len; HashMap<Integer,String> appNameMap = new HashMap<Integer, String>(); LogInfo logInfo = null; final List<PackageInfoData> apps = Api.getApps(ctx,null); try { while ((line = r.readLine()) != null) { if (line.indexOf("{AFL}") == -1) continue; uid = unknownUID; if (((start=line.indexOf("UID=")) != -1) && ((end=line.indexOf(" ", start)) != -1)) { uid = Integer.parseInt(line.substring(start+4, end)); } logInfo = new LogInfo(); if (((start=line.indexOf("DST=")) != -1) && ((end=line.indexOf(" ", start)) != -1)) { dst = line.substring(start+4, end); logInfo.dst = dst; } if (((start=line.indexOf("DPT=")) != -1) && ((end=line.indexOf(" ", start)) != -1)) { dpt = line.substring(start+4, end); logInfo.dpt = dpt; } if (((start=line.indexOf("SPT=")) != -1) && ((end=line.indexOf(" ", start)) != -1)) { spt = line.substring(start+4, end); logInfo.spt = spt; } if (((start=line.indexOf("PROTO=")) != -1) && ((end=line.indexOf(" ", start)) != -1)) { proto = line.substring(start+6, end); logInfo.proto = proto; } if (((start=line.indexOf("LEN=")) != -1) && ((end=line.indexOf(" ", start)) != -1)) { len = line.substring(start+4, end); logInfo.len = len; } if (((start=line.indexOf("SRC=")) != -1) && ((end=line.indexOf(" ", start)) != -1)) { src = line.substring(start+4, end); logInfo.src = src; } if (((start=line.indexOf("OUT=")) != -1) && ((end=line.indexOf(" ", start)) != -1)) { out = line.substring(start+4, end); logInfo.out = out; } String appName = ""; if(uid != -1) { if(!appNameMap.containsKey(uid)) { appName = ctx.getPackageManager().getNameForUid(uid); for (PackageInfoData app : apps) { if (app.uid == uid) { appName = app.names.get(0); break; } } appNameMap.put(uid, appName); } else { appName = appNameMap.get(uid); } } else { appName = ctx.getString(R.string.kernel_item); } address = new StringBuilder(); address.append(" " + appName + "(" + uid + ")" + " "); address.append(logInfo.dst + ":" + logInfo.dpt + "\n" ); textView.append(address.toString()); } } catch (Exception e) { Log.e(Api.TAG, e.getMessage()); } } public static String parseLogs(String result,final Context ctx) { final Integer unknownUID = -11; StringBuilder address = new StringBuilder(); int start, end; Integer uid; String out, src, dst, proto, spt, dpt, len; LogInfo logInfo = null; HashMap<Integer,String> appNameMap = new HashMap<Integer, String>(); final List<PackageInfoData> apps = Api.getApps(ctx,null); int pos = 0; try { while ((pos = result.indexOf("{AFL}", pos)) > -1) { if (result.indexOf("{AFL}") == -1) continue; uid = unknownUID; if (((start = result.indexOf("UID=")) != -1) && ((end = result.indexOf(" ", start)) != -1)) { uid = Integer.parseInt(result.substring(start + 4, end)); } logInfo = new LogInfo(); if (((start = result.indexOf("DST=")) != -1) && ((end = result.indexOf(" ", start)) != -1)) { dst = result.substring(start + 4, end); logInfo.dst = dst; } if (((start = result.indexOf("DPT=")) != -1) && ((end = result.indexOf(" ", start)) != -1)) { dpt = result.substring(start + 4, end); logInfo.dpt = dpt; } if (((start = result.indexOf("SPT=")) != -1) && ((end = result.indexOf(" ", start)) != -1)) { spt = result.substring(start + 4, end); logInfo.spt = spt; } if (((start = result.indexOf("PROTO=")) != -1) && ((end = result.indexOf(" ", start)) != -1)) { proto = result.substring(start + 6, end); logInfo.proto = proto; } if (((start = result.indexOf("LEN=")) != -1) && ((end = result.indexOf(" ", start)) != -1)) { len = result.substring(start + 4, end); logInfo.len = len; } if (((start = result.indexOf("SRC=")) != -1) && ((end = result.indexOf(" ", start)) != -1)) { src = result.substring(start + 4, end); logInfo.src = src; } if (((start = result.indexOf("OUT=")) != -1) && ((end = result.indexOf(" ", start)) != -1)) { out = result.substring(start + 4, end); logInfo.out = out; } String appName = ""; if(uid != unknownUID) { if(!appNameMap.containsKey(uid)) { appName = ctx.getPackageManager().getNameForUid(uid); for (PackageInfoData app : apps) { if (app.uid == uid) { appName = app.names.get(0); break; } } appNameMap.put(uid, appName); } else { appName = appNameMap.get(uid); } } else { appName = ctx.getString(R.string.kernel_item); } address = new StringBuilder(); if(!G.getBlockedNotifyApps().contains(uid+"")) { address.append(ctx.getString(R.string.blocked) + " " + appName + "(" + uid + ") -" + logInfo.dst + ":" + logInfo.dpt + "\n"); } return address.toString(); } } catch (Exception e) { Log.e(Api.TAG, e.getMessage()); } return address.toString(); } }