summaryrefslogtreecommitdiffstats
path: root/modules-available/dozmod/api.inc.php
diff options
context:
space:
mode:
authorSimon Rettberg2016-06-08 18:34:07 +0200
committerSimon Rettberg2016-06-08 18:34:07 +0200
commitb9283754a22d24a645bb7a77a2e4ebad45a59d85 (patch)
tree0b68e4df1c815a900d35327f47ef761b814a8cb5 /modules-available/dozmod/api.inc.php
parent[install] Implement install scripts for most modules (diff)
parentressource -> resource :-) (diff)
downloadslx-admin-b9283754a22d24a645bb7a77a2e4ebad45a59d85.tar.gz
slx-admin-b9283754a22d24a645bb7a77a2e4ebad45a59d85.tar.xz
slx-admin-b9283754a22d24a645bb7a77a2e4ebad45a59d85.zip
Merge branch 'modularization' of dnbd3:openslx-ng/slx-admin into modularization
Diffstat (limited to 'modules-available/dozmod/api.inc.php')
-rw-r--r--modules-available/dozmod/api.inc.php157
1 files changed, 157 insertions, 0 deletions
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";
+}