aboutsummaryrefslogtreecommitdiffstats
path: root/web
diff options
context:
space:
mode:
authorKristian Lyngstol <kristian@bohemians.org>2016-05-16 16:13:33 +0200
committerKristian Lyngstol <kristian@bohemians.org>2016-05-16 16:13:33 +0200
commit5b2a63f65edd13f182787ebb997ceaa493f61665 (patch)
tree8769496b970cdd374358e60cf91cb397874a6627 /web
parent948b1e9558479846c2ddd52be5483ab8b44be77c (diff)
Add config read-api and use it to detect public access
Currently no way to modify the settings except by manual SQL, but it's coming. This allows us to have event-specific configuration in the database. This commit adds js that uses this to detect if the frontend is a public vhost or not. There are currently only three columns provided in addition to ID. publicvhost: The domain name of the publicly accessible version of Gondul. shortname: code name for the vent. e.g dx16, tg17, etc. data: jsonb to contain most other settings as we see fit. Most settings will be stored in 'data' if it's only or mainly used by the frontend. This will allow frontend developers to supply arbitrary configuration options without the need for API or database changes in the future. Fixes #51 References #54 Still need the GUI for it.
Diffstat (limited to 'web')
-rwxr-xr-xweb/api/public/config28
-rw-r--r--web/js/nms.js46
2 files changed, 69 insertions, 5 deletions
diff --git a/web/api/public/config b/web/api/public/config
new file mode 100755
index 0000000..dd8ccc1
--- /dev/null
+++ b/web/api/public/config
@@ -0,0 +1,28 @@
+#! /usr/bin/perl
+# vim:ts=8:sw=8
+
+use DBI;
+use lib '/opt/gondul/include';
+use nms;
+use nms::web;
+use strict;
+use warnings;
+use Data::Dumper;
+
+$nms::web::cc{'max-age'} = "3600";
+
+my $hostname = $ENV{'HTTP_HOST'} || "";
+my $q2 = $nms::web::dbh->prepare('select id, publicvhost, shortname, data from config order by id desc limit 1;');
+
+$q2->execute();
+while (my $ref = $q2->fetchrow_hashref()) {
+ $nms::web::json{'config'} = $ref;
+ $nms::web::json{'config'}{'data'} = JSON::XS::decode_json($ref->{'data'});
+ if ($ref->{'publicvhost'} eq $hostname) {
+ $nms::web::json{'config'}{'public'} = "true";
+ } else {
+ $nms::web::json{'config'}{'public'} = "false";
+ }
+}
+
+finalize_output();
diff --git a/web/js/nms.js b/web/js/nms.js
index 1f7398b..5df9431 100644
--- a/web/js/nms.js
+++ b/web/js/nms.js
@@ -548,6 +548,35 @@ function setNightMode(toggle) {
}
/*
+ * Only used to fetch the initial config for anything that needs to be
+ * handled prior to regular "boot up".
+ *
+ * For the moment, that only means detecting if we're being run on a public
+ * vhost or not. This has to be done in synch because it affects what
+ * sources we register for nmsData[]. If we wait for nmsData['config'],
+ * it's too late because all other things have been initialized already.
+ *
+ * If you add a configuration setting, use nmsData['config'] as much as
+ * possible. Avoid adding to this function.
+ */
+function getInitialConfig() {
+ $.ajax({
+ type: "GET",
+ url: "/api/public/config",
+ async: false,
+ dataType: "json",
+ success: function (data, textStatus, jqXHR) {
+ if (data["config"]["public"] == "true") {
+ nms._public = true;
+ } else {
+ console.log("Private");
+ nms._public = false;
+ }
+ }
+ });
+}
+
+/*
* Boot up "fully fledged" NMS.
*
* This can be re-written to provide different looks and feels but using
@@ -558,12 +587,17 @@ function initNMS() {
nms.timers.playback = new nmsTimer(nms.playback.tick, 1000, "Playback ticker", "Handler used to advance time");
// Public
+ nmsData.registerSource("config","/api/public/config");
nmsData.registerSource("ping", "/api/public/ping");
nmsData.registerSource("switches","/api/public/switches");
nmsData.registerSource("switchstate","/api/public/switch-state");
nmsData.registerSource("dhcpsummary","/api/public/dhcp-summary");
nmsData.registerSource("dhcp","/api/public/dhcp");
-
+
+ // Fetch initial config. Basically just populates nms._public.
+ // All other settings are kept in nmsData['config'].
+ getInitialConfig();
+
// This is a magic dummy-source, it's purpose is to give a unified
// way to get ticks every second. It is mainly meant to allow map
// handlers to register for ticks so they will execute without data
@@ -571,10 +605,12 @@ function initNMS() {
// despite no pings)
nmsData.registerSource("ticker","bananabananbanana");
- // Private
- nmsData.registerSource("snmp","/api/read/snmp");
- nmsData.registerSource("comments", "/api/read/comments");
- nmsData.registerSource("smanagement","/api/read/switches-management");
+ if (!nms._public) {
+ // Private
+ nmsData.registerSource("snmp","/api/read/snmp");
+ nmsData.registerSource("comments", "/api/read/comments");
+ nmsData.registerSource("smanagement","/api/read/switches-management");
+ }
restoreSettings();
nmsMap.init();