Context-detection API for Android developed as a university project
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <?PHP
  2. require_once('common.php');
  3. define('VERSION', 25);
  4. function processExceptions($records = true) {
  5. $sql = 'SELECT record_id, record_ip, record_headers, record_data FROM unprocessed';
  6. $res = mysql_query($sql);
  7. $count = 0;
  8. while ($row = mysql_fetch_assoc($res)) {
  9. $ip = $row['record_ip'];
  10. $headers = array();
  11. foreach (explode("\n", $row['record_headers']) as $line) {
  12. if (preg_match('/(.*?): (.*)$/', $line, $m)) {
  13. $headers[$m[1]] = $m[2];
  14. }
  15. }
  16. if (!isset($headers['APPLICATION']) || substr($headers['APPLICATION'], -10) != '-exception') {
  17. continue;
  18. }
  19. $application = substr($headers['APPLICATION'], 0, -10);
  20. $imei = isset($headers['IMEI']) ? $headers['IMEI'] : '';
  21. if (!ctype_digit($imei) && !empty($imei)) {
  22. // It's probably an MEID not an IMEI number
  23. $imei = bchexdec($headers['IMEI']);
  24. }
  25. $version = isset($headers['VERSION']) ? $headers['VERSION'] : '';
  26. $headers = $row['record_headers'];
  27. $data = $row['record_data'];
  28. $sql = 'INSERT INTO exceptions (ex_ip, ex_imei, ex_application, ex_version, ';
  29. $sql .= 'ex_headers, ex_trace) VALUES (';
  30. $sql .= '\'' . m($ip) . '\', \'' . m($imei) . '\', \'' . m($application) . '\', \'';
  31. $sql .= m($version) . '\', \'' . m($headers) . '\', \'' . m($data) . '\')';
  32. mysql_query($sql) or die(mysql_error());
  33. $sql = 'DELETE FROM unprocessed WHERE record_id = ' . $row['record_id'];
  34. mysql_query($sql);
  35. $count++;
  36. }
  37. if ($count > 1 || !$records && $count > 0) {
  38. Oblong("\002[ANDROID]\002 Processed $count " . ($records ? "new" : "existing") . " exceptions");
  39. }
  40. }
  41. function processSensorLogger($records = true) {
  42. $sql = $records ? 'SELECT record_id, record_ip, record_headers, record_data FROM unprocessed'
  43. : 'SELECT log_id, log_ip AS record_ip, log_headers AS record_headers, log_data '
  44. . 'AS record_data FROM sensorlogger WHERE log_pversion < ' . VERSION;
  45. $res = mysql_query($sql);
  46. $count = 0;
  47. $codes = array();
  48. while ($row = mysql_fetch_assoc($res)) {
  49. $ip = $row['record_ip'];
  50. $headers = array();
  51. foreach (explode("\n", $row['record_headers']) as $line) {
  52. if (preg_match('/(.*?): (.*)$/', $line, $m)) {
  53. $headers[$m[1]] = $m[2];
  54. }
  55. }
  56. if (!isset($headers['APPLICATION']) || $headers['APPLICATION'] != 'SensorLogger') {
  57. continue;
  58. }
  59. $imei = isset($headers['IMEI']) ? $headers['IMEI'] : '';
  60. if (!ctype_digit($imei) && !empty($imei)) {
  61. // It's probably an MEID not an IMEI number
  62. $imei = bchexdec($headers['IMEI']);
  63. }
  64. $activity = isset($headers['ACTIVITY']) ? $headers['ACTIVITY'] : '';
  65. $version = isset($headers['VERSION']) ? $headers['VERSION'] : '';
  66. if (preg_match('/^([0-9]+)[0-9]{3}:.*/', $row['record_data'], $m)) {
  67. $time = (int) $m[1];
  68. } else {
  69. $time = 0;
  70. }
  71. if (empty($imei)) {
  72. $statuscode = 2;
  73. } else if (empty($activity) || $activity == '<Unknown>') {
  74. $statuscode = 3;
  75. } else if (empty($version)) {
  76. $statuscode = 4;
  77. } else if (empty($row['record_data'])) {
  78. $statuscode = 5;
  79. } else if ($time == 0 || date('Y', $time) < 2010) {
  80. $statuscode = 6;
  81. } else if (count(explode("\n", $row['record_data'])) < 500) {
  82. $statuscode = 7;
  83. } else {
  84. // Check for duplicates
  85. $sql2 = 'SELECT COUNT(*) FROM sensorlogger WHERE LEFT(log_data, ' . strlen($row['record_data']) . ')';
  86. $sql2 .= ' = LEFT(\'' . m($row['record_data']) . '\', ' . strlen($row['record_data']) . ')';
  87. if (!$record) {
  88. $sql2 .= ' AND (log_id < ' . $row['log_id'] . ' OR LENGTH(log_data) > ' . strlen($row['record_data']) . ')';
  89. }
  90. $res2 = mysql_query($sql2);
  91. $num2 = (int) mysql_result($res2, 0);
  92. if ($num2 > 0) {
  93. $statuscode = 8;
  94. } else {
  95. $error = false;
  96. // Check for repeated data
  97. $last = array(); $lastcount = array();
  98. foreach (explode("\n", $row['record_data']) as $line) {
  99. $bits = explode(',', trim(substr($line, strpos($line, ':'))));
  100. foreach ($bits as $o => $bit) {
  101. if (empty($bit)) { continue; }
  102. if ($last[$o] == $bit) { $lastcount[$o]++; } else { $lastcount[$o] = 0; }
  103. $last[$o] = $bit;
  104. }
  105. if (max($lastcount) > 200) {
  106. $error = true;
  107. break;
  108. }
  109. }
  110. $statuscode = $error ? 9 : 1;
  111. }
  112. }
  113. $codes[$statuscode]++;
  114. $pversion = VERSION;
  115. $headers = $row['record_headers'];
  116. $data = $row['record_data'];
  117. if ($records) {
  118. $sql = 'INSERT INTO sensorlogger (log_ip, log_imei, log_activity, log_version, ';
  119. $sql .= 'log_time, log_statuscode, log_pversion, log_headers, log_data) VALUES (';
  120. $sql .= '\'' . m($ip) . '\', \'' . m($imei) . '\', \'' . m($activity) . '\', \'';
  121. $sql .= m($version) . '\', ' . ((int) $time) . ', ' . ((int) $statuscode) . ', ';
  122. $sql .= ((int) $pversion) . ', \'' . m($headers) . '\', \'' . m($data) . '\')';
  123. mysql_query($sql) or die(mysql_error());
  124. $sql = 'DELETE FROM unprocessed WHERE record_id = ' . $row['record_id'];
  125. mysql_query($sql);
  126. } else {
  127. $sql = 'UPDATE sensorlogger SET log_ip = \'' . m($ip) . '\', log_imei = \'';
  128. $sql .= m($imei) . '\', log_activity = \'' . m($activity) . '\', log_version = \'';
  129. $sql .= m($version) . '\', log_time = ' . ((int) $time) . ', log_statuscode = ';
  130. $sql .= ((int) $statuscode) . ', log_pversion = ' . ((int) $pversion) . ', log_headers = \'';
  131. $sql .= m($headers) . '\', log_data = \'' . m($data) . '\' WHERE log_id = ' . $row['log_id'];
  132. mysql_query($sql);
  133. }
  134. $count++;
  135. }
  136. if ($count > 1 || !$records && $count > 0) {
  137. $codestr = '';
  138. asort($codes);
  139. foreach ($codes as $code => $count) {
  140. $codestr .= (!empty($codestr) ? '; ' : '') . $code . ': ' . $count;
  141. }
  142. Oblong("\002[ANDROID]\002 Processed $count " . ($records ? "new" : "existing") . " SensorLogger dataset(s). Status codes: $codestr");
  143. }
  144. }
  145. processSensorLogger(!isset($argv[1]) || $argv[1] != '--update');
  146. processExceptions(!isset($argv[1]) || $argv[1] != '--update');
  147. ?>