Backupper.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <?php
  2. namespace MGModule\DNSManager2\mgLibs\custom\task;
  3. use \MGModule\DNSManager2 as main;
  4. use \MGModule\DNSManager2\mgLibs\custom\manager\GlobalSettingHelper;
  5. use \MGModule\DNSManager2\models\custom\globalsetting\GlobalSettingEnum;
  6. use \MGModule\DNSManager2\mgLibs\custom\manager\LogHelper;
  7. use \MGModule\DNSManager2\models\custom\task;
  8. use \MGModule\DNSManager2\mgLibs\custom;
  9. use \MGModule\DNSManager2\mgLibs\custom\manager;
  10. use MGModule\DNSManager2\helpers\WHMCS\Client;
  11. use MGModule\DNSManager2\helpers\custom\ClientFilesManage;
  12. use MGModule\DNSManager2\models\custom\clientfiles\Repository as ClientFilesRepository;
  13. class Backupper extends TaskAbstract
  14. {
  15. protected $abort_after_repeats = array('main' => 0);
  16. protected $taskTypeCode = TaskTypeCodesCodes::BACKUPPER;
  17. public function mainDescription()
  18. {
  19. return 'Automatic Backupper';
  20. }
  21. public function main($params)
  22. {
  23. $cron_backupper_run_each = GlobalSettingHelper::getSetting(GlobalSettingEnum::CRON_BACKUP_RUN_EACH ?: 5);
  24. if (!$this->isReadyToRun($cron_backupper_run_each)) {
  25. return true;
  26. }
  27. LogHelper::addSuccessLog('Cron Backupper', 'Cron Backupper Started');
  28. if ($this->getStatus() == task\TaskStatusEnum::START) {
  29. $this->setStatus(task\TaskStatusEnum::IN_PROGRESS);
  30. }
  31. foreach (Client::getClientsAsIdKey() as $clientID => $status) {
  32. if ($status['status'] == 'Active') {
  33. $this->deleteOldBackups($clientID);
  34. if($this->canCronBackup($clientID)) {
  35. $this->createZoneTask($clientID);
  36. }
  37. else {
  38. $cronFilesList = $this->getCronBackupList($clientID);
  39. //Deleting the oldest cron backup due to the limit set - we are deleting that files to make space for newest one.
  40. $this->deleteOldestCronBackupsDueLimit($clientID, $cronFilesList);
  41. $this->createZoneTask($clientID);
  42. }
  43. }
  44. }
  45. // $this->setStatus(task\TaskStatusEnum::FINISHED);
  46. LogHelper::addSuccessLog('Cron Backupper', 'End Of Cron Backupper Run');
  47. }
  48. public function deleteOldBackups($clientID){
  49. $cron_backup_delete_run_after = manager\GlobalSettingHelper::getSetting(GlobalSettingEnum::CRON_BACKUP_DELETE_AFTER ?: 5);
  50. $fileManager = new custom\FileManager('zonesFilesStorage' . DIRECTORY_SEPARATOR . 'bulkZones');
  51. $filesList = ClientFilesManage::getClientFiles($clientID, 'backup');
  52. foreach ($filesList as $file) {
  53. if($file->createdby != 'client') {
  54. $calculations = $this->dateCalculations($file->date);
  55. $minutesAfter = $this->minutesFormat($calculations);
  56. if ($minutesAfter >= $cron_backup_delete_run_after) {
  57. $task = custom\TaskManager::addTask('DeleteOldBackups:main', array('file' => $file->file, 'clientID' => $clientID), 0, $clientID);
  58. ClientFilesManage::delete($clientID, $file->file);
  59. $fileManager->deleteFile($file->file);
  60. $task->status = task\TaskStatusEnum::FINISHED;
  61. $task->save();
  62. }
  63. }
  64. }
  65. }
  66. public function createZoneTask($clientID){
  67. $fileName = custom\helpers\ImportExportFileHelper::generateClientFileName($clientID);
  68. $task = custom\TaskManager::addTask('ImportToFileWHMCS:main', array('from' => 'WHMCS', 'toFile' => $fileName, 'createdBy' => 'cron'), 0, $clientID);
  69. custom\TaskManager::getTaskObjectByID($task->id)->run(true);
  70. $pRep = task\Repository::factory()->byParentID((int)$task->id)->one();
  71. $pRepName = explode(':', $pRep->name);
  72. $taskZone = custom\TaskManager::getXTasks(1, $pRepName[0] . ':fetchZonesList', (int)$task->id, false);
  73. $taskZone = end($taskZone);
  74. $rep = task\result\Repository::factory()->byTaskID((int)$taskZone->id);
  75. $input['limit'] = $rep->count();
  76. $helper = new main\mgLibs\custom\RepoTableHelper($rep, $input, array('data'));
  77. $this->backupZonesTask($helper->get());
  78. $task->status = task\TaskStatusEnum::FINISHED;
  79. $task->save();
  80. }
  81. public function backupZonesTask($zones){
  82. foreach($zones as $zone){
  83. $task = new task\Task($zone->taskid);
  84. $task->status = task\TaskStatusEnum::IN_PROGRESS;
  85. $task->save();
  86. $result = new task\result\TaskResult($zone->id);
  87. $task = custom\TaskManager::getTaskObjectByID($result->taskid);
  88. $main_task = $task->getParent();
  89. $result->data['resultid'] = $zone->id;
  90. $result->data['domain'] = $result->data['name'];
  91. $child = $main_task->addChild('import', $result->data);
  92. $result->data['status'] = 'importing';
  93. $result->data['taskid'] = $child->obj()->id;
  94. $result->save();
  95. $child->run();
  96. }
  97. }
  98. private function getCronBackupList($clientID){
  99. return ClientFilesRepository::factory()->byClientId($clientID)->byType('backup')->byCreatedBy('cron')->get();
  100. }
  101. private function canCronBackup($clientID){
  102. $cronBackupsLimit = GlobalSettingHelper::getSetting(GlobalSettingEnum::CRON_BACKUP_LIMIT);
  103. $cronFilesList = $this->getCronBackupList($clientID);
  104. $amountOfCronBackups = count($cronFilesList);
  105. if($amountOfCronBackups >= $cronBackupsLimit)
  106. return false;
  107. else
  108. return true;
  109. }
  110. private function deleteOldestCronBackupsDueLimit($clientID, $cronFilesList){
  111. usort($cronFilesList, function($a, $b) {
  112. return strtotime($a->date) - strtotime($b->date);
  113. });
  114. $fileManager = new custom\FileManager('zonesFilesStorage' . DIRECTORY_SEPARATOR . 'bulkZones');
  115. ClientFilesManage::delete($clientID, $cronFilesList[0]->file);
  116. $fileManager->deleteFile($cronFilesList[0]->file);
  117. }
  118. private function dateCalculations($backupDate){
  119. $now = new \DateTime(date('Y-m-d H:i:s'));
  120. return $now->diff(new \DateTime($backupDate));
  121. }
  122. private function minutesFormat($dateInterval){
  123. $minutes = $dateInterval->days * 24 * 60;
  124. $minutes += $dateInterval->h * 60;
  125. $minutes += $dateInterval->i;
  126. return $minutes;
  127. }
  128. }