Source of file Installer.php
Size: 22,819 Bytes - Last Modified: 2021-12-24T05:15:46+00:00
/var/www/docs.ssmods.com/process/src/vendor/MLabs/Installer.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515 | <?php namespace MLabs; use Composer\Script\Event; class Installer { // Todo: all configs should be external in environment.yml file /** * installer settings */ private static $version = "0.1"; private static $version_jquery = "2.1.4"; private static $version_bootstrap = "3.3.5"; private static $version_silverstripe = "3.1.12"; // only command line (cli) supported at moment private static $config_from = "cli"; // cli | file | database /** * silverstripe filestructure * * code/forms * code/extensions * code/dataobjects * code/controllers * templates/Forms */ private static $root_dir_code = "mysite/code/"; // root directory of mysite private static $root_dir_theme = "themes/"; // root directory for themes private static $root_dir_default_theme = "themes/simple/templates/"; // root directory for standard theme private static $root_dir_config = "mysite/_config/"; // root directory for config private static $root_dir_vendor = "vendor/MLabs/"; // root directory for MLabs vendor /** * config path settings */ private static $config_composer = "composer.json"; // config file for composer private static $config_silverstripe = "mysite/_config/config.yml"; // yml config file for silverstripe private static $config_silverstripe_old = "mysite/_config.php"; // php config file for silverstripe private static $config_silverstripe_environment = "_ss_environment.php"; // environment settings /** * webserver settings */ private static $root_dir_web = "/var/customers/webs/"; // root directory for web private static $root_dir_logfiles = "/var/customers/logs/"; // root directory of mysite private static $owner_user_web = "www-data"; private static $owner_group_web = "www-data"; /** * silverstripe project settings */ private static $project_company = "MLabs Development and Design"; private static $project_company_adress = "Kirchgasse 31"; private static $project_company_destination = "92360 Mühlhausen"; private static $project_company_email = "info@mlaboratories.de"; private static $project_company_web = "http://mlaboratories.de"; // environment settings private static $project_database_server = "localhost"; private static $project_database_name = "[database_name]"; private static $project_database_username = "[database_username]"; private static $project_database_password = "[database_password]"; private static $project_environment_type = "dev"; private static $default_admin_username = "admin"; private static $default_admin_password = "[default_admin_password]"; private static $domain = "[domain]"; // domain for project private static $froxlor_username = "[froxlor_username]"; // client username in froxlor private static $event = null; public static function postUpdate(Event $event) { self::$event = $event; // run tasks in update mode self::tasks(true); self::$event->getIO()->write(":: mlabs installer post update done..."); } public static function postInstall(Event $event) { self::$event = $event; // run tasks in default install mode self::tasks(); self::$event->getIO()->write(":: mlabs installer post install done..."); } public static function getComposerEvent() { return self::$event; } public static function getRootDirCode() { return self::$root_dir_code; } public static function getRootDirTheme() { return self::$root_dir_default_theme; } public static function getRootDirConfig() { return self::$root_dir_config; } public static function getRootDirVendor() { return self::$root_dir_vendor; } /** * task handler with install or update mode * * @param boolean $update true then some tasks have a special behaviour */ protected static function tasks($update = false) { // check some system requirements self::checkSystemRequirements(); self::moveFiles($update); self::copyFiles($update); // not neede in update mode if(!$update) { self::getConfig(); self::changeOwner(); self::executableUserRights(); // some config settings self::addEnvironmentSettings(); // before all other tasks can run silverstripe must installed via browser install.php // in framework/dev/install.php is a command install as argument via commandline check if installer can run via cli // in case can be that sake dev/build is the same... in config only theme and language must be setted check plz if(!self::$event->getIO()->askConfirmation(":: run http://[domain]/install.php when done type [yes] here (let empty for abort): ", false)) { self::exitInstaller(':: mlabs installer abort'); } self::createFolderStructure(); // add some nice addons and customized changes self::addRepositories(); // silverstripe cms changes self::addConfigErrorLog(); self::addConfigEmailLog(); self::addControllerVars(); self::requirementsGoogleJquery(); self::blockRequirements(); self::requirementsCDNBootstrap(); self::requirementsJqueryChosen(); self::addMeta(); self::resetUserRights(); } // check why site is not flushed and builded self::build(); // rename installer.php File::move("install.php", "_install.php"); self::$event->getIO()->write(":: move silverstripe installer"); self::$event->getIO()->write(":: mlabs installer tasks done run http://[domain]/dev/build?flush=all in browser builded in built has no effekt at this time..."); } protected static function exitInstaller($message) { self::$event->getIO()->write("$message"); exit(); } /** * get config for installer */ protected static function getConfig() { // Todo: use a class like Config with functions like Config->get('domain') which readed from environment.yml switch(self::$config_from) { case "cli": self::getConfigFromCommandline(); break; case "file": self::getConfigFromFile(); break; case "database": self::getConfigFromDatabase(); break; } } /** * get config information from command line */ protected static function getConfigFromCommandline() { self::$domain = self::$event->getIO()->ask(":: type the domain here without http:// or https:// (let empty for default placeholder [domain]): ", "[domain]"); self::$froxlor_username = self::$event->getIO()->ask(":: type the client username which added to froxlor here (let empty for default placeholder [froxlor-username]): ", "[froxlor-username]"); self::$owner_user_web = self::$event->getIO()->ask(":: type the www user here (let empty for default ".self::$froxlor_username.": ", self::$froxlor_username); self::$owner_group_web = self::$event->getIO()->ask(":: type the www group here (let empty for default ".self::$froxlor_username.": ", self::$froxlor_username); self::$project_database_server = self::$event->getIO()->ask(":: type the database server here (let empty for default placeholder [localhost]): ", "localhost"); self::$project_database_name = self::$event->getIO()->ask(":: type the database name here (let empty for default placeholder [SS_mysite]): ", "SS_mysite"); self::$project_database_username = self::$event->getIO()->ask(":: type the database user name here (let empty for default placeholder [database_username]): ", "[database_username]"); self::$project_database_password = self::$event->getIO()->ask(":: type the database password here (let empty for default placeholder [database_password]): ", "[database_password]"); self::$project_environment_type = self::$event->getIO()->ask(":: type the environment type here dev|test|live (let empty for default placeholder [".self::$project_environment_type."]): ", self::$project_environment_type); self::$default_admin_username = self::$event->getIO()->ask(":: type the default admin username here (let empty for default placeholder [admin]): ", "admin"); self::$default_admin_password = self::$event->getIO()->ask(":: type the default admin password here (let empty for default placeholder [12345]): ", "12345"); } protected static function getConfigFromFile() { // Todo: self::$event->getIO()->write(":: getConfigFromFile() not implemented yet"); } protected static function getConfigFromDatabase() { // Todo: self::$event->getIO()->write(":: getConfigFromDatabase() not implemented yet"); } /** * check for some system requirements which are needed to run installer */ protected static function checkSystemRequirements() { self::hasNginx(); self::hasFroxlor(); self::hasSake(); } /** * change the owner-user and owner-group to get access via php5-fpm process * recursiv for project */ protected static function changeOwner() { // change owner for project recursiv exec("chown ".self::$owner_user_web.":".self::$owner_group_web." ".self::$root_dir_web.self::$froxlor_username." -R"); self::$event->getIO()->write(":: make domain readable for www"); } /** * create a default folder structure for projects */ protected static function createFolderStructure() { // code structure exec("mkdir ".self::$root_dir_code."forms"); exec("mkdir ".self::$root_dir_code."extensions"); exec("mkdir ".self::$root_dir_code."dataobjects"); exec("mkdir ".self::$root_dir_code."controllers"); // new theme structure // replace .de .com .org - from domainname with regex exec("mkdir ".self::$root_dir_theme.self::$domain); exec("mkdir ".self::$root_dir_theme.self::$domain.'/css'); exec("mkdir ".self::$root_dir_theme.self::$domain.'/images'); exec("mkdir ".self::$root_dir_theme.self::$domain.'/fonts'); exec("mkdir ".self::$root_dir_theme.self::$domain.'/js'); exec("mkdir ".self::$root_dir_theme.self::$domain.'/templates'); exec("mkdir ".self::$root_dir_theme.self::$domain.'/templates/Forms'); exec("mkdir ".self::$root_dir_theme.self::$domain.'/templates/Includes'); exec("mkdir ".self::$root_dir_theme.self::$domain.'/templates/Layout'); // adding some to default theme structure exec("mkdir ".self::$root_dir_default_theme."Forms"); self::$event->getIO()->write(":: create default folder structure for projects"); } /** * move the silverstripe-installer from vendor to project root * and delete directory structure in vendor * * @param boolean $update */ protected static function moveFiles($update) { $root_dir_silverstripe_installer = "vendor/silverstripe/installer"; // check if folder exists if(file_exists($root_dir_silverstripe_installer) && is_dir($root_dir_silverstripe_installer)) { // remove composer.json in silverstripe installer to avoid conflicts File::delete("$root_dir_silverstripe_installer/composer.json"); // not move folders when update is running because overwriting existing files if(!$update) { // move folders File::move("$root_dir_silverstripe_installer/assets", "."); File::move("$root_dir_silverstripe_installer/mysite", "."); } // move files File::move("$root_dir_silverstripe_installer/*.*", "."); // espacially for .git .gitignore and so one File::move("$root_dir_silverstripe_installer/.*", "."); // remove the folder File::deleteFolder("vendor/silverstripe"); } } /** * copy some files * * @param boolean $update */ protected static function copyFiles($update) { File::copy(self::getRootDirVendor().'css/*.css', self::getRootDirTheme().'css/'); File::copy(self::getRootDirVendor().'js/*.js', self::getRootDirTheme().'js/'); File::copy(self::getRootDirVendor().'images/*.*', self::getRootDirTheme().'images/'); self::$event->getIO()->write(":: copied some needed files"); } /** * build and flush silverstripe cms */ protected static function build() { // build database passthru('sake dev/build "flush=all"'); self::$event->getIO()->write(":: build database and flush cache"); } /** * add silverstripe addons must done here an error occurs if it in composer.json on install it */ protected static function addRepositories() { foreach(Addons::getRequire() as $require) { File::addContent(self::$config_composer, $require, 'silverstripe/installer'); } File::replaceContent(self::$config_composer, '"silverstripe/installer": "3.1.12"', '"silverstripe/installer": "3.1.12",'); // run composer again which triggered Installer.php again passthru("composer update"); // add some customized extensions to addons Addons::addExtensions(self::$event); self::changeOwner(); } /** * add some settings to __ss_environment.php for silverstripe needed to run sake */ protected static function addEnvironmentSettings() { File::replaceContent(self::$config_silverstripe_environment, '[database_server]', self::$project_database_server); File::replaceContent(self::$config_silverstripe_environment, '[database_name]', self::$project_database_name); File::replaceContent(self::$config_silverstripe_environment, '[database_username]', self::$project_database_username); File::replaceContent(self::$config_silverstripe_environment, '[database_password]', self::$project_database_password); File::replaceContent(self::$config_silverstripe_environment, '[environment_type]', self::$project_environment_type); File::replaceContent(self::$config_silverstripe_environment, '[default_admin_username]', self::$default_admin_username); File::replaceContent(self::$config_silverstripe_environment, '[default_admin_password]', self::$default_admin_password); File::replaceContent(self::$config_silverstripe_environment, '[domain]', self::$domain); File::replaceContent(self::$config_silverstripe_environment, '[root_dir_web]', '"'.self::$root_dir_web.self::$froxlor_username.'/'.self::$domain.'"'); } /** * add some usefull controller vars */ protected static function addControllerVars() { // add a variable $theme_dir to controller to avoid long syntax File::addContent( self::$root_dir_code.'Page.php', 'protected $theme_dir;', "class Page_Controller extends ContentController {" ); File::addContent( self::$root_dir_code.'Page.php', '$this->theme_dir = Config::inst()->get("SSViewer", "theme");', "parent::init();" ); } /** * adding warn and error log to silverstripe _config.php */ protected static function addConfigErrorLog() { self::$event->getIO()->write(":: add logging to Silverstripe _config.php"); File::addContent( self::$config_silverstripe_old, "SS_Log::add_writer(new SS_LogFileWriter('".self::$root_dir_logfiles.self::$froxlor_username."-ss.log'), SS_Log::WARN, '<=');" ); } /** * adding warn and error log for email */ protected static function addConfigEmailLog() { self::$event->getIO()->write(":: add email logging to Silverstripe _config.php"); File::addContent( self::$config_silverstripe_old, "SS_Log::add_writer(new SS_LogEmailWriter('".self::$project_company_email."'), SS_Log::WARN, '<=');" ); } /** * add Requirements::block for delivered jquery to use newer version in frontend */ protected static function blockRequirements() { File::addContent( self::$root_dir_code.'Page.php', " Requirements::block(THIRDPARTY_DIR . '/jquery/jquery.js');", "http://doc.silverstripe.org/framework/en/reference/requirements" ); File::addContent( self::$root_dir_code.'Page.php', " Requirements::block(FRAMEWORK_DIR . '/admin/thirdparty/chosen/chosen/chosen.jquery.js');", "/jquery/jquery.js" ); } /** * add Requirements::javascript jquery from googleapis in _config.php that is loaded bevore all other javascripts can be loaded * prevent $. is not defined */ protected static function requirementsGoogleJquery() { self::$version_jquery = self::$event->getIO()->ask(":: type jquery version here (let empty for default ".self::$version_jquery."): ", self::$version_jquery); File::addContent( self::$config_silverstripe_old, "Requirements::javascript('http://ajax.googleapis.com/ajax/libs/jquery/".self::$version_jquery."/jquery.min.js');" ); } protected static function requirementsJqueryChosen() { File::addContent( self::$root_dir_code.'Page.php', " Requirements::javascript(THEMES_DIR.'/'. SSViewer::current_theme().'/js/jquery.chosen.min.js');", 'bootstrap.min.js' ); File::addContent( self::$root_dir_code.'Page.php', " Requirements::themedCSS('jquery.chosen.min');", 'bootstrap-theme.min.css' ); } /** * add Requirements:: for bootstrap from cdn */ protected static function requirementsCDNBootstrap() { self::$version_bootstrap = self::$event->getIO()->ask(":: type bootstrap version here (let empty for default ".self::$version_bootstrap."): ", self::$version_bootstrap); File::addContent( self::$root_dir_code.'Page.php', " Requirements::javascript('https://maxcdn.bootstrapcdn.com/bootstrap/".self::$version_bootstrap."/js/bootstrap.min.js');", 'Requirements::block' ); File::addContent( self::$root_dir_code.'Page.php', " Requirements::css('https://maxcdn.bootstrapcdn.com/bootstrap/".self::$version_bootstrap."/css/bootstrap-theme.min.css');", 'Requirements::block' ); File::addContent( self::$root_dir_code.'Page.php', " Requirements::css('https://maxcdn.bootstrapcdn.com/bootstrap/".self::$version_bootstrap."/css/bootstrap.min.css');", 'Requirements::block' ); } /** * add meta name, content and $MetaTags(true) to default theme */ protected static function addMeta() { // Todo: compan_* variables from command line otherwise use this one File::addContent( self::$root_dir_default_theme.'Page.ss', ' <meta name="author" content="'.self::$project_company.', '.self::$project_company_adress.', '.self::$project_company_destination.', '.self::$project_company_web.', '.self::$project_company_email.'">', '<meta http-equiv' ); File::replaceContent( self::$root_dir_default_theme.'Page.ss', '$MetaTags(false)', '$MetaTags(true)' ); } /** * make some files and folders executable via web to add some configs or upload assets */ protected static function executableUserRights() { // change user rights to grant access from web exec("chmod 755 assets/ -R"); self::$event->getIO()->write(":: make assets executable for www to upload files via Silverstripe"); exec("chmod 775 ".self::$config_silverstripe_old); self::$event->getIO()->write(":: make _config.php executable for www to add some lines for installer"); exec("chmod 775 ".self::$config_silverstripe); self::$event->getIO()->write(":: make config.yml executable for www to add some lines for installer"); } /** * reset user rights to default to prevent access via web */ protected static function resetUserRights() { // reset rights 644 for files exec("chmod 644 ".self::$config_silverstripe_old); self::$event->getIO()->write(":: reset rights for _config.php"); exec("chmod 644 ".self::$config_silverstripe); self::$event->getIO()->write(":: reset rigths config.yml"); } /** * check if nginx is installed * * @return boolean */ protected static function hasNginx() { if(strpos(exec("dpkg --get-selections | grep -E 'nginx[^\-]'"), 'nginx') !== false) return true; self::exitInstaller(':: mlabs installer abort because nginx is not installed and nginx is only supported at moment'); } /** * check if froxlor installed * * @return boolean */ protected static function hasFroxlor() { if(strpos(exec("dpkg --get-selections | grep -E 'froxlor'"), 'froxlor') !== false) return true; self::exitInstaller(':: mlabs installer abort because froxlor is not installed and froxlor is only supported at moment'); } /** * check if sake installed otherwise install it * * @return boolean */ protected static function hasSake() { if(file_exists('/usr/bin/sake')) return true; exec('./framework/sake installsake'); self::$event->getIO()->write(":: silverstripe sake was successfully installed"); } } ?> |