ENHANCEMENT: using doctrine for creating and editing jobs

This commit is contained in:
Jeroen De Meerleer 2022-05-18 17:14:25 +02:00
parent 045d2389b9
commit d700458f31
Signed by: JeroenED
GPG Key ID: 28CCCB8F62BFADD6
2 changed files with 58 additions and 55 deletions

View File

@ -27,13 +27,13 @@ class Job
/** /**
* @var string * @var string
*/ */
#[ORM\Column(type: "text")] #[ORM\Column(name: "`data`", type: "text")]
private string $data; private string $data;
/** /**
* @var int * @var int
*/ */
#[ORM\Column(type: "integer")] #[ORM\Column(name: "`interval`", type: "integer")]
private int $interval; private int $interval;
/** /**
@ -118,7 +118,7 @@ class Job
public function setData(string $name, mixed $value): Job public function setData(string $name, mixed $value): Job
{ {
$data = json_decode($this->data, true); $data = json_decode($this->data ?? '{}', true);
if (!empty($name)) { if (!empty($name)) {
$this->addDataItem($data, $name, $value); $this->addDataItem($data, $name, $value);
} }
@ -130,8 +130,9 @@ class Job
{ {
$names = is_array($name) ? $name : explode('.', $name); $names = is_array($name) ? $name : explode('.', $name);
$current = $names[0]; $current = $names[0];
if(isset($data[$current]) && is_array($data[$current])) { if(count($names) > 1) {
unset($names[0]); unset($names[0]);
if(!isset($data[$current])) $data[$current] = [];
$this->addDataItem($data[$current], array_values($names), $value); $this->addDataItem($data[$current], array_values($names), $value);
} else { } else {
$data[$names[0]] = $value; $data[$names[0]] = $value;
@ -216,7 +217,7 @@ class Job
* @param int $lastrun * @param int $lastrun
* @return Job * @return Job
*/ */
public function setLastrun(int $lastrun): Job public function setLastrun(?int $lastrun): Job
{ {
$this->lastrun = $lastrun; $this->lastrun = $lastrun;
return $this; return $this;

View File

@ -480,13 +480,10 @@ class JobRepository extends EntityRepository
throw new \InvalidArgumentException('Some fields are empty'); throw new \InvalidArgumentException('Some fields are empty');
} }
$data = $this->prepareJob($values); $job = $this->prepareJob($values);
$data['data'] = json_encode($data['data']);
$addJobSql = "INSERT INTO job(name, data, `interval`, nextrun, lastrun, running) VALUES (:name, :data, :interval, :nextrun, :lastrun, :running)";
$addJobStmt = $this->getEntityManager()->getConnection()->prepare($addJobSql);
$addJobStmt->executeQuery([':name' => $data['name'], ':data' => $data['data'], ':interval' => $data['interval'], ':nextrun' => $data['nextrun'], ':lastrun' => $data['lastrun'], ':running' => 0]);
$this->getEntityManager()->persist($job);
$this->getEntityManager()->flush();
return ['success' => true, 'message' => 'Cronjob succesfully added']; return ['success' => true, 'message' => 'Cronjob succesfully added'];
} }
@ -499,47 +496,52 @@ class JobRepository extends EntityRepository
) { ) {
throw new \InvalidArgumentException('Some fields are empty'); throw new \InvalidArgumentException('Some fields are empty');
} }
$data = $this->prepareJob($values); $job = $this->find($id);
$data['data'] = json_encode($data['data']); $job = $this->prepareJob($values, $job);
$editJobSql = "UPDATE job SET name = :name, data = :data, `interval` = :interval, nextrun = :nextrun, lastrun = :lastrun WHERE id = :id";
$editJobStmt = $this->getEntityManager()->getConnection()->prepare($editJobSql);
$editJobStmt->executeQuery([':name' => $data['name'], ':data' => $data['data'], ':interval' => $data['interval'], ':nextrun' => $data['nextrun'], ':lastrun' => $data['lastrun'],':id' => $id ]);
$this->getEntityManager()->persist($job);
$this->getEntityManager()->flush();
return ['success' => true, 'message' => 'Cronjob succesfully edited']; return ['success' => true, 'message' => 'Cronjob succesfully edited'];
} }
public function prepareJob(array $values): array public function prepareJob(array $values, ?Job $job = NULL): Job
{ {
if ($job === NULL) {
$job = new Job();
$job->setRunning(0);
}
$job->setName($values['name']);
$job->setInterval($values['interval']);
if(empty($values['lastrun']) || (isset($values['lastrun-eternal']) && $values['lastrun-eternal'] == 'true')) { if(empty($values['lastrun']) || (isset($values['lastrun-eternal']) && $values['lastrun-eternal'] == 'true')) {
$values['lastrun'] = NULL; $job->setLastrun(NULL);
} else { } else {
$values['lastrun'] = DateTime::createFromFormat('d/m/Y H:i:s',$values['lastrun'])->getTimestamp(); $job->setLastrun(DateTime::createFromFormat('d/m/Y H:i:s',$values['lastrun'])->getTimestamp());
} }
$values['nextrun'] = DateTime::createFromFormat('d/m/Y H:i:s', $values['nextrun'])->getTimestamp(); $job->setNextrun(DateTime::createFromFormat('d/m/Y H:i:s', $values['nextrun'])->getTimestamp());
$values['data']['retention'] = !empty($values['retention']) ? (int)$values['retention'] : NULL; $job->setData('retention', !empty($values['retention']) ? (int)$values['retention'] : NULL);
$values['data']['crontype'] = $values['crontype']; $job->setData('crontype', $values['crontype'] ?? NULL);
$values['data']['hosttype'] = $values['hosttype']; $job->setData('hosttype', $values['hosttype']);
$values['data']['containertype'] = $values['containertype']; $job->setData('containertype', $values['containertype']);
$values['data']['fail-pct'] = !empty($values['fail-pct']) ? (int)$values['fail-pct'] : 50; $job->setData('fail-pct', !empty($values['fail-pct']) ? (int)$values['fail-pct'] : 50);
$values['data']['fail-days'] = !empty($values['fail-days']) ? (int)$values['fail-days'] : 7; $job->setData('fail-days', !empty($values['fail-days']) ? (int)$values['fail-days'] : 7);
if(empty($values['data']['crontype'])) { if(!$job->hasData('crontype')) {
throw new \InvalidArgumentException("Crontype cannot be empty"); throw new \InvalidArgumentException("Crontype cannot be empty");
} }
switch($values['data']['crontype']) switch($job->getData('crontype'))
{ {
case 'command': case 'command':
$values['data']['command'] = $values['command']; $job->setData('command', $values['command']);
$values['data']['response'] = explode(',', $values['response']); $job->setData('response', explode(',', $values['response']));
break; break;
case 'reboot': case 'reboot':
$values['data']['reboot-command'] = $values['reboot-command']; $job->setData('reboot-command', $values['reboot-command']);
$values['data']['getservices-command'] = $values['getservices-command']; $job->setData('getservices-command', $values['getservices-command']);
$values['data']['getservices-response'] = explode(',',$values['getservices-response']); $job->setData('getservices-response', explode(',',$values['getservices-response']));
$values['data']['reboot-duration'] = $values['reboot-duration']; $job->setData('reboot-duration', $values['reboot-duration']);
if(!empty($values['reboot-delay']) || $values['reboot-delay'] == 0) { if(!empty($values['reboot-delay']) || $values['reboot-delay'] == 0) {
$newsecretkey = count($values['var-value']); $newsecretkey = count($values['var-value']);
$values['var-id'][$newsecretkey] = 'reboot-delay'; $values['var-id'][$newsecretkey] = 'reboot-delay';
@ -554,9 +556,9 @@ class JobRepository extends EntityRepository
break; break;
case 'http': case 'http':
$parsedUrl = parse_url($values['url']); $parsedUrl = parse_url($values['url']);
$values['data']['url'] = $values['url']; $job->setData('url', $values['url']);
$values['data']['http-status'] = explode(',', $values['http-status']); $job->setData('http-status', explode(',', $values['http-status']));
$values['data']['basicauth-username'] = $values['basicauth-username']; $job->setData('basicauth-username', $values['basicauth-username']);
if(empty($parsedUrl['host'])) { if(empty($parsedUrl['host'])) {
throw new \InvalidArgumentException('Some data was invalid'); throw new \InvalidArgumentException('Some data was invalid');
} }
@ -566,20 +568,20 @@ class JobRepository extends EntityRepository
$values['var-issecret'][$newsecretkey] = true; $values['var-issecret'][$newsecretkey] = true;
$values['var-value'][$newsecretkey] = $values['basicauth-password']; $values['var-value'][$newsecretkey] = $values['basicauth-password'];
} }
$values['data']['host'] = $parsedUrl['host']; $job->setData('host', $parsedUrl['host']);
break; break;
} }
switch($values['data']['hosttype']) { switch($job->getData('hosttype')) {
default: default:
if($values['data']['crontype'] == 'http') break; if($job->getData('crotype') == 'http') break;
$values['data']['hosttype'] = 'local'; $job->setData('hosttype', 'local');
case 'local': case 'local':
$values['data']['host'] = 'localhost'; $job->setData('host', 'localhost');
break; break;
case 'ssh': case 'ssh':
$values['data']['host'] = $values['host']; $job->setData('host', $values['host']);
$values['data']['user'] = $values['user']; $job->setData('user', $values['user']);
if(!empty($values['privkey-password'])) { if(!empty($values['privkey-password'])) {
$newsecretkey = count($values['var-value']); $newsecretkey = count($values['var-value']);
$values['var-id'][$newsecretkey] = 'privkey-password'; $values['var-id'][$newsecretkey] = 'privkey-password';
@ -605,16 +607,16 @@ class JobRepository extends EntityRepository
} }
switch($values['data']['containertype']) { switch($job->getData('hosttype')) {
default: default:
if($values['data']['crontype'] == 'http' || $values['data']['crontype'] == 'reboot' ) break; if($job->getData('crontype') == 'http' || $job->getData('crontype') == 'reboot' ) break;
$values['data']['containertype'] = 'none'; $job->setData('containertype', 'none');
case 'none': case 'none':
// No options for no container // No options for no container
break; break;
case 'docker': case 'docker':
$values['data']['service'] = $values['service']; $job->setData('service', $values['service']);
$values['data']['container-user'] = $values['container-user']; $job->setData('container-user', $values['container-user']);
break; break;
} }
@ -622,16 +624,16 @@ class JobRepository extends EntityRepository
foreach($values['var-value'] as $key => $value) { foreach($values['var-value'] as $key => $value) {
if(!empty($value) || $value == 0) { if(!empty($value) || $value == 0) {
if(isset($values['var-issecret'][$key]) && $values['var-issecret'][$key] != false) { if(isset($values['var-issecret'][$key]) && $values['var-issecret'][$key] != false) {
$values['data']['vars'][$values['var-id'][$key]]['issecret'] = true; $job->setData('vars.' . $values['var-id'][$key] . '.issecret', true);
$values['data']['vars'][$values['var-id'][$key]]['value'] = base64_encode(Secret::encrypt($values['var-value'][$key])); $job->setData('vars.' . $values['var-id'][$key] . '.value', base64_encode(Secret::encrypt($values['var-value'][$key])));
} else { } else {
$values['data']['vars'][$values['var-id'][$key]]['issecret'] = false; $job->setData('vars.' . $values['var-id'][$key] . '.issecret', false);
$values['data']['vars'][$values['var-id'][$key]]['value'] = $values['var-value'][$key]; $job->setData('vars.' . $values['var-id'][$key] . '.value', $values['var-value'][$key]);
} }
} }
} }
} }
return $values; return $job;
} }
public function getJob(int $id, bool $withSecrets = false) { public function getJob(int $id, bool $withSecrets = false) {