diff --git a/Netdisco/Changes b/Netdisco/Changes index 7116af1f..e9541105 100644 --- a/Netdisco/Changes +++ b/Netdisco/Changes @@ -4,6 +4,8 @@ * Device Port filter by vlan includes both tagging and untagged (closes #37) * Change colour and name of Port Control toggle option in Device Port View + * Incorporate latest DB schema changes from upstream + * Add some doc clarifcations [BUG FIXES] diff --git a/Netdisco/bin/nd-dbic-versions b/Netdisco/bin/nd-dbic-versions index 1ec2e84e..329953c4 100755 --- a/Netdisco/bin/nd-dbic-versions +++ b/Netdisco/bin/nd-dbic-versions @@ -21,6 +21,24 @@ If called with the "-p " option, upgrade SQL DDL command files are created between the specified version and the current DBIx::Class specification. +=head2 New Version + +=over 4 + +=item 1. + +Alter the DBIC DDL files as you wish. + +=item 2. + +Increment the Schema's C<$VERSION> number. + +=item 3. + +Run this script with "C<-p $current_db_version>". + +=back + =cut my $sql_dir = $App::Netdisco::DB::schema_versions_dir; diff --git a/Netdisco/bin/netdisco-db-deploy b/Netdisco/bin/netdisco-db-deploy index 7f8c2068..ae0cea79 100755 --- a/Netdisco/bin/netdisco-db-deploy +++ b/Netdisco/bin/netdisco-db-deploy @@ -37,11 +37,7 @@ Version 2 is the "classic" Netdisco database schema as of Netdisco 1.1 =item * -Version 3 adds patches for Netdisco 1.2 - -=item * - -Version 4 (not yet created) B +Version 3 (and onwards) adds patches for Netdisco 1.2 =back diff --git a/Netdisco/lib/App/Netdisco.pm b/Netdisco/lib/App/Netdisco.pm index b5fb42b8..fd4e5823 100644 --- a/Netdisco/lib/App/Netdisco.pm +++ b/Netdisco/lib/App/Netdisco.pm @@ -161,6 +161,13 @@ a username of C and the C flag set to true: netdisco=> insert into users (username, port_control) values ('guest', true); +=head1 Upgrading + +Simply install this module again, then upgrade the database schema: + + ~/bin/localenv cpanm --quiet --notest App::Netdisco + DANCER_ENVDIR=~/environments ~/bin/localenv netdisco-deploy + =head1 Future Work Bundled with this app is a L layer for the Netdisco database. diff --git a/Netdisco/lib/App/Netdisco/DB.pm b/Netdisco/lib/App/Netdisco/DB.pm index a45d1837..469aaec6 100644 --- a/Netdisco/lib/App/Netdisco/DB.pm +++ b/Netdisco/lib/App/Netdisco/DB.pm @@ -15,7 +15,7 @@ __PACKAGE__->load_namespaces; # Created by DBIx::Class::Schema::Loader v0.07015 @ 2012-01-07 14:20:02 # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:tQTf/oInVydRDsuIFLSU4A -our $VERSION = 3; # schema version used for upgrades, keep as integer +our $VERSION = 4; # schema version used for upgrades, keep as integer use Path::Class; use File::Basename; diff --git a/Netdisco/lib/App/Netdisco/DB/Result/Node.pm b/Netdisco/lib/App/Netdisco/DB/Result/Node.pm index 6336cf13..bd91a6da 100644 --- a/Netdisco/lib/App/Netdisco/DB/Result/Node.pm +++ b/Netdisco/lib/App/Netdisco/DB/Result/Node.pm @@ -41,8 +41,10 @@ __PACKAGE__->add_columns( is_nullable => 1, original => { default_value => \"now()" }, }, + "vlan", + { data_type => "text", is_nullable => 1, default_value => '0' }, ); -__PACKAGE__->set_primary_key("mac", "switch", "port"); +__PACKAGE__->set_primary_key("mac", "switch", "port", "vlan"); # Created by DBIx::Class::Schema::Loader v0.07015 @ 2012-01-07 14:20:02 diff --git a/Netdisco/lib/App/Netdisco/DB/Result/NodeWireless.pm b/Netdisco/lib/App/Netdisco/DB/Result/NodeWireless.pm index 50314b7d..dc00a0e5 100644 --- a/Netdisco/lib/App/Netdisco/DB/Result/NodeWireless.pm +++ b/Netdisco/lib/App/Netdisco/DB/Result/NodeWireless.pm @@ -37,8 +37,10 @@ __PACKAGE__->add_columns( is_nullable => 1, original => { default_value => \"now()" }, }, + "ssid", + { data_type => "text", is_nullable => 1, default_value => '' }, ); -__PACKAGE__->set_primary_key("mac"); +__PACKAGE__->set_primary_key("mac", "ssid"); # Created by DBIx::Class::Schema::Loader v0.07015 @ 2012-01-07 14:20:02 diff --git a/Netdisco/lib/App/Netdisco/DB/schema_versions/App-Netdisco-DB-3-4-PostgreSQL.sql b/Netdisco/lib/App/Netdisco/DB/schema_versions/App-Netdisco-DB-3-4-PostgreSQL.sql new file mode 100644 index 00000000..c10c6d9d --- /dev/null +++ b/Netdisco/lib/App/Netdisco/DB/schema_versions/App-Netdisco-DB-3-4-PostgreSQL.sql @@ -0,0 +1,22 @@ +-- Convert schema '/home/oliver/git/netdisco-frontend-sandpit/Netdisco/bin/../lib/App/Netdisco/DB/schema_versions/App-Netdisco-DB-3-PostgreSQL.sql' to '/home/oliver/git/netdisco-frontend-sandpit/Netdisco/bin/../lib/App/Netdisco/DB/schema_versions/App-Netdisco-DB-4-PostgreSQL.sql':; + +BEGIN; + +ALTER TABLE node DROP CONSTRAINT node_pkey; + +ALTER TABLE node_wireless DROP CONSTRAINT node_wireless_pkey; + +ALTER TABLE node ADD COLUMN vlan text DEFAULT '0' NOT NULL; + +ALTER TABLE node_wireless ADD COLUMN ssid text DEFAULT '' NOT NULL; + +CREATE INDEX device_port_power_idx_ip_port on device_port_power (ip, port); + +ALTER TABLE admin ADD PRIMARY KEY (job); + +ALTER TABLE node ADD PRIMARY KEY (mac, switch, port, vla); + +ALTER TABLE node_wireless ADD PRIMARY KEY (mac, ssid); + +COMMIT; + diff --git a/Netdisco/lib/App/Netdisco/DB/schema_versions/App-Netdisco-DB-4-PostgreSQL.sql b/Netdisco/lib/App/Netdisco/DB/schema_versions/App-Netdisco-DB-4-PostgreSQL.sql new file mode 100644 index 00000000..4cfafd21 --- /dev/null +++ b/Netdisco/lib/App/Netdisco/DB/schema_versions/App-Netdisco-DB-4-PostgreSQL.sql @@ -0,0 +1,469 @@ +-- +-- Created by SQL::Translator::Producer::PostgreSQL +-- Created on Tue Jan 29 22:24:59 2013 +-- +-- +-- Table: admin +-- +DROP TABLE "admin" CASCADE; +CREATE TABLE "admin" ( + "job" serial NOT NULL, + "entered" timestamp DEFAULT current_timestamp, + "started" timestamp, + "finished" timestamp, + "device" inet, + "port" text, + "action" text, + "subaction" text, + "status" text, + "username" text, + "userip" inet, + "log" text, + "debug" boolean, + PRIMARY KEY ("job") +); + +-- +-- Table: device +-- +DROP TABLE "device" CASCADE; +CREATE TABLE "device" ( + "ip" inet NOT NULL, + "creation" timestamp DEFAULT current_timestamp, + "dns" text, + "description" text, + "uptime" bigint, + "contact" text, + "name" text, + "location" text, + "layers" character varying(8), + "ports" integer, + "mac" macaddr, + "serial" text, + "model" text, + "ps1_type" text, + "ps2_type" text, + "ps1_status" text, + "ps2_status" text, + "fan" text, + "slots" integer, + "vendor" text, + "os" text, + "os_ver" text, + "log" text, + "snmp_ver" integer, + "snmp_comm" text, + "snmp_class" text, + "vtp_domain" text, + "last_discover" timestamp, + "last_macsuck" timestamp, + "last_arpnip" timestamp, + PRIMARY KEY ("ip") +); + +-- +-- Table: device_module +-- +DROP TABLE "device_module" CASCADE; +CREATE TABLE "device_module" ( + "ip" inet NOT NULL, + "index" integer NOT NULL, + "description" text, + "type" text, + "parent" integer, + "name" text, + "class" text, + "pos" integer, + "hw_ver" text, + "fw_ver" text, + "sw_ver" text, + "serial" text, + "model" text, + "fru" boolean, + "creation" timestamp DEFAULT current_timestamp, + "last_discover" timestamp, + PRIMARY KEY ("ip", "index") +); + +-- +-- Table: device_port_log +-- +DROP TABLE "device_port_log" CASCADE; +CREATE TABLE "device_port_log" ( + "id" serial NOT NULL, + "ip" inet, + "port" text, + "reason" text, + "log" text, + "username" text, + "userip" inet, + "action" text, + "creation" timestamp DEFAULT current_timestamp +); + +-- +-- Table: device_port_ssid +-- +DROP TABLE "device_port_ssid" CASCADE; +CREATE TABLE "device_port_ssid" ( + "ip" inet, + "port" text, + "ssid" text, + "broadcast" boolean, + "bssid" macaddr +); + +-- +-- Table: device_port_wireless +-- +DROP TABLE "device_port_wireless" CASCADE; +CREATE TABLE "device_port_wireless" ( + "ip" inet, + "port" text, + "channel" integer, + "power" integer +); + +-- +-- Table: device_power +-- +DROP TABLE "device_power" CASCADE; +CREATE TABLE "device_power" ( + "ip" inet NOT NULL, + "module" integer NOT NULL, + "power" integer, + "status" text, + PRIMARY KEY ("ip", "module") +); + +-- +-- Table: device_route +-- +DROP TABLE "device_route" CASCADE; +CREATE TABLE "device_route" ( + "ip" inet NOT NULL, + "network" cidr NOT NULL, + "creation" timestamp DEFAULT current_timestamp, + "dest" inet NOT NULL, + "last_discover" timestamp DEFAULT current_timestamp, + PRIMARY KEY ("ip", "network", "dest") +); + +-- +-- Table: log +-- +DROP TABLE "log" CASCADE; +CREATE TABLE "log" ( + "id" serial NOT NULL, + "creation" timestamp DEFAULT current_timestamp, + "class" text, + "entry" text, + "logfile" text +); + +-- +-- Table: node_ip +-- +DROP TABLE "node_ip" CASCADE; +CREATE TABLE "node_ip" ( + "mac" macaddr NOT NULL, + "ip" inet NOT NULL, + "dns" text, + "active" boolean, + "time_first" timestamp DEFAULT current_timestamp, + "time_last" timestamp DEFAULT current_timestamp, + PRIMARY KEY ("mac", "ip") +); + +-- +-- Table: node_monitor +-- +DROP TABLE "node_monitor" CASCADE; +CREATE TABLE "node_monitor" ( + "mac" macaddr NOT NULL, + "active" boolean, + "why" text, + "cc" text, + "date" timestamp DEFAULT current_timestamp, + PRIMARY KEY ("mac") +); + +-- +-- Table: node_nbt +-- +DROP TABLE "node_nbt" CASCADE; +CREATE TABLE "node_nbt" ( + "mac" macaddr NOT NULL, + "ip" inet, + "nbname" text, + "domain" text, + "server" boolean, + "nbuser" text, + "active" boolean, + "time_first" timestamp DEFAULT current_timestamp, + "time_last" timestamp DEFAULT current_timestamp, + PRIMARY KEY ("mac") +); + +-- +-- Table: node_wireless +-- +DROP TABLE "node_wireless" CASCADE; +CREATE TABLE "node_wireless" ( + "mac" macaddr NOT NULL, + "uptime" integer, + "maxrate" integer, + "txrate" integer, + "sigstrength" integer, + "sigqual" integer, + "rxpkt" integer, + "txpkt" integer, + "rxbyte" bigint, + "txbyte" bigint, + "time_last" timestamp DEFAULT current_timestamp, + "ssid" text DEFAULT '' NOT NULL, + PRIMARY KEY ("mac", "ssid") +); + +-- +-- Table: oui +-- +DROP TABLE "oui" CASCADE; +CREATE TABLE "oui" ( + "oui" character varying(8) NOT NULL, + "company" text, + PRIMARY KEY ("oui") +); + +-- +-- Table: process +-- +DROP TABLE "process" CASCADE; +CREATE TABLE "process" ( + "controller" integer NOT NULL, + "device" inet NOT NULL, + "action" text NOT NULL, + "status" text, + "count" integer, + "creation" timestamp DEFAULT current_timestamp +); + +-- +-- Table: sessions +-- +DROP TABLE "sessions" CASCADE; +CREATE TABLE "sessions" ( + "id" character(32) NOT NULL, + "creation" timestamp DEFAULT current_timestamp, + "a_session" text, + PRIMARY KEY ("id") +); + +-- +-- Table: subnets +-- +DROP TABLE "subnets" CASCADE; +CREATE TABLE "subnets" ( + "net" cidr NOT NULL, + "creation" timestamp DEFAULT current_timestamp, + "last_discover" timestamp DEFAULT current_timestamp, + PRIMARY KEY ("net") +); + +-- +-- Table: topology +-- +DROP TABLE "topology" CASCADE; +CREATE TABLE "topology" ( + "dev1" inet NOT NULL, + "port1" text NOT NULL, + "dev2" inet NOT NULL, + "port2" text NOT NULL +); + +-- +-- Table: user_log +-- +DROP TABLE "user_log" CASCADE; +CREATE TABLE "user_log" ( + "entry" serial NOT NULL, + "username" character varying(50), + "userip" inet, + "event" text, + "details" text, + "creation" timestamp DEFAULT current_timestamp +); + +-- +-- Table: users +-- +DROP TABLE "users" CASCADE; +CREATE TABLE "users" ( + "username" character varying(50) NOT NULL, + "password" text, + "creation" timestamp DEFAULT current_timestamp, + "last_on" timestamp, + "port_control" boolean DEFAULT false, + "ldap" boolean DEFAULT false, + "admin" boolean DEFAULT false, + "fullname" text, + "note" text, + PRIMARY KEY ("username") +); + +-- +-- Table: device_vlan +-- +DROP TABLE "device_vlan" CASCADE; +CREATE TABLE "device_vlan" ( + "ip" inet NOT NULL, + "vlan" integer NOT NULL, + "description" text, + "creation" timestamp DEFAULT current_timestamp, + "last_discover" timestamp DEFAULT current_timestamp, + PRIMARY KEY ("ip", "vlan") +); +CREATE INDEX "device_vlan_idx_ip" on "device_vlan" ("ip"); + +-- +-- Table: device_ip +-- +DROP TABLE "device_ip" CASCADE; +CREATE TABLE "device_ip" ( + "ip" inet NOT NULL, + "alias" inet NOT NULL, + "subnet" cidr, + "port" text, + "dns" text, + "creation" timestamp DEFAULT current_timestamp, + PRIMARY KEY ("ip", "alias"), + CONSTRAINT "device_ip_alias" UNIQUE ("alias") +); +CREATE INDEX "device_ip_idx_ip" on "device_ip" ("ip"); +CREATE INDEX "device_ip_idx_ip_port" on "device_ip" ("ip", "port"); + +-- +-- Table: device_port +-- +DROP TABLE "device_port" CASCADE; +CREATE TABLE "device_port" ( + "ip" inet NOT NULL, + "port" text NOT NULL, + "creation" timestamp DEFAULT current_timestamp, + "descr" text, + "up" text, + "up_admin" text, + "type" text, + "duplex" text, + "duplex_admin" text, + "speed" text, + "name" text, + "mac" macaddr, + "mtu" integer, + "stp" text, + "remote_ip" inet, + "remote_port" text, + "remote_type" text, + "remote_id" text, + "vlan" text, + "pvid" integer, + "lastchange" bigint, + PRIMARY KEY ("port", "ip") +); +CREATE INDEX "device_port_idx_ip" on "device_port" ("ip"); +CREATE INDEX "device_port_idx_remote_ip" on "device_port" ("remote_ip"); + +-- +-- Table: device_port_power +-- +DROP TABLE "device_port_power" CASCADE; +CREATE TABLE "device_port_power" ( + "ip" inet NOT NULL, + "port" text NOT NULL, + "module" integer, + "admin" text, + "status" text, + "class" text, + "power" integer, + PRIMARY KEY ("port", "ip") +); +CREATE INDEX "device_port_power_idx_ip_port" on "device_port_power" ("ip", "port"); + +-- +-- Table: device_port_vlan +-- +DROP TABLE "device_port_vlan" CASCADE; +CREATE TABLE "device_port_vlan" ( + "ip" inet NOT NULL, + "port" text NOT NULL, + "vlan" integer NOT NULL, + "native" boolean DEFAULT false NOT NULL, + "creation" timestamp DEFAULT current_timestamp, + "last_discover" timestamp DEFAULT current_timestamp, + "vlantype" text, + PRIMARY KEY ("ip", "port", "vlan") +); +CREATE INDEX "device_port_vlan_idx_ip" on "device_port_vlan" ("ip"); +CREATE INDEX "device_port_vlan_idx_ip_port" on "device_port_vlan" ("ip", "port"); +CREATE INDEX "device_port_vlan_idx_ip_vlan" on "device_port_vlan" ("ip", "vlan"); + +-- +-- Table: node +-- +DROP TABLE "node" CASCADE; +CREATE TABLE "node" ( + "mac" macaddr NOT NULL, + "switch" inet NOT NULL, + "port" text NOT NULL, + "active" boolean, + "oui" character varying(8), + "time_first" timestamp DEFAULT current_timestamp, + "time_recent" timestamp DEFAULT current_timestamp, + "time_last" timestamp DEFAULT current_timestamp, + "vlan" text DEFAULT '0' NOT NULL, + PRIMARY KEY ("mac", "switch", "port", "vlan") +); +CREATE INDEX "node_idx_switch" on "node" ("switch"); +CREATE INDEX "node_idx_switch_port" on "node" ("switch", "port"); +CREATE INDEX "node_idx_oui" on "node" ("oui"); + +-- +-- Foreign Key Definitions +-- + +-- ALTER TABLE "device_vlan" ADD FOREIGN KEY ("ip") +-- REFERENCES "device" ("ip") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; +-- +-- ALTER TABLE "device_ip" ADD FOREIGN KEY ("ip") +-- REFERENCES "device" ("ip") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; +-- +-- ALTER TABLE "device_ip" ADD FOREIGN KEY ("ip", "port") +-- REFERENCES "device_port" ("ip", "port") DEFERRABLE; +-- +-- ALTER TABLE "device_port" ADD FOREIGN KEY ("ip") +-- REFERENCES "device" ("ip") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; +-- +-- ALTER TABLE "device_port" ADD FOREIGN KEY ("remote_ip") +-- REFERENCES "device_ip" ("alias") DEFERRABLE; +-- +-- ALTER TABLE "device_port_power" ADD FOREIGN KEY ("ip", "port") +-- REFERENCES "device_port" ("ip", "port") ON DELETE CASCADE DEFERRABLE; +-- +-- ALTER TABLE "device_port_vlan" ADD FOREIGN KEY ("ip") +-- REFERENCES "device" ("ip") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; +-- +-- ALTER TABLE "device_port_vlan" ADD FOREIGN KEY ("ip", "port") +-- REFERENCES "device_port" ("ip", "port") DEFERRABLE; +-- +-- ALTER TABLE "device_port_vlan" ADD FOREIGN KEY ("ip", "vlan") +-- REFERENCES "device_vlan" ("ip", "vlan") DEFERRABLE; +-- +-- ALTER TABLE "node" ADD FOREIGN KEY ("switch") +-- REFERENCES "device" ("ip") DEFERRABLE; +-- +-- ALTER TABLE "node" ADD FOREIGN KEY ("switch", "port") +-- REFERENCES "device_port" ("ip", "port") ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE; +-- +-- ALTER TABLE "node" ADD FOREIGN KEY ("oui") +-- REFERENCES "oui" ("oui") DEFERRABLE; +--