<?php /* ###################################################################### IML DEPLOYMENT included functions for the act_*.php files --------------------------------------------------------------------- 2013-11-08 Axel <axel.hahn@iml.unibe.ch> ###################################################################### */ global $aParams; $aParams = array(); // ---------------------------------------------------------------------- // verifiy config // ---------------------------------------------------------------------- $aErrors=array(); if (!isset($aConfig) || !is_array($aConfig)) { $aErrors[]="* \$aConfig does not exist. The config was not included before including " . __FILE__ . " in the request/ script.\n"; } else { foreach (array( 'appRootDir', 'configDir', 'workDir', 'dataDir', 'buildDir', 'buildDefaultsDir', 'packageDir', 'archiveDir', ) as $sKey){ if (!is_dir($aConfig[$sKey])){ $aErrors[]="* \$aConfig['$sKey'] points to a non existing directory (".$aConfig[$sKey].").\n"; } else { if (!is_writable($aConfig[$sKey])){ $aErrors[]="* \$aConfig['$sKey'] = ".$aConfig[$sKey]." is NOT writable.\n"; } } } } foreach (array( $aConfig['dataDir'].'/database', $aConfig['dataDir'].'/projects', $aConfig['dataDir'].'/sshkeys', ) as $sDir2Check){ if (!is_dir($sDir2Check)){ $aErrors[]="* directory not found: $sDir2Check\n"; } else { if (!is_writable($sDir2Check)){ $aErrors[]="* $sDir2Check is NOT writable.\n"; } } } // check required keys in the config foreach (array( 'auth', 'hooks', 'installPackages', 'lang', 'phases', 'projects', ) as $sKey){ if (!array_key_exists($sKey, $aConfig)){ $aErrors[]="* missing key directory [$sKey] in config\n"; } } if (count($aErrors)){ die("FATAL ERROR on config.<br>" . implode("<br>\n", $aErrors)); } // remark: $_SERVER does not exist in CLI if (isset($_SERVER) && is_array($_SERVER) && array_key_exists("REQUEST_URI", $_SERVER)) { /* print_r($_GET); print_r($_POST); print_r($aParams); print_r($_SERVER); echo $_SERVER["REQUEST_URI"]; */ $aTmp = preg_split("#/#", $_SERVER["REQUEST_URI"]); if (count($aTmp) > 1 && $aTmp[1] == "deployment" && $aTmp[2] != "?") { array_shift($aTmp); array_shift($aTmp); if ( count($aTmp) && $aTmp[count($aTmp) - 1] && $aTmp[count($aTmp) - 1][0] == "?" ) { array_pop($aTmp); } if (count($aTmp) && $aTmp[0]) $aParams["prj"] = $aTmp[0]; if (count($aTmp) > 1 && $aTmp[1]) $aParams["action"] = $aTmp[1]; if (count($aTmp) > 2 && $aTmp[2]) $aParams["par3"] = $aTmp[2]; if (count($aTmp) > 3 && $aTmp[3]) $aParams["par4"] = $aTmp[3]; } if (count($_GET)) foreach ($_GET as $key => $value) $aParams[$key] = $value; if (count($_POST)) foreach ($_POST as $key => $value) $aParams[$key] = $value; /* force integer params foreach (array("id") as $sKey) { if (array_key_exists($sKey, $aParams)) { $aParams[$sKey]=(int)$aParams[$sKey]; } } */ foreach (array_keys($aParams) as $sKey) { $aParams[$sKey] = str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $aParams[$sKey]); } } /** * get home link as button * @return string */ function aHome($sClass = "btn btn-default") { global $oHtml; // if (!array_key_exists("prj", $aParams)) return false; return $oHtml->getLinkButton(array( 'href'=>'/deployment/?', 'icon'=>'overview', 'label'=>t("menu-overview"), )); } /** * get project Home link as button * @return string */ function aPrjHome($sClass = "btn btn-default") { global $aParams, $oHtml; if (!array_key_exists("prj", $aParams)){ return false; } if ($aParams["prj"] == "all"){ return aHome($sClass); } // if (!array_key_exists("action", $aParams)) return false; require_once("./classes/project.class.php"); $oPrj = new project($aParams["prj"]); return $oHtml->getLinkButton(array( 'href'=>'/deployment/' . $aParams["prj"] . '/', 'icon'=>'project-home', 'label'=>$oPrj->getLabel(), )); } /** * get go back link as button * @return string */ function aGoback($sClass = "btn btn-default") { global $oHtml; return $oHtml->getLinkButton(array( 'href'=>'#', 'onclick'=>'history.back();', 'title'=>t("back"), 'icon'=>'back', 'label'=>t("back") )); } /** * get go top link as button * @return string */ function aGotop($sClass = "scroll-link btn btn-default") { global $oHtml; return $oHtml->getLinkButton(array( 'href'=>'#top', 'class'=>$sClass, 'title'=>t("gotop"), 'icon'=>'glyphicon-eject', 'label'=>' ' )); } /** * auto generate upper part of the page with header and navigation * @global type $aParams * @return type */ function getTopArea() { global $aParams, $oHtml; $sReturn = ''; require_once("./classes/project.class.php"); require_once("./classes/user.class.php"); $oUser = new user(); $sMyPhase = "[phase]"; $sMyRev = " [no rev] "; // bug#1511 json file was moved 1 level up $sJsonfile = __DIR__ . "/../../ci-webgui.json"; if (file_exists($sJsonfile)) { $aJson = json_decode(file_get_contents($sJsonfile), true); if (array_key_exists("date", $aJson)) $sMyRev = $aJson["date"]; } $sBaseUrl = '/deployment/'; $sWikiBaseUrl = 'https://secure.iml.unibe.ch/wiki/doku.php'; $sReturn = ' <span id="top"></span> <nav class="navbar navbar-inverse" role="navigation"> <div class="container-fluid"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> <span class="sr-only">Toggle navigation</span> <span class=" glyphicon glyphicon-bar"></span> <span class=" glyphicon glyphicon-bar"></span> <span class=" glyphicon glyphicon-bar"></span> </button> <nobr> <a class="navbar-brand" href="' . $sBaseUrl . '"><span class="imllogo"></span> '.t("menu-brand").'</a> <span class="badge"></span> </nobr> </div> <!-- Collect the nav links, forms, and other content for toggling --> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> '; if($oUser->getUsername()){ $sReturn.=' <ul class="nav navbar-nav"> <li class="dropdown'; if (array_key_exists("prj", $aParams) && $aParams['prj']==='all'){ $sReturn.=' active'; } $sReturn.='">' . $oHtml->getLink(array( 'href'=>$sBaseUrl, 'class'=>'dropdown-toggle', 'data-toggle'=>'dropdown', 'role'=>'button', 'aria-expanded'=>'false', 'icon'=>'menu', 'label'=>t("menu").' <span class="caret"></span>', )) .'<ul class="dropdown-menu" role="menu"> <li>'.$oHtml->getLink(array( 'href'=>$sBaseUrl . 'all/setup/new/', 'icon'=>'new', 'label'=>t("menu-new-project"), )).'</li> <li>'.$oHtml->getLink(array( 'href'=>$sBaseUrl . 'all/setup/actionlog/', 'icon'=>'actionlog', 'label'=>t("menu-logs"), )).'</li> <li>'.$oHtml->getLink(array( 'href'=>$sBaseUrl . 'all/setup/checklang/', 'icon'=>'checklang', 'label'=>t("menu-checklang"), )).'</li> <li>'.$oHtml->getLink(array( 'href'=>$sBaseUrl . 'all/setup/', 'icon'=>'setup', 'label'=>t("menu-settings"), )).'</li> </ul> </li> <li class="dropdown">' . $oHtml->getLink(array( 'href'=>'#', 'class'=>'dropdown-toggle', 'data-toggle'=>'dropdown', 'role'=>'button', 'aria-expanded'=>'false', 'icon'=>'projects', 'label'=>t("menu-projects") . ' <span class="caret"></span>', )) .'<ul class="dropdown-menu" role="menu">' ; $oPrj1 = new project(); foreach ($oPrj1->getProjects() as $sPrj) { $oPrj = new project($sPrj); $sReturn.='<li>' . $oHtml->getLink(array( 'href'=>$sBaseUrl . $sPrj .'/', 'icon'=>'project', 'label'=>$oPrj->getLabel(), )) . '</li>'; } $sReturn.=' </ul> </li> '; if (array_key_exists("prj", $aParams) && $aParams["prj"] <> "all") { $oPrj = new project($aParams["prj"]); $sReturn.=' <li class="dropdown active">' .$oHtml->getLink(array( 'href'=>'#', 'class'=>'dropdown-toggle', 'data-toggle'=>'dropdown', 'role'=>'button', 'aria-expanded'=>'false', 'icon'=>'project', 'label'=>$oPrj->getLabel() .' <span class="caret"></span>', )) .' <ul class="dropdown-menu" role="menu"> <li>' . $oHtml->getLink(array( 'href'=>$sBaseUrl . $sPrj .'/', 'icon'=>'project-home', 'label'=>t("project-home"), )) .'</li> '; $aPhases = $oPrj->getActivePhases(); if (count($aPhases)) { $sReturn.='<li role="separator" class="divider"></li> <li>' .$oHtml->getLink(array( 'href'=>$sBaseUrl . $aParams["prj"] . '/build/', 'icon'=>'build', 'label'=>t("build"), )) .'</li> <li role="separator" class="divider"></li> <li class="dropdown-header">'.t("menu-project-phases").'</li>'; foreach ($aPhases as $sPhase) { $sReturn.='<li><a href="' . $sBaseUrl . $aParams["prj"] . '/phase/' . $sPhase . '/">' . $oHtml->getIcon('phase').$sPhase . '</a></li>'; } } $sReturn.=' <li role="separator" class="divider"></li> <li>' .$oHtml->getLink(array( 'href'=>$sBaseUrl . $aParams["prj"] . '/setup/', 'icon'=>'setup', 'label'=>t("menu-project-settings"), )) .'</li> <li>' .$oHtml->getLink(array( 'href'=>$sBaseUrl . $aParams["prj"] . '/cleanup/', 'icon'=>'cleanup', 'label'=>t("menu-project-cleanup"), )) .'</li> <li>' .$oHtml->getLink(array( 'href'=>$sBaseUrl . $aParams["prj"] . '/delete/', 'icon'=>'delete', 'label'=>t("menu-project-delete"), )) .'</li> </ul></li>'; } } $sReturn.=' </ul> <ul class="nav navbar-nav navbar-right">' . ($oUser->getUsername() ? ' <!-- userdata --> <li class="dropdown">' .$oHtml->getLink(array( 'href'=>'#', 'class'=>'dropdown-toggle', 'data-toggle'=>'dropdown', 'role'=>'button', 'aria-expanded'=>'false', 'icon'=>'user', 'label'=>$oUser->getUsername() .' <span class="caret"></span>', )) .'<ul class="dropdown-menu" role="menu"> <li>' .$oHtml->getLink(array( 'href'=>$sBaseUrl . 'all/login/', 'icon'=>'login', 'label'=>t("menu-login"), )) .'</li> </ul> </li>' : '<li>' .$oHtml->getLink(array( 'href'=>$sBaseUrl . 'all/login/', 'icon'=>'login', 'label'=>t("login"), )) .'</li>' ) .'<li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false" ><span class="glyphicon glyphicon-question-sign"></span> ' . t("menu-help") . ' <b class="caret"></b></a> <ul class="dropdown-menu"> <li><a href="' . $sWikiBaseUrl . '/it/entwicklung/continuous_deployment">WIKI: Übersicht Continous Deployment</a></li> <li><a href="' . $sWikiBaseUrl . '/it/entwicklung/continuous_deployment#konventionen">WIKI: Konventionen für Entwickler</a></li> <li><a href="' . $sWikiBaseUrl . '/it/infrastruktur/dienste/puppet/snippets#iml-deployment">WIKI (Admin): Puppet-Snippets für den Sysadmin</a></li> <li><a href="' . $sWikiBaseUrl . '/it/infrastruktur/dienste/imldeployment">WIKI (Admin): Verzeichnisse und Dateien</a></li> <li><a href="/deployment/all/doc/">' . t("menu-help-classes") . '</a></li> </ul> </li> </ul> </div><!-- /.navbar-collapse --> </div><!-- /.container-fluid --> </nav> <span id="swversion">' . $sMyRev . ' @ ' . php_uname("n") . '</span> </div><div id="header2">'; if (!array_key_exists("prj", $aParams)) { $sReturn.='<h1>' . t("overview-label") . '</h1><span class="description">' . t("overview-hint") . '</span>'; } else { if ($aParams["prj"] <> "all") { $oPrj = new project($aParams["prj"]); $sReturn.='<h1>' . $oPrj->getLabel() . '</h1>' . '<span class="description">' . $oPrj->getDescription() . '</span>'; if (array_key_exists("action", $aParams)) { // $sReturn.='<h2>Aktion: '.$aParams["action"].'</h2>'; } } } $sReturn.='</div>'; return $sReturn; } /** * get h2 headline with action * @global type $aParams * @return string */ function getAction() { global $aParams, $oHtml; $sReturn = ''; $sNav = ''; $sLabel = ''; // $sDelim=$oHtml->getIcon('fa-chevron-right'); $sDelim=' / '; if (array_key_exists("action", $aParams)) { $sLabel .= $oHtml->getIcon($aParams["action"]).t($aParams["action"]); $sNav .= aHome(); if ($aParams['prj']==='all'){ // $sNav .= ' ' . $oHtml->getIcon('fa-chevron-right') . '[ci-GUI]'; } else { $sNav .= ' ' . $sDelim . aPrjHome(); } $sClass='action '.$aParams["action"]; if (array_key_exists("par3", $aParams)) { $sLabel.=' :: ' . $oHtml->getIcon($aParams["par3"]). $aParams["par3"]; $sClass='action ' . $aParams["action"]; } // $sReturn.='<h2 class="action ' . $aParams["action"] . '">' . $sLabel . '</h2>'; } else if (array_key_exists("prj", $aParams)) { $sNav .= aHome(); $sClass='action prjhome'; $sLabel.=$oHtml->getIcon('project-home').t('project-home'); // $sReturn.='<h2 class="action prjhome"> Projekt-Home</h2>'; } $sReturn.=($sNav ? '<div id="navtop">' . $sNav . ' ' . $sDelim . ' <span class="current">'.$sLabel.'</span></div>':'') // .'<h2 class="'.$sClass.'"> '.$sLabel.'</h2>' ; return $sReturn; } /** * translate function * @global type $aConfig * @staticvar array $aLang * @param string $s text * @return string */ function t($s) { global $aConfig; static $aLang = array(); if (!is_array($aConfig) || !array_key_exists("lang", $aConfig)) { die("ERROR: \$aConfig[\"lang\"] does not exist.\n"); } if (!count($aLang)) { $sLangfile = __DIR__ . "/../../config/lang/" . $aConfig["lang"] . ".json"; if (!file_exists($sLangfile)) { die("language file was not found: $sLangfile"); } $aLang = json_decode(file_get_contents($sLangfile), true); } if (!array_key_exists($s, $aLang)) { return '<span class="warning">' . $s . '</span>'; } // return $aLang[$s].' ('.$s.')'; return $aLang[$s]; } /** * enter user and comment * @global type $aParams * @return string */ function enterDeployinfos() { global $aParams; $sIdUser = "inputUser"; $sIdComment = "inputComment"; $sUser = (array_key_exists($sIdUser, $aParams)) ? $aParams[$sIdUser] : ""; $sComment = (array_key_exists($sIdComment, $aParams)) ? $aParams[$sIdComment] : ""; $sOut = ' <div class="control-group"> <label class="control-label" for="inputUser">Benutzername</label> <div class="controls"> <input type="text" id="inputUser" name="inputUser" placeholder="Benutzername" value="' . $sUser . '"> </div> </div> <div class="control-group"> <label class="control-label" for="inputComment">Kommentar zum Deployment</label> <div class="controls"> <textarea id= rows="3" id="inputComment" name="inputComment" placeholder="Kommentar">' . $sComment . '</textarea> </div> </div> '; return $sOut; }