diff options
author | Simon Rettberg | 2016-06-08 18:34:07 +0200 |
---|---|---|
committer | Simon Rettberg | 2016-06-08 18:34:07 +0200 |
commit | b9283754a22d24a645bb7a77a2e4ebad45a59d85 (patch) | |
tree | 0b68e4df1c815a900d35327f47ef761b814a8cb5 | |
parent | [install] Implement install scripts for most modules (diff) | |
parent | ressource -> resource :-) (diff) | |
download | slx-admin-b9283754a22d24a645bb7a77a2e4ebad45a59d85.tar.gz slx-admin-b9283754a22d24a645bb7a77a2e4ebad45a59d85.tar.xz slx-admin-b9283754a22d24a645bb7a77a2e4ebad45a59d85.zip |
Merge branch 'modularization' of dnbd3:openslx-ng/slx-admin into modularization
-rw-r--r-- | config.php.example | 5 | ||||
-rw-r--r-- | modules-available/dozmod/api.inc.php | 157 |
2 files changed, 161 insertions, 1 deletions
diff --git a/config.php.example b/config.php.example index 6674ef61..14978897 100644 --- a/config.php.example +++ b/config.php.example @@ -26,10 +26,13 @@ define('CONFIG_VMSTORE_DIR', '/srv/openslx/nfs'); define('CONFIG_PROXY_CONF', '/opt/openslx/proxy/config'); +/* for the dozmod API proxy cache */ +define('CONFIG_DOZMOD_EXPIRE', 60*60); // 1 Minute + // Sort order for menu - optional, if missing, order will be alphabetically $MENU_CAT_SORT_ORDER = array('main.content' => 0, 'main.settings-client' => 1, 'main.settings-server' => 2, 'main.status' => 3, 'main.users' => 4); $MENU_SETTING_SORT_ORDER = array( 'news' => 0, 'sysconfig' => 1, 'baseconfig' => 2, 'locations' => 3, // main.content 'serversetup' => 0, 'internetaccess' => 1, 'vmstore' => 2, 'webinterface' => 3, 'backup' => 4, // main.settings 'systemstatus' => 0, 'eventlog' => 1, 'syslog' => 2, 'statistics' => 3 // main.status -);
\ No newline at end of file +); diff --git a/modules-available/dozmod/api.inc.php b/modules-available/dozmod/api.inc.php new file mode 100644 index 00000000..bc2410aa --- /dev/null +++ b/modules-available/dozmod/api.inc.php @@ -0,0 +1,157 @@ +<?php +/* small API server that acts as a proxy to the dozmod server. + * To reduce the number of requests and connections to dozmod-server, results + * gets cached into a file cache. + * + * Required Configuration: + * CONFIG_DOZMOD_EXPIRE: Expiration time in seconds for the cache + * CONFIG_DOZMOD: URL to the dozmod server + * + **/ + +require 'modules/locations/inc/location.inc.php'; + + +define('LIST_URL', CONFIG_DOZMOD . '/vmchooser/list'); +define('VMX_URL', CONFIG_DOZMOD . '/vmchooser/lecture'); +$availableRessources = ['vmx', 'test', 'netrules']; + +/* BEGIN: A simple caching mechanism ---------------------------- */ + +function cache_hash($obj) { + return md5(serialize($obj)); +} + +function cache_key_to_filename($key) { + return "/tmp/bwlp-slxadmin-cache-$key"; // TODO: hash +} + +function cache_put($key, $value) { + $filename = cache_key_to_filename($key); + file_put_contents($filename, $value); +} + +function cache_has($key) { + $filename = cache_key_to_filename($key); + $mtime = filemtime($filename); + + if (!$mtime) { + return false; // cache miss + } + if ( time() - $mtime > CONFIG_DOZMOD_EXPIRE) { + return false; + } else { + return true; + } +} + + +function cache_get($key) { + $filename = cache_key_to_filename($key); + return file_get_contents($filename); +} + +/* good for large binary files */ +function cache_get_passthru($key) { + $filename = cache_key_to_filename($key); + $fp = fopen($filename, "r"); + if($fp) { + fpassthru($fp); + } else { + Util::traceError("cannot open file"); + } +} +/* END: Cache ---------------------------------------------------- */ + + +/* this script requires 2 (3 with implicit client ip) parameters + * + * resource = vmx,... + * lecture_uuid = client can choose + **/ + + +function println($str) { echo "$str\n"; } + +/* return an array of lecutre uuids. + * Parameter: an array with location Ids + * */ +function _getLecturesForLocations($locationIds) { + $ids = implode('%20', $locationIds); + $url = LIST_URL . "?locations=$ids"; + $responseXML = Download::asString($url, 60, $code); + $xml = new SimpleXMLElement($responseXML); + + $uuids = []; + foreach ($xml->eintrag as $e) { + $uuids[] = strval($e->uuid['param'][0]); + } + return $uuids; +} +/** Caching wrapper around _getLecturesForLocations() */ +function getLecturesForLocations($locationIds) { + $key = 'lectures_' . cache_hash($locationIds); + if (cache_has($key)) { + return unserialize(cache_get($key)); + } else { + $value = _getLecturesForLocations($locationIds); + cache_put($key, serialize($value)); + return $value; + } +} + +function _getVMX($lecture_uuid) { + $url = VMX_URL . '/' . $lecture_uuid; + $response = Download::asString($url, 60, $code); + return $response; +} + +/** Caching wrapper around _getVMX() **/ +function getVMX($lecture_uuid) { + $key = 'vmx_' . $lecture_uuid; + if (cache_has($key)) { + cache_get_passthru($key); + } else { + $value = _getVMX($lecture_uuid); + cache_put($key, $value); + return $value; + } +} + + +// -----------------------------------------------------------------------------// +$ip = $_SERVER['REMOTE_ADDR']; +if (substr($ip, 0, 7) === '::ffff:') { + $ip = substr($ip, 7); +} + +/* request data, don't trust */ +$request = [ 'resource' => filter_var(strtolower(trim($_REQUEST['resource'])), FILTER_SANITIZE_STRING), + 'lecture' => filter_var(strtolower(trim($_REQUEST['lecture'])), FILTER_SANITIZE_STRING), + 'ip' => $ip ]; + + +/* lookup location id(s) */ +$location_ids = Location::getFromIP($request['ip']); + +/* lookup lecture uuids */ +$lectures = getLecturesForLocations(array($location_ids)); + +/* validate request -------------------------------------------- */ +/* check resources */ +if (!in_array($request['resource'], $availableRessources)) { + Util::traceError("unknown resource: {$request['resource']}"); +} + +/* check that the user requests a lecture that he is allowed to have */ +if (!in_array($request['lecture'], $lectures)) { + Util::traceError("client is not allowed to access this lecture: ${request['lecture']}"); +} + +if ($request['resource'] === 'vmx') { + echo getVMX($request['lecture']); +} else if ($request['resource'] === 'test') { + echo "Here's your special test data!"; +} else { + echo "I don't know how to give you that resource"; +} |