Compare commits

..

No commits in common. "master" and "v2.4.0" have entirely different histories.

5 changed files with 17 additions and 143 deletions

View File

@ -114,17 +114,17 @@ function _try_lz4_replay(string $txt)
return "4:" . base64_encode(lz4_compress(base64_decode($txt))); return "4:" . base64_encode(lz4_compress(base64_decode($txt)));
} }
function log(string $msg) function log($msg)
{ {
echo date("Y-m-d H:i:s") . " " . $msg . "\n"; echo date("Y-m-d H:i:s") . " " . $msg . "\n";
} }
function err(string $msg) function err($msg)
{ {
taskman\stderr(date("Y-m-d H:i:s") . " " . $msg . "\n"); taskman\stderr(date("Y-m-d H:i:s") . " " . $msg . "\n");
} }
function _retry(int $max_tries, callable $func, int $sleep = 1) function _retry($max_tries, $func)
{ {
for($i=0;$i<$max_tries;++$i) for($i=0;$i<$max_tries;++$i)
{ {
@ -133,12 +133,12 @@ function _retry(int $max_tries, callable $func, int $sleep = 1)
$func(); $func();
return; return;
} }
catch(\Throwable $e) catch(Exception $e)
{ {
if(($i+1) == $max_tries) if(($i+1) == $max_tries)
throw $e; throw $e;
} }
sleep($sleep); sleep(1);
} }
} }

View File

