<?php /* ###################################################################### IML DEPLOYMENT included functions for the act_*.php files --------------------------------------------------------------------- 2013-11-08 Axel <axel.hahn@iml.unibe.ch> ... 2024-09-03 Axel <axel.hahn@unibe.ch> php8 only; added variable types; short array syntax ###################################################################### */ global $aParams; $aParams = []; // 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 (["id"] as $sKey) { if (array_key_exists($sKey, $aParams)) { $aParams[$sKey]=(int)$aParams[$sKey]; } } */ foreach (array_keys($aParams) as $sKey) { $aParams[$sKey] = is_string($aParams[$sKey]) ? str_replace(['\\', "\0", "\n", "\r", "'", '"', "\x1a"], ['\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'], $aParams[$sKey]) : $aParams[$sKey]; } } /** * Get home link as button * * @global object $oHtml * * @param string $sClass css class for the button; default: "btn btn-default" * @return string */ function aHome(string $sClass = "btn btn-default"): string { global $oHtml; // if (!array_key_exists("prj", $aParams)) return false; return $oHtml->getLinkButton([ 'href' => '/deployment/?', 'icon' => 'overview', 'class' => $sClass, 'label' => t("menu-overview"), ]); } /** * Get project Home link as button. * It returns false if no project is selected (GET param "prj" is missing) * * @global object $oHtml * @global array $aParams * * @param string $sClass css class for the button; default: "btn btn-default" * @return bool|string */ function aPrjHome(string $sClass = "btn btn-default"): bool|string { 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([ 'href' => '/deployment/' . $aParams["prj"] . '/', 'icon' => 'project', 'class' => $sClass, 'label' => $oPrj->getLabel(), ]); } /** * Get go back link as button * * @global object $oHtml * * @param string $sClass css class for the button; default: "btn btn-default" * @return string */ function aGoback(string $sClass = "btn btn-default"): string { global $oHtml; return $oHtml->getLinkButton([ 'href' => '#', 'onclick' => 'history.back();', 'title' => t("back"), 'icon' => 'back', 'class' => $sClass, 'label' => t("back") ]); } /** * Get go top link as button * * @global object $oHtml * * @param string $sClass css class for the button; default: "scroll-link btn btn-default" * @return string */ function aGotop($sClass = "scroll-link btn btn-default"): string { global $oHtml; return $oHtml->getLinkButton([ 'href' => '#top', 'class' => $sClass, 'title' => t("gotop"), 'icon' => 'gotop', 'label' => ' ' ]); } /** * Get array for top left navigation. * It is an empty array if no authenticated user was found. * * @global object $oHtml * @global array $aParams * * @return array */ function getTopNavLeft(): array { global $aParams, $oHtml; $aReturn = []; require_once("./classes/project.class.php"); require_once("./classes/user.class.php"); $oUser = new user(); $sBaseUrl = '/deployment/'; $sBaseUrl = '/deployment/'; $sCurrentProject = (array_key_exists("prj", $aParams) && $aParams["prj"] <> "all") ? $aParams["prj"] : false; $sCurrentAction = (array_key_exists("action", $aParams) && $aParams["action"]) ? $aParams["action"] : false; $sCurrentPar3 = (array_key_exists("par3", $aParams) && $aParams["par3"]) ? $aParams["par3"] : false; // $aReturn[]=['label'=>'=' ]; $aReturn[] = ['href' => $sBaseUrl . '', 'label' => ' Deployment UI <small class="badge bg-info"><nobr>v' . APP_VERSION . '</nobr></small>', 'icon' => '', 'class' => 'imllogo topbrand']; if ($oUser->getUsername()) { $oPrj1 = new project(); $aPrjItems = []; foreach ($oPrj1->getProjects("label") as $aProject) { $aPrjItems[] = [ 'href' => $sBaseUrl . $aProject['id'] . '/', 'label' => $aProject['label'], 'class' => $sCurrentProject === $aProject['id'] ? 'active' : '', 'icon' => $oHtml->getIconClass('project'), ]; } /* to test a scrolling menu $aPrjItems=array_merge( $aPrjItems,$aPrjItems,$aPrjItems,$aPrjItems,$aPrjItems, $aPrjItems,$aPrjItems,$aPrjItems,$aPrjItems,$aPrjItems, $aPrjItems,$aPrjItems,$aPrjItems,$aPrjItems,$aPrjItems, ); */ $aReturn[] = [ 'href' => $sBaseUrl, 'label' => t("menu"), 'icon' => $oHtml->getIconClass('menu'), 'class' => ($sCurrentAction === 'setup' || $sCurrentAction === 'valuestore' ? 'active' : ''), 'children' => [ ['href' => $sBaseUrl . 'all/setup/new/', 'label' => t("menu-new-project"), 'icon' => $oHtml->getIconClass('new'), 'class' => ($sCurrentPar3 === 'new' ? 'active' : ''),], ['href' => $sBaseUrl . 'all/setup/actionlog/', 'label' => t("menu-logs"), 'icon' => $oHtml->getIconClass('actionlog'), 'class' => ($sCurrentPar3 === 'actionlog' ? 'active' : ''),], ['href' => $sBaseUrl . 'all/valuestore/', 'label' => t("menu-valuestore"), 'icon' => $oHtml->getIconClass('valuestore'), 'class' => ($sCurrentAction === 'valuestore' ? 'active' : ''),], ['href' => $sBaseUrl . 'all/setup/checklang/', 'label' => t("menu-checklang"), 'icon' => $oHtml->getIconClass('comment'), 'class' => ($sCurrentPar3 === 'checklang' ? 'active' : ''),], ['label' => '-'], ['href' => $sBaseUrl . 'all/setup/', 'label' => t("menu-settings"), 'icon' => $oHtml->getIconClass('setup')], ] ]; if (count($aPrjItems)) { $aReturn[] = [ 'href' => '#', 'label' => t("menu-projects"), 'icon' => $oHtml->getIconClass('projects'), 'children' => $aPrjItems ]; } if ($sCurrentProject) { $oPrj = new project($aParams["prj"]); $aPrjChildren = [ ['href' => $sBaseUrl . $sCurrentProject . '/', 'label' => t("project-home"), 'icon' => $oHtml->getIconClass('project-home'), 'class' => ($sCurrentAction == '' ? 'active' : '')], ['label' => '-'], ]; $aPhases = $oPrj->getActivePhases(); if (count($aPhases)) { $aPrjChildren[] = ['href' => $sBaseUrl . $sCurrentProject . '/build/', 'label' => t("build"), 'icon' => $oHtml->getIconClass('build'), 'class' => ($sCurrentAction === 'build' ? 'active' : '')]; $aPrjChildren[] = ['label' => '-']; foreach ($aPhases as $sPhase) { $aPrjChildren[] = ['href' => $sBaseUrl . $sCurrentProject . '/phase/' . $sPhase . '/', 'label' => $sPhase, 'icon' => $oHtml->getIconClass('phase'), 'class' => (isset($aParams['par3']) && $aParams['par3'] === $sPhase ? 'active' : '')]; } $aPrjChildren[] = ['label' => '-']; } $aPrjChildren[] = ['href' => $sBaseUrl . $sCurrentProject . '/setup/', 'label' => t("menu-project-settings"), 'icon' => $oHtml->getIconClass('setup'), 'class' => ($sCurrentAction === 'setup' ? 'active' : '')]; $aPrjChildren[] = ['label'=> '-']; $aPrjChildren[] = ['href' => $sBaseUrl . $sCurrentProject . '/cleanup/', 'label' => t("menu-project-cleanup"), 'icon' => $oHtml->getIconClass('cleanup'), 'class' => ($sCurrentAction === 'cleanup' ? 'active' : '')]; $aPrjChildren[] = ['href' => $sBaseUrl . $sCurrentProject . '/delete/', 'label' => t("menu-project-delete"), 'icon' => $oHtml->getIconClass('delete'), 'class' => ($sCurrentAction === 'delete' ? 'active' : '')]; $aReturn[] = [ 'href' => '#', 'label' => $oPrj->getLabel(), 'icon' => $oHtml->getIconClass('project'), 'class' => 'active', 'children' => $aPrjChildren ]; } } // echo '<pre>'.print_r($aReturn, 1); die(__FUNCTION__); return $aReturn; } /** * Get array for top right navigation. * * @global object $oHtml * @global array $aParams * * @return array */ function getTopNavRight(): array { global $aParams, $oHtml; $aReturn = []; require_once("./classes/project.class.php"); require_once("./classes/user.class.php"); $oUser = new user(); $sBaseUrl = '/deployment/'; $sWikiBaseUrl = 'https://intranet.iml.unibe.ch/wiki/doku.php'; $sCurrentAction = (array_key_exists("action", $aParams) && $aParams["action"]) ? $aParams["action"] : false; if ($oUser->getUsername()) { $aReturn = [ [ 'href' => '#', 'label' => $oUser->getUsername(), 'icon' => $oHtml->getIconClass('user'), 'class' => ($sCurrentAction == 'login' ? 'active' : ''), 'children' => [ ['href' => $sBaseUrl . 'all/login/', 'label' => t("menu-userprofile"), 'icon' => $oHtml->getIconClass('user-profile'), 'class' => ($sCurrentAction == 'login' ? 'active' : '')], ] ] ]; } else { $aReturn[] = ['href' => $sBaseUrl . 'all/login/', 'label' => t("login"), 'icon' => $oHtml->getIconClass('login'), 'class' => ($sCurrentAction == 'login' ? 'active' : '')]; } $aReturn[] = [ 'href' => '#', 'label' => t('menu-help'), 'icon' => $oHtml->getIconClass('help'), 'class' => '', 'children' => [ ['href' => $sWikiBaseUrl . '/it/entwicklung/continuous_deployment', 'target' => '_help', 'label' => 'WIKI: Übersicht Continous Deployment', 'icon' => $oHtml->getIconClass('link-extern')], ['href' => $sWikiBaseUrl . '/it/entwicklung/continuous_deployment#konventionen', 'target' => '_help', 'label' => 'WIKI: Konventionen für Entwickler', 'icon' => $oHtml->getIconClass('link-extern')], ['href' => $sWikiBaseUrl . '/it/infrastruktur/se/snippets/iml.deployment_profile', 'target' => '_help', 'label' => 'WIKI (Admin): Snippets für den Sysadmin', 'icon' => $oHtml->getIconClass('link-extern')], ['href' => $sWikiBaseUrl . '/it/infrastruktur/dienste/imldeployment', 'target' => '_help', 'label' => 'WIKI (Admin): Verzeichnisse und Dateien', 'icon' => $oHtml->getIconClass('link-extern')], ['href' => $sBaseUrl . 'all/doc', 'label' => t('menu-help-classes'), 'icon' => $oHtml->getIconClass('help')], ['label' => '-'], ['href' => $sBaseUrl . 'all/about', 'label' => t('about'), 'icon' => $oHtml->getIconClass('sign-info')], ] ]; // echo '<pre>'.print_r($aReturn, 1); die(__FUNCTION__); return $aReturn; } /** * Gett h2 headline with action * * @global array $aParams * * @param string $sLinkClass classname for links; default: "" (adds class="btn btn-default") * @return string */ function getBreadcrumb(string $sLinkClass = ""): string { global $aParams, $oHtml; $sReturn = ''; $sNav = ''; $sLabel = ''; $sDelim = ' / '; if (array_key_exists("action", $aParams)) { $sLabel .= $oHtml->getIcon($aParams["action"]) . t($aParams["action"]); $sNav .= aHome($sLinkClass); if ($aParams['prj'] === 'all') { } else { $sNav .= ' ' . $sDelim . aPrjHome($sLinkClass); } if (array_key_exists("par3", $aParams)) { $sLabel = $oHtml->getIcon($aParams["par3"]) . $aParams["par3"]; } // $sReturn.='<h2 class="action ' . $aParams["action"] . '">' . $sLabel . '</h2>'; } else if (array_key_exists("prj", $aParams)) { $sNav .= aHome($sLinkClass); $sLabel .= aPrjHome($sLinkClass); } $sReturn .= ($sNav ? '' . $sNav . ' ' . $sDelim . ' <span class="current">' . $sLabel . '</span>' : ''); if ($sLinkClass) { $sReturn = str_replace(['btn-default ', 'btn '], ['', ''], $sReturn); } return $sReturn; } /** * Get version info by detecting a json file in approot * @return string */ function getVersioninfo(): string { $sMyRev = ""; $aFiles = glob(dirname(dirname(__DIR__)) . "/*.json"); if (isset($aFiles[0])) { $aJson = json_decode(file_get_contents($aFiles[0]), true); $sMyRev = (isset($aJson["branch"]) ? $aJson["branch"] . ' - ' : '') . (isset($aJson["date"]) ? $aJson["date"] : ''); } return ($sMyRev ? $sMyRev . ' @ ' : '') . php_uname("n"); } /** * translate function. Get translated text by given key. * * @global array $aConfig * @staticvar array $aLang * * @param string $s text * @return string */ function t(string $s): string { global $aConfig; static $aLang = []; if (!isset($aConfig["lang"])) { 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]; } /** * Get html code for a form to enter user and comment * * @global array $aParams * * @return string The HTML code */ function enterDeployinfos(): string { 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; }