PMCORE-3867 “database-upgrade” console action
This commit is contained in:
@@ -7,6 +7,7 @@ use ProcessMaker\BusinessModel\Process as BmProcess;
|
||||
/*----------------------------------********---------------------------------*/
|
||||
use ProcessMaker\ChangeLog\ChangeLog;
|
||||
/*----------------------------------********---------------------------------*/
|
||||
use ProcessMaker\BusinessModel\TaskSchedulerBM;
|
||||
use ProcessMaker\BusinessModel\WebEntry;
|
||||
use ProcessMaker\Core\Installer;
|
||||
use ProcessMaker\Core\ProcessesManager;
|
||||
@@ -1125,6 +1126,7 @@ class WorkspaceTools
|
||||
$this->upgradeSchema($systemSchemaRbac, false, true); // Perform upgrade to RBAC
|
||||
$this->upgradeData();
|
||||
$this->checkRbacPermissions(); //check or add new permissions
|
||||
$this->checkSchedulerTable();
|
||||
$this->checkSequenceNumber();
|
||||
$this->migrateIteeToDummytask($this->name);
|
||||
/*----------------------------------********---------------------------------*/
|
||||
@@ -3352,7 +3354,7 @@ class WorkspaceTools
|
||||
*/
|
||||
public function checkRbacPermissions()
|
||||
{
|
||||
CLI::logging("-> Remove the permissions depreacated in RBAC \n");
|
||||
CLI::logging("-> Remove the permissions deprecated in RBAC \n");
|
||||
$this->removePermission();
|
||||
CLI::logging("-> Verifying roles permissions in RBAC \n");
|
||||
//Update table RBAC permissions
|
||||
@@ -3368,6 +3370,17 @@ class WorkspaceTools
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check SCHEDULER table integrity.
|
||||
* @return void
|
||||
*/
|
||||
public function checkSchedulerTable(): void
|
||||
{
|
||||
CLI::logging("-> Check SCHEDULER table integrity.\n");
|
||||
TaskSchedulerBM::checkDataIntegrity();
|
||||
CLI::logging(" SCHEDULER table integrity was checked.\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* Add sequence numbers
|
||||
*/
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace ProcessMaker\BusinessModel;
|
||||
|
||||
use Bootstrap;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use ProcessMaker\Core\System;
|
||||
use ProcessMaker\Model\TaskScheduler;
|
||||
|
||||
@@ -223,13 +225,14 @@ class TaskSchedulerBM
|
||||
]
|
||||
/*----------------------------------********---------------------------------*/
|
||||
];
|
||||
|
||||
/**
|
||||
* Return the records in Schedule Table by category
|
||||
*/
|
||||
public static function getSchedule($category)
|
||||
{
|
||||
$tasks = TaskScheduler::all();
|
||||
$count = $tasks->count();
|
||||
$count = $tasks->count();
|
||||
if ($count == 0) {
|
||||
TaskSchedulerBM::generateInitialData();
|
||||
$tasks = TaskScheduler::all();
|
||||
@@ -244,6 +247,7 @@ class TaskSchedulerBM
|
||||
return $tasks;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the record Schedule in Schedule Table
|
||||
*/
|
||||
@@ -251,55 +255,122 @@ class TaskSchedulerBM
|
||||
{
|
||||
$task = TaskScheduler::find($request['id']);
|
||||
if (isset($request['enable'])) {
|
||||
$task->enable = $request['enable'];
|
||||
$task->enable = $request['enable'];
|
||||
}
|
||||
if (isset($request['expression'])) {
|
||||
$task->expression = $request['expression'];
|
||||
$task->startingTime = $request['startingTime'];
|
||||
$task->endingTime = $request['endingTime'];
|
||||
$task->timezone = $request['timezone'];
|
||||
$task->everyOn = $request['everyOn'];
|
||||
$task->interval = $request['interval'];
|
||||
$task->startingTime = $request['startingTime'];
|
||||
$task->endingTime = $request['endingTime'];
|
||||
$task->timezone = $request['timezone'];
|
||||
$task->everyOn = $request['everyOn'];
|
||||
$task->interval = $request['interval'];
|
||||
}
|
||||
$task->save();
|
||||
return $task;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initial data for Schedule Table, with default values
|
||||
*/
|
||||
public static function generateInitialData()
|
||||
{
|
||||
$arraySystemConfiguration = System::getSystemConfiguration('', '', config("system.workspace"));
|
||||
$toSave = [];
|
||||
$win = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
|
||||
foreach (TaskSchedulerBM::$services as $service) {
|
||||
$task = new TaskScheduler;
|
||||
$task->title = $service["title"];
|
||||
$task->category = $service["category"];
|
||||
$task->description = $service["description"];
|
||||
$task->startingTime = $service["startingTime"];
|
||||
$task->endingTime = $service["endingTime"];
|
||||
if ($win) {
|
||||
$task->body = 'php "' . PATH_TRUNK . $service["filew"] . '" ' . $service["service"] . ' +w' . config("system.workspace") . ' +force +async';
|
||||
} else {
|
||||
$task->body = 'su -s /bin/sh -c "php ' . PATH_TRUNK . $service["file"] . " " . $service["service"] . ' +w' . config("system.workspace") . ' +force +async"';
|
||||
}
|
||||
$task->expression = $service["expression"];
|
||||
$task->type = "shell";
|
||||
$task->system = 1;
|
||||
$task->enable = $service["enable"];
|
||||
$task->everyOn = $service["everyOn"];
|
||||
$task->interval = $service["interval"];
|
||||
$task->timezone = $service["timezone"] == "default" ? date_default_timezone_get() : null;
|
||||
$task->default_value = json_encode([
|
||||
"startingTime" => $service["startingTime"],
|
||||
"endingTime" => $service["endingTime"],
|
||||
"everyOn" => $service["everyOn"],
|
||||
"interval" => $service["interval"],
|
||||
"expression" => $service["expression"],
|
||||
"timezone" => $task->timezone
|
||||
]);
|
||||
$task->save();
|
||||
self::registerScheduledTask($service);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Register scheduled task.
|
||||
* @param array $service
|
||||
* @return TaskScheduler
|
||||
*/
|
||||
private static function registerScheduledTask(array $service)
|
||||
{
|
||||
$task = new TaskScheduler;
|
||||
$task->title = $service["title"];
|
||||
$task->category = $service["category"];
|
||||
$task->description = $service["description"];
|
||||
$task->startingTime = $service["startingTime"];
|
||||
$task->endingTime = $service["endingTime"];
|
||||
$task->body = self::buildBody($service);
|
||||
$task->expression = $service["expression"];
|
||||
$task->type = "shell";
|
||||
$task->system = 1;
|
||||
$task->enable = $service["enable"];
|
||||
$task->everyOn = $service["everyOn"];
|
||||
$task->interval = $service["interval"];
|
||||
$task->timezone = $service["timezone"] == "default" ? date_default_timezone_get() : null;
|
||||
$task->default_value = json_encode([
|
||||
"startingTime" => $service["startingTime"],
|
||||
"endingTime" => $service["endingTime"],
|
||||
"everyOn" => $service["everyOn"],
|
||||
"interval" => $service["interval"],
|
||||
"expression" => $service["expression"],
|
||||
"timezone" => $task->timezone
|
||||
]);
|
||||
$task->save();
|
||||
return $task;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build body parameter.
|
||||
* @param array $service
|
||||
* @return string
|
||||
*/
|
||||
private static function buildBody(array $service): string
|
||||
{
|
||||
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
|
||||
return 'php "' . PATH_TRUNK . $service["filew"] . '" ' . $service["service"] . ' +w' . config("system.workspace") . ' +force +async';
|
||||
} else {
|
||||
return 'su -s /bin/sh -c "php ' . PATH_TRUNK . $service["file"] . " " . $service["service"] . ' +w' . config("system.workspace") . ' +force +async"';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check data integrity.
|
||||
* @return array
|
||||
*/
|
||||
public static function checkDataIntegrity(): array
|
||||
{
|
||||
$beforeChanges = TaskScheduler::select()->get();
|
||||
|
||||
//remove missing register
|
||||
$titleCondition = [];
|
||||
$descriptionCondition = [];
|
||||
foreach (self::$services as $service) {
|
||||
$titleCondition[] = $service['title'];
|
||||
$descriptionCondition[] = $service['description'];
|
||||
}
|
||||
TaskScheduler::whereNotIn('title', $titleCondition)
|
||||
->whereNotIn('description', $descriptionCondition)
|
||||
->delete();
|
||||
|
||||
//update register or create new register
|
||||
foreach (self::$services as $service) {
|
||||
$scheduler = TaskScheduler::select()
|
||||
->where('title', '=', $service['title'])
|
||||
->where('description', '=', $service['description'])
|
||||
->get()
|
||||
->first();
|
||||
if (is_null($scheduler)) {
|
||||
self::registerScheduledTask($service);
|
||||
} else {
|
||||
$scheduler->body = self::buildBody($service);
|
||||
$scheduler->type = 'shell';
|
||||
$scheduler->category = $service['category'];
|
||||
$scheduler->system = 1;
|
||||
$scheduler->update();
|
||||
}
|
||||
}
|
||||
|
||||
//log changes
|
||||
$afterChanges = TaskScheduler::select()->get();
|
||||
$result = [
|
||||
'beforeChanges' => $beforeChanges,
|
||||
'afterChanges' => $afterChanges
|
||||
];
|
||||
$message = 'Check SCHEDULER table integrity';
|
||||
Log::channel(':taskSchedulerCheckDataIntegrity')->info($message, Bootstrap::context($result));
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user