@ -8,7 +8,6 @@ interface IMChan
{ {
function post(string $message, array $fields = array()) : array; function post(string $message, array $fields = array()) : array;
function updatePost(string $thread_id, array $fields = array()); function updatePost(string $thread_id, array $fields = array());
function postFile(string $title, string $mime_type, string $file_path, array $fields = array()) : array;
function postPNG(string $title, string $png_file, array $fields = array()) : array; function postPNG(string $title, string $png_file, array $fields = array()) : array;
function getPermalink(string $id) : string; function getPermalink(string $id) : string;
} }
@ -25,11 +24,6 @@ class NullMessenger implements IMChan
return array('ok' => true); return array('ok' => true);
} }
function postFile(string $title, string $mime_type, string $file_path, array $fields = array()) : array
{
return array('ok' => true);
}
function postPNG(string $title, string $png_file, array $fields = array()) : array function postPNG(string $title, string $png_file, array $fields = array()) : array
{ {
return array('ok' => true); return array('ok' => true);
@ -66,11 +60,6 @@ class MattermostChan implements IMChan
return mm_update($this->server, $this->token, $id, $fields); return mm_update($this->server, $this->token, $id, $fields);
} }
function postFile(string $title, string $mime_type, string $file_path, array $fields = array()) : array
{
return mm_post_file($this->server, $this->token, $this->chan, $title, $mime_type, $file_path, $fields);
}
function postPNG(string $title, string $png_file, array $fields = array()) : array function postPNG(string $title, string $png_file, array $fields = array()) : array
{ {
return mm_post_png($this->server, $this->token, $this->chan, $title, $png_file, $fields); return mm_post_png($this->server, $this->token, $this->chan, $title, $png_file, $fields);
@ -133,49 +122,7 @@ function mm_update(string $server, string $token, string $id, array $fields)
return json_decode($result, true); return json_decode($result, true);
} }
function mm_post_file( function mm_post_png(string $server, string $token, string $chan, string $title, string $png_file, $msg_fields = array())
string $server, string $token, string $chan,
string $title, string $mime_type, string $file_path,
$msg_fields = array()
)
{
$headers = array(
'Content-Type: multipart/form-data',
'Authorization: Bearer ' . $token
);
$file = new \CurlFile(realpath($file_path), $mime_type, basename($file_path));
$fields = array();
$fields['channel_id'] = $chan;
$fields['files'] = $file;
$ch = curl_init("$server/api/v4/files");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if($status != 201)
throw new Exception("File failed with status: " . $status .", result: " . var_export($result, true));
$result = json_decode($result, true);
$file_id = $result['file_infos'][0]['id'];
$msg_fields['file_ids'] = array($file_id);
return mm_post($server, $token, $chan, $title, $msg_fields);
}
function mm_post_png(
string $server, string $token, string $chan,
string $title, string $png_file,
$msg_fields = array()
)
{ {
$headers = array( $headers = array(
'Content-Type: multipart/form-data', 'Content-Type: multipart/form-data',

View File

@ -16,8 +16,6 @@ class Plan
const BOGUS_REINSTALL_APP_EVERY_N = 2; const BOGUS_REINSTALL_APP_EVERY_N = 2;
const IM_THREAD_UPDATE_INTERVAL = 5; const IM_THREAD_UPDATE_INTERVAL = 5;
const MaxImTextPostLen = 3000;
public Session $session; public Session $session;
public string $name; public string $name;
@ -253,17 +251,7 @@ class Plan
while(!$this->isOver()) while(!$this->isOver())
{ {
try
{
//let's not exit the testing just because we couldn't update IM thread for some reason
_retry(3, function() {
$this->_updateMessengerThread(false); $this->_updateMessengerThread(false);
});
}
catch(\Throwable $e)
{
err("Task #{$task->run_id} IM thread update error: {$e} *{$task->device}*...");
}
yield Amp\delay((int)($this->session->conf->sleep_time*1000)); yield Amp\delay((int)($this->session->conf->sleep_time*1000));
@ -300,10 +288,7 @@ class Plan
} }
} }
_retry(3, function() {
$this->_updateMessengerThread(true); $this->_updateMessengerThread(true);
}
);
}); });
} }
@ -335,7 +320,6 @@ class Plan
$task->getCmd(), $task->getCmd(),
$task->getCmdArgs() $task->getCmdArgs()
); );
$task->ext_cmd_start_time = time();
} }
catch(Exception $e) catch(Exception $e)
{ {
@ -553,7 +537,7 @@ class Plan
static function _printToShellExtItem(Task $task, array $item) static function _printToShellExtItem(Task $task, array $item)
{ {
$shell_msg = _trim($item['message'], self::MaxImTextPostLen); $shell_msg = _trim($item['message'], 3000);
if(Task::isProblemCode($item['error'])) if(Task::isProblemCode($item['error']))
$shell_msg = "[PRB] Code:{$item['error']}, $shell_msg"; $shell_msg = "[PRB] Code:{$item['error']}, $shell_msg";
$shell_msg = "(".round($item['time'],1)."s) {$shell_msg} *{$task->device}*"; $shell_msg = "(".round($item['time'],1)."s) {$shell_msg} *{$task->device}*";
@ -563,7 +547,7 @@ class Plan
function _postToMessengerExtStatusItem(Task $task, array $item) function _postToMessengerExtStatusItem(Task $task, array $item)
{ {
$orig_msg = _trim($item['message'], self::MaxImTextPostLen); $orig_msg = _trim($item['message'], 3000);
$mm_msg = $orig_msg; $mm_msg = $orig_msg;
if($item['error'] == Task::CODE_EXCEPTION) if($item['error'] == Task::CODE_EXCEPTION)
@ -583,30 +567,6 @@ class Plan
return $this->session->conf->im->post($msg, $args); return $this->session->conf->im->post($msg, $args);
} }
function postFileData(string $title, string $mime_type, string $file_data, string $file_extension, array $args = array()) : bool
{
$args['root_id'] = $this->im_thread_id;
if($file_data)
{
$tmp_file = tempnam(sys_get_temp_dir(), 'tmp_upload') . $file_extension;
taskman\ensure_write($tmp_file, $file_data);
try
{
$this->session->conf->im->postFile($title, $mime_type, $tmp_file, $args);
return true;
}
catch(Exception $e)
{}
finally
{
taskman\ensure_rm($tmp_file);
}
}
return false;
}
function _analyzeExtStatusItemAsync(Task $task, array $item) : Amp\Promise function _analyzeExtStatusItemAsync(Task $task, array $item) : Amp\Promise
{ {
return Amp\call(function() use($task, $item) { return Amp\call(function() use($task, $item) {
@ -642,10 +602,6 @@ class Plan
{ {
$this->_postToMessengerExtStatusItem($task, $item); $this->_postToMessengerExtStatusItem($task, $item);
} }
else if($item['error'] == Task::CODE_RAW)
{
$this->_postRawDataToMessenger($task, $item['message']);
}
else if($msg_type === '[WRN]') else if($msg_type === '[WRN]')
{ {
$task->addStatusCode(Task::CODE_WARN); $task->addStatusCode(Task::CODE_WARN);
@ -680,21 +636,9 @@ class Plan
}); });
} }
function _postRawDataToMessenger(Task $task, string $txt)
{
if(strlen($txt) > self::MaxImTextPostLen)
$this->postFileData("Raw data: *{$task->device}*", 'text/plain', $txt, '.txt');
else
$this->post("Raw data: \n```\n$txt\n```\n *{$task->device}*");
}
function _postReplayToMessenger(Task $task, $repl_txt) function _postReplayToMessenger(Task $task, $repl_txt)
{ {
$repl_txt = _try_lz4_replay($repl_txt); $repl_txt = _try_lz4_replay($repl_txt);
if(strlen($repl_txt) > self::MaxImTextPostLen)
$this->postFileData("Replay File: *{$task->device}*", 'text/plain', $repl_txt, '.txt');
else
$this->post("Last Replay: \n```\n$repl_txt\n```\n *{$task->device}*"); $this->post("Last Replay: \n```\n$repl_txt\n```\n *{$task->device}*");
} }

View File

@ -51,7 +51,6 @@ class SessionConfig
class Session class Session
{ {
const RUN_SLEEP = 3; const RUN_SLEEP = 3;
const IGNORE_DEVICE_TTL = 300;
public string $name; public string $name;
public SessionConfig $conf; public SessionConfig $conf;
@ -112,30 +111,18 @@ class Session
function getDevices() : array function getDevices() : array
{ {
$this->_checkIgnoredDevices(); $devices = array_diff(
$this->device_pool->get(),
$connected_devices = $this->device_pool->get(); $this->ignored_devices
$actual_devices = array_diff($connected_devices, array_keys($this->ignored_devices)); );
return $devices;
return $actual_devices;
}
function _checkIgnoredDevices()
{
//let's remove from ignored devices devices which were ignored for some time
$devices = array_keys($this->ignored_devices);
foreach($devices as $device)
{
if(time() - $this->ignored_devices[$device] > self::IGNORE_DEVICE_TTL)
unset($this->ignored_devices[$device]);
}
} }
function ignoreDevice(string $device, string $reason) function ignoreDevice(string $device, string $reason)
{ {
err("Ignoring device *$device*: $reason"); err("Ignoring device *$device*: $reason");
$this->ignored_devices[$device] = time(); $this->ignored_devices[] = $device;
} }
function incBogusDevice(string $device) function incBogusDevice(string $device)

View File

@ -26,7 +26,6 @@ class Task
const CODE_MESSAGE = 0; const CODE_MESSAGE = 0;
const CODE_EXCEPTION = 1; const CODE_EXCEPTION = 1;
const CODE_WARN = 2; const CODE_WARN = 2;
const CODE_RAW = 3;
const CODE_NSTART = 124; const CODE_NSTART = 124;
const CODE_STUCK = 125; const CODE_STUCK = 125;
const CODE_GONE = 126; const CODE_GONE = 126;
@ -43,8 +42,6 @@ class Task
return "exception"; return "exception";
case self::CODE_WARN: case self::CODE_WARN:
return "warning"; return "warning";
case self::CODE_RAW:
return "raw";
case self::CODE_STUCK: case self::CODE_STUCK:
return "stuck"; return "stuck";
case self::CODE_NSTART: case self::CODE_NSTART:
@ -82,7 +79,6 @@ class Task
public float $start_time = 0; public float $start_time = 0;
public float $reset_time = 0; public float $reset_time = 0;
public float $ext_cmd_start_time = 0;
public float $last_progress = 0; public float $last_progress = 0;
public int $last_done_arg_idx = -1; public int $last_done_arg_idx = -1;