CLI update apply db patches
This commit is contained in:
		
							parent
							
								
									c863a9083e
								
							
						
					
					
						commit
						a18b35f784
					
				
							
								
								
									
										85
									
								
								cli.php
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										85
									
								
								cli.php
									
									
									
									
									
								
							| @ -21,7 +21,7 @@ function _exit(string $line = "") { | ||||
|   die(); | ||||
| } | ||||
| 
 | ||||
| if (php_sapi_name() !== "cli") { | ||||
| if (!is_cli()) { | ||||
|   _exit("Can only be executed via CLI"); | ||||
| } | ||||
| 
 | ||||
| @ -36,11 +36,12 @@ function getDatabaseConfig(): ConnectionData { | ||||
|   return new $configClass(); | ||||
| } | ||||
| 
 | ||||
| function getUser(): User { | ||||
| function getUser(): ?User { | ||||
|   $config = new Configuration(); | ||||
|   $user = new User($config); | ||||
|   if (!$user->getSQL() || !$user->getSQL()->isConnected()) { | ||||
|     _exit("Could not establish database connection"); | ||||
|     printLine("Could not establish database connection"); | ||||
|     return null; | ||||
|   } | ||||
| 
 | ||||
|   return $user; | ||||
| @ -50,6 +51,33 @@ function printHelp() { | ||||
|   // TODO: help
 | ||||
| } | ||||
| 
 | ||||
| function applyPatch(\Driver\SQL\SQL $sql, string $patchName): bool { | ||||
|   $class = str_replace('/', '\\', $patchName); | ||||
|   $className = "\\Configuration\\$class"; | ||||
|   $classPath = getClassPath($className); | ||||
|   if (!file_exists($classPath) || !is_readable($classPath)) { | ||||
|     printLine("Database script file does not exist or is not readable"); | ||||
|     return false; | ||||
|   } | ||||
| 
 | ||||
|   include_once $classPath; | ||||
|   $obj = new $className(); | ||||
|   if (!($obj instanceof DatabaseScript)) { | ||||
|     printLine("Not a database script"); | ||||
|     return false; | ||||
|   } | ||||
| 
 | ||||
|   $queries = $obj->createQueries($sql); | ||||
|   foreach ($queries as $query) { | ||||
|     if (!$query->execute($sql)) { | ||||
|       printLine($sql->getLastError()); | ||||
|       return false; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return true; | ||||
| } | ||||
| 
 | ||||
| function handleDatabase(array $argv) { | ||||
|   $action = $argv[2] ?? ""; | ||||
| 
 | ||||
| @ -59,27 +87,9 @@ function handleDatabase(array $argv) { | ||||
|       _exit("Usage: cli.php db migrate <class name>"); | ||||
|     } | ||||
| 
 | ||||
|     $class = str_replace('/', '\\', $class); | ||||
|     $className = "\\Configuration\\$class"; | ||||
|     $classPath = getClassPath($className); | ||||
|     if (!file_exists($classPath) || !is_readable($classPath)) { | ||||
|       _exit("Database script file does not exist or is not readable"); | ||||
|     } | ||||
| 
 | ||||
|     include_once $classPath; | ||||
|     $obj = new $className(); | ||||
|     if (!($obj instanceof DatabaseScript)) { | ||||
|       _exit("Not a database script"); | ||||
|     } | ||||
| 
 | ||||
|     $user = getUser(); | ||||
|     $user = getUser() or die(); | ||||
|     $sql = $user->getSQL(); | ||||
|     $queries = $obj->createQueries($sql); | ||||
|     foreach ($queries as $query) { | ||||
|       if (!$query->execute($sql)) { | ||||
|         _exit($sql->getLastError()); | ||||
|       } | ||||
|     } | ||||
|     applyPatch($sql, $class); | ||||
|   } else if ($action === "export" || $action === "import") { | ||||
| 
 | ||||
|     // database config
 | ||||
| @ -160,7 +170,7 @@ function handleDatabase(array $argv) { | ||||
|       proc_close($process); | ||||
|     } | ||||
|   } else if ($action === "clean") { | ||||
|     $user = getUser(); | ||||
|     $user = getUser() or die(); | ||||
|     $sql = $user->getSQL(); | ||||
| 
 | ||||
|     printLine("Deleting user related data older than 90 days..."); | ||||
| @ -242,6 +252,7 @@ function onMaintenance(array $argv) { | ||||
|     _exit("Maintenance disabled"); | ||||
|   } else if ($action === "update") { | ||||
| 
 | ||||
|     $oldPatchFiles = glob('core/Configuration/Patch/*.php'); | ||||
|     printLine("$ git remote -v"); | ||||
|     exec("git remote -v", $gitRemote, $ret); | ||||
|     if ($ret !== 0) { | ||||
| @ -294,9 +305,26 @@ function onMaintenance(array $argv) { | ||||
|       printLine("Update could not be applied, check the git output."); | ||||
|       printLine("Follow the instructions and afterwards turn off the maintenance mode again using:"); | ||||
|       printLine("cli.php maintenance off"); | ||||
|       printLine("Also don't forget to apply new database patches using: cli.php db migrate"); | ||||
|       die(); | ||||
|     } | ||||
| 
 | ||||
|     $newPatchFiles = glob('core/Configuration/Patch/*.php'); | ||||
|     $newPatchFiles = array_diff($newPatchFiles, $oldPatchFiles); | ||||
|     if (count($newPatchFiles) > 0) { | ||||
|       printLine("Applying new database patches"); | ||||
|       $user = getUser(); | ||||
|       if ($user) { | ||||
|         $sql = $user->getSQL(); | ||||
|         foreach ($newPatchFiles as $patchFile) { | ||||
|           if (preg_match("/core\/Configuration\/(Patch\/.*)\.class\.php/", $patchFile, $match)) { | ||||
|             $patchName = $match[1]; | ||||
|             applyPatch($sql, $patchName); | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     // disable maintenance mode again
 | ||||
|     if (!$isMaintenanceEnabled) { | ||||
|       printLine("Turning off maintenance mode"); | ||||
| @ -343,7 +371,7 @@ function printTable(array $head, array $body) { | ||||
| // TODO: add missing api functions (should be all internal only i guess)
 | ||||
| function onRoutes(array $argv) { | ||||
| 
 | ||||
|   $user = getUser(); | ||||
|   $user = getUser() or die(); | ||||
|   $action = $argv[2] ?? "list"; | ||||
| 
 | ||||
|   if ($action === "list") { | ||||
| @ -427,6 +455,10 @@ function onRoutes(array $argv) { | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| function onTest($argv) { | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| $argv = $_SERVER['argv']; | ||||
| if (count($argv) < 2) { | ||||
|   _exit("Usage: cli.php <db|routes|settings|maintenance> [options...]"); | ||||
| @ -446,6 +478,9 @@ switch ($command) { | ||||
|   case 'maintenance': | ||||
|     onMaintenance($argv); | ||||
|     break; | ||||
|   case 'test': | ||||
|     onTest($argv); | ||||
|     break; | ||||
|   default: | ||||
|     printLine("Unknown command '$command'"); | ||||
|     printLine(); | ||||
|  | ||||
| @ -22,13 +22,16 @@ class User extends ApiObject { | ||||
|   private array $groups; | ||||
| 
 | ||||
|   public function __construct($configuration) { | ||||
|     session_start(); | ||||
|     $this->configuration = $configuration; | ||||
|     $this->setLanguage(Language::DEFAULT_LANGUAGE()); | ||||
|     $this->reset(); | ||||
|     $this->connectDb(); | ||||
| 
 | ||||
|     if (!is_cli()) { | ||||
|       session_start(); | ||||
|       $this->setLanguage(Language::DEFAULT_LANGUAGE()); | ||||
|       $this->parseCookies(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   public function __destruct() { | ||||
|     if($this->sql && $this->sql->isConnected()) { | ||||
|  | ||||
| @ -12,6 +12,9 @@ spl_autoload_register(function($class) { | ||||
|   } | ||||
| }); | ||||
| 
 | ||||
| function is_cli(): bool { | ||||
|   return php_sapi_name() === "cli"; | ||||
| } | ||||
| 
 | ||||
| function getProtocol(): string { | ||||
|   $isSecure = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user