aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--README.rst2
-rw-r--r--ansible/roles/postgres/files/schema-backup.sql610
-rw-r--r--ansible/roles/postgres/files/schema.sql162
-rw-r--r--ansible/roles/web/tasks/main.yml1
-rw-r--r--build/schema.sql361
-rwxr-xr-xcollectors/dhcptail.pl2
-rwxr-xr-xcollectors/ping.pl85
-rwxr-xr-xcollectors/snmpfetchng.pl75
-rwxr-xr-xinclude/config.pm.dist (renamed from include/config.pm)2
-rw-r--r--include/nms/snmp.pm1
-rw-r--r--include/nms/util.pm12
-rwxr-xr-xinclude/nms/web.pm3
-rwxr-xr-xtemplating/templating.py33
-rwxr-xr-xweb/api/public/dhcp10
-rwxr-xr-xweb/api/public/distro-tree8
-rwxr-xr-xweb/api/public/ping4
-rwxr-xr-xweb/api/public/switch-state28
-rwxr-xr-xweb/api/public/switches7
-rwxr-xr-xweb/api/read/distro-management31
-rwxr-xr-x[-rw-r--r--]web/api/read/networks15
-rwxr-xr-xweb/api/read/oplog9
-rwxr-xr-xweb/api/read/switches-management35
-rwxr-xr-xweb/api/read/template-list21
-rwxr-xr-xweb/api/write/linknet-add32
-rw-r--r--web/api/write/network-add49
-rw-r--r--web/api/write/network-update114
-rwxr-xr-xweb/api/write/networks82
-rwxr-xr-xweb/api/write/switch-add94
-rwxr-xr-xweb/api/write/switches (renamed from web/api/write/switch-update)4
-rw-r--r--web/index.html46
-rw-r--r--web/js/nms-draw-chart.js111
-rw-r--r--web/js/nms-info-box.js110
-rw-r--r--web/js/nms-map-handlers.js272
-rw-r--r--web/js/nms-map.js3
-rw-r--r--web/js/nms-template.js74
-rw-r--r--web/js/nms-time.js16
-rw-r--r--web/js/nms.js55
-rw-r--r--web/templates/HOWTO.txt2
39 files changed, 1667 insertions, 916 deletions
diff --git a/.gitignore b/.gitignore
index 35d595f..292e2fa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
.*.swp
data/
+web/templates/
+web/files/
diff --git a/README.rst b/README.rst
index 68a1f7b..9a75c6a 100644
--- a/README.rst
+++ b/README.rst
@@ -32,7 +32,7 @@ Some facts from The Gathering 2016:
- Active network devices at 2016-03-22T12:00:00: 206
- Active network devices at 2016-03-23T08:00:00: 346
- Active network devices at 2016-03-23T20:00:00: 6467
-- 180+ switches and routers. Pinged seceral times per second. Polled for
+- 180+ switches and routers. Pinged several times per second. Polled for
SNMP every minute. Every reply (or lack thereof) is kept.
- Collected roughly 300 million database rows, or 30GB of data in postgresql.
- Public NMS and API provided to all participants and the world at large.
diff --git a/ansible/roles/postgres/files/schema-backup.sql b/ansible/roles/postgres/files/schema-backup.sql
new file mode 100644
index 0000000..ed94e80
--- /dev/null
+++ b/ansible/roles/postgres/files/schema-backup.sql
@@ -0,0 +1,610 @@
+--
+-- PostgreSQL database dump
+--
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+
+--
+-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner:
+--
+
+CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
+
+
+--
+-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner:
+--
+
+COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
+
+
+SET search_path = public, pg_catalog;
+
+--
+-- Name: comment_state; Type: TYPE; Schema: public; Owner: nms
+--
+
+CREATE TYPE comment_state AS ENUM (
+ 'active',
+ 'inactive',
+ 'persist',
+ 'delete'
+);
+
+
+ALTER TYPE comment_state OWNER TO nms;
+
+SET default_tablespace = '';
+
+SET default_with_oids = false;
+
+--
+-- Name: config; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE config (
+ id integer NOT NULL,
+ publicvhost character varying,
+ shortname character varying,
+ data jsonb
+);
+
+
+ALTER TABLE config OWNER TO nms;
+
+--
+-- Name: config_id_seq; Type: SEQUENCE; Schema: public; Owner: nms
+--
+
+CREATE SEQUENCE config_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE config_id_seq OWNER TO nms;
+
+--
+-- Name: config_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: nms
+--
+
+ALTER SEQUENCE config_id_seq OWNED BY config.id;
+
+
+--
+-- Name: dhcp; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE dhcp (
+ switch integer,
+ "time" timestamp with time zone,
+ mac macaddr,
+ ip inet,
+ dhcp_server integer
+);
+
+
+ALTER TABLE dhcp OWNER TO nms;
+
+--
+-- Name: linknet_ping; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE linknet_ping (
+ linknet integer NOT NULL,
+ "time" timestamp with time zone DEFAULT now() NOT NULL,
+ latency1_ms double precision,
+ latency2_ms double precision
+);
+
+
+ALTER TABLE linknet_ping OWNER TO nms;
+
+--
+-- Name: linknets; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE linknets (
+ linknet integer NOT NULL,
+ switch1 integer NOT NULL,
+ addr1 inet,
+ switch2 integer NOT NULL,
+ addr2 inet,
+ port1 character varying(10),
+ port2 character varying(10)
+);
+
+
+ALTER TABLE linknets OWNER TO nms;
+
+--
+-- Name: linknets_linknet_seq; Type: SEQUENCE; Schema: public; Owner: nms
+--
+
+CREATE SEQUENCE linknets_linknet_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE linknets_linknet_seq OWNER TO nms;
+
+--
+-- Name: linknets_linknet_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: nms
+--
+
+ALTER SEQUENCE linknets_linknet_seq OWNED BY linknets.linknet;
+
+
+--
+-- Name: oplog; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE oplog (
+ id integer NOT NULL,
+ "time" timestamp with time zone DEFAULT now(),
+ systems character varying,
+ username character varying,
+ log text
+);
+
+
+ALTER TABLE oplog OWNER TO nms;
+
+--
+-- Name: oplog_id_seq; Type: SEQUENCE; Schema: public; Owner: nms
+--
+
+CREATE SEQUENCE oplog_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE oplog_id_seq OWNER TO nms;
+
+--
+-- Name: oplog_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: nms
+--
+
+ALTER SEQUENCE oplog_id_seq OWNED BY oplog.id;
+
+
+--
+-- Name: ping; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE ping (
+ switch integer NOT NULL,
+ "time" timestamp with time zone DEFAULT now() NOT NULL,
+ latency_ms double precision
+);
+
+
+ALTER TABLE ping OWNER TO nms;
+
+--
+-- Name: ping_secondary_ip; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE ping_secondary_ip (
+ switch integer NOT NULL,
+ "time" timestamp with time zone DEFAULT now() NOT NULL,
+ latency_ms double precision
+);
+
+
+ALTER TABLE ping_secondary_ip OWNER TO nms;
+
+--
+-- Name: seen_mac; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE seen_mac (
+ mac macaddr NOT NULL,
+ address inet NOT NULL,
+ seen timestamp with time zone DEFAULT now() NOT NULL
+);
+
+
+ALTER TABLE seen_mac OWNER TO nms;
+
+--
+-- Name: snmp; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE snmp (
+ "time" timestamp without time zone DEFAULT now() NOT NULL,
+ switch integer NOT NULL,
+ data jsonb,
+ id integer NOT NULL
+);
+
+
+ALTER TABLE snmp OWNER TO nms;
+
+--
+-- Name: snmp_id_seq; Type: SEQUENCE; Schema: public; Owner: nms
+--
+
+CREATE SEQUENCE snmp_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE snmp_id_seq OWNER TO nms;
+
+--
+-- Name: snmp_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: nms
+--
+
+ALTER SEQUENCE snmp_id_seq OWNED BY snmp.id;
+
+
+--
+-- Name: switches; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE switches (
+ switch integer DEFAULT nextval(('"switches_switch_seq"'::text)::regclass) NOT NULL,
+ mgmt_v4_addr inet,
+ mgmt_v6_addr inet,
+ mgmt_vlan character varying,
+ sysname character varying NOT NULL,
+ last_updated timestamp with time zone,
+ locked boolean DEFAULT false NOT NULL,
+ poll_frequency interval DEFAULT '00:01:00'::interval NOT NULL,
+ community character varying DEFAULT 'FullPuppTilNMS'::character varying NOT NULL,
+ placement box,
+ distro_name character varying,
+ distro_phy_port character varying(100),
+ traffic_vlan character varying,
+ tags jsonb DEFAULT '[]'::jsonb
+);
+
+
+ALTER TABLE switches OWNER TO nms;
+
+--
+-- Name: switches_switch_seq; Type: SEQUENCE; Schema: public; Owner: nms
+--
+
+CREATE SEQUENCE switches_switch_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE switches_switch_seq OWNER TO nms;
+
+--
+-- Name: networks; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE networks (
+ network integer DEFAULT nextval(('"networks_network_seq"'::text)::regclass) NOT NULL,
+ name character varying NOT NULL,
+ last_updated timestamp with time zone,
+ placement box,
+ subnet4 cidr,
+ subnet6 cidr,
+ gw4 inet,
+ gw6 inet,
+ routing_point character varying,
+ vlan integer,
+ tags jsonb DEFAULT '[]'::jsonb
+);
+
+ALTER TABLE networks OWNER TO nms;
+
+CREATE SEQUENCE networks_network_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER TABLE networks_network_seq OWNER TO nms;
+
+--
+-- Name: id; Type: DEFAULT; Schema: public; Owner: nms
+--
+
+ALTER TABLE ONLY config ALTER COLUMN id SET DEFAULT nextval('config_id_seq'::regclass);
+
+
+--
+-- Name: linknet; Type: DEFAULT; Schema: public; Owner: nms
+--
+
+ALTER TABLE ONLY linknets ALTER COLUMN linknet SET DEFAULT nextval('linknets_linknet_seq'::regclass);
+
+
+--
+-- Name: id; Type: DEFAULT; Schema: public; Owner: nms
+--
+
+ALTER TABLE ONLY oplog ALTER COLUMN id SET DEFAULT nextval('oplog_id_seq'::regclass);
+
+
+--
+-- Name: id; Type: DEFAULT; Schema: public; Owner: nms
+--
+
+ALTER TABLE ONLY snmp ALTER COLUMN id SET DEFAULT nextval('snmp_id_seq'::regclass);
+
+
+--
+-- Name: seen_mac_pkey; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
+--
+
+ALTER TABLE ONLY seen_mac
+ ADD CONSTRAINT seen_mac_pkey PRIMARY KEY (mac, address, seen);
+
+
+--
+-- Name: switches_pkey; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
+--
+
+ALTER TABLE ONLY switches
+ ADD CONSTRAINT switches_pkey PRIMARY KEY (switch);
+
+
+--
+-- Name: switches_sysname_key; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
+--
+
+ALTER TABLE ONLY switches
+ ADD CONSTRAINT switches_sysname_key UNIQUE (sysname);
+
+
+--
+-- Name: switches_sysname_key1; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
+--
+
+ALTER TABLE ONLY switches
+ ADD CONSTRAINT switches_sysname_key1 UNIQUE (sysname);
+
+
+--
+-- Name: dhcp_ip; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX dhcp_ip ON dhcp USING btree (ip);
+
+
+--
+-- Name: dhcp_mac; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX dhcp_mac ON dhcp USING btree (mac);
+
+
+--
+-- Name: dhcp_switch; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX dhcp_switch ON dhcp USING btree (switch);
+
+
+--
+-- Name: dhcp_time; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX dhcp_time ON dhcp USING btree ("time");
+
+
+--
+-- Name: ping_index; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX ping_index ON ping USING btree ("time");
+
+
+--
+-- Name: ping_secondary_index; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX ping_secondary_index ON ping_secondary_ip USING btree ("time");
+
+
+--
+-- Name: seen_mac_addr_family; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX seen_mac_addr_family ON seen_mac USING btree (family(address));
+
+
+--
+-- Name: seen_mac_seen; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX seen_mac_seen ON seen_mac USING btree (seen);
+
+
+--
+-- Name: snmp_time; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX snmp_time ON snmp USING btree ("time");
+
+
+--
+-- Name: snmp_time15; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX snmp_time15 ON snmp USING btree (id, switch);
+
+
+--
+-- Name: snmp_time6; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX snmp_time6 ON snmp USING btree ("time" DESC, switch);
+
+
+--
+-- Name: switches_switch; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX switches_switch ON switches USING hash (switch);
+
+
+--
+-- Name: updated_index2; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX updated_index2 ON linknet_ping USING btree ("time");
+
+
+--
+-- Name: updated_index3; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX updated_index3 ON ping_secondary_ip USING btree ("time");
+
+
+--
+-- Name: dhcp_switch_fkey; Type: FK CONSTRAINT; Schema: public; Owner: nms
+--
+
+ALTER TABLE ONLY dhcp
+ ADD CONSTRAINT dhcp_switch_fkey FOREIGN KEY (switch) REFERENCES switches(switch);
+
+
+--
+-- Name: snmp_switch_fkey; Type: FK CONSTRAINT; Schema: public; Owner: nms
+--
+
+ALTER TABLE ONLY snmp
+ ADD CONSTRAINT snmp_switch_fkey FOREIGN KEY (switch) REFERENCES switches(switch);
+
+
+--
+-- Name: switchname; Type: FK CONSTRAINT; Schema: public; Owner: nms
+--
+
+ALTER TABLE ONLY ping
+ ADD CONSTRAINT switchname FOREIGN KEY (switch) REFERENCES switches(switch);
+
+
+--
+-- Name: public; Type: ACL; Schema: -; Owner: postgres
+--
+
+REVOKE ALL ON SCHEMA public FROM PUBLIC;
+REVOKE ALL ON SCHEMA public FROM postgres;
+GRANT ALL ON SCHEMA public TO postgres;
+GRANT ALL ON SCHEMA public TO PUBLIC;
+
+
+--
+-- Name: config; Type: ACL; Schema: public; Owner: nms
+--
+
+REVOKE ALL ON TABLE config FROM PUBLIC;
+REVOKE ALL ON TABLE config FROM nms;
+GRANT ALL ON TABLE config TO nms;
+
+
+--
+-- Name: dhcp; Type: ACL; Schema: public; Owner: nms
+--
+
+REVOKE ALL ON TABLE dhcp FROM PUBLIC;
+REVOKE ALL ON TABLE dhcp FROM nms;
+GRANT ALL ON TABLE dhcp TO nms;
+
+
+--
+-- Name: linknet_ping; Type: ACL; Schema: public; Owner: nms
+--
+
+REVOKE ALL ON TABLE linknet_ping FROM PUBLIC;
+REVOKE ALL ON TABLE linknet_ping FROM nms;
+GRANT ALL ON TABLE linknet_ping TO nms;
+
+
+--
+-- Name: linknets; Type: ACL; Schema: public; Owner: nms
+--
+
+REVOKE ALL ON TABLE linknets FROM PUBLIC;
+REVOKE ALL ON TABLE linknets FROM nms;
+GRANT ALL ON TABLE linknets TO nms;
+
+
+--
+-- Name: ping; Type: ACL; Schema: public; Owner: nms
+--
+
+REVOKE ALL ON TABLE ping FROM PUBLIC;
+REVOKE ALL ON TABLE ping FROM nms;
+GRANT ALL ON TABLE ping TO nms;
+
+
+--
+-- Name: ping_secondary_ip; Type: ACL; Schema: public; Owner: nms
+--
+
+REVOKE ALL ON TABLE ping_secondary_ip FROM PUBLIC;
+REVOKE ALL ON TABLE ping_secondary_ip FROM nms;
+GRANT ALL ON TABLE ping_secondary_ip TO nms;
+
+
+--
+-- Name: seen_mac; Type: ACL; Schema: public; Owner: nms
+--
+
+REVOKE ALL ON TABLE seen_mac FROM PUBLIC;
+REVOKE ALL ON TABLE seen_mac FROM nms;
+GRANT ALL ON TABLE seen_mac TO nms;
+
+
+--
+-- Name: snmp; Type: ACL; Schema: public; Owner: nms
+--
+
+REVOKE ALL ON TABLE snmp FROM PUBLIC;
+REVOKE ALL ON TABLE snmp FROM nms;
+GRANT ALL ON TABLE snmp TO nms;
+GRANT ALL ON TABLE snmp TO postgres;
+
+
+--
+-- Name: snmp_id_seq; Type: ACL; Schema: public; Owner: nms
+--
+
+REVOKE ALL ON SEQUENCE snmp_id_seq FROM PUBLIC;
+REVOKE ALL ON SEQUENCE snmp_id_seq FROM nms;
+GRANT ALL ON SEQUENCE snmp_id_seq TO nms;
+GRANT ALL ON SEQUENCE snmp_id_seq TO postgres;
+
+
+--
+-- Name: switches; Type: ACL; Schema: public; Owner: nms
+--
+
+REVOKE ALL ON TABLE switches FROM PUBLIC;
+REVOKE ALL ON TABLE switches FROM nms;
+GRANT ALL ON TABLE switches TO nms;
+
+
+--
+-- PostgreSQL database dump complete
diff --git a/ansible/roles/postgres/files/schema.sql b/ansible/roles/postgres/files/schema.sql
index ed94e80..0be7d17 100644
--- a/ansible/roles/postgres/files/schema.sql
+++ b/ansible/roles/postgres/files/schema.sql
@@ -10,14 +10,14 @@ SET check_function_bodies = false;
SET client_min_messages = warning;
--
--- Name: plpgsql; Type: EXTENSION; Schema: -; Owner:
+-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner:
--
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
--
--- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner:
+-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner:
--
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
@@ -44,7 +44,7 @@ SET default_tablespace = '';
SET default_with_oids = false;
--
--- Name: config; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: config; Type: TABLE; Schema: public; Owner: nms; Tablespace:
--
CREATE TABLE config (
@@ -79,11 +79,11 @@ ALTER SEQUENCE config_id_seq OWNED BY config.id;
--
--- Name: dhcp; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: dhcp; Type: TABLE; Schema: public; Owner: nms; Tablespace:
--
CREATE TABLE dhcp (
- switch integer,
+ network integer,
"time" timestamp with time zone,
mac macaddr,
ip inet,
@@ -94,7 +94,7 @@ CREATE TABLE dhcp (
ALTER TABLE dhcp OWNER TO nms;
--
--- Name: linknet_ping; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: linknet_ping; Type: TABLE; Schema: public; Owner: nms; Tablespace:
--
CREATE TABLE linknet_ping (
@@ -108,7 +108,7 @@ CREATE TABLE linknet_ping (
ALTER TABLE linknet_ping OWNER TO nms;
--
--- Name: linknets; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: linknets; Type: TABLE; Schema: public; Owner: nms; Tablespace:
--
CREATE TABLE linknets (
@@ -146,7 +146,42 @@ ALTER SEQUENCE linknets_linknet_seq OWNED BY linknets.linknet;
--
--- Name: oplog; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: networks; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE networks (
+ network integer DEFAULT nextval(('"networks_network_seq"'::text)::regclass) NOT NULL,
+ name character varying NOT NULL,
+ last_updated timestamp with time zone,
+ placement box,
+ subnet4 cidr,
+ subnet6 cidr,
+ gw4 inet,
+ gw6 inet,
+ routing_point character varying,
+ vlan integer,
+ tags jsonb DEFAULT '[]'::jsonb
+);
+
+
+ALTER TABLE networks OWNER TO nms;
+
+--
+-- Name: networks_network_seq; Type: SEQUENCE; Schema: public; Owner: nms
+--
+
+CREATE SEQUENCE networks_network_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE networks_network_seq OWNER TO nms;
+
+--
+-- Name: oplog; Type: TABLE; Schema: public; Owner: nms; Tablespace:
--
CREATE TABLE oplog (
@@ -182,7 +217,7 @@ ALTER SEQUENCE oplog_id_seq OWNED BY oplog.id;
--
--- Name: ping; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: ping; Type: TABLE; Schema: public; Owner: nms; Tablespace:
--
CREATE TABLE ping (
@@ -195,7 +230,7 @@ CREATE TABLE ping (
ALTER TABLE ping OWNER TO nms;
--
--- Name: ping_secondary_ip; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: ping_secondary_ip; Type: TABLE; Schema: public; Owner: nms; Tablespace:
--
CREATE TABLE ping_secondary_ip (
@@ -208,7 +243,7 @@ CREATE TABLE ping_secondary_ip (
ALTER TABLE ping_secondary_ip OWNER TO nms;
--
--- Name: seen_mac; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: seen_mac; Type: TABLE; Schema: public; Owner: nms; Tablespace:
--
CREATE TABLE seen_mac (
@@ -221,7 +256,7 @@ CREATE TABLE seen_mac (
ALTER TABLE seen_mac OWNER TO nms;
--
--- Name: snmp; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: snmp; Type: TABLE; Schema: public; Owner: nms; Tablespace:
--
CREATE TABLE snmp (
@@ -256,24 +291,26 @@ ALTER SEQUENCE snmp_id_seq OWNED BY snmp.id;
--
--- Name: switches; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: switches; Type: TABLE; Schema: public; Owner: nms; Tablespace:
--
CREATE TABLE switches (
switch integer DEFAULT nextval(('"switches_switch_seq"'::text)::regclass) NOT NULL,
mgmt_v4_addr inet,
- mgmt_v6_addr inet,
- mgmt_vlan character varying,
sysname character varying NOT NULL,
last_updated timestamp with time zone,
locked boolean DEFAULT false NOT NULL,
poll_frequency interval DEFAULT '00:01:00'::interval NOT NULL,
community character varying DEFAULT 'FullPuppTilNMS'::character varying NOT NULL,
+ mgmt_v6_addr inet,
placement box,
distro_name character varying,
distro_phy_port character varying(100),
+ tags jsonb DEFAULT '[]'::jsonb,
+ deleted boolean DEFAULT false,
+ mgmt_vlan character varying,
traffic_vlan character varying,
- tags jsonb DEFAULT '[]'::jsonb
+ network integer
);
@@ -294,35 +331,6 @@ CREATE SEQUENCE switches_switch_seq
ALTER TABLE switches_switch_seq OWNER TO nms;
--
--- Name: networks; Type: TABLE; Schema: public; Owner: nms; Tablespace:
---
-
-CREATE TABLE networks (
- network integer DEFAULT nextval(('"networks_network_seq"'::text)::regclass) NOT NULL,
- name character varying NOT NULL,
- last_updated timestamp with time zone,
- placement box,
- subnet4 cidr,
- subnet6 cidr,
- gw4 inet,
- gw6 inet,
- routing_point character varying,
- vlan integer,
- tags jsonb DEFAULT '[]'::jsonb
-);
-
-ALTER TABLE networks OWNER TO nms;
-
-CREATE SEQUENCE networks_network_seq
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-ALTER TABLE networks_network_seq OWNER TO nms;
-
---
-- Name: id; Type: DEFAULT; Schema: public; Owner: nms
--
@@ -351,7 +359,7 @@ ALTER TABLE ONLY snmp ALTER COLUMN id SET DEFAULT nextval('snmp_id_seq'::regclas
--
--- Name: seen_mac_pkey; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
+-- Name: seen_mac_pkey; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
--
ALTER TABLE ONLY seen_mac
@@ -359,7 +367,7 @@ ALTER TABLE ONLY seen_mac
--
--- Name: switches_pkey; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
+-- Name: switches_pkey; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
--
ALTER TABLE ONLY switches
@@ -367,7 +375,7 @@ ALTER TABLE ONLY switches
--
--- Name: switches_sysname_key; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
+-- Name: switches_sysname_key; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
--
ALTER TABLE ONLY switches
@@ -375,7 +383,7 @@ ALTER TABLE ONLY switches
--
--- Name: switches_sysname_key1; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
+-- Name: switches_sysname_key1; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
--
ALTER TABLE ONLY switches
@@ -383,112 +391,104 @@ ALTER TABLE ONLY switches
--
--- Name: dhcp_ip; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: dhcp_ip; Type: INDEX; Schema: public; Owner: nms; Tablespace:
--
CREATE INDEX dhcp_ip ON dhcp USING btree (ip);
--
--- Name: dhcp_mac; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: dhcp_mac; Type: INDEX; Schema: public; Owner: nms; Tablespace:
--
CREATE INDEX dhcp_mac ON dhcp USING btree (mac);
--
--- Name: dhcp_switch; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: dhcp_network; Type: INDEX; Schema: public; Owner: nms; Tablespace:
--
-CREATE INDEX dhcp_switch ON dhcp USING btree (switch);
+CREATE INDEX dhcp_network ON dhcp USING btree (network);
--
--- Name: dhcp_time; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: dhcp_time; Type: INDEX; Schema: public; Owner: nms; Tablespace:
--
CREATE INDEX dhcp_time ON dhcp USING btree ("time");
--
--- Name: ping_index; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: ping_index; Type: INDEX; Schema: public; Owner: nms; Tablespace:
--
CREATE INDEX ping_index ON ping USING btree ("time");
--
--- Name: ping_secondary_index; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: ping_secondary_index; Type: INDEX; Schema: public; Owner: nms; Tablespace:
--
CREATE INDEX ping_secondary_index ON ping_secondary_ip USING btree ("time");
--
--- Name: seen_mac_addr_family; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: seen_mac_addr_family; Type: INDEX; Schema: public; Owner: nms; Tablespace:
--
CREATE INDEX seen_mac_addr_family ON seen_mac USING btree (family(address));
--
--- Name: seen_mac_seen; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: seen_mac_seen; Type: INDEX; Schema: public; Owner: nms; Tablespace:
--
CREATE INDEX seen_mac_seen ON seen_mac USING btree (seen);
--
--- Name: snmp_time; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: snmp_time; Type: INDEX; Schema: public; Owner: nms; Tablespace:
--
CREATE INDEX snmp_time ON snmp USING btree ("time");
--
--- Name: snmp_time15; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: snmp_time15; Type: INDEX; Schema: public; Owner: nms; Tablespace:
--
CREATE INDEX snmp_time15 ON snmp USING btree (id, switch);
--
--- Name: snmp_time6; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: snmp_time6; Type: INDEX; Schema: public; Owner: nms; Tablespace:
--
CREATE INDEX snmp_time6 ON snmp USING btree ("time" DESC, switch);
--
--- Name: switches_switch; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: switches_switch; Type: INDEX; Schema: public; Owner: nms; Tablespace:
--
CREATE INDEX switches_switch ON switches USING hash (switch);
--
--- Name: updated_index2; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: updated_index2; Type: INDEX; Schema: public; Owner: nms; Tablespace:
--
CREATE INDEX updated_index2 ON linknet_ping USING btree ("time");
--
--- Name: updated_index3; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: updated_index3; Type: INDEX; Schema: public; Owner: nms; Tablespace:
--
CREATE INDEX updated_index3 ON ping_secondary_ip USING btree ("time");
--
--- Name: dhcp_switch_fkey; Type: FK CONSTRAINT; Schema: public; Owner: nms
---
-
-ALTER TABLE ONLY dhcp
- ADD CONSTRAINT dhcp_switch_fkey FOREIGN KEY (switch) REFERENCES switches(switch);
-
-
---
-- Name: snmp_switch_fkey; Type: FK CONSTRAINT; Schema: public; Owner: nms
--
@@ -551,6 +551,24 @@ GRANT ALL ON TABLE linknets TO nms;
--
+-- Name: networks; Type: ACL; Schema: public; Owner: nms
+--
+
+REVOKE ALL ON TABLE networks FROM PUBLIC;
+REVOKE ALL ON TABLE networks FROM nms;
+GRANT ALL ON TABLE networks TO nms;
+
+
+--
+-- Name: oplog; Type: ACL; Schema: public; Owner: nms
+--
+
+REVOKE ALL ON TABLE oplog FROM PUBLIC;
+REVOKE ALL ON TABLE oplog FROM nms;
+GRANT ALL ON TABLE oplog TO nms;
+
+
+--
-- Name: ping; Type: ACL; Schema: public; Owner: nms
--
diff --git a/ansible/roles/web/tasks/main.yml b/ansible/roles/web/tasks/main.yml
index d05c6db..dce3f4c 100644
--- a/ansible/roles/web/tasks/main.yml
+++ b/ansible/roles/web/tasks/main.yml
@@ -30,7 +30,6 @@
- perl-modules
- libfreezethaw-perl
- apache2
- - libapache2-mod-proxy-html
- libxml2-dev
- build-essential
- cpanminus
diff --git a/build/schema.sql b/build/schema.sql
index 41d513d..9288098 100644
--- a/build/schema.sql
+++ b/build/schema.sql
@@ -2,12 +2,18 @@
-- PostgreSQL database dump
--
+-- Dumped from database version 9.6.10
+-- Dumped by pg_dump version 9.6.10
+
SET statement_timeout = 0;
SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
+SET row_security = off;
--
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner:
@@ -23,13 +29,11 @@ CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
-SET search_path = public, pg_catalog;
-
--
-- Name: comment_state; Type: TYPE; Schema: public; Owner: nms
--
-CREATE TYPE comment_state AS ENUM (
+CREATE TYPE public.comment_state AS ENUM (
'active',
'inactive',
'persist',
@@ -37,17 +41,17 @@ CREATE TYPE comment_state AS ENUM (
);
-ALTER TYPE comment_state OWNER TO nms;
+ALTER TYPE public.comment_state OWNER TO nms;
SET default_tablespace = '';
SET default_with_oids = false;
--
--- Name: config; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: config; Type: TABLE; Schema: public; Owner: nms
--
-CREATE TABLE config (
+CREATE TABLE public.config (
id integer NOT NULL,
publicvhost character varying,
shortname character varying,
@@ -55,13 +59,13 @@ CREATE TABLE config (
);
-ALTER TABLE config OWNER TO nms;
+ALTER TABLE public.config OWNER TO nms;
--
-- Name: config_id_seq; Type: SEQUENCE; Schema: public; Owner: nms
--
-CREATE SEQUENCE config_id_seq
+CREATE SEQUENCE public.config_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
@@ -69,21 +73,21 @@ CREATE SEQUENCE config_id_seq
CACHE 1;
-ALTER TABLE config_id_seq OWNER TO nms;
+ALTER TABLE public.config_id_seq OWNER TO nms;
--
-- Name: config_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: nms
--
-ALTER SEQUENCE config_id_seq OWNED BY config.id;
+ALTER SEQUENCE public.config_id_seq OWNED BY public.config.id;
--
--- Name: dhcp; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: dhcp; Type: TABLE; Schema: public; Owner: nms
--
-CREATE TABLE dhcp (
- switch integer,
+CREATE TABLE public.dhcp (
+ network integer,
"time" timestamp with time zone,
mac macaddr,
ip inet,
@@ -91,13 +95,13 @@ CREATE TABLE dhcp (
);
-ALTER TABLE dhcp OWNER TO nms;
+ALTER TABLE public.dhcp OWNER TO nms;
--
--- Name: linknet_ping; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: linknet_ping; Type: TABLE; Schema: public; Owner: nms
--
-CREATE TABLE linknet_ping (
+CREATE TABLE public.linknet_ping (
linknet integer NOT NULL,
"time" timestamp with time zone DEFAULT now() NOT NULL,
latency1_ms double precision,
@@ -105,13 +109,13 @@ CREATE TABLE linknet_ping (
);
-ALTER TABLE linknet_ping OWNER TO nms;
+ALTER TABLE public.linknet_ping OWNER TO nms;
--
--- Name: linknets; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: linknets; Type: TABLE; Schema: public; Owner: nms
--
-CREATE TABLE linknets (
+CREATE TABLE public.linknets (
linknet integer NOT NULL,
switch1 integer NOT NULL,
addr1 inet,
@@ -122,13 +126,13 @@ CREATE TABLE linknets (
);
-ALTER TABLE linknets OWNER TO nms;
+ALTER TABLE public.linknets OWNER TO nms;
--
-- Name: linknets_linknet_seq; Type: SEQUENCE; Schema: public; Owner: nms
--
-CREATE SEQUENCE linknets_linknet_seq
+CREATE SEQUENCE public.linknets_linknet_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
@@ -136,20 +140,74 @@ CREATE SEQUENCE linknets_linknet_seq
CACHE 1;
-ALTER TABLE linknets_linknet_seq OWNER TO nms;
+ALTER TABLE public.linknets_linknet_seq OWNER TO nms;
--
-- Name: linknets_linknet_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: nms
--
-ALTER SEQUENCE linknets_linknet_seq OWNED BY linknets.linknet;
+ALTER SEQUENCE public.linknets_linknet_seq OWNED BY public.linknets.linknet;
+
+
+--
+-- Name: networks; Type: TABLE; Schema: public; Owner: nms
+--
+
+CREATE TABLE public.networks (
+ name character varying NOT NULL,
+ subnet4 cidr,
+ subnet6 cidr,
+ gw4 inet,
+ gw6 inet,
+ vlan integer,
+ tags jsonb DEFAULT '[]'::jsonb,
+ network integer NOT NULL,
+ router integer
+);
+
+
+ALTER TABLE public.networks OWNER TO nms;
+
+--
+-- Name: networks_network_seq; Type: SEQUENCE; Schema: public; Owner: nms
+--
+
+CREATE SEQUENCE public.networks_network_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER TABLE public.networks_network_seq OWNER TO nms;
--
--- Name: oplog; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: networks_networks_seq; Type: SEQUENCE; Schema: public; Owner: nms
--
-CREATE TABLE oplog (
+CREATE SEQUENCE public.networks_networks_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE public.networks_networks_seq OWNER TO nms;
+
+--
+-- Name: networks_networks_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: nms
+--
+
+ALTER SEQUENCE public.networks_networks_seq OWNED BY public.networks.network;
+
+
+--
+-- Name: oplog; Type: TABLE; Schema: public; Owner: nms
+--
+
+CREATE TABLE public.oplog (
id integer NOT NULL,
"time" timestamp with time zone DEFAULT now(),
systems character varying,
@@ -158,13 +216,13 @@ CREATE TABLE oplog (
);
-ALTER TABLE oplog OWNER TO nms;
+ALTER TABLE public.oplog OWNER TO nms;
--
-- Name: oplog_id_seq; Type: SEQUENCE; Schema: public; Owner: nms
--
-CREATE SEQUENCE oplog_id_seq
+CREATE SEQUENCE public.oplog_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
@@ -172,73 +230,73 @@ CREATE SEQUENCE oplog_id_seq
CACHE 1;
-ALTER TABLE oplog_id_seq OWNER TO nms;
+ALTER TABLE public.oplog_id_seq OWNER TO nms;
--
-- Name: oplog_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: nms
--
-ALTER SEQUENCE oplog_id_seq OWNED BY oplog.id;
+ALTER SEQUENCE public.oplog_id_seq OWNED BY public.oplog.id;
--
--- Name: ping; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: ping; Type: TABLE; Schema: public; Owner: nms
--
-CREATE TABLE ping (
+CREATE TABLE public.ping (
switch integer NOT NULL,
"time" timestamp with time zone DEFAULT now() NOT NULL,
latency_ms double precision
);
-ALTER TABLE ping OWNER TO nms;
+ALTER TABLE public.ping OWNER TO nms;
--
--- Name: ping_secondary_ip; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: ping_secondary_ip; Type: TABLE; Schema: public; Owner: nms
--
-CREATE TABLE ping_secondary_ip (
+CREATE TABLE public.ping_secondary_ip (
switch integer NOT NULL,
"time" timestamp with time zone DEFAULT now() NOT NULL,
latency_ms double precision
);
-ALTER TABLE ping_secondary_ip OWNER TO nms;
+ALTER TABLE public.ping_secondary_ip OWNER TO nms;
--
--- Name: seen_mac; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: seen_mac; Type: TABLE; Schema: public; Owner: nms
--
-CREATE TABLE seen_mac (
+CREATE TABLE public.seen_mac (
mac macaddr NOT NULL,
address inet NOT NULL,
seen timestamp with time zone DEFAULT now() NOT NULL
);
-ALTER TABLE seen_mac OWNER TO nms;
+ALTER TABLE public.seen_mac OWNER TO nms;
--
--- Name: snmp; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: snmp; Type: TABLE; Schema: public; Owner: nms
--
-CREATE TABLE snmp (
- "time" timestamp without time zone DEFAULT now() NOT NULL,
+CREATE TABLE public.snmp (
+ "time" timestamp with time zone DEFAULT now() NOT NULL,
switch integer NOT NULL,
data jsonb,
id integer NOT NULL
);
-ALTER TABLE snmp OWNER TO nms;
+ALTER TABLE public.snmp OWNER TO nms;
--
-- Name: snmp_id_seq; Type: SEQUENCE; Schema: public; Owner: nms
--
-CREATE SEQUENCE snmp_id_seq
+CREATE SEQUENCE public.snmp_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
@@ -246,48 +304,45 @@ CREATE SEQUENCE snmp_id_seq
CACHE 1;
-ALTER TABLE snmp_id_seq OWNER TO nms;
+ALTER TABLE public.snmp_id_seq OWNER TO nms;
--
-- Name: snmp_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: nms
--
-ALTER SEQUENCE snmp_id_seq OWNED BY snmp.id;
+ALTER SEQUENCE public.snmp_id_seq OWNED BY public.snmp.id;
--
--- Name: switches; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+-- Name: switches; Type: TABLE; Schema: public; Owner: nms
--
-CREATE TABLE switches (
+CREATE TABLE public.switches (
switch integer DEFAULT nextval(('"switches_switch_seq"'::text)::regclass) NOT NULL,
mgmt_v4_addr inet,
sysname character varying NOT NULL,
last_updated timestamp with time zone,
locked boolean DEFAULT false NOT NULL,
poll_frequency interval DEFAULT '00:01:00'::interval NOT NULL,
- community character varying DEFAULT 'FullPuppTilNMS'::character varying NOT NULL,
+ community character varying DEFAULT 'IskremTilMiddag'::character varying NOT NULL,
mgmt_v6_addr inet,
placement box,
- subnet4 cidr,
- subnet6 cidr,
distro_name character varying,
distro_phy_port character varying(100),
- mgmt_v6_gw inet,
- mgmt_v4_gw inet,
- mgmt_vlan integer DEFAULT 666,
- traffic_vlan integer,
- tags jsonb DEFAULT '[]'::jsonb
+ tags jsonb DEFAULT '[]'::jsonb,
+ deleted boolean DEFAULT false,
+ mgmt_vlan character varying,
+ traffic_vlan character varying
);
-ALTER TABLE switches OWNER TO nms;
+ALTER TABLE public.switches OWNER TO nms;
--
-- Name: switches_switch_seq; Type: SEQUENCE; Schema: public; Owner: nms
--
-CREATE SEQUENCE switches_switch_seq
+CREATE SEQUENCE public.switches_switch_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
@@ -295,290 +350,280 @@ CREATE SEQUENCE switches_switch_seq
CACHE 1;
-ALTER TABLE switches_switch_seq OWNER TO nms;
+ALTER TABLE public.switches_switch_seq OWNER TO nms;
+
+--
+-- Name: config id; Type: DEFAULT; Schema: public; Owner: nms
+--
+
+ALTER TABLE ONLY public.config ALTER COLUMN id SET DEFAULT nextval('public.config_id_seq'::regclass);
+
--
--- Name: id; Type: DEFAULT; Schema: public; Owner: nms
+-- Name: linknets linknet; Type: DEFAULT; Schema: public; Owner: nms
--
-ALTER TABLE ONLY config ALTER COLUMN id SET DEFAULT nextval('config_id_seq'::regclass);
+ALTER TABLE ONLY public.linknets ALTER COLUMN linknet SET DEFAULT nextval('public.linknets_linknet_seq'::regclass);
--
--- Name: linknet; Type: DEFAULT; Schema: public; Owner: nms
+-- Name: networks network; Type: DEFAULT; Schema: public; Owner: nms
--
-ALTER TABLE ONLY linknets ALTER COLUMN linknet SET DEFAULT nextval('linknets_linknet_seq'::regclass);
+ALTER TABLE ONLY public.networks ALTER COLUMN network SET DEFAULT nextval('public.networks_networks_seq'::regclass);
--
--- Name: id; Type: DEFAULT; Schema: public; Owner: nms
+-- Name: oplog id; Type: DEFAULT; Schema: public; Owner: nms
--
-ALTER TABLE ONLY oplog ALTER COLUMN id SET DEFAULT nextval('oplog_id_seq'::regclass);
+ALTER TABLE ONLY public.oplog ALTER COLUMN id SET DEFAULT nextval('public.oplog_id_seq'::regclass);
--
--- Name: id; Type: DEFAULT; Schema: public; Owner: nms
+-- Name: snmp id; Type: DEFAULT; Schema: public; Owner: nms
--
-ALTER TABLE ONLY snmp ALTER COLUMN id SET DEFAULT nextval('snmp_id_seq'::regclass);
+ALTER TABLE ONLY public.snmp ALTER COLUMN id SET DEFAULT nextval('public.snmp_id_seq'::regclass);
--
--- Name: seen_mac_pkey; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
+-- Name: seen_mac seen_mac_pkey; Type: CONSTRAINT; Schema: public; Owner: nms
--
-ALTER TABLE ONLY seen_mac
+ALTER TABLE ONLY public.seen_mac
ADD CONSTRAINT seen_mac_pkey PRIMARY KEY (mac, address, seen);
--
--- Name: switches_pkey; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
+-- Name: switches switches_pkey; Type: CONSTRAINT; Schema: public; Owner: nms
--
-ALTER TABLE ONLY switches
+ALTER TABLE ONLY public.switches
ADD CONSTRAINT switches_pkey PRIMARY KEY (switch);
--
--- Name: switches_sysname_key; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
+-- Name: switches switches_sysname_key; Type: CONSTRAINT; Schema: public; Owner: nms
--
-ALTER TABLE ONLY switches
+ALTER TABLE ONLY public.switches
ADD CONSTRAINT switches_sysname_key UNIQUE (sysname);
--
--- Name: switches_sysname_key1; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
+-- Name: switches switches_sysname_key1; Type: CONSTRAINT; Schema: public; Owner: nms
--
-ALTER TABLE ONLY switches
+ALTER TABLE ONLY public.switches
ADD CONSTRAINT switches_sysname_key1 UNIQUE (sysname);
--
--- Name: dhcp_ip; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: dhcp_ip; Type: INDEX; Schema: public; Owner: nms
+--
+
+CREATE INDEX dhcp_ip ON public.dhcp USING btree (ip);
+
+
+--
+-- Name: dhcp_mac; Type: INDEX; Schema: public; Owner: nms
--
-CREATE INDEX dhcp_ip ON dhcp USING btree (ip);
+CREATE INDEX dhcp_mac ON public.dhcp USING btree (mac);
--
--- Name: dhcp_mac; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: dhcp_network; Type: INDEX; Schema: public; Owner: nms
--
-CREATE INDEX dhcp_mac ON dhcp USING btree (mac);
+CREATE INDEX dhcp_network ON public.dhcp USING btree (network);
--
--- Name: dhcp_switch; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: dhcp_time; Type: INDEX; Schema: public; Owner: nms
--
-CREATE INDEX dhcp_switch ON dhcp USING btree (switch);
+CREATE INDEX dhcp_time ON public.dhcp USING btree ("time");
--
--- Name: dhcp_time; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: ping_index; Type: INDEX; Schema: public; Owner: nms
--
-CREATE INDEX dhcp_time ON dhcp USING btree ("time");
+CREATE INDEX ping_index ON public.ping USING btree ("time");
--
--- Name: ping_index; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: ping_secondary_index; Type: INDEX; Schema: public; Owner: nms
--
-CREATE INDEX ping_index ON ping USING btree ("time");
+CREATE INDEX ping_secondary_index ON public.ping_secondary_ip USING btree ("time");
--
--- Name: ping_secondary_index; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: seen_mac_addr_family; Type: INDEX; Schema: public; Owner: nms
--
-CREATE INDEX ping_secondary_index ON ping_secondary_ip USING btree ("time");
+CREATE INDEX seen_mac_addr_family ON public.seen_mac USING btree (family(address));
--
--- Name: seen_mac_addr_family; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: seen_mac_seen; Type: INDEX; Schema: public; Owner: nms
--
-CREATE INDEX seen_mac_addr_family ON seen_mac USING btree (family(address));
+CREATE INDEX seen_mac_seen ON public.seen_mac USING btree (seen);
--
--- Name: seen_mac_seen; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: snmp_time; Type: INDEX; Schema: public; Owner: nms
--
-CREATE INDEX seen_mac_seen ON seen_mac USING btree (seen);
+CREATE INDEX snmp_time ON public.snmp USING btree ("time");
--
--- Name: snmp_time; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: snmp_time15; Type: INDEX; Schema: public; Owner: nms
--
-CREATE INDEX snmp_time ON snmp USING btree ("time");
+CREATE INDEX snmp_time15 ON public.snmp USING btree (id, switch);
--
--- Name: snmp_time15; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: snmp_time6; Type: INDEX; Schema: public; Owner: nms
--
-CREATE INDEX snmp_time15 ON snmp USING btree (id, switch);
+CREATE INDEX snmp_time6 ON public.snmp USING btree ("time" DESC, switch);
--
--- Name: snmp_time6; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: switches_switch; Type: INDEX; Schema: public; Owner: nms
--
-CREATE INDEX snmp_time6 ON snmp USING btree ("time" DESC, switch);
+CREATE INDEX switches_switch ON public.switches USING hash (switch);
--
--- Name: switches_switch; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: updated_index2; Type: INDEX; Schema: public; Owner: nms
--
-CREATE INDEX switches_switch ON switches USING hash (switch);
+CREATE INDEX updated_index2 ON public.linknet_ping USING btree ("time");
--
--- Name: updated_index2; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: updated_index3; Type: INDEX; Schema: public; Owner: nms
--
-CREATE INDEX updated_index2 ON linknet_ping USING btree ("time");
+CREATE INDEX updated_index3 ON public.ping_secondary_ip USING btree ("time");
--
--- Name: updated_index3; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+-- Name: networks networks_router_fkey; Type: FK CONSTRAINT; Schema: public; Owner: nms
--
-CREATE INDEX updated_index3 ON ping_secondary_ip USING btree ("time");
+ALTER TABLE ONLY public.networks
+ ADD CONSTRAINT networks_router_fkey FOREIGN KEY (router) REFERENCES public.switches(switch);
--
--- Name: dhcp_switch_fkey; Type: FK CONSTRAINT; Schema: public; Owner: nms
+-- Name: snmp snmp_switch_fkey; Type: FK CONSTRAINT; Schema: public; Owner: nms
--
-ALTER TABLE ONLY dhcp
- ADD CONSTRAINT dhcp_switch_fkey FOREIGN KEY (switch) REFERENCES switches(switch);
+ALTER TABLE ONLY public.snmp
+ ADD CONSTRAINT snmp_switch_fkey FOREIGN KEY (switch) REFERENCES public.switches(switch);
--
--- Name: snmp_switch_fkey; Type: FK CONSTRAINT; Schema: public; Owner: nms
+-- Name: ping switchname; Type: FK CONSTRAINT; Schema: public; Owner: nms
--
-ALTER TABLE ONLY snmp
- ADD CONSTRAINT snmp_switch_fkey FOREIGN KEY (switch) REFERENCES switches(switch);
+ALTER TABLE ONLY public.ping
+ ADD CONSTRAINT switchname FOREIGN KEY (switch) REFERENCES public.switches(switch);
--
--- Name: switchname; Type: FK CONSTRAINT; Schema: public; Owner: nms
+-- Name: TABLE config; Type: ACL; Schema: public; Owner: nms
--
-ALTER TABLE ONLY ping
- ADD CONSTRAINT switchname FOREIGN KEY (switch) REFERENCES switches(switch);
+GRANT ALL ON TABLE public.config TO dhcptail;
--
--- Name: public; Type: ACL; Schema: -; Owner: postgres
+-- Name: TABLE dhcp; Type: ACL; Schema: public; Owner: nms
--
-REVOKE ALL ON SCHEMA public FROM PUBLIC;
-REVOKE ALL ON SCHEMA public FROM postgres;
-GRANT ALL ON SCHEMA public TO postgres;
-GRANT ALL ON SCHEMA public TO PUBLIC;
+GRANT ALL ON TABLE public.dhcp TO dhcptail;
--
--- Name: config; Type: ACL; Schema: public; Owner: nms
+-- Name: TABLE linknet_ping; Type: ACL; Schema: public; Owner: nms
--
-REVOKE ALL ON TABLE config FROM PUBLIC;
-REVOKE ALL ON TABLE config FROM nms;
-GRANT ALL ON TABLE config TO nms;
+GRANT ALL ON TABLE public.linknet_ping TO dhcptail;
--
--- Name: dhcp; Type: ACL; Schema: public; Owner: nms
+-- Name: TABLE linknets; Type: ACL; Schema: public; Owner: nms
--
-REVOKE ALL ON TABLE dhcp FROM PUBLIC;
-REVOKE ALL ON TABLE dhcp FROM nms;
-GRANT ALL ON TABLE dhcp TO nms;
+GRANT ALL ON TABLE public.linknets TO dhcptail;
--
--- Name: linknet_ping; Type: ACL; Schema: public; Owner: nms
+-- Name: TABLE networks; Type: ACL; Schema: public; Owner: nms
--
-REVOKE ALL ON TABLE linknet_ping FROM PUBLIC;
-REVOKE ALL ON TABLE linknet_ping FROM nms;
-GRANT ALL ON TABLE linknet_ping TO nms;
+GRANT ALL ON TABLE public.networks TO dhcptail;
--
--- Name: linknets; Type: ACL; Schema: public; Owner: nms
+-- Name: TABLE oplog; Type: ACL; Schema: public; Owner: nms
--
-REVOKE ALL ON TABLE linknets FROM PUBLIC;
-REVOKE ALL ON TABLE linknets FROM nms;
-GRANT ALL ON TABLE linknets TO nms;
+GRANT ALL ON TABLE public.oplog TO dhcptail;
--
--- Name: ping; Type: ACL; Schema: public; Owner: nms
+-- Name: TABLE ping; Type: ACL; Schema: public; Owner: nms
--
-REVOKE ALL ON TABLE ping FROM PUBLIC;
-REVOKE ALL ON TABLE ping FROM nms;
-GRANT ALL ON TABLE ping TO nms;
+GRANT ALL ON TABLE public.ping TO dhcptail;
--
--- Name: ping_secondary_ip; Type: ACL; Schema: public; Owner: nms
+-- Name: TABLE ping_secondary_ip; Type: ACL; Schema: public; Owner: nms
--
-REVOKE ALL ON TABLE ping_secondary_ip FROM PUBLIC;
-REVOKE ALL ON TABLE ping_secondary_ip FROM nms;
-GRANT ALL ON TABLE ping_secondary_ip TO nms;
+GRANT ALL ON TABLE public.ping_secondary_ip TO dhcptail;
--
--- Name: seen_mac; Type: ACL; Schema: public; Owner: nms
+-- Name: TABLE seen_mac; Type: ACL; Schema: public; Owner: nms
--
-REVOKE ALL ON TABLE seen_mac FROM PUBLIC;
-REVOKE ALL ON TABLE seen_mac FROM nms;
-GRANT ALL ON TABLE seen_mac TO nms;
+GRANT ALL ON TABLE public.seen_mac TO dhcptail;
--
--- Name: snmp; Type: ACL; Schema: public; Owner: nms
+-- Name: TABLE snmp; Type: ACL; Schema: public; Owner: nms
--
-REVOKE ALL ON TABLE snmp FROM PUBLIC;
-REVOKE ALL ON TABLE snmp FROM nms;
-GRANT ALL ON TABLE snmp TO nms;
-GRANT ALL ON TABLE snmp TO postgres;
+GRANT ALL ON TABLE public.snmp TO postgres;
+GRANT ALL ON TABLE public.snmp TO dhcptail;
--
--- Name: snmp_id_seq; Type: ACL; Schema: public; Owner: nms
+-- Name: SEQUENCE snmp_id_seq; Type: ACL; Schema: public; Owner: nms
--
-REVOKE ALL ON SEQUENCE snmp_id_seq FROM PUBLIC;
-REVOKE ALL ON SEQUENCE snmp_id_seq FROM nms;
-GRANT ALL ON SEQUENCE snmp_id_seq TO nms;
-GRANT ALL ON SEQUENCE snmp_id_seq TO postgres;
+GRANT ALL ON SEQUENCE public.snmp_id_seq TO postgres;
--
--- Name: switches; Type: ACL; Schema: public; Owner: nms
+-- Name: TABLE switches; Type: ACL; Schema: public; Owner: nms
--
-REVOKE ALL ON TABLE switches FROM PUBLIC;
-REVOKE ALL ON TABLE switches FROM nms;
-GRANT ALL ON TABLE switches TO nms;
+GRANT ALL ON TABLE public.switches TO dhcptail;
--
diff --git a/collectors/dhcptail.pl b/collectors/dhcptail.pl
index 5fd8cf0..5f117b9 100755
--- a/collectors/dhcptail.pl
+++ b/collectors/dhcptail.pl
@@ -27,7 +27,7 @@ my %months = (
my $realtime = 0;
my ($dbh, $q,$check);
$dbh = nms::db_connect();
-$q = $dbh->prepare("INSERT INTO dhcp (dhcp_server,switch,time,ip,mac) VALUES($nms::config::dhcp_id,(SELECT switch FROM switches WHERE ?::inet << subnet4 and deleted = false ORDER BY sysname LIMIT 1),?,?,?)");
+$q = $dbh->prepare("INSERT INTO dhcp (dhcp_server,network,time,ip,mac) VALUES($nms::config::dhcp_id,(SELECT network FROM networks WHERE ?::inet << subnet4 ORDER BY name LIMIT 1),?,?,?)");
$check = $dbh->prepare("SELECT max(time)::timestamp - ?::timestamp < '0s'::interval as doit FROM dhcp where dhcp_server = $nms::config::dhcp_id;");
open(SYSLOG, "tail -n 9999999 -F /var/log/messages |") or die "Unable to tail syslog: $!";
diff --git a/collectors/ping.pl b/collectors/ping.pl
index 82c5c42..e8fcbdd 100755
--- a/collectors/ping.pl
+++ b/collectors/ping.pl
@@ -29,6 +29,9 @@ while (1) {
if ($elapsed < $target) {
sleep($target - ($now - $last));
}
+
+ my @influx_tree = ();
+
$last = time();
# ping loopbacks
my $ping = Net::Oping->new;
@@ -82,27 +85,18 @@ while (1) {
$latency //= "\\N";
$dbh->pg_putcopydata("$switch\t$latency\n");
if($latency ne "\\N") {
- my $cv = AE::cv;
- $influx->write(
- database => $nms::config::influx_database,
- data => [
- {
- measurement => 'ping',
- tags => {
- switch => $sysname,
- ip => $ip,
- version => 'v4'
- },
- fields => {
- latency => $latency,
- },
- }],
- on_success => $cv,
- on_error => sub {
- $cv->croak("Failed to write data: @_");
- }
- );
- $cv->recv;
+ push (@influx_tree,
+ {
+ measurement => 'ping',
+ tags => {
+ switch => $sysname,
+ ip => $ip,
+ version => 'v4'
+ },
+ fields => {
+ latency => $latency,
+ },
+ });
}
}
@@ -120,29 +114,20 @@ while (1) {
$latency //= "\\N";
$dbh->pg_putcopydata("$switch\t$latency\n");
- if($latency ne "\\N") {
- my $cv = AE::cv;
- $influx->write(
- database => $nms::config::influx_database,
- data => [
- {
- measurement => 'ping',
- tags => {
- switch => $sysname,
- ip => $ip,
- version => 'v6'
- },
- fields => {
- latency => $latency,
- },
- }],
- on_success => $cv,
- on_error => sub {
- $cv->croak("Failed to write data: @_");
- }
- );
- $cv->recv;
- }
+ if($latency ne "\\N") {
+ push (@influx_tree,
+ {
+ measurement => 'ping',
+ tags => {
+ switch => $sysname,
+ ip => $ip,
+ version => 'v6'
+ },
+ fields => {
+ latency => $latency,
+ },
+ });
+ }
}
$dbh->pg_putcopyend();
@@ -172,4 +157,16 @@ while (1) {
$dbh->pg_putcopyend();
}
$dbh->commit;
+
+ my $cv = AE::cv;
+ $influx->write(
+ database => $nms::config::influx_database,
+ data => [@influx_tree],
+ on_success => $cv,
+ on_error => sub {
+ $cv->croak("Failed to write data: @_");
+ }
+ );
+ $cv->recv;
+
}
diff --git a/collectors/snmpfetchng.pl b/collectors/snmpfetchng.pl
index 9c06f4a..02b75b8 100755
--- a/collectors/snmpfetchng.pl
+++ b/collectors/snmpfetchng.pl
@@ -4,9 +4,10 @@ use warnings;
use DBI;
use POSIX;
#use Time::HiRes qw(time);
+use lib '/opt/gondul/include';
+use FixedSNMP;
use SNMP;
use Data::Dumper;
-use lib '/opt/gondul/include';
use nms qw(convert_mac convert_decimal);
use IO::Socket::IP;
use Scalar::Util qw(looks_like_number);
@@ -32,7 +33,7 @@ EOF
# Borrowed from snmpfetch.pl
our $qswitch = $dbh->prepare(<<"EOF")
SELECT
- sysname,switch,host(mgmt_v4_addr) as ip,host(mgmt_v6_addr) as ip2,community,
+ sysname,switch,host(mgmt_v6_addr) as ip2,host(mgmt_v4_addr) as ip,community,
DATE_TRUNC('second', now() - last_updated - poll_frequency) AS overdue
FROM
switches
@@ -103,7 +104,7 @@ sub inner_loop
}
}
mylog( "Polling " . @switches . " switches: $poll_todo");
- SNMP::MainLoop(6);
+ SNMP::MainLoop(5);
}
sub callback{
@@ -115,6 +116,7 @@ sub callback{
my @nicids;
my $total = 0;
my %tree2;
+ my @influx_tree = ();
for my $ret (@top) {
for my $var (@{$ret}) {
@@ -162,65 +164,45 @@ sub callback{
for my $nic (@nicids) {
$tree2{'ports'}{$tree{$nic}{'ifName'}} = $tree{$nic};
my $tmp_field = '';
- for my $tmp_key (keys $tree{$nic}) {
+ for my $tmp_key (keys %{$tree{$nic}}) {
if(looks_like_number($tree{$nic}{$tmp_key})) {
$tmp_field = $tree{$nic}{$tmp_key};
} else {
$tmp_field = '"'.$tree{$nic}{$tmp_key}.'"';
}
-
- my $cv = AE::cv;
- $influx->write(
- database => $nms::config::influx_database,
- data => [
+ push (@influx_tree,
{
measurement => 'ports',
tags => {
switch => $switch{'sysname'},
- interface => $tree{$nic}{'ifName'},
+ interface => $tree{$nic}{'ifName'},
},
fields => { $tmp_key => $tmp_field },
- }],
- on_success => $cv,
- on_error => sub {
- $cv->croak("Failed to write data: @_");
- }
- );
- $cv->recv;
+ });
}
delete $tree{$nic};
}
+
for my $iid (keys %tree) {
my $tmp_field = '';
for my $key (keys %{$tree{$iid}}) {
$tree2{'misc'}{$key}{$iid} = $tree{$iid}{$key};
- if(looks_like_number($tree{$iid}{$key})) {
+ if(looks_like_number($tree{$iid}{$key})) {
$tmp_field = $tree{$iid}{$key};
} else {
$tmp_field = '"'.$tree{$iid}{$key}.'"';
}
- my $cv = AE::cv;
- $influx->write(
- database => $nms::config::influx_database,
- data => [
+ push (@influx_tree,
{
measurement => 'snmp',
tags => {
switch => $switch{'sysname'},
},
fields => { $key => $tmp_field },
- }],
- on_success => $cv,
- on_error => sub {
- $cv->croak("Failed to write data: @_");
- }
- );
- $cv->recv;
-
-
+ });
}
}
if ($total > 0) {
@@ -230,21 +212,22 @@ sub callback{
or die "Couldn't unlock switch";
$dbh->commit;
if ($total > 0) {
- my $cv = AE::cv;
- $influx->write(
- database => $nms::config::influx_database,
- data => [
- {
- measurement => 'snmp',
- tags => {
- switch => $switch{'sysname'},
- },
- fields => { 'execution_time' => (time - $switch{'start'}) },
- }],
- on_success => $cv,
- on_error => sub {
- $cv->croak("Failed to write data: @_");
- }
+ push (@influx_tree,
+ {
+ measurement => 'snmp',
+ tags => {
+ switch => $switch{'sysname'},
+ },
+ fields => { 'execution_time' => (time - $switch{'start'}) },
+ });
+ my $cv = AE::cv;
+ $influx->write(
+ database => $nms::config::influx_database,
+ data => [@influx_tree],
+ on_success => $cv,
+ on_error => sub {
+ $cv->croak("Failed to write data: @_");
+ }
);
$cv->recv;
diff --git a/include/config.pm b/include/config.pm.dist
index dcc784d..78f03cc 100755
--- a/include/config.pm
+++ b/include/config.pm.dist
@@ -14,7 +14,7 @@ our $graphite_port = "2003";
# Influx
our $influx_host = "http://localhost:8086";
our $influx_username = "gondulWrite";
-our $influx_password = "funfunfunWrite";
+our $influx_password = "pasr";
our $influx_database = "gondul";
# Max SNMP polls to fire off at the same time.
diff --git a/include/nms/snmp.pm b/include/nms/snmp.pm
index 45ab6c6..6165a5a 100644
--- a/include/nms/snmp.pm
+++ b/include/nms/snmp.pm
@@ -1,6 +1,7 @@
#! /usr/bin/perl
use strict;
use warnings;
+use FixedSNMP;
use SNMP;
use nms;
package nms::snmp;
diff --git a/include/nms/util.pm b/include/nms/util.pm
index 511da33..69f5392 100644
--- a/include/nms/util.pm
+++ b/include/nms/util.pm
@@ -91,10 +91,11 @@ sub guess_placement_dx {
$y = 880;
$xx = $x + 230;
$yy = $y + 40;
- } elsif ($name =~ /^distro(\d)$/) {
+ } elsif ($name =~ /^s(\d).floor$/) {
my $d = ($1);
+ $d -= 1;
$src = "distro";
- $x = 1550 - $d * 700;
+ $x = 1550 - $d * 600;
$y = 410;
$xx = $x + 230;
$yy = $y + 40;
@@ -180,11 +181,12 @@ sub guess_placement_tg {
$y = int(759 + 20.5 * $s);
$xx = $x + 65;
$yy = $y + 14;
- } elsif ($name =~ /^distro(\d)/) {
+ } elsif ($name =~ /^s(\d).floor/) {
my $d = ($1);
$src = "distro";
- $x = 292 + $d * 165;
- $y = 415;
+ $d -= 1;
+ $x = 260 + $d * 145;
+ $y = 417;
$xx = $x + 130;
$yy = $y + 20;
} else {
diff --git a/include/nms/web.pm b/include/nms/web.pm
index 6592bfb..588498f 100755
--- a/include/nms/web.pm
+++ b/include/nms/web.pm
@@ -85,7 +85,8 @@ sub finalize_output {
$json{'time'} = int($query->fetchrow_hashref()->{'time'});
$json{'hash'} = $hash;
if (defined($get_params{'now'})) {
- $cc{'max-age'} = "3600";
+ $cc{'max-age'} = "60";
+ $cc{'stale-while-revalidate'} = "3600";
}
printcc;
diff --git a/templating/templating.py b/templating/templating.py
index 9794655..fff5d42 100755
--- a/templating/templating.py
+++ b/templating/templating.py
@@ -3,14 +3,15 @@
import requests,traceback
from jinja2 import Template,Environment,FileSystemLoader,TemplateNotFound
import json
+import netaddr
import http.server
from enum import Enum
-endpoints = "read/oplog read/snmp read/switches-management public/config public/dhcp public/dhcp-summary public/ping public/switches public/switch-state".split()
+endpoints = "read/networks read/oplog read/snmp read/switches-management public/distro-tree public/config public/dhcp public/dhcp-summary public/ping public/switches public/switch-state".split()
objects = dict()
def getEndpoint(endpoint):
- r = requests.get("http://localhost:8080/api/%s" % endpoint)
+ r = requests.get("http://localhost:80/api/%s" % endpoint)
if (r.status_code != 200):
raise Exception("Bad status code for endpoint %s: %s" % (endpoint, r.status_code))
return r.json()
@@ -19,7 +20,33 @@ def updateData():
for a in endpoints:
objects[a] = getEndpoint(a)
-env = Environment(loader=FileSystemLoader(['templates/','/opt/gondul/data/templates', '/opt/gondul/web/templates']),lstrip_blocks=True, trim_blocks=True)
+def netmask(ip):
+ return netaddr.IPNetwork(ip).netmask
+def cidr(ip):
+ return netaddr.IPNetwork(ip).prefixlen
+def networkId(ip):
+ return netaddr.IPNetwork(ip).ip
+def getFirstDhcpIp(ip):
+ return netaddr.IPNetwork(ip)[3]
+def getLastDhcpIp(ip):
+ return netaddr.IPNetwork(ip)[-1]
+def getDistro(src):
+ return src.split(":")[0]
+def getPort(src):
+ return src.split(":")[1]
+def getFirstFapIp(ip):
+ return netaddr.IPNetwork(ip)[netaddr.IPNetwork(ip).size/2]
+
+env = Environment(loader=FileSystemLoader(['templates/','/opt/gondul/data/templates', '/opt/gondul/web/templates']), trim_blocks=True)
+
+env.filters["netmask"] = netmask
+env.filters["cidr"] = cidr
+env.filters["networkId"] = networkId
+env.filters["getFirstDhcpIp"] = getFirstDhcpIp
+env.filters["getLastDhcpIp"] = getLastDhcpIp
+env.filters["agentDistro"] = getDistro
+env.filters["agentPort"] = getPort
+env.filters["getFirstFapIP"] = getFirstFapIp
class Mode(Enum):
Get = 1
diff --git a/web/api/public/dhcp b/web/api/public/dhcp
index 0b0bb49..f153a49 100755
--- a/web/api/public/dhcp
+++ b/web/api/public/dhcp
@@ -8,16 +8,16 @@ use warnings;
use Data::Dumper;
nms::web::setwhen('60m');
-my $q = $nms::web::dbh->prepare('select distinct on (sysname) extract(epoch from date_trunc(\'second\',time)) as time,sysname from dhcp join switches on dhcp.switch = switches.switch where ' . $nms::web::when . ' and switches.deleted = false order by sysname,time desc;');
+my $q = $nms::web::dbh->prepare('select distinct on (name) extract(epoch from date_trunc(\'second\',time)) as time,name from dhcp join networks on dhcp.network = networks.network where ' . $nms::web::when . ' order by name,time desc;');
$q->execute();
while ( my $ref = $q->fetchrow_hashref() ) {
- my $sysname = $ref->{'sysname'};
- $json{'dhcp'}{$ref->{'sysname'}} = $ref->{'time'};
+ my $sysname = $ref->{'sname'};
+ $json{'dhcp'}{$ref->{'name'}} = $ref->{'time'};
}
-my $q2 = $nms::web::dbh->prepare("select sysname,count(distinct mac) as clients,count(distinct ip) as addresses,count(mac) as acks from dhcp natural join switches where $nms::web::when and switches.deleted = false group by switches.sysname;");
+my $q2 = $nms::web::dbh->prepare("select name,count(distinct mac) as clients,count(distinct ip) as addresses,count(mac) as acks from dhcp natural join networks where $nms::web::when group by networks.name;");
$q2->execute();
while (my $ref = $q2->fetchrow_hashref()) {
- $nms::web::json{'switches'}{$ref->{sysname}} = $ref;
+ $nms::web::json{'networks'}{$ref->{name}} = $ref;
}
$nms::web::cc{'max-age'} = "10";
diff --git a/web/api/public/distro-tree b/web/api/public/distro-tree
index cff35ec..49ce607 100755
--- a/web/api/public/distro-tree
+++ b/web/api/public/distro-tree
@@ -10,16 +10,18 @@ use strict;
use warnings;
use Data::Dumper;
-$nms::web::cc{'max-age'} = "20";
+$nms::web::cc{'max-age'} = "5";
+$nms::web::cc{'stale-while-revalidate'} = "30";
my $q2 = $nms::web::dbh->prepare('select sysname,distro_phy_port,distro_name from switches where placement is not null and distro_name is not null and distro_phy_port is not null and deleted = false');
$q2->execute();
while (my $ref = $q2->fetchrow_hashref()) {
my $sysname = $ref->{'sysname'};
- my $phy = $ref->{'distro_phy_port'};
my $distro = $ref->{'distro_name'};
- $nms::web::json{'distro-tree'}{$distro}{$phy} = $sysname;
+ my $phy = $ref->{'distro_phy_port'};
+ $nms::web::json{'distro-tree-phy'}{$distro}{$phy} = $sysname;
+ $nms::web::json{'distro-tree-sys'}{$distro}{$sysname} = $phy;
}
finalize_output();
diff --git a/web/api/public/ping b/web/api/public/ping
index 1928368..be37875 100755
--- a/web/api/public/ping
+++ b/web/api/public/ping
@@ -4,7 +4,7 @@ use strict;
use warnings;
use nms::web;
-nms::web::setwhen('15s');
+nms::web::setwhen('25s');
my $q = $nms::web::dbh->prepare("SELECT DISTINCT ON (sysname) (" . $nms::web::now . " - time) as age,sysname, latency_ms FROM ping NATURAL JOIN switches WHERE time in (select max(time) from ping where "
. $nms::web::when . " group by switch)");
@@ -37,5 +37,5 @@ while ( my $ref = $lq->fetchrow_hashref() ) {
}
$nms::web::cc{'max-age'} = "1";
-$nms::web::cc{'stale-while-revalidate'} = "15";
+$nms::web::cc{'stale-while-revalidate'} = "5";
finalize_output();
diff --git a/web/api/public/switch-state b/web/api/public/switch-state
index 965e881..528bf7d 100755
--- a/web/api/public/switch-state
+++ b/web/api/public/switch-state
@@ -7,17 +7,19 @@ use strict;
use warnings;
use Data::Dumper;
-my $target = $ENV{REQUEST_URI};
-$target =~ s/$ENV{SCRIPT_NAME}//;
-$target =~ s/^\///;
-my ($switch, $port) = split(/\//,$target,2);
+#my $target = $ENV{REQUEST_URI};
+#$target =~ s/$ENV{SCRIPT_NAME}//;
+#$target =~ s/^\///;
+#my ($switch, $port) = split(/\//,$target,2);
+my $port;
+my $switch;
my $q;
-if (!defined($switch)) {
- $q = $nms::web::dbh->prepare('select sysname,extract(epoch from date_trunc(\'second\',time)) as time,data from snmp natural join switches where id in (select max(id) from snmp where ' . $nms::web::when . ' and switches.deleted = false group by switch);');
-} else {
- $q = $nms::web::dbh->prepare('select sysname,extract(epoch from date_trunc(\'second\',time)) as time,data from snmp natural join switches where id in (select max(id) from snmp where ' . $nms::web::when . 'group by switch) and sysname = ' . $nms::web::dbh->quote($switch) . ' and switches.deleted = false;');
-}
+#if (!defined($switch)) {
+ $q = $nms::web::dbh->prepare('select sysname,extract(epoch from date_trunc(\'second\',time)) as time,data from snmp natural join switches where id in (select max(id) from snmp where ' . $nms::web::when . ' group by switch) and switches.deleted = \'f\' and not switches.tags \?& array[\'ignoreswitchstate\'];');
+#} else {
+# $q = $nms::web::dbh->prepare('select sysname,extract(epoch from date_trunc(\'second\',time)) as time,data from snmp natural join switches where id in (select max(id) from snmp where ' . $nms::web::when . 'group by switch) and sysname = ' . $nms::web::dbh->quote($switch) . ';');
+#}
$q->execute();
while ( my $ref = $q->fetchrow_hashref() ) {
@@ -42,7 +44,7 @@ while ( my $ref = $q->fetchrow_hashref() ) {
$json{'switches'}{$sysname}{ifs}{$smallport}{'ifAlias'} = $port{'ifAlias'};
}
if ($data{'ports'}{$porti}{'ifType'} ne "propVirtual" and
- $data{'ports'}{$porti}{'ifAlias'} =~ m/LAG member/i) {
+ $data{'ports'}{$porti}{'ifAlias'} =~ m/Fysisk/i) {
if ($port{'ifAdminStatus'} eq "up") {
$json{'switches'}{$sysname}{'uplinks'}{'ifHCInOctets'} += $port{'ifHCInOctets'};
$json{'switches'}{$sysname}{'uplinks'}{'ifHCOutOctets'} += $port{'ifHCOutOctets'};
@@ -83,9 +85,9 @@ while ( my $ref = $q->fetchrow_hashref() ) {
nms::web::setwhen('15m','10m');
my $q2;
if (!defined($switch)) {
- $q2 = $nms::web::dbh->prepare('select sysname,extract(epoch from date_trunc(\'second\',time)) as time,data from snmp natural join switches where id in (select max(id) from snmp where ' . $nms::web::when . 'group by switch);');
+ $q2 = $nms::web::dbh->prepare('select sysname,extract(epoch from date_trunc(\'second\',time)) as time,data from snmp natural join switches where id in (select max(id) from snmp where ' . $nms::web::when . ' group by switch) and switches.deleted = \'f\' and not switches.tags \?& array[\'ignoreswitchstate\'];');
} else {
- $q2 = $nms::web::dbh->prepare('select sysname,extract(epoch from date_trunc(\'second\',time)) as time,data from snmp natural join switches where id in (select max(id) from snmp where ' . $nms::web::when . 'group by switch) and sysname = ' . $nms::web::dbh->quote($switch) . ';');
+ $q2 = $nms::web::dbh->prepare('select sysname,extract(epoch from date_trunc(\'second\',time)) as time,data from snmp natural join switches where id in (select max(id) from snmp where ' . $nms::web::when . 'group by switch) and switches.deleted = \'f\' and not switches.tags \?& array[\'ignoreswitchstate\'] and sysname = ' . $nms::web::dbh->quote($switch) . ';');
}
$q2->execute();
@@ -109,7 +111,7 @@ while ( my $ref = $q2->fetchrow_hashref() ) {
$json{'then'}{$sysname}{ifs}{$smallport}{'ifAlias'} = $port{'ifAlias'};
}
if ($data{'ports'}{$porti}{'ifType'} ne "propVirtual" and
- $data{'ports'}{$porti}{'ifAlias'} =~ m/LAG member/i) {
+ $data{'ports'}{$porti}{'ifAlias'} =~ m/Fysisk/i) {
if ($port{'ifAdminStatus'} eq "up") {
$json{'then'}{$sysname}{'uplinks'}{'ifHCInOctets'} += $port{'ifHCInOctets'};
$json{'then'}{$sysname}{'uplinks'}{'ifHCOutOctets'} += $port{'ifHCOutOctets'};
diff --git a/web/api/public/switches b/web/api/public/switches
index 8e7f333..9bb63d8 100755
--- a/web/api/public/switches
+++ b/web/api/public/switches
@@ -29,11 +29,4 @@ while (my $ref = $q2->fetchrow_hashref()) {
$nms::web::json{'switches'}{$ref->{'sysname'}}{'tags'} = $data;
}
-my $q4 = $nms::web::dbh->prepare('select linknet, (select sysname from switches where switch = switch1) as sysname1, (select sysname from switches where switch = switch2) as sysname2 from linknets');
-
-$q4->execute();
-while (my $ref = $q4->fetchrow_hashref()) {
- $nms::web::json{'linknets'}{$ref->{'linknet'}} = $ref;
-}
-
finalize_output();
diff --git a/web/api/read/distro-management b/web/api/read/distro-management
deleted file mode 100755
index 7fbebef..0000000
--- a/web/api/read/distro-management
+++ /dev/null
@@ -1,31 +0,0 @@
-#! /usr/bin/perl
-# vim:ts=8:sw=8
-
-use CGI qw(fatalsToBrowser);
-use DBI;
-use lib '/opt/gondul/include';
-use nms;
-use nms::web;
-use strict;
-use warnings;
-use Data::Dumper;
-
-my $target = $ENV{REQUEST_URI};
-$target =~ s/$ENV{SCRIPT_NAME}//;
-$target =~ s/^\///;
-my ($switch, $port) = split(/\//,$target,2);
-my $q2;
-
-$nms::web::cc{'max-age'} = "5";
-$nms::web::cc{'stale-while-revalidate'} = "30";
-
-$q2 = $nms::web::dbh->prepare('SELECT distro_name,sysname,subnet4,subnet6,traffic_vlan,distro_phy_port FROM switches WHERE placement is not null AND distro_name is not null AND distro_phy_port is not null and deleted = false');
-
-$q2->execute();
-while (my $ref = $q2->fetchrow_hashref()) {
- my $sysname = $ref->{'sysname'};
- my $distro = $ref->{'distro_name'};
- $nms::web::json{'distros'}{$distro}{$sysname} = $ref;
-}
-
-finalize_output();
diff --git a/web/api/read/networks b/web/api/read/networks
index 870ae8c..0fbdb15 100644..100755
--- a/web/api/read/networks
+++ b/web/api/read/networks
@@ -13,23 +13,12 @@ use Data::Dumper;
$nms::web::cc{'max-age'} = "5";
$nms::web::cc{'stale-while-revalidate'} = "30";
-my $q2 = $nms::web::dbh->prepare('select network, name, vlan, tags, routing_point, placement, last_updated, subnet4, subnet6, gw4, gw6 from networks');
+my $q2 = $nms::web::dbh->prepare('select name, vlan, networks.tags, switches.sysname as router, subnet4, subnet6, gw4, gw6 from networks left join switches on switches.switch = networks.router');
$q2->execute();
while (my $ref = $q2->fetchrow_hashref()) {
- $ref->{'placement'} =~ /\((-?\d+),(-?\d+)\),\((-?\d+),(-?\d+)\)/;
- my ($x1, $y1, $x2, $y2) = ($1, $2, $3, $4);
my $name = $ref->{'name'};
- $nms::web::json{'networks'}{$ref->{'name'}}{'vlan'} = $ref->{'vlan'};
- $nms::web::json{'networks'}{$ref->{'name'}}{'subnet4'} = $ref->{'subnet4'};
- $nms::web::json{'networks'}{$ref->{'name'}}{'subnet6'} = $ref->{'subnet6'};
- $nms::web::json{'networks'}{$ref->{'name'}}{'gw4'} = $ref->{'gw4'};
- $nms::web::json{'networks'}{$ref->{'name'}}{'gw6'} = $ref->{'gw6'};
- $nms::web::json{'networks'}{$ref->{'name'}}{'placement'}{'x'} = $x2;
- $nms::web::json{'networks'}{$ref->{'name'}}{'placement'}{'y'} = $y2;
- $nms::web::json{'networks'}{$ref->{'name'}}{'placement'}{'width'} = $x1 - $x2;
- $nms::web::json{'networks'}{$ref->{'name'}}{'placement'}{'height'} = $y1 - $y2;
- $nms::web::json{'networks'}{$ref->{'name'}}{'routing_point'} = $ref->{'routing_point'};
+ $nms::web::json{'networks'}{$ref->{'name'}} = $ref;
my $data = JSON::XS::decode_json($ref->{'tags'});
$nms::web::json{'networks'}{$ref->{'name'}}{'tags'} = $data;
}
diff --git a/web/api/read/oplog b/web/api/read/oplog
index fb187ea..f2ed3a7 100755
--- a/web/api/read/oplog
+++ b/web/api/read/oplog
@@ -6,7 +6,14 @@ use nms::web;
use strict;
use warnings;
-my $query = $nms::web::dbh->prepare('select id,date_trunc(\'second\',time) as timestamp,extract(hour from time) as h, extract(minute from time) as m,systems,username,log from oplog order by id desc;');
+my $filter = '';
+
+if (defined($get_params{'now'})) {
+ $filter = "where time < timestamp with time zone 'epoch' + " . db_safe_quote('now') . " * INTERVAL '1 second' ";
+}
+my $query = $nms::web::dbh->prepare('select id,date_trunc(\'second\',time) as timestamp,extract(hour from time) as h, extract(minute from time) as m,systems,username,log from oplog '
+ . $filter .
+'order by id desc;');
$query->execute();
while (my $ref = $query->fetchrow_hashref()) {
my %meh;
diff --git a/web/api/read/switches-management b/web/api/read/switches-management
index 77badf4..118ea4d 100755
--- a/web/api/read/switches-management
+++ b/web/api/read/switches-management
@@ -13,29 +13,40 @@ use Data::Dumper;
my $target = $ENV{REQUEST_URI};
$target =~ s/$ENV{SCRIPT_NAME}//;
$target =~ s/^\///;
-my ($switch, $port) = split(/\//,$target,2);
+my $switch;
+my $port;
+
+if ($target !~ m/now=/) {
+ ($switch, $port) = split(/\//,$target,2);
+}
+
my $q2;
$nms::web::cc{'max-age'} = "5";
$nms::web::cc{'stale-while-revalidate'} = "30";
-if (!defined($switch)) {
- $q2 = $nms::web::dbh->prepare('select switches.sysname, host(switches.mgmt_v4_addr) as mgmt_v4_addr, host(switches.mgmt_v6_addr) as mgmt_v6_addr, switches.mgmt_vlan, switches.traffic_vlan, switches.poll_frequency, switches.last_updated, switches.distro_name, switches.distro_phy_port, switches.community, traffic_net.subnet4, traffic_net.subnet6, mgmt_net.gw4 as mgmt_v4_gw, mgmt_net.gw6 as mgmt_v6_gw from switches left join networks as traffic_net on (switches.traffic_vlan = traffic_net.name) left join networks as mgmt_net on (switches.mgmt_vlan = mgmt_net.name) where switches.placement is not null and switches.deleted = false;');
-} else {
- $q2 = $nms::web::dbh->prepare('select sysname,host(mgmt_v4_addr) as mgmt_v4_addr,host(mgmt_v6_addr) as mgmt_v6_addr,mgmt_vlan,traffic_vlan,poll_frequency,last_updated,distro_name,distro_phy_port,community from switches where placement is not null and sysname = ' . $nms::web::dbh->quote($switch) . ' and switches.deleted = false;');
+my $limit = '';
+if (defined($switch)) {
+ $limit = ' and sysname = ' . $nms::web::dbh->quote($switch);
}
+$q2 = $nms::web::dbh->prepare("select
+ switches.sysname,
+ host(switches.mgmt_v4_addr) as mgmt_v4_addr,
+ host(switches.mgmt_v6_addr) as mgmt_v6_addr,
+ switches.mgmt_vlan,
+ switches.traffic_vlan,
+ switches.poll_frequency,
+ switches.last_updated,
+ switches.distro_name,
+ switches.distro_phy_port,
+ switches.community
+ from switches where switches.placement is not null and switches.deleted = false $limit;");
+
$q2->execute();
while (my $ref = $q2->fetchrow_hashref()) {
my $sysname = $ref->{'sysname'};
$nms::web::json{'switches'}{$ref->{'sysname'}} = $ref;
}
-my $q4 = $nms::web::dbh->prepare('select linknet, (select sysname from switches where switch = switch1) as sysname1, addr1, (select sysname from switches where switch = switch2) as sysname2,addr2 from linknets');
-
-$q4->execute();
-while (my $ref = $q4->fetchrow_hashref()) {
- $nms::web::json{'linknets'}{$ref->{'linknet'}} = $ref;
-}
-
finalize_output();
diff --git a/web/api/read/template-list b/web/api/read/template-list
new file mode 100755
index 0000000..81b9986
--- /dev/null
+++ b/web/api/read/template-list
@@ -0,0 +1,21 @@
+#! /usr/bin/perl
+# vim:ts=8:sw=8
+
+use lib '/opt/gondul/include';
+use nms::web;
+use strict;
+use warnings;
+
+my @dirs = ("/opt/gondul/web/templates","/opt/gondul/data/templates");
+
+foreach my $template_dir (@dirs) {
+opendir (DIR, $template_dir) or next;
+while (my $file = readdir(DIR)) {
+ next if ($file =~ m/^\./);
+ my %meh;
+ $meh{'file'} = $file;
+
+ push @{$nms::web::json{'templates'}},\%meh;
+}
+}
+nms::web::finalize_output();
diff --git a/web/api/write/linknet-add b/web/api/write/linknet-add
deleted file mode 100755
index 13ccd17..0000000
--- a/web/api/write/linknet-add
+++ /dev/null
@@ -1,32 +0,0 @@
-#! /usr/bin/perl
-# vim:ts=8:sw=8
-use lib '/opt/gondul/include';
-use utf8;
-use nms::web qw($dbh db_safe_quote get_input finalize_output);
-use strict;
-use warnings;
-
-my $in = get_input();
-my %tmp = %{JSON::XS::decode_json($in)};
-
-my $q = $nms::web::dbh->prepare("INSERT INTO linknets (switch1, switch2) VALUES((SELECT switch FROM switches WHERE sysname = ? LIMIT 1), (SELECT switch FROM switches WHERE sysname = ? LIMIT 1));");
-my $sth = $nms::web::dbh->prepare("SELECT linknet FROM linknets WHERE switch1 = (SELECT switch FROM switches WHERE sysname = ? LIMIT 1) and switch2 = (SELECT switch FROM switches WHERE sysname = ? LIMIT 1);");
-
-$sth->execute($tmp{'switch1'}, $tmp{'switch2'});
-my $affected = 0;
-while ( my @row = $sth->fetchrow_array ) {
- $affected += 1;
-}
-
-print "X-affected: $affected\n";
-if ($affected eq 0) {
- $q->execute($tmp{'switch1'}, $tmp{'switch2'});
-}
-
-$dbh->commit;
-$nms::web::cc{'max-age'} = '0';
-$nms::web::cc{'stale-while-revalidate'} = '0';
-$nms::web::json{'state'} = 'ok';
-
-print "X-ban: /api/public/.*\n";
-finalize_output();
diff --git a/web/api/write/network-add b/web/api/write/network-add
deleted file mode 100644
index d1aab4e..0000000
--- a/web/api/write/network-add
+++ /dev/null
@@ -1,49 +0,0 @@
-#! /usr/bin/perl
-# vim:ts=8:sw=8
-
-#use CGI qw(fatalsToBrowser);
-use DBI;
-use lib '/opt/gondul/include';
-use nms;
-use nms::web qw(%get_params %json finalize_output get_input $dbh);
-use nms::util qw(guess_placement);
-use strict;
-use warnings;
-use JSON;
-use Data::Dumper;
-use nms::oplog qw(oplog);
-
-$nms::web::cc{'max-age'} = "0";
-
-my $in = get_input();
-my @tmp = @{JSON::XS::decode_json($in)};
-
-my @added;
-my @dups;
-
-my $sth = $nms::web::dbh->prepare("SELECT name FROM networks WHERE name=?");
-
-foreach my $tmp2 (@tmp) {
- my %network = %{$tmp2};
- my $affected = 0;
- my %template = ();
- if (not defined($network{'name'})) {
- next;
- }
-
- $sth->execute( $network{'name'});
- while ( my @row = $sth->fetchrow_array ) {
- $affected += 1;
- }
-
- if ($affected == 0) {
- $nms::web::dbh->do("INSERT INTO NETWORKS (name) VALUES ('$network{'name'}');");
- push @added, $network{'name'};
- oplog("\"" . $network{'name'} . "\"", "Network added: " . $network{'name'});
- }
-}
-
-$json{'networks_addded'} = \@added;
-
-print "X-ban: /api/.*\n";
-finalize_output();
diff --git a/web/api/write/network-update b/web/api/write/network-update
deleted file mode 100644
index f6684c5..0000000
--- a/web/api/write/network-update
+++ /dev/null
@@ -1,114 +0,0 @@
-#! /usr/bin/perl
-# vim:ts=8:sw=8
-
-#use CGI qw(fatalsToBrowser);
-use DBI;
-use lib '/opt/gondul/include';
-use nms;
-use nms::web qw(%get_params %json finalize_output get_input $dbh);
-use nms::util qw(guess_placement);
-use strict;
-use warnings;
-use JSON;
-use Data::Dumper;
-
-$nms::web::cc{'max-age'} = "0";
-
-my $in = get_input();
-my @tmp = @{JSON::XS::decode_json($in)};
-
-my @added;
-my @dups;
-
-my $sth = $nms::web::dbh->prepare("SELECT name FROM networks WHERE name=?");
-
-
-my @fields = ('name','last_updated','placement','subnet4','subnet6','gw4','gw6','routing_point','vlan','tags');
-
-sub convertplace
-{
- my %in = %{$_[0]};
- my %out = ();
-
- if (not defined $in{'x1'} and defined($in{'x'})) {
- $out{'x1'} = int($in{'x'});
- $out{'y1'} = int($in{'y'});
- $out{'xx'} = int($in{'x'} + $in{'width'});
- $out{'yy'} = int($in{'y'} + $in{'height'});
- } else {
- return \%in;
- }
- return \%out;
-}
-
-foreach my $tmp2 (@tmp) {
- my %network = %{$tmp2};
- my $affected = 0;
- my %template = ();
- map { $template{$_} = 'DEFAULT' } @fields;
- if (not defined($network{'sysname'})) {
- next;
- }
-
- $sth->execute( $network{'sysname'});
- while ( my @row = $sth->fetchrow_array ) {
- $affected += 1;
- }
-
- if ($affected == 0) {
- my %placement;
- if (not defined ($network{'placement'})) {
- %placement = guess_placement($network{'sysname'});
- } else {
- %placement = %{convertplace($network{'sysname'})};
- }
- my ($x1,$x2,$y1,$y2);
- $x1 = $placement{'x1'};
- $y1 = $placement{'y1'};
- $x2 = $placement{'xx'};
- $y2 = $placement{'yy'};
- $network{'placement'} = "(($x1,$y1),($x2,$y2))";
-
- map {
- if (defined ($template{$_})) {
- $template{$_} = $dbh->quote($network{$_});
- }
- } keys %network;
-
-
- $nms::web::dbh->do("INSERT INTO NETWORKS (name, last_updated, placement, subnet4, subnet6, routing_point, gw4, gw6, vlan, tags) VALUES ($template{'sysname'}, $template{'last_updated'}, $template{'placement'}, $template{'subnet4'}, $template{'subnet6'}, $template{'routing_point'}, $template{'gw4'}, $template{'gw6'}, $template{'vlan'}, $template{'tags'});");
- push @added, $network{'sysname'};
- } else {
- if (defined($network{'placement'})) {
- my %placement;
- if ($network{'placement'} eq "reset") {
- %placement = guess_placement($network{'sysname'});
- } else {
- %placement = %{convertplace($network{'placement'})};
- }
- my ($x1,$x2,$y1,$y2);
- $x1 = $placement{'x1'};
- $y1 = $placement{'y1'};
- $x2 = $placement{'xx'};
- $y2 = $placement{'yy'};
- $network{'placement'} = "(($x1,$y1),($x2,$y2))";
- push @dups, "not really, but: " . $network{'placement'};
- }
- if (defined($network{'tags'})) {
- $network{'tags'} =~ s/'/"/g;
- }
- my @set;
- map {
- if (defined($template{$_})) {
- push @set, "$_=" . $dbh->quote($network{$_});
- }
- } keys %network;
- $nms::web::dbh->do("UPDATE NETWORKS SET " . join(", ", @set) . "WHERE name=" . $dbh->quote($network{'sysname'}) . ";");
- push @dups, $network{'sysname'};
- }
-}
-$json{'networks_addded'} = \@added;
-$json{'networks_updated'} = \@dups;
-
-print "X-ban: /api/.*networks.*\n";
-finalize_output();
diff --git a/web/api/write/networks b/web/api/write/networks
new file mode 100755
index 0000000..460a7ae
--- /dev/null
+++ b/web/api/write/networks
@@ -0,0 +1,82 @@
+#! /usr/bin/perl
+# vim:ts=8:sw=8
+
+#use CGI qw(fatalsToBrowser);
+use DBI;
+use lib '/opt/gondul/include';
+use nms;
+use nms::web qw(%get_params %json finalize_output get_input $dbh);
+use strict;
+use warnings;
+use JSON;
+use Data::Dumper;
+
+$nms::web::cc{'max-age'} = "0";
+
+my $in = get_input();
+my @tmp = @{JSON::XS::decode_json($in)};
+
+my @added;
+my @dups;
+
+my $sth = $nms::web::dbh->prepare("SELECT name FROM networks WHERE name=?");
+
+
+my @fields = ('name','subnet4','subnet6','gw4','gw6','router','vlan','tags');
+
+foreach my $tmp2 (@tmp) {
+ my %network = %{$tmp2};
+ my $affected = 0;
+ my %template = ();
+ map { $template{$_} = 'DEFAULT' } @fields;
+ if (not defined($network{'name'})) {
+ next;
+ }
+
+ $sth->execute( $network{'name'});
+ while ( my @row = $sth->fetchrow_array ) {
+ $affected += 1;
+ }
+
+ if ($affected == 0) {
+
+ map {
+ if (defined ($template{$_})) {
+ $template{$_} = $dbh->quote($network{$_});
+ }
+ } keys %network;
+
+ if ($template{'router'} ne 'DEFAULT') {
+ $template{'router'} = "(select switch from switches where sysname = $template{'router'})";
+ }
+ if ($template{'gw4'} eq 'DEFAULT' and $template{'subnet4'} ne 'DEFAULT') {
+ $template{'gw4'} = "host(inet $template{'subnet4'} + 1)";
+ }
+ if ($template{'gw6'} eq 'DEFAULT' and $template{'subnet6'} ne 'DEFAULT') {
+ $template{'gw6'} = "host(inet $template{'subnet6'} + 1)";
+ }
+ $nms::web::dbh->do("INSERT INTO NETWORKS (name, subnet4, subnet6, router, gw4, gw6, vlan, tags) VALUES ($template{'name'}, $template{'subnet4'}, $template{'subnet6'}, $template{'router'}, $template{'gw4'}, $template{'gw6'}, $template{'vlan'}, $template{'tags'});");
+ push @added, $network{'name'};
+ } else {
+ if (defined($network{'tags'})) {
+ $network{'tags'} =~ s/'/"/g;
+ }
+ my @set;
+ map {
+ if (defined($template{$_})) {
+ if ($_ eq "router") {
+ push @set, "router=(select switch from switches where sysname = " . $dbh->quote($network{$_}) . ")";
+ } else {
+ push @set, "$_=" . $dbh->quote($network{$_});
+ }
+ }
+ } keys %network;
+ $nms::web::dbh->do("UPDATE networks SET " . join(", ", @set) . "WHERE name=" . $dbh->quote($network{'name'}) . ";");
+ push @dups, $network{'name'};
+ }
+}
+$json{'networks_addded'} = \@added;
+$json{'networks_updated'} = \@dups;
+
+print "X-ban: /api/.*networks.*\n";
+finalize_output();
diff --git a/web/api/write/switch-add b/web/api/write/switch-add
deleted file mode 100755
index c92cf31..0000000
--- a/web/api/write/switch-add
+++ /dev/null
@@ -1,94 +0,0 @@
-#! /usr/bin/perl
-# vim:ts=8:sw=8
-
-#use CGI qw(fatalsToBrowser);
-use DBI;
-use lib '/opt/gondul/include';
-use nms;
-use nms::web qw(%get_params %json finalize_output get_input $dbh);
-use nms::util qw(guess_placement);
-use strict;
-use warnings;
-use JSON;
-use Data::Dumper;
-use nms::oplog qw(oplog);
-
-$nms::web::cc{'max-age'} = "0";
-
-my $in = get_input();
-my @tmp = @{JSON::XS::decode_json($in)};
-
-my @added;
-my @dups;
-
-my $sth = $nms::web::dbh->prepare("SELECT sysname FROM switches WHERE sysname=?");
-
-my @fields = ( 'community', 'distro_name', 'distro_phy_port', 'mgmt_v4_addr', 'mgmt_v6_addr', 'mgmt_vlan', 'placement', 'poll_frequency', 'sysname', 'traffic_vlan');
-
-sub convertplace
-{
- my %in = %{$_[0]};
- my %out = ();
-
- if (not defined $in{'x1'} and defined($in{'x'})) {
- $out{'x1'} = int($in{'x'});
- $out{'y1'} = int($in{'y'});
- $out{'xx'} = int($in{'x'} + $in{'width'});
- $out{'yy'} = int($in{'y'} + $in{'height'});
- } else {
- return \%in;
- }
- return \%out;
-}
-
-foreach my $tmp2 (@tmp) {
- my %switch = %{$tmp2};
- my $affected = 0;
- my %template = ();
- map { $template{$_} = 'DEFAULT' } @fields;
- if (not defined($switch{'sysname'})) {
- next;
- }
-
- $sth->execute( $switch{'sysname'});
- while ( my @row = $sth->fetchrow_array ) {
- $affected += 1;
- }
-
- if ($affected == 0) {
- my %placement;
- if (not defined ($switch{'placement'})) {
- %placement = guess_placement($switch{'sysname'});
- } else {
- %placement = %{convertplace($switch{'placement'})};
- }
- if (not defined($switch{'ip'}) and defined($switch{'mgtmt4'})) {
- $switch{'ip'} = $switch{'mgtmt4'};
- }
- if (not defined($switch{'secondary_ip'}) and defined($switch{'mgtmt6'})) {
- $switch{'secondary_ip'} = $switch{'mgtmt6'};
- }
- my ($x1,$x2,$y1,$y2);
- $x1 = $placement{'x1'};
- $y1 = $placement{'y1'};
- $x2 = $placement{'xx'};
- $y2 = $placement{'yy'};
- $switch{'placement'} = "(($x1,$y1),($x2,$y2))";
-
- map {
- if (defined ($template{$_})) {
- $template{$_} = $dbh->quote($switch{$_});
- }
- } keys %switch;
-
-
- $nms::web::dbh->do("INSERT INTO SWITCHES (mgmt_v4_addr, sysname, poll_frequency, community, mgmt_v6_addr, placement, distro_name) VALUES ($template{'mgmt_v4_addr'}, $template{'sysname'}, $template{'poll_frequency'}, $template{'community'}, $template{'mgmt_v6_addr'}, $template{'placement'}, $template{'distro_name'});");
- push @added, $switch{'sysname'};
- oplog("\"" . $switch{'sysname'} . "\"", "Switch added: " . $switch{'sysname'});
- }
-}
-
-$json{'switches_addded'} = \@added;
-
-print "X-ban: /api/.*\n";
-finalize_output();
diff --git a/web/api/write/switch-update b/web/api/write/switches
index b71548b..947404d 100755
--- a/web/api/write/switch-update
+++ b/web/api/write/switches
@@ -11,6 +11,7 @@ use strict;
use warnings;
use JSON;
use Data::Dumper;
+use nms::oplog qw(oplog);
$nms::web::cc{'max-age'} = "0";
@@ -23,7 +24,7 @@ my @dups;
my $sth = $nms::web::dbh->prepare("SELECT sysname FROM switches WHERE sysname=?");
-my @fields = ( 'community', 'tags', 'distro_name', 'distro_phy_port', 'mgmt_v4_addr', 'mgmt_v4_gw', 'mgmt_v4_netsize', 'mgmt_v6_addr', 'mgmt_v6_gw', 'mgmt_v6_netsize', 'mgmt_vlan', 'placement', 'poll_frequency', 'subnet4', 'subnet6', 'sysname', 'traffic_vlan', 'deleted');
+my @fields = ( 'community', 'tags', 'distro_name', 'distro_phy_port', 'mgmt_v4_addr', 'mgmt_v6_addr', 'mgmt_vlan', 'placement', 'poll_frequency', 'sysname', 'traffic_vlan', 'deleted');
sub convertplace
{
@@ -84,6 +85,7 @@ foreach my $tmp2 (@tmp) {
$nms::web::dbh->do("INSERT INTO SWITCHES (ip, sysname, last_updated, locked, poll_frequency, tags, community, secondary_ip, placement,subnet4,subnet6,distro) VALUES ($template{'ip'}, $template{'sysname'}, $template{'last_updated'}, $template{'locked'}, $template{'poll_frequency'}, $template{'tags'}, $template{'community'}, $template{'secondary_ip'}, $template{'placement'},$template{'subnet4'},$template{'subnet6'},$template{'distro'});");
push @added, $switch{'sysname'};
+ oplog("\"" . $switch{'sysname'} . "\"", "Switch added: " . $switch{'sysname'});
} else {
if (defined($switch{'placement'})) {
my %placement;
diff --git a/web/index.html b/web/index.html
index 7aedbae..447772f 100644
--- a/web/index.html
+++ b/web/index.html
@@ -46,34 +46,21 @@
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
- <li class="gondul-is-private"><a href="#health" onclick="setUpdater(handler_health)">Health</a></li>
- <li><a href="#ping" onclick="setUpdater(handler_ping)">Ping</a></li>
- <li><a href="#uplink" onclick="setUpdater(handler_uplinks)">Uplink</a></li>
- <li><a href="#dhcp" onclick="setUpdater(handler_dhcp)">DHCP</a></li>
- <li><a href="#temp" onclick="setUpdater(handler_temp)">Temperature</a></li>
- <li><a href="#traffic" onclick="setUpdater(handler_traffic)">Traffic</a></li>
- <li><a href="#traffictot" onclick="setUpdater(handler_traffic_tot)">Total switch traffic</a></li>
- <li class="gondul-is-private"><a href="#snmp" onclick="setUpdater(handler_snmp)">SNMP</a></li>
- <li class="gondul-is-private"><a href="#cpu" onclick="setUpdater(handler_cpu)">CPU</a></li>
- <li><a href="#disco" onclick="setUpdater(handler_disco)">DISCO</a></li>
+ <li class="gondul-is-private dropdown-header">Switches</li>
+ <li class="gondul-is-private"><a href="#" onclick="nmsInfoBox.showWindow('addSwitch')">Add switch</a></li>
+ <li class="gondul-is-private"><a href="#" onclick="nmsInfoBox.showWindow('addNetwork')">Add network</a></li>
+ <li class="gondul-is-private"><a href="#" onclick="nmsInfoBox.showWindow('listNetwork')">List networks</a></li>
+ <li class="gondul-is-private"><a href="#" onclick="nmsMap.moveSet(true);">Enable switch moving</a></li>
+ <li class="gondul-is-private"><a href="#" onclick="nmsMap.moveSet(false);">Disable switch moving</a></li>
+ <li class="gondul-is-private divider"> </li>
<li class="divider"> </li>
<li class="dropdown-header">Time</li>
<li><a href="#" onclick="toggleLayer('nowPickerBox');nmsTime.startNowPicker();">Travel in time</a></li>
<li><a href="#" onclick="nmsTime.replayEvent();" title="Replay from opening 120 minutes per second">Replay event</a></li>
<li class="divider"> </li>
<li class="dropdown-header">View</li>
- <li><a href="#" onclick="toggleNightMode()">Toggle Night Mode</a></li>
- <li><a href="#" onclick="toggleConnect()">Toggle linknets</a></li>
<li><a href="#" onclick="nmsUi.toggleVertical()">Toggle vertical mode</a></li>
<li class="divider"> </li>
- <li class="gondul-is-private dropdown-header">Switches</li>
- <li class="gondul-is-private"><a href="#" onclick="nmsMap.moveSet(true);">Enable switch moving</a></li>
- <li class="gondul-is-private"><a href="#" onclick="nmsMap.moveSet(false);">Disable switch moving</a></li>
- <li class="gondul-is-private"><a href="#" onclick="nmsInfoBox.showWindow('addSwitch')">Add switch</a></li>
- <li class="gondul-is-private divider"> </li>
- <li class="gondul-is-private"><a href="#" onclick="nmsInfoBox.showWindow('listNetwork')">List networks</a></li>
- <li class="gondul-is-private"><a href="#" onclick="nmsInfoBox.showWindow('addNetwork')">Add network</a></li>
- <li class="gondul-is-private divider"> </li>
<li class="gondul-is-private dropdown-header">Inventory lists</li>
<li class="gondul-is-private"><a href="#" onclick="nmsInfoBox.showWindow('inventoryListing','distro_name');">Distro names</a></li>
<li class="gondul-is-private"><a href="#" onclick="nmsInfoBox.showWindow('inventoryListing','sysDescr')">System description</a></li>
@@ -143,14 +130,15 @@
<div class="span3 col-lg-6">
<textarea id="template-input" class="form-control" cols="80" rows="25"></textarea>
<div class="form-inline">
- <div class="form-group">
- <button onclick="nmsTemplate.fromFile('HOWTO.txt')" class="btn btn-info">Load HOWTO.txt</button>
- <button onclick="nmsTemplate.fromFile('switches.txt')" class="btn btn-info">Load switches.txt</button>
- <button onclick="nmsTemplate.fromFile('switch.txt')" class="btn btn-info">Load switch.txt</button>
- </div>
+ https://gondul.tg.lol/api/templates/
+ <div class="form-group">
+ <select onchange="nmsTemplate.fromFile(this.value)" class="form-control" id="nmsTemplate-select">
+ <option value="">Select template</option>
+ </select>
+ </div>
<div class="form-group">
<label for="template-query-params">Query parameters</label>
- <input type="text" class="form-control" id="template-query-params" value="?switch=e13-1&foo=bar" />
+ <input type="text" class="form-control" id="template-query-params" value="?a=r1.ring:ge-1/0/2.0:mgmt+irb.666" />
</div>
<div class="form-group">
<button onclick="nmsTemplate.test()" class="btn btn-primary">Test</button>
@@ -158,7 +146,7 @@
</div>
</div>
<div class="span3 col-lg-6">
- <textarea id="template-output" class="form-control" disabled cols="80" rows="25"></textarea>
+ <textarea id="template-output" class="form-control" readonly cols="80" rows="25"></textarea>
</div>
</div>
</div>
@@ -252,6 +240,10 @@
<td>Step 1 hour forward in time</td>
</tr>
<tr>
+ <td>o</td>
+ <td>Toggle the ops log</td>
+ </tr>
+ <tr>
<td>p</td>
<td>Toggle playback (1 hour per second)</td>
</tr>
diff --git a/web/js/nms-draw-chart.js b/web/js/nms-draw-chart.js
index da621e7..60698c0 100644
--- a/web/js/nms-draw-chart.js
+++ b/web/js/nms-draw-chart.js
@@ -16,63 +16,65 @@ function drawLatency(canvas, sw, chart, callback) {
var dataset = [];
$.getJSON( "/query?db=gondul&q="+q, function( results ) {
- results['results'][0]['series'].forEach(function(serie) {
- var data = [];
- serie['values'].forEach(function(element) {
- data.push({t: new Date(element[0]), y: element[1]});
- });
- var borderColor = "rgba(0,155,200,255)";
- console.log(serie['tags']['version']);
- if(serie['tags']['version'] === "v6") {
- borderColor = "rgba(100,155,100,255)";
+ try {
+ results['results'][0]['series'].forEach(function(serie) {
+ var data = [];
+ serie['values'].forEach(function(element) {
+ data.push({t: new Date(element[0]), y: element[1]});
+ });
+ var borderColor = "rgba(0,155,200,255)";
+ if(serie['tags']['version'] === "v6") {
+ borderColor = "rgba(100,155,100,255)";
+ }
+ dataset.push({data: data, fill:false, borderColor:borderColor, label:serie['tags']['version'] });
+ });
+ if(chart != false) {
+ chart.data.datasets = dataset;
+ chart.update();
+ return;
}
- dataset.push({data: data, fill:false, borderColor:borderColor, label:serie['tags']['version'] });
- });
- if(chart != false) {
- chart.data.datasets = dataset;
- chart.update();
- return;
- }
- var ctx = document.getElementById(canvas).getContext('2d');
- var myChart = new Chart(ctx, {
- type: 'line',
- data: {
- datasets: dataset
- },
- options: {
- legend: {
- display: false
+ var ctx = document.getElementById(canvas).getContext('2d');
+ var myChart = new Chart(ctx, {
+ type: 'line',
+ data: {
+ datasets: dataset
},
- scales: {
- xAxes:[{
- type: 'time',
- time: {
- format: "HH:mm",
- unit: 'minute',
- tooltipFormat: 'HH:mm',
- displayFormats: {
- 'minute': 'HH:mm',
- 'hour': 'HH:mm',
- min: '00:00',
- max: '23:59'
- },
- }
- }],
- yAxes: [{
- ticks: {
- beginAtZero: true
+ options: {
+ legend: {
+ display: false
+ },
+ scales: {
+ xAxes:[{
+ type: 'time',
+ time: {
+ format: "HH:mm",
+ unit: 'minute',
+ tooltipFormat: 'HH:mm',
+ displayFormats: {
+ 'minute': 'HH:mm',
+ 'hour': 'HH:mm',
+ min: '00:00',
+ max: '23:59'
+ },
+ }
+ }],
+ yAxes: [{
+ ticks: {
+ beginAtZero: true
+ }
+ }]
+ },
+ responsive: true,
+ animation: false,
+ elements: {
+ line: {
+ tension: 0.05
}
- }]
- },
- responsive: true,
- animation: false,
- elements: {
- line: {
- tension: 0.05
- }
- }
- }
- });
+ }
+ }
+ });
+ } catch(e) {
+ }
if(callback != undefined) {
callback(myChart);
}
@@ -95,6 +97,7 @@ function drawSumOfPorts(canvas, sw) {
var bits_in = [];
var bits_out = [];
+
results['results'][0]['series'].forEach(function(serie) {
// Bytes in
diff --git a/web/js/nms-info-box.js b/web/js/nms-info-box.js
index 1971b61..1eea112 100644
--- a/web/js/nms-info-box.js
+++ b/web/js/nms-info-box.js
@@ -50,6 +50,10 @@ var nmsInfoBox = nmsInfoBox || {
'name': 'SNMP',
'panels': ['switchSNMP:misc']
},
+ 'links': {
+ 'name': 'Links',
+ 'panels': ['switchLinks']
+ },
'edit': {
'name': 'Edit settings',
'panels': ['switchEdit']
@@ -125,7 +129,11 @@ var nmsInfoBox = nmsInfoBox || {
'jnxBoxSerialNo': {
'name': 'Serial numbers',
'panels': ['inventoryListing:jnxBoxSerialNo']
- }
+ },
+ 'transceiver': {
+ 'name': 'Transceivers',
+ 'panels': ['inventoryListing:transceiver']
+ }
}
},
{
@@ -657,7 +665,13 @@ var switchPortsPanel = function () {
indicies.push(obj);
}
indicies.sort(function(a,b) {
- return snmpJson[a].ifIndex - snmpJson[b].ifIndex;
+ var tmpx = [ snmpJson[a].ifName, snmpJson[b].ifName ];
+ tmpx.sort();
+ if (tmpx[0] == snmpJson[a].ifName) {
+ return -1;
+ } else {
+ return 1;
+ }
});
for(var obji in indicies) {
var obj = indicies[obji];
@@ -686,7 +700,7 @@ var switchPortsPanel = function () {
}
} catch(e) {};
- groupObj.innerHTML = '<span class="panel-heading" style="display:block;"><a class="collapse-controller" role="button" data-toggle="collapse" href="#'+cleanObj+'-group">' + snmpJson[obj].ifDescr + ' </a><small>' + snmpJson[obj].ifAlias + '</small><span class="pull-right">' + traffic + '<i class="btn-xs ' + button + '"><span class="glyphicon ' + glyphicon + '" title="' + title + '" aria-hidden="true"></span></i></span></span>';
+ groupObj.innerHTML = '<span class="panel-heading" style="display:block;"><a class="collapse-controller" role="button" data-toggle="collapse" href="#'+cleanObj+'-group">' + snmpJson[obj].ifName + ' </a><small>' + snmpJson[obj].ifAlias + '</small><span class="pull-right">' + traffic + '<i class="btn-xs ' + button + '"><span class="glyphicon ' + glyphicon + '" title="' + title + '" aria-hidden="true"></span></i></span></span>';
var groupObjCollapse = document.createElement("div");
groupObjCollapse.id = cleanObj + "-group";
@@ -818,7 +832,7 @@ var switchAddPanel = function() {
var myData = JSON.stringify(myData);
$.ajax({
type: "POST",
- url: "/api/write/switch-add",
+ url: "/api/write/switches",
dataType: "text",
data:myData,
success: function (data, textStatus, jqXHR) {
@@ -885,6 +899,9 @@ var inventoryListingPanel = function() {
case 'jnxBoxSerialNo':
listTitle = 'Serial Numbers';
break;
+ case 'transceiver':
+ listTitle = 'Transceivers';
+ break;
default:
listTitle = 'Distro names';
}
@@ -900,15 +917,18 @@ var inventoryListingPanel = function() {
switch (this.mode) {
case 'distro_name':
value = nmsData.switches.switches[sw]["distro_name"];
+ resultArray.push([sw, value]);
break;
case 'sysDescr':
value = nmsData.snmp.snmp[sw]["misc"]["sysDescr"][0];
+ resultArray.push([sw, value]);
break;
case 'jnxBoxSerialNo':
if(testTree(nmsData,["snmp","snmp",sw,"misc","entPhysicalSerialNum"])) {
for (var x in nmsData.snmp.snmp[sw]["misc"]["entPhysicalSerialNum"]) {
value = "misc" + x + ":" + nmsData.snmp.snmp[sw]["misc"]["entPhysicalSerialNum"][x];
- resultArray.push([sw, value]);
+ var entPhysicalDescr = nmsData.snmp.snmp[sw]["misc"]["entPhysicalDescr"][x];
+ resultArray.push([sw, entPhysicalDescr+': '+value]);
}
}
if (testTree(nmsData,["snmp","snmp",sw,"misc","jnxVirtualChassisMemberSerialnumber"])) {
@@ -918,11 +938,23 @@ var inventoryListingPanel = function() {
}
}
value = nmsData.snmp.snmp[sw]["misc"]["jnxBoxSerialNo"][0];
+ resultArray.push([sw, value]);
break;
+ case 'transceiver':
+ if(testTree(nmsData,["snmp","snmp",sw,"misc","entPhysicalSerialNum"])) {
+ for (var x in nmsData.snmp.snmp[sw]["misc"]["entPhysicalSerialNum"]) {
+ var entPhysicalDescr = nmsData.snmp.snmp[sw]["misc"]["entPhysicalDescr"][x];
+ if(!entPhysicalDescr.match(/^SFP/)) {
+ continue;
+ }
+ value = entPhysicalDescr + ": " + nmsData.snmp.snmp[sw]["misc"]["entPhysicalSerialNum"][x];
+ resultArray.push([sw, entPhysicalDescr+': '+value]);
+ }
+ }
+ break;
+
}
} catch (e) {console.log("sw: " + sw); console.log(e);}
-
- resultArray.push([sw, value]);
}
resultArray.sort();
@@ -986,7 +1018,12 @@ var switchEditPanel = function () {
var tmpsw = '\'' + this.sw + '\'';
var tmpv = '\'' + v + '\'';
var tmphandler = '"nmsInfoBox._editChange(' + tmpsw + ',' + tmpv + ');"';
+ if(v == 'community') {
+ var html = '<input type="password" autocomplete="off" onfocus="this.type = \'text\'" class="form-control" value="' + template[v] + '" id="edit-' + this.sw + '-' + v + '" onchange=' + tmphandler + ' oninput=' + tmphandler + '>';
+ }
+ else {
var html = '<input type="text" class="form-control" value="' + template[v] + '" id="edit-' + this.sw + '-' + v + '" onchange=' + tmphandler + ' oninput=' + tmphandler + ' ' + (v == 'sysname' || v == 'subnet4' || v == 'subnet6' || v == 'mgmt_v4_gw' || v == 'mgmt_v6_gw' ? "readonly" : "") + '>';
+ }
if (v == "placement") {
v = "placement <a onclick='var _x = document.getElementById(\"edit-" + this.sw + "-placement\"); _x.value = \"\\\"reset\\\"\"; _x.oninput();' class='pull-right'>Reset</a>";
}
@@ -1055,7 +1092,7 @@ var switchEditPanel = function () {
var myData = nmsInfoBox._editStringify(this.sw);
$.ajax({
type: "POST",
- url: "/api/write/switch-update",
+ url: "/api/write/switches",
dataType: "text",
data:myData,
success: function (data, textStatus, jqXHR) {
@@ -1075,7 +1112,7 @@ var switchEditPanel = function () {
myData = JSON.stringify(myData);
$.ajax({
type: "POST",
- url: "/api/write/switch-update",
+ url: "/api/write/switches",
dataType: "text",
data:myData,
success: function (data, textStatus, jqXHR) {
@@ -1199,6 +1236,40 @@ nmsInfoBox.setLegendPick = function(tag,id) {
}
nmsInfoBox.addPanelType("switchSummary",switchSummaryPanel);
+var switchLinks = function() {
+ nmsInfoPanel.call(this,"switchLinks");
+ var latencyChart;
+ this.init = function() {
+ this.refresh();
+ };
+ this.refresh = function(reason) {
+ var content = [];
+ if (this.sw == false) {
+ console.log("ugh, cleanup failed?");
+ return;
+ }
+ var sw = this.sw;
+
+ var topp = document.createElement("div")
+ var urls = [ "https://gondul.tg.lol/api/templates/magic.conf/switch=" + sw,
+ "http://185.110.148.5/api/templates/magic.conf/switch=" + sw,
+ "http://gondul.tg.lol/api/templates/magic.conf/switch=" + sw ];
+ if (testTree(nmsData,['smanagement','switches',sw])) {
+ var mg = nmsData["smanagement"]["switches"][sw];
+ urls.push("ssh://[" + mg.mgmt_v6_addr + "]");
+ urls.push("ssh://" + mg.mgmt_v4_addr);
+ }
+ for (var x in urls) {
+ topp.appendChild(document.createElement("br"));
+ var link = document.createElement("a");
+ link.href = urls[x];
+ link.textContent = urls[x];
+ topp.appendChild(link);
+ }
+ this._render(topp);
+ };
+};
+nmsInfoBox.addPanelType("switchLinks",switchLinks);
/*
* Panel type: Add network
*
@@ -1221,7 +1292,7 @@ var networkAddPanel = function() {
var myData = JSON.stringify(myData);
$.ajax({
type: "POST",
- url: "/api/write/network-add",
+ url: "/api/write/networks",
dataType: "text",
data:myData,
success: function (data, textStatus, jqXHR) {
@@ -1253,14 +1324,13 @@ var networkListPanel = function() {
table.className = "table table-condensed";
table.id = "searchResults-table"
for (var net in networks) {
- console.log(networks[net]);
var row = table.insertRow(net);
var cell1 = row.insertCell(0);
var cell2 = row.insertCell(1);
var cell3 = row.insertCell(2);
cell1.innerHTML = "<a href='#' onclick='nmsInfoBox.showWindow(\"networkInfo\",\""+net+"\");'>"+net+ '</a>';
cell2.innerHTML = networks[net].vlan;
- cell3.innerHTML = networks[net].routing_point;
+ cell3.innerHTML = networks[net].router;
}
this._render(table);
@@ -1306,14 +1376,9 @@ var networkEditPanel = function() {
var tags;
for (var v in net) {
/*
- * Placement and tags needs to be sent and edited
+ * Tags needs to be sent and edited
* as plain JSON...
*/
- if (v == "placement") {
- place = JSON.stringify(net[v]);
- template[v] = place;
- continue;
- }
if (v == "tags") {
tags = JSON.stringify(net[v]);
template[v] = tags;
@@ -1384,10 +1449,10 @@ var networkEditPanel = function() {
};
this.save = function () {
- var myData = nmsInfoBox._editStringify(this.sw);
+ var myData = nmsInfoBox._editStringify(this.sw,"name");
$.ajax({
type: "POST",
- url: "/api/write/network-update",
+ url: "/api/write/networks",
dataType: "text",
data:myData,
success: function (data, textStatus, jqXHR) {
@@ -1396,6 +1461,7 @@ var networkEditPanel = function() {
nmsInfoBox.hide();
}
nmsData.invalidate("switches");
+ nmsData.invalidate("networks");
nmsData.invalidate("smanagement");
}
});
@@ -1500,7 +1566,7 @@ nmsInfoBox._editChange = function(sw, v) {
out.value = myData;
};
-nmsInfoBox._editStringify = function(sw) {
- nmsInfoBox._editValues['sysname'] = sw;
+nmsInfoBox._editStringify = function(sw, sysname='sysname') {
+ nmsInfoBox._editValues[sysname] = sw;
return JSON.stringify([nmsInfoBox._editValues]);
};
diff --git a/web/js/nms-map-handlers.js b/web/js/nms-map-handlers.js
index f9fe52b..90f6922 100644
--- a/web/js/nms-map-handlers.js
+++ b/web/js/nms-map-handlers.js
@@ -73,6 +73,13 @@ var handler_cpu = {
name:"CPU utilization"
};
+var handler_memory = {
+ init:memoryInit,
+ getInfo:memoryInfo,
+ tag:"memory",
+ name:"Memory utilization"
+};
+
var handler_health = {
init:healthInit,
getInfo:healthInfo,
@@ -85,6 +92,11 @@ var handler_mgmt = {
tag:"mgmt",
name:"Management info"
};
+var handler_net = {
+ getInfo:networkInfo,
+ tag:"net",
+ name:"Network info"
+};
var handler_snmpup = {
getInfo:snmpUpInfo,
tag:"snmpup",
@@ -124,6 +136,7 @@ var handlerInfo = function(tag,desc) {
var handlers = [
handler_health,
handler_mgmt,
+ handler_net,
handler_uplinks,
handler_temp,
handler_ping,
@@ -133,12 +146,13 @@ var handlers = [
handler_dhcp,
handler_snmp,
handler_cpu,
+ handler_memory,
handler_snmpup
];
function uplinkInfo(sw)
{
- var ret = new handlerInfo("uplink","Uplinks");
+ var ret = new handlerInfo("snmpup","Uplinks");
ret.why = "Uplinks";
ret.score = 0;
var u = 0;
@@ -152,39 +166,41 @@ function uplinkInfo(sw)
ret.data[0].description = "Uplinks (live/configured)";
if (nmsData.switches.switches[sw].subnet4 == undefined ||
nmsData.switches.switches[sw].subnet4 == null) {
- if (tagged(sw,'3up')) {
- known_t = 3;
- } else if (tagged(sw,'2up')) {
- known_t = 2;
- } else if (tagged(sw, '1up')) {
- known_t = 1;
- } else if (tagged(sw,'4up')) {
- known_t = 4;
- }
- if (known_t != t) {
- ret.data[0].value += "(Overridden: " + known_t + ")";
- }
-
- if (u == known_t) {
- ret.score = 0;
- ret.why = "All uplinks up";
- } else if (u == 1) {
- ret.score = 800;
- ret.why = "Only 1 of " + known_t + " uplinks alive";
- } else if (u < known_t) {
- ret.score = 450;
- ret.why = u + " of " + known_t + " uplinks alive";
- } else if (u > known_t) {
- ret.score = 350;
- ret.why = u + " of " + known_t + " uplinks alive";
- }
- }
- }
- if (testTree(nmsData,['switchstate','switches',sw,'clients','live'])) {
+ if (tagged(sw,'3up')) {
+ known_t = 3;
+ } else if (tagged(sw,'2up')) {
+ known_t = 2;
+ } else if (tagged(sw, '1up')) {
+ known_t = 1;
+ } else if (tagged(sw,'4up')) {
+ known_t = 4;
+ }
+ if (known_t != t) {
+ ret.data[0].value += "(Overridden: " + known_t + ")";
+ }
+ if (u == known_t) {
+ ret.score = 0;
+ ret.why = "All uplinks up";
+ } else if (u == 1) {
+ ret.score = 800;
+ ret.why = "Only 1 of " + known_t + " uplinks alive";
+ } else if (u < known_t && !(t >= 10 && u <5)) {
+ ret.score = 450;
+ ret.why = u + " of " + known_t + " uplinks alive";
+ } else if (u > known_t) {
+ ret.score = 350;
+ ret.why = u + " of " + known_t + " uplinks alive";
+ } else if (u < known_t && (t >= 10 && u < 5)) {
+ ret.score = 150;
+ ret.why = u + " of " + known_t + " uplinks alive (huge diff suggests WIP - downgrading)";
+ }
+ }
+ }
+ if (testTree(nmsData,['switchstate','switches',sw,'clients','total'])) {
var tu = parseInt(nmsData.switchstate.switches[sw].clients.live);
var tt = parseInt(nmsData.switchstate.switches[sw].clients.total);
ret.data[1] = {};
- ret.data[1].value = (tu) + " / " + (tt);
+ ret.data[1].value = (tu && tt) ? (tu) + " / " + (tt) : "None configured";
ret.data[1].description = "Client ports (live/total)";
}
if (testTree(nmsData,['switchstate','switches',sw,'totals','live'])) {
@@ -471,21 +487,26 @@ function pingInfo(sw)
if (!(distro == "" || phy == "" || distro == undefined || phy == undefined)) {
if (testTree(nmsData,['snmp','snmp',distro, 'ports',phy,'ifOperStatus'])) {
var x = nmsData['snmp']['snmp'][distro]['ports'][phy]['ifOperStatus'];
- var ping = parseFloat(nmsData["ping"]["switches"][sw]["latency4"]);
- var ping6 = parseFloat(nmsData["ping"]["switches"][sw]["latency6"]);
+ var ping = "no";
+ var ping6 = "no ";
+ try {
+ ping = parseFloat(nmsData["ping"]["switches"][sw]["latency4"]);
+ ping6 = parseFloat(nmsData["ping"]["switches"][sw]["latency6"]);
+ } catch(e) {}
if (x == "up") {
ret.data[3] = {};
ret.data[3].description = "Distro-port";
ret.data[3].value = "Distro port is live";
if (isNaN(ping) && isNaN(ping6)) {
- ret.score = 850;
+ ret.score = 700;
ret.why = "Distro port is alive, but no IPv4/IPv6 ping. ROLLBACK!";
}
}
}
}
} catch(e) {
- console.log("lol");
+ console.log("Lazy about errors....");
+ console.log(e);
}
}
return ret;
@@ -516,13 +537,13 @@ function getDhcpColor(stop)
function dhcpUpdater()
{
- if (!testTree(nmsData,['dhcp','dhcp']) || !testTree(nmsData,['switches','switches'])) {
- return
+ if (!testTree(nmsData,['dhcp','dhcp']) || !testTree(nmsData,['switches','switches']) || !testTree(nmsData,['smanagement','switches'])) {
+ return;
}
var now = nmsData.dhcp.time;
for (var sw in nmsData.switches.switches) {
var c = nmsColor.blue;
- var s = nmsData.dhcp.dhcp[sw];
+ var s = nmsData.dhcp.dhcp[nmsData.smanagement.switches[sw].traffic_vlan];
if (s == undefined) {
nmsMap.setSwitchColor(sw,c);
continue;
@@ -536,11 +557,24 @@ function dhcpInfo(sw) {
var ret = new handlerInfo("dhcp","DHCP state");
ret.why = "No DHCP data";
ret.data[0].description = "DHCP age";
- if (testTree(nmsData,['dhcp','dhcp',sw])) {
+ if (!testTree(nmsData,['dhcp','dhcp']) || !testTree(nmsData,['switches','switches']) || !testTree(nmsData,['smanagement','switches'])) {
+ return ret.data[1] = {};
+ }
+ var dhcpClients = 0;
+ var clientPortsUp = 0;
+ var clientPortsUp = setTree(nmsData,['switchstate','switches',sw,'clients','live'],0);
+ var clientPortsTotal = setTree(nmsData,['switchstate','switches',sw,'clients','total'],0);
+ if (testTree(nmsData,['dhcp','networks',nmsData.smanagement.switches[sw].traffic_vlan,'clients'])) {
+ dhcpClients = nmsData.dhcp.networks[nmsData.smanagement.switches[sw].traffic_vlan].clients;
+ }
+ if (testTree(nmsData,['dhcp','dhcp',nmsData.smanagement.switches[sw].traffic_vlan])) {
var now = nmsData.dhcp.time;
- var then = nmsData.dhcp.dhcp[sw];
+ var then = nmsData.dhcp.dhcp[nmsData.smanagement.switches[sw].traffic_vlan];
var diff = now - then;
var divider = 6;
+ if (dhcpClients < 10) {
+ divider = 12;
+ }
if(tagged(sw,'slowdhcp')) {
divider = 12;
}
@@ -551,24 +585,39 @@ function dhcpInfo(sw) {
} else {
ret.data[0].value = "No DHCP data";
if (testTree(nmsData,['smanagement','switches',sw])) {
- if (nmsData.smanagement.switches[sw].subnet4 == undefined ||
- nmsData.smanagement.switches[sw].subnet4 == "") {
- ret.data[0].value = "No associated subnets";
+ if (nmsData.smanagement.switches[sw].traffic_vlan == undefined ||
+ nmsData.smanagement.switches[sw].traffic_vlan == "") {
+ ret.data[0].value = "No associated networks";
ret.score = 0;
- ret.why = "No subnet registered";
+ ret.why = "No network associated";
} else {
- ret.score = 350;
- ret.why = "No DHCP data";
+ if (!(clientPortsUp < 2 && clientPortsTotal > 20)) {
+ ret.score = 350;
+ ret.why = "No DHCP data";
+ } else {
+ ret.data[0].value = "No DHCP data, but too few clients anyway";
+ }
}
} else {
ret.score = 100;
ret.why = "No management data for DHCP";
}
}
- if (testTree(nmsData,['dhcp','switches',sw,'clients'])) {
+ if (testTree(nmsData,['dhcp','networks',nmsData.smanagement.switches[sw].traffic_vlan,'clients'])) {
+ var dhcpClients = nmsData.dhcp.networks[nmsData.smanagement.switches[sw].traffic_vlan].clients;
ret.data[1] = {};
- ret.data[1].value = nmsData.dhcp.switches[sw].clients;
+ ret.data[1].value = nmsData.dhcp.networks[nmsData.smanagement.switches[sw].traffic_vlan].clients;
ret.data[1].description = "DHCP clients";
+ if (testTree(nmsData,['switchstate','switches',sw,'clients','live'])) {
+ var tu = parseInt(nmsData.switchstate.switches[sw].clients.live);
+ var tt = parseInt(nmsData.switchstate.switches[sw].clients.total);
+ if (tu - dhcpClients > 12) {
+ if (ret.score < 450) {
+ ret.score = 450;
+ ret.why = "Far more client ports than dhcp clients";
+ }
+ }
+ }
}
if (testTree(nmsData,['switches','switches',sw, 'tags'])) {
if (tagged(sw,'ignoredhcp')) {
@@ -709,7 +758,7 @@ function snmpInit() {
}
function snmpUpInfo(sw) {
- var ret = new handlerInfo("snmpup","SNMP uplink data");
+ var ret = new handlerInfo("uplink","SNMP uplink data");
ret.why = "No SNMP data";
ret.score = 0;
@@ -718,16 +767,20 @@ function snmpUpInfo(sw) {
var seen_up = 0;
for (var port in nmsData.snmp.snmp[sw].ports) {
var x = nmsData.snmp.snmp[sw].ports[port];
- if (x["ifAlias"].match(/Uplink/i) && x["ifOperStatus"] == "up") {
+ if (x["ifAlias"].match(/Gruppe/i) && x["ifOperStatus"] == "up") {
total_up += parseInt(x["ifHighSpeed"]);
}
- if (x["ifAlias"].match(/LAG Member/i) && x["ifOperStatus"] == "up") {
+ if (x["ifAlias"].match(/Fysisk/i) && x["ifOperStatus"] == "up") {
seen_up += parseInt(x["ifHighSpeed"]);
}
}
ret.data[0].value = "LAG member speed and total speed is " + seen_up;
if (total_up != seen_up) {
ret.score = 500;
+ if (tagged(sw,'ignoreuplink')) {
+ ret.score = 0;
+ }
+
ret.why = "LAG member (ge/xe/et) speed is " + seen_up + " but logical (ae) is " + total_up;
ret.data[0].value = ret.why;
}
@@ -777,6 +830,47 @@ function cpuUpdater() {
}
}
}
+function memoryUpdater() {
+ for (var sw in nmsData.switches.switches) {
+ try {
+ var buffer = 0;
+ for (var u in nmsData.snmp.snmp[sw].misc.jnxOperatingBuffer) {
+ var local = nmsData.snmp.snmp[sw].misc['jnxOperatingBuffer'][u];
+ buffer = Math.max(nmsData.snmp.snmp[sw].misc.jnxOperatingBuffer[u],buffer);
+ }
+ nmsMap.setSwitchColor(sw, nmsColor.getColorStop(buffer * 10));
+ nmsMap.setSwitchInfo(sw, buffer + " % ");
+ } catch (e) {
+ nmsMap.setSwitchColor(sw, "white");
+ nmsMap.setSwitchInfo(sw, "N/A");
+ }
+ }
+}
+function memoryInfo(sw) {
+ var ret = new handlerInfo("memory","Memory utilization");
+ ret.why = "No Memory info";
+ ret.score = 0;
+
+ if (testTree(nmsData,['snmp','snmp',sw, 'misc','jnxOperatingBuffer'])) {
+ var memory = 0;
+ for (var u in nmsData.snmp.snmp[sw].misc.jnxOperatingBuffer) {
+ var local = nmsData.snmp.snmp[sw].misc['jnxOperatingBuffer'][u];
+ memory = Math.max(nmsData.snmp.snmp[sw].misc.jnxOperatingBuffer[u],memory);
+ }
+ if (memory < 70) {
+ ret.score = 0;
+ } else if (memory < 80) {
+ ret.score = 100;
+ } else if (memory < 90) {
+ ret.score = memory * 2;
+ } else {
+ ret.score = memory * 6;
+ }
+ ret.why = "Memory utilization: " + memory + "%";
+ ret.data[0].value = memory + "%";
+ }
+ return ret;
+}
function tagged(sw, tag) {
if (testTree(nmsData,['switches','switches',sw, 'tags'])) {
@@ -787,6 +881,63 @@ function tagged(sw, tag) {
return false;
}
+function networkInfo(sw) {
+ var ret = new handlerInfo("net","Network info");
+ ret.score = 0;
+ ret.why = "All good";
+ if (testTree(nmsData,['smanagement','switches',sw])) {
+ var i = 0;
+ var mg = nmsData.smanagement.switches[sw];
+ var objs = [{
+ d: "Management",
+ v: setTree(nmsData,['networks','networks',mg.mgmt_vlan],undefined)
+ },{
+ d: "Traffic",
+ v: setTree(nmsData,['networks','networks',mg.traffic_vlan],undefined)
+ }
+ ];
+ for (var x in objs) {
+ a = objs[x];
+ if (a.v == undefined) {
+ ret.data[i++] = {
+ value: 'Not set',
+ description: a.d + ' network'
+ };
+ continue;
+ }
+
+ ret.data[i++] = {
+ value: a.v.name || "Not set",
+ description: a.d + " network"
+ }
+ ret.data[i++] = {
+ value: a.v.vlan || "Not set",
+ description: a.d + " vlan"
+ }
+ ret.data[i++] = {
+ value: a.v.subnet4 || "Not set",
+ description: a.d + " subnet IPv4"
+ }
+ ret.data[i++] = {
+ value: a.v.gw4 || "Not set",
+ description: a.d + " gw IPv4"
+ }
+ ret.data[i++] = {
+ value: a.v.subnet6 || "Not set",
+ description: a.d + " subnet IPv6"
+ }
+ ret.data[i++] = {
+ value: a.v.gw6 || "Not set",
+ description: a.d + " gw IPv6"
+ }
+ ret.data[i++] = {
+ value: a.v.router || "Not set",
+ description: a.d + " net router"
+ }
+ }
+ }
+ return ret;
+}
function mgmtInfo(sw) {
var ret = new handlerInfo("mgmt","Management info");
ret.score = 0;
@@ -801,15 +952,10 @@ function mgmtInfo(sw) {
value: mg.mgmt_v6_addr || "N/A",
description: "Management IP (v6)"
}, {
- value: mg.subnet4 || "N/A",
- description: "Subnet (v4)"
- }, {
- value: mg.subnet6 || "N/A",
- description: "Subnet (v6)"
- }, {
value: mg.distro_name || "N/A",
description: "Distro"
- }];
+ }
+ ];
if ((mg.mgmt_v4_addr == undefined || mg.mgmt_v4_addr == "") && (mg.mgmt_v6_addr == undefined || mg.mgmt_v6_addr == "")) {
ret.why = "No IPv4 or IPv6 management IP";
ret.score = 1000;
@@ -843,6 +989,16 @@ function cpuInit() {
setLegend(5,"white","N/A");
cpuUpdater();
}
+function memoryInit() {
+ nmsData.addHandler("snmp", "mapHandler", memoryUpdater);
+ nmsColor.drawGradient([nmsColor.green,nmsColor.orange,nmsColor.red]);
+ setLegend(1,getColorStop(0),"0 %");
+ setLegend(2,getColorStop(250),"25 %");
+ setLegend(3,getColorStop(600),"60 %");
+ setLegend(4,getColorStop(1000),"100 %");
+ setLegend(5,"white","N/A");
+ memoryUpdater();
+}
function healthInfo(sw) {
var worst = new handlerInfo("health", "Health");
diff --git a/web/js/nms-map.js b/web/js/nms-map.js
index 1ebcf92..5927324 100644
--- a/web/js/nms-map.js
+++ b/web/js/nms-map.js
@@ -218,7 +218,7 @@ nmsMap.drawNow = function ()
} else {
now = new Date(nmsData.now); //Date assumes UTC
}
- now = now.toString().split(' ').splice(1,4).join(' '); //Date returns local time
+ now = now.toString().split(' ').splice(0,5).join(' '); //Date returns local time
if (nmsMap._lastNow == now) {
nmsMap.stats.nowDups++;
return;
@@ -231,6 +231,7 @@ nmsMap.drawNow = function ()
ctx.clearRect(0,0,800,100);
ctx.fillStyle = "white";
ctx.strokeStyle = "black";
+ ctx.translate(200,0);
ctx.lineWidth = nms.fontLineFactor;
ctx.strokeText(now, this._settings.textMargin, 25);
ctx.fillText(now, this._settings.textMargin, 25);
diff --git a/web/js/nms-template.js b/web/js/nms-template.js
index c34ef34..0f25367 100644
--- a/web/js/nms-template.js
+++ b/web/js/nms-template.js
@@ -4,36 +4,52 @@ var nmsTemplate = nmsTemplate || {
}
nmsTemplate.test = function() {
- var input = document.getElementById("template-input");
- var output = document.getElementById("template-output");
- var qp = document.getElementById("template-query-params");
- $.ajax({
- type: "POST",
- url: "/api/templates/test" + qp.value,
- async: false,
- data: input.value,
- dataType: "text",
- success: function (indata, textStatus, jqXHR) {
- var output = document.getElementById("template-output");
- output.value = jqXHR.responseText;
- },
- error: function (jqXHR, textStatus) {
- var output = document.getElementById("template-output");
- output.value = jqXHR.responseText;
- }
- });
+ var input = document.getElementById("template-input");
+ var output = document.getElementById("template-output");
+ var qp = document.getElementById("template-query-params");
+ $.ajax({
+ type: "POST",
+ url: "/api/templates/test" + qp.value,
+ async: false,
+ data: input.value,
+ dataType: "text",
+ success: function (indata, textStatus, jqXHR) {
+ var output = document.getElementById("template-output");
+ output.value = jqXHR.responseText;
+ },
+ error: function (jqXHR, textStatus) {
+ var output = document.getElementById("template-output");
+ output.value = jqXHR.responseText;
+ }
+ });
}
nmsTemplate.fromFile = function(template) {
- $.ajax({
- type: "GET",
- url: "/templates/" + template,
- async: false,
- dataType: "text",
- success: function (indata, textStatus, jqXHR) {
- var output = document.getElementById("template-input");
- output.value = indata;
- }
- });
- nmsTemplate.test();
+ if(template == '') { return; }
+ $.ajax({
+ type: "GET",
+ url: "/templates/" + template,
+ async: false,
+ dataType: "text",
+ success: function (indata, textStatus, jqXHR) {
+ var output = document.getElementById("template-input");
+ output.value = indata;
+ }
+ });
+ nmsTemplate.test();
}
+
+nmsTemplate.getTemplates = function() {
+ $.ajax({
+ type: "GET",
+ url: "/api/read/template-list",
+ async: false,
+ dataType: "json",
+ success: function (indata, textStatus, jqXHR) {
+ $.each( indata['templates'], function( value ) {
+ $('#nmsTemplate-select').append($("<option></option>").attr("value",indata['templates'][value]['file']).text(indata['templates'][value]['file']));
+ });
+ }
+ });
+}
+//nmsTemplate.getTemplates();
diff --git a/web/js/nms-time.js b/web/js/nms-time.js
index 315ac79..482cfa7 100644
--- a/web/js/nms-time.js
+++ b/web/js/nms-time.js
@@ -10,11 +10,15 @@
*/
var nmsTime = nmsTime || {
_now: undefined,
- _handle: undefined
+ _handle: undefined,
+ _stopTime: undefined
}
nmsTime.replayEvent = function() {
- throw "Not yet implemented.";
+ var eStart = setTree(nmsData,["config","config","data","start"],"2018-03-23T00:00:00+0200");
+ nmsTime._stopTime = new Date(setTree(nmsData,["config","config","data","end"],"2018-04-01T14:30:00+0200"));
+ nmsTime.setNow(eStart);
+ nmsTime.startPlayback(60);
}
nmsTime.isRealTime = function() {
@@ -89,6 +93,10 @@ nmsTime.step = function(amount) {
nmsTime.realTime();
return;
}
+ if (nmsTime._stopTime != undefined && nmsTime._now.getTime() >= nmsTime._stopTime.getTime()) {
+ nmsTime.stopPlayback();
+ nmsTime._stopTime = undefined;
+ }
nmsTime._now.setMinutes(nmsTime._now.getMinutes() + amount);
nmsTime._updateData();
}
@@ -127,7 +135,7 @@ nmsTime.startPlayback = function(speed) {
return;
}
nmsTime._speed = speed;
- nmsTime._handle = setInterval(nmsTime._tick,1000);
+ nmsTime._handle = setInterval(nmsTime._tick,2000);
}
nmsTime.togglePause = function() {
@@ -137,7 +145,7 @@ nmsTime.togglePause = function() {
if (nmsTime.isRealTime()) {
nmsTime.setNow(Date.now());
} else {
- nmsTime.startPlayback(nmsTime._speed ? nmsTime._speed : 5);
+ nmsTime.startPlayback(nmsTime._speed ? nmsTime._speed : 60);
}
}
}
diff --git a/web/js/nms.js b/web/js/nms.js
index e1d9283..0422f00 100644
--- a/web/js/nms.js
+++ b/web/js/nms.js
@@ -29,6 +29,7 @@ var nms = {
},
menuShowing:true,
+ oplogShowing:true,
get uptime() {
return (Date.now() - this._startTime)/1000;
},
@@ -60,6 +61,7 @@ var nms = {
'menuShowing',
'vertical',
'interval',
+ 'oplogShowing',
'user'
],
keyBindings:{
@@ -75,12 +77,15 @@ var nms = {
'8':setMapModeFromN,
'9':setMapModeFromN,
'c':toggleConnect,
+ 'H':moveTimeFromKey,
'h':moveTimeFromKey,
'j':moveTimeFromKey,
'k':moveTimeFromKey,
'l':moveTimeFromKey,
+ 'L':moveTimeFromKey,
'p':moveTimeFromKey,
'r':moveTimeFromKey,
+ 'o':toggleOplog,
'Escape':hideWindow,
'?':toggleHelp
},
@@ -134,7 +139,7 @@ function nmsTimer(handler, interval, name, description) {
function byteCount(bytes,precision) {
if (precision ==undefined)
precision = 1;
- var units = ['', 'K', 'M', 'G', 'T', 'P'];
+ var units = ['', 'K', 'M', 'G', 'T', 'P', 'E','Z'];
var i = 0;
while (bytes > 1024) {
bytes = bytes / 1024;
@@ -356,6 +361,7 @@ function getInitialConfig() {
} else {
nms._public = false;
document.body.classList.add("gondul-private");
+ nmsTemplate.getTemplates();
}
}
});
@@ -414,7 +420,7 @@ function detectHandler() {
var views = document.location.hash.slice(1);
var interval = nms.interval;
if (views == undefined || views == "")
- views = "ping";
+ views = "health";
views = views.split(",");
if (views.length > 1) {
@@ -444,6 +450,11 @@ function setMenu()
var nav = document.getElementsByTagName("nav")[0];
nav.style.display = nms.menuShowing ? '' : 'none';
}
+function setOplog()
+{
+ var nav = document.getElementById("oplog-parent-mini");
+ nav.style.display = nms.oplogShowing ? '' : 'none';
+}
function toggleMenu()
{
@@ -451,6 +462,12 @@ function toggleMenu()
setMenu();
saveSettings();
}
+function toggleOplog()
+{
+ nms.oplogShowing = ! nms.oplogShowing;
+ setOplog();
+ saveSettings();
+}
function hideWindow(e,key)
{
nmsInfoBox.hide();
@@ -499,6 +516,9 @@ function setMapModeFromN(e,key)
function moveTimeFromKey(e,key)
{
switch(key) {
+ case 'H':
+ nmsTime.stepKey(-1440);
+ break;
case 'h':
nmsTime.stepKey(-60);
break;
@@ -511,6 +531,9 @@ function moveTimeFromKey(e,key)
case 'l':
nmsTime.stepKey(60);
break;
+ case 'L':
+ nmsTime.stepKey(1440);
+ break;
case 'p':
nmsTime.togglePause();
break;
@@ -616,6 +639,7 @@ function restoreSettings()
nms[v] = retrieve[v];
}
setMenu();
+ setOplog();
}
/*
@@ -642,14 +666,25 @@ function nmsUpdateNavbarGraph() {
* do stuff with nmsData.snmp.snmp[sw].misc
* }
*
+ * New: setTree(root, array, default):
+ * same thing, but instead of just returing true/false, return the value found
+ * or the provided default.
*/
-function testTree(root, ar) {
- if (ar == undefined || root == undefined)
- return false;
- for (var i in ar) {
- root = root[ar[i]];
- if (root == undefined)
- return false;
+function setTree(root, ar, def) {
+ if (ar == undefined || root == undefined) {
+ return def;
+ } else {
+ for (var i in ar) {
+ root = root[ar[i]];
+ if (root == undefined)
+ return def;
+ }
}
- return true;
+ return root;
}
+function testTree(root, ar) {
+ var x = setTree(root,ar,false);
+ if (x != false)
+ return true;
+}
+
diff --git a/web/templates/HOWTO.txt b/web/templates/HOWTO.txt
index ed47926..641878e 100644
--- a/web/templates/HOWTO.txt
+++ b/web/templates/HOWTO.txt
@@ -8,7 +8,7 @@ We utilize Jinja2 templates.
-#}
{% set url = "localhost" -%}
-{% set example_switch = "distro0" -%}
+{% set example_switch = "r1.tele" -%}
See http://jinja.pocoo.org/ for the full documentation of the templating
language.