128 lines
4.1 KiB
PHP
128 lines
4.1 KiB
PHP
<?php
|
|
/* ReportParser.php
|
|
* Parses incoming raw crash reports
|
|
*
|
|
* Description
|
|
* @package Singularity Crash Processor
|
|
* @author Latif Khalifa <latifer@streamgrid.net>
|
|
* @copyright Copyright © 2012, Latif Khalifa
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining
|
|
* a copy of this software and associated documentation files
|
|
* (the "Software"), to deal in the Software without restriction, including
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
* distribute, sublicense, and/or sell copies of the Software, and to permit
|
|
* persons to whom the Software is furnished to do so, subject to the
|
|
* following conditions:
|
|
*
|
|
* - The above copyright notice and this permission notice shall be included
|
|
* in all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
|
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*
|
|
*/
|
|
|
|
require_once SITE_ROOT.'/lib/llsd_classes.php';
|
|
require_once SITE_ROOT.'/lib/llsd_decode.php';
|
|
|
|
class ReportParser
|
|
{
|
|
static $extracted = array();
|
|
|
|
function parse($id)
|
|
{
|
|
global $DB;
|
|
$q = kl_str_sql("select * from raw_reports where report_id=!i", $id);
|
|
if (!$res = $DB->query($q) OR !$row = $DB->fetchRow($res))
|
|
{
|
|
return new stdClass;
|
|
}
|
|
$data = new stdClass;
|
|
$DB->loadFromDbRow($data, $res, $row);
|
|
$data->report = llsd_decode($data->raw_data);
|
|
$data->report["reported"] = $data->reported;
|
|
unset($data->raw_data);
|
|
|
|
if ($client = $data->report["DebugLog"]["ClientInfo"])
|
|
{
|
|
//var_dump($client);
|
|
$data->report["clientVersion"] = $client["MajorVersion"] . "." . $client["MinorVersion"] . "." . $client["PatchVersion"] . "." .$client["BuildVersion"];
|
|
$data->report["clientChannel"] = str_replace(" ", "", $client["Name"]);
|
|
}
|
|
|
|
// $data->report["raw"] = $row;
|
|
return $data->report;
|
|
}
|
|
|
|
function setProcessed($id, $status)
|
|
{
|
|
global $DB;
|
|
$ret = array();
|
|
$q = kl_str_sql("update raw_reports set processed=!i where report_id=!i", $status, $id);
|
|
|
|
if ($res = $DB->query($q))
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function getUnprocessedIDs()
|
|
{
|
|
global $DB;
|
|
$ret = array();
|
|
$q = kl_str_sql("select report_id from raw_reports where processed=!i", 0);
|
|
|
|
if (!$res = $DB->query($q))
|
|
{
|
|
return $ret;
|
|
}
|
|
|
|
while ($row = $DB->fetchRow($res))
|
|
{
|
|
$ret[] = (int)$row["report_id"];
|
|
}
|
|
|
|
return $ret;
|
|
}
|
|
|
|
function getWorkPath()
|
|
{
|
|
static $p = "";
|
|
|
|
if ($p) return $p;
|
|
|
|
return $p = sys_get_temp_dir() . "/extract-syms-" . (string)getmypid();
|
|
}
|
|
|
|
function getStackTrace($prefix, $dump)
|
|
{
|
|
if (!$dump || !($data = $dump->getData())) return;
|
|
file_put_contents(self::getWorkPath() . "/working.dmp", $data);
|
|
|
|
$match = SITE_ROOT . "/../incoming_symbols/$prefix-symbols-*.tar.bz2";
|
|
|
|
foreach(glob($match) as $file)
|
|
{
|
|
if (!in_array($file, self::$extracted))
|
|
{
|
|
self::$extracted[] = $file;
|
|
print "Unpacking $file\n";
|
|
shell_exec("tar xjf " . escapeshellcmd($file));
|
|
}
|
|
}
|
|
|
|
$cmd = "minidump_stackwalk -m " . self::getWorkPath() . "/working.dmp " . self::getWorkPath();
|
|
print "Executing: $cmd\n";
|
|
return shell_exec($cmd);
|
|
}
|
|
} |