query( "UPDATE `tasks` SET `state` = 'stalled' " . "WHERE done = 0 " . "AND state <> 'stalled' " . "AND unix_timestamp(now()) - updated > 120"); $stalled_count = $query->count(); if ($stalled_count) { log::warning("tasks", t2("One task is stalled", "%count tasks are stalled", $stalled_count), t("%link_startview%link_end", array("link_start" => "", "link_start" => ""))); } $view = new Admin_View("admin.html"); $view->content = new View("admin_maintenance.html"); $view->content->task_definitions = task::get_task_definitions(); $view->content->running_tasks = ORM::factory("task") ->select("tasks.*", "users.name as user_name") ->join("users", "tasks.owner_id", "users.id") ->where("done", 0)->orderby("updated", "DESC")->find_all(); $view->content->finished_tasks = ORM::factory("task") ->select("tasks.*", "users.name as user_name") ->join("users", "tasks.owner_id", "users.id") ->where("done", 1)->orderby("updated", "DESC")->find_all(); $view->content->csrf = access::csrf_token(); print $view; } /** * Start a new task * @param string $task_callback */ public function start($task_callback) { access::verify_csrf(); $task = task::create($task_callback); $view = new View("admin_maintenance_task.html"); $view->csrf = access::csrf_token(); $view->task = $task; log::info("tasks", t("Task %task_name started (task id %task_id)", array("task_name" => $task->name, "task_id" => $task->id)), html::anchor(url::site("admin/maintenance"), t("maintenance"))); print $view; } /** * Resume a stalled task * @param string $task_id */ public function resume($task_id) { access::verify_csrf(); $task = ORM::factory("task", $task_id); if (!$task->loaded) { throw new Exception("@todo MISSING_TASK"); } $view = new View("admin_maintenance_task.html"); $view->csrf = access::csrf_token(); $view->task = $task; log::info("tasks", t("Task %task_name resumed (task id %task_id)", array("task_name" => $task->name, "task_id" => $task->id)), html::anchor(url::site("admin/maintenance"), t("maintenance"))); print $view; } /** * Cancel a task. * @param string $task_id */ public function cancel($task_id) { access::verify_csrf(); task::cancel($task_id); message::success(t("Task cancelled")); url::redirect("admin/maintenance"); } /** * Remove a task. * @param string $task_id */ public function remove($task_id) { access::verify_csrf(); task::remove($task_id); message::success(t("Task removed")); url::redirect("admin/maintenance"); } /** * Run a task. This will trigger the task to do a small amount of work, then it will report * back with status on the task. * @param string $task_id */ public function run($task_id) { access::verify_csrf(); $task = task::run($task_id); if ($task->done) { switch ($task->state) { case "success": log::success("tasks", t("Task %task_name completed (task id %task_id)", array("task_name" => $task->name, "task_id" => $task->id)), html::anchor(url::site("admin/maintenance"), t("maintenance"))); message::success(t("Task completed successfully")); break; case "error": log::error("tasks", t("Task %task_name failed (task id %task_id)", array("task_name" => $task->name, "task_id" => $task->id)), html::anchor(url::site("admin/maintenance"), t("maintenance"))); message::success(t("Task failed")); break; } print task::success($task, url::site("admin/maintenance")); } else { print task::in_progress($task); } } }