diff --git a/public_html/versions/classes/versions.class.php b/public_html/versions/classes/versions.class.php index a8446fe32d3598cee9174bc297dd5ad3275686a6..4468a5f5b0b27c6f4f0b35ef7a20c4c0cd64af08 100644 --- a/public_html/versions/classes/versions.class.php +++ b/public_html/versions/classes/versions.class.php @@ -1,5 +1,4 @@ <?php - /** * version data handler for the deployment tool * @@ -15,11 +14,15 @@ class versions { public $sData = false; /** - * filename of + * filename of sqlite database file * @var type */ private $_dbfile = false; + /** + * create statement for the database + * @var type + */ private $_sCreate = ' CREATE TABLE "versions" ( `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE , @@ -38,7 +41,9 @@ class versions { // CONSTRUCTOR // ---------------------------------------------------------------------- - + /** + * constructor ... no params + */ public function __construct(){ // cache dir is hardcoded to versions directory :-/ @@ -46,9 +51,6 @@ class versions { if (!file_exists($this->_dbfile)) { $this->_createDb(); - if (!file_exists($this->_dbfile)) { - die("ERROR: unable to create sqlite database " . $this->_dbfile); - } } } @@ -60,8 +62,16 @@ class versions { * create sqlite database - called in constructor if the file does not exist */ private function _createDb() { - echo "try to create file $this->_dbfile ...<br>\n"; - return $this->_makeQuery($this->_sCreate); + if (file_exists($this->_dbfile)) { + echo "removing existing file $this->_dbfile ...<br>\n"; + unlink($this->_dbfile); + } + echo "create database as file $this->_dbfile ...<br>\n"; + $this->_makeQuery($this->_sCreate); + if (!file_exists($this->_dbfile)) { + die("ERROR: unable to create sqlite database " . $this->_dbfile); + } + return true; } /** @@ -71,39 +81,123 @@ class versions { */ private function _makeQuery($sSql) { // $this->_log(__FUNCTION__."($sSql)"); - echo "DEBUG: executing SQL<pre>$sSql</pre>"; - $db = new PDO("sqlite:" . $this->_dbfile); - $result = $db->query($sSql); - $db = NULL; + // echo "DEBUG: executing SQL<pre>$sSql</pre>"; + $oDb = new PDO("sqlite:" . $this->_dbfile); + $result = $oDb->query($sSql); return $result; } + /** + * execute a sql statement + * @param string $sSql sql statement + * @return database object + */ + private function _makeSelectQuery($sSql, $aKey=false) { + // $this->_log(__FUNCTION__."($sSql)"); + // echo "DEBUG: executing select SQL<pre>$sSql</pre>"; + $oDb = new PDO("sqlite:" . $this->_dbfile); + $oStatement = $oDb->prepare($sSql); + $oStatement->execute(); + $aReturn=array(); + while ($row = $oStatement->fetch(PDO::FETCH_ASSOC)) { + if ($aKey && array_key_exists($aKey, $row)){ + $aReturn[] = $row[$aKey]; + } else { + $aReturn[] = $row; + } + } + return $aReturn; + } + // ---------------------------------------------------------------------- // PUBLIC GETTER // ---------------------------------------------------------------------- + + /** + * get list of current projects + * @return type + */ + public function getProjects(){ + $sSql="select distinct(project) from `versions`"; + return $this->_makeSelectQuery($sSql, 'project'); + } + + /** + * get phases of the current project; a project must be set be set before + * @return type + */ + public function getPhases(){ + if (!$this->sProject){ + die("ERROR: you need to set a project first. Use the setProject() method to do so."); + } + $sSql="select distinct(phase) from `versions` + WHERE + project='" . $this->sProject . "' + " + ; + return $this->_makeSelectQuery($sSql,'phase'); + } + + /** + * get places of the current project; a project and must be set be set before + * @return type + */ + public function getPlaces(){ + if (!$this->sProject || !$this->sPhase){ + die("ERROR: you need to set a project, and phase first. Use the setProject() method to do so."); + } + $sSql="select distinct(place) from `versions` + WHERE + project='" . $this->sProject . "' + AND phase='" . $this->sPhase . "' + "; + return $this->_makeSelectQuery($sSql, 'place'); + } + + /** + * get hosts that have installed a project + * @return type + */ + public function getHosts(){ + if (!$this->sProject || !$this->sPhase){ + die("ERROR: you need to set a project, and phase first. Use the setProject() method to do so."); + } + $sSql="select distinct(host) from `versions` + WHERE + project='" . $this->sProject . "' + AND phase='" . $this->sPhase . "' + AND place='installed' + "; + return $this->_makeSelectQuery($sSql, 'host'); + } + + /** + * get versions of the current place (project, phase and place must be + * set before) + * @see setProject() + * @return type + */ public function getVersion(){ if (!$this->sProject || !$this->sPhase || !$this->sPlace ){ - die("ERROR: you need to set a project, phase and place. use the setProject() method to do so."); + die("ERROR: you need to set a project, phase and place first. Use the setProject() method to do so."); } - $aReturn=array(); - $sSql="select * from `versions` + $sSql="select data from `versions` WHERE project='" . $this->sProject . "' AND phase='" . $this->sPhase . "' AND place='" . $this->sPlace . "' AND host='" . $this->sHost . "' + AND variable='version' "; - foreach ($this->_makeQuery($sSql) as $row) { - for ($i = 0; $i <= count($row); $i++) { - unset($row[$i]); - } - $aReturn[] = $row; - } - return $aReturn; + return $this->_makeSelectQuery($sSql, 'data'); } + /** + * return currebntly set project, phase, place and host + * @return type + */ public function whereiam(){ return array( 'project'=>$this->sProject, @@ -112,6 +206,14 @@ class versions { 'host'=>$this->sHost, ); } + /** + * return currebntly set project, phase, place and host + * @return type + */ + public function dumpdb(){ + $sSql="select * from `versions`"; + return $this->_makeSelectQuery($sSql); + } // ---------------------------------------------------------------------- @@ -166,7 +268,7 @@ class versions { * update a version * @return boolean */ - public function updateVersion($sVersioninfos){ + public function updateVar($sVarname,$sValue){ if (!$this->sProject || !$this->sPhase || !$this->sPlace ){ die("ERROR: you need to set a project, phase and place. use the setProject() method to do so."); } @@ -180,11 +282,18 @@ class versions { '" . $this->sPhase . "', '" . $this->sPlace . "', '" . $this->sHost . "', - 'version', - '" . $sVersioninfos . "' + '" . $sVarname . "', + '" . $sValue . "' ); "; return $this->_makeQuery($sSql); } + /** + * update a version + * @return boolean + */ + public function updateVersion($sVersioninfos){ + return $this->updateVar('version', $sVersioninfos); + } } diff --git a/public_html/versions/data/.htkeep b/public_html/versions/data/.htkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/public_html/versions/index.php b/public_html/versions/index.php index 22efa83c32469b52660c573693bb13c0eb6d791e..7d79ff6ca90869b8dcb0e6999a791349f17f91ae 100644 --- a/public_html/versions/index.php +++ b/public_html/versions/index.php @@ -1,26 +1,138 @@ <?php -echo '<pre>'.print_r($_GET, 1).'</pre>'; -require './classes/versions.class.php'; +/** + * + * VERSION HANDLER API + * + * Syntax des Aufrufs (als GET Schreibweise; ein POST soll (später) auch gehen): + * http://dev.ci.iml.unibe.ch:8002/versions/?action=update&project=ci&phase=preview&host=ci.preview.iml.unibe.ch&variable=version&value=007 + * + * Parameter: + * + * action=update (get-Funktionen muss ich später noch bauen) + * project=[Projekt-ID (=Name des Package, das installiert wird)] + * phase=(preview|stage|live) + * host=[FQDN] + * variable=version (andere noch nicht unterstützt/ vorgesehen) + * value=[Versionsdaten] + * + * 2017-04-07 hahn first lines + */ -$oVersion=new versions(); -$sProject='ci'; -$sPhase='preview'; -$sPlace='installed'; -$sHost='preview02.ci'; +// ---------------------------------------------------------------------- +// functions +// ---------------------------------------------------------------------- -$oVersion->setProject($sProject, $sPhase, $sPlace, $sHost); -print_r($oVersion->whereiam()); +/** + * show an error message and quit with http status code 400 (Bad request) + * @param string $sMessage message to show + * @return boolean + */ +function quit($sMessage) { + $sProtocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0'); + header("$sProtocol 400: Bad request"); + die("<h1>Bad request</h1>" . $sMessage); + return false; +} + +/** + * get a request param from GET and POST scope (POST has priority) and + * verify it with execution of a cleanup array + * @param string $sKey key to search for in GET or POST + * @param string $sRegex4Cleanup regex for filtering + * @return type + */ +function getParam($sKey, $sRegex4Cleanup = false) { + $sValue=false; + if (array_key_exists($sKey, $_GET)) { + $sValue=$_GET[$sKey]; + } + if (array_key_exists($sKey, $_POST)) { + $sValue=$_POST[$sKey]; + } + if(!$sValue){ + return false; + } + $sReturn = $sRegex4Cleanup ? preg_replace($sRegex4Cleanup, '', $sValue) : $sValue; + + if ($sReturn !== $sValue) { + quit("ERROR: the parameter value in [$sKey = ...] has a wrong format."); + } + return $sReturn; +} + +// ---------------------------------------------------------------------- +// check required params +// ---------------------------------------------------------------------- +if (!$_GET || !count($_GET)) { + quit("no parameter was found."); +} + + +foreach (array("action", "project") as $sKey) { + if (!array_key_exists($sKey, $_GET)) { + quit("value required: $sKey="); + } +} + +// ---------------------------------------------------------------------- +// get vars +// ---------------------------------------------------------------------- + + +$sAction = getParam('action', '/[^a-z]/'); +if ($sAction !== "get" && $sAction !== "update") { + quit("action is unknown or not implemented yet."); +} + +$sProject = getParam('project', '/[^a-z\-0-9]/'); +$sPhase = getParam('phase', '/[^a-z]/'); +$sPlace = getParam('place', '/[^a-z]/'); +$sHost = getParam('host', '/[^a-z\.\-0-9]/'); -/* -if ($oVersion->updateVersion('{ "revision": "000" }')){ - print_r($oVersion->getVersion()); -} else { - echo "insert failed. :-("; +if ($sHost && !$sPlace) { + $sPlace = 'installed'; } -*/ -print_r($oVersion->getVersion()); +$sVarname = getParam('variable', '/[^a-z]/'); +$sValue = getParam('value', ''); + + +// ---------------------------------------------------------------------- +// init class +// ---------------------------------------------------------------------- + +require './classes/versions.class.php'; + +$oVersion = new versions(); +$oVersion->setProject($sProject, $sPhase, $sPlace, $sHost); + +switch ($sAction) { + case 'get': + print_r($oVersion->getVersion()); + + + break; + case 'update': + if (!$sVarname) { + quit("ERROR: the update action requires a variable and a value."); + } + switch ($sVarname) { + // case 'other-varname': + case 'version': + $oVersion->updateVar($sVarname, $sValue); + echo "OK: $sVarname was updated."; + break; -// $oVersion-> \ No newline at end of file + default: + quit("ERROR: update of variable [$sVarname] is not supported."); + break; + } + break; + + + default: + quit("ERROR: the action is not supported."); + break; +}