* Updated Alert->register() to take message variables using the 'variables' parameter. * Added a 'cache' parameter to Database->insert_or_update_health() and ->insert_or_update_temperature(). When set, the SQL UPDATE/INSERT calls and pushed into the array reference set in 'cache'. This is to allow performance improvements when processing a large amount of sensor/device data. * Updated Log->variables() to take a 'prefix' parameter that, when set, will prefix the string to each variable line. * Updated scan-ipmitool to use Database->insert_or_update_health() and ->insert_or_update_temperature(). Signed-off-by: Digimer <digimer@alteeve.ca>main
parent
51de6c721f
commit
1c00060d6e
17 changed files with 12346 additions and 664 deletions
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,640 @@ |
|||||||
|
-- This is the database schema for the 'storcli Scan Agent'. |
||||||
|
-- |
||||||
|
-- Things that change rarely should go in the main tables (even if we won't explicitely watch for them |
||||||
|
-- to change with specific alerts). |
||||||
|
|
||||||
|
-- ------------------------------------------------------------------------------------------------------- -- |
||||||
|
-- Adapter -- |
||||||
|
-- ------------------------------------------------------------------------------------------------------- -- |
||||||
|
|
||||||
|
-- Here is the basic controller information. All connected devices will reference back to this table's |
||||||
|
-- 'storcli_controller_serial_number' column. |
||||||
|
|
||||||
|
-- Key variables; |
||||||
|
-- - "ROC temperature" |
||||||
|
CREATE TABLE scan_storcli_controllers ( |
||||||
|
scan_storcli_controller_uuid uuid not null primary key, |
||||||
|
scan_storcli_controller_host_uuid uuid not null, |
||||||
|
scan_storcli_controller_serial_number text not null, -- This is the core identifier |
||||||
|
scan_storcli_controller_model text not null, -- "model" |
||||||
|
scan_storcli_controller_alarm_state text not null, -- "alarm_state" |
||||||
|
scan_storcli_controller_cache_size numeric not null, -- "on_board_memory_size" |
||||||
|
modified_date timestamp with time zone not null, |
||||||
|
|
||||||
|
FOREIGN KEY(scan_storcli_controller_host_uuid) REFERENCES hosts(host_uuid) |
||||||
|
); |
||||||
|
ALTER TABLE scan_storcli_controllers OWNER TO admin; |
||||||
|
|
||||||
|
CREATE TABLE history.scan_storcli_controllers ( |
||||||
|
history_id bigserial, |
||||||
|
scan_storcli_controller_uuid uuid, |
||||||
|
scan_storcli_controller_host_uuid uuid, |
||||||
|
scan_storcli_controller_serial_number text, |
||||||
|
scan_storcli_controller_model text, |
||||||
|
scan_storcli_controller_alarm_state text, |
||||||
|
scan_storcli_controller_cache_size numeric, |
||||||
|
modified_date timestamp with time zone |
||||||
|
); |
||||||
|
ALTER TABLE history.scan_storcli_controllers OWNER TO admin; |
||||||
|
|
||||||
|
CREATE FUNCTION history_scan_storcli_controllers() RETURNS trigger |
||||||
|
AS $$ |
||||||
|
DECLARE |
||||||
|
history_scan_storcli_controllers RECORD; |
||||||
|
BEGIN |
||||||
|
SELECT INTO history_scan_storcli_controllers * FROM scan_storcli_controllers WHERE scan_storcli_controller_uuid=new.scan_storcli_controller_uuid; |
||||||
|
INSERT INTO history.scan_storcli_controllers |
||||||
|
(scan_storcli_controller_uuid, |
||||||
|
scan_storcli_controller_host_uuid, |
||||||
|
scan_storcli_controller_serial_number, |
||||||
|
scan_storcli_controller_model, |
||||||
|
scan_storcli_controller_alarm_state, |
||||||
|
scan_storcli_controller_cache_size, |
||||||
|
modified_date) |
||||||
|
VALUES |
||||||
|
(history_scan_storcli_controllers.scan_storcli_controller_uuid, |
||||||
|
history_scan_storcli_controllers.scan_storcli_controller_host_uuid, |
||||||
|
history_scan_storcli_controllers.scan_storcli_controller_serial_number, |
||||||
|
history_scan_storcli_controllers.scan_storcli_controller_model, |
||||||
|
history_scan_storcli_controllers.scan_storcli_controller_alarm_state, |
||||||
|
history_scan_storcli_controllers.scan_storcli_controller_cache_size, |
||||||
|
history_scan_storcli_controllers.modified_date); |
||||||
|
RETURN NULL; |
||||||
|
END; |
||||||
|
$$ |
||||||
|
LANGUAGE plpgsql; |
||||||
|
ALTER FUNCTION history_scan_storcli_controllers() OWNER TO admin; |
||||||
|
|
||||||
|
CREATE TRIGGER trigger_scan_storcli_controllers |
||||||
|
AFTER INSERT OR UPDATE ON scan_storcli_controllers |
||||||
|
FOR EACH ROW EXECUTE PROCEDURE history_scan_storcli_controllers(); |
||||||
|
|
||||||
|
|
||||||
|
-- ------------------------------------------------------------------------------------------------------- -- |
||||||
|
-- Cachevault -- |
||||||
|
-- ------------------------------------------------------------------------------------------------------- -- |
||||||
|
|
||||||
|
-- Key variables; |
||||||
|
-- - "Temperature" |
||||||
|
-- - "Capacitance" |
||||||
|
-- - "Pack Energy" |
||||||
|
-- - "Next Learn time" |
||||||
|
-- This records the basic information about the cachevault (FBU) unit. |
||||||
|
CREATE TABLE scan_storcli_cachevaults ( |
||||||
|
scan_storcli_cachevault_uuid uuid not null primary key, |
||||||
|
scan_storcli_cachevault_host_uuid uuid not null, |
||||||
|
scan_storcli_cachevault_controller_uuid uuid not null, |
||||||
|
scan_storcli_cachevault_serial_number text not null, -- "Serial Number" |
||||||
|
scan_storcli_cachevault_state text not null, -- "State" |
||||||
|
scan_storcli_cachevault_design_capacity text not null, -- "Design Capacity" |
||||||
|
scan_storcli_cachevault_replacement_needed text not null, -- "Replacement required" |
||||||
|
scan_storcli_cachevault_type text not null, -- "Type" |
||||||
|
scan_storcli_cachevault_model text not null, -- "Device Name" |
||||||
|
scan_storcli_cachevault_manufacture_date text not null, -- "Date of Manufacture" |
||||||
|
modified_date timestamp with time zone not null, |
||||||
|
|
||||||
|
FOREIGN KEY(scan_storcli_cachevault_host_uuid) REFERENCES hosts(host_uuid), |
||||||
|
FOREIGN KEY(scan_storcli_cachevault_controller_uuid) REFERENCES scan_storcli_controllers(scan_storcli_controller_uuid) |
||||||
|
); |
||||||
|
ALTER TABLE scan_storcli_cachevaults OWNER TO admin; |
||||||
|
|
||||||
|
CREATE TABLE history.scan_storcli_cachevaults ( |
||||||
|
history_id bigserial, |
||||||
|
scan_storcli_cachevault_uuid uuid, |
||||||
|
scan_storcli_cachevault_host_uuid uuid, |
||||||
|
scan_storcli_cachevault_controller_uuid uuid, |
||||||
|
scan_storcli_cachevault_serial_number text, |
||||||
|
scan_storcli_cachevault_state text, |
||||||
|
scan_storcli_cachevault_design_capacity text, |
||||||
|
scan_storcli_cachevault_replacement_needed text, |
||||||
|
scan_storcli_cachevault_type text, |
||||||
|
scan_storcli_cachevault_model text, |
||||||
|
scan_storcli_cachevault_manufacture_date text, |
||||||
|
modified_date timestamp with time zone |
||||||
|
); |
||||||
|
ALTER TABLE history.scan_storcli_cachevaults OWNER TO admin; |
||||||
|
|
||||||
|
CREATE FUNCTION history_scan_storcli_cachevaults() RETURNS trigger |
||||||
|
AS $$ |
||||||
|
DECLARE |
||||||
|
history_scan_storcli_cachevaults RECORD; |
||||||
|
BEGIN |
||||||
|
SELECT INTO history_scan_storcli_cachevaults * FROM scan_storcli_cachevaults WHERE scan_storcli_cachevault_uuid=new.scan_storcli_cachevault_uuid; |
||||||
|
INSERT INTO history.scan_storcli_cachevaults |
||||||
|
(scan_storcli_cachevault_uuid, |
||||||
|
scan_storcli_cachevault_host_uuid, |
||||||
|
scan_storcli_cachevault_controller_uuid, |
||||||
|
scan_storcli_cachevault_serial_number, |
||||||
|
scan_storcli_cachevault_state, |
||||||
|
scan_storcli_cachevault_design_capacity, |
||||||
|
scan_storcli_cachevault_replacement_needed, |
||||||
|
scan_storcli_cachevault_type, |
||||||
|
scan_storcli_cachevault_model, |
||||||
|
scan_storcli_cachevault_manufacture_date, |
||||||
|
modified_date) |
||||||
|
VALUES |
||||||
|
(history_scan_storcli_cachevaults.scan_storcli_cachevault_uuid, |
||||||
|
history_scan_storcli_cachevaults.scan_storcli_cachevault_host_uuid, |
||||||
|
history_scan_storcli_cachevaults.scan_storcli_cachevault_controller_uuid, |
||||||
|
history_scan_storcli_cachevaults.scan_storcli_cachevault_serial_number, |
||||||
|
history_scan_storcli_cachevaults.scan_storcli_cachevault_state, |
||||||
|
history_scan_storcli_cachevaults.scan_storcli_cachevault_design_capacity, |
||||||
|
history_scan_storcli_cachevaults.scan_storcli_cachevault_replacement_needed, |
||||||
|
history_scan_storcli_cachevaults.scan_storcli_cachevault_type, |
||||||
|
history_scan_storcli_cachevaults.scan_storcli_cachevault_model, |
||||||
|
history_scan_storcli_cachevaults.scan_storcli_cachevault_manufacture_date, |
||||||
|
history_scan_storcli_cachevaults.modified_date); |
||||||
|
RETURN NULL; |
||||||
|
END; |
||||||
|
$$ |
||||||
|
LANGUAGE plpgsql; |
||||||
|
ALTER FUNCTION history_scan_storcli_cachevaults() OWNER TO admin; |
||||||
|
|
||||||
|
CREATE TRIGGER trigger_scan_storcli_cachevaults |
||||||
|
AFTER INSERT OR UPDATE ON scan_storcli_cachevaults |
||||||
|
FOR EACH ROW EXECUTE PROCEDURE history_scan_storcli_cachevaults(); |
||||||
|
|
||||||
|
|
||||||
|
-- ------------------------------------------------------------------------------------------------------- -- |
||||||
|
-- Battery Backup Units -- |
||||||
|
-- ------------------------------------------------------------------------------------------------------- -- |
||||||
|
|
||||||
|
-- Key variables; |
||||||
|
-- - "Temperature" |
||||||
|
-- - "Absolute state of charge" |
||||||
|
-- - "Cycle Count" |
||||||
|
-- - "Full Charge Capacity" |
||||||
|
-- - "Fully Charged" |
||||||
|
-- - "Learn Cycle Active" |
||||||
|
-- - "Next Learn time" |
||||||
|
-- - "Over Charged" |
||||||
|
-- - "Over Temperature" |
||||||
|
-- This records the basic information about the cachevault (FBU) unit. |
||||||
|
CREATE TABLE scan_storcli_bbus ( |
||||||
|
scan_storcli_bbu_uuid uuid not null primary key, |
||||||
|
scan_storcli_bbu_host_uuid uuid not null, |
||||||
|
scan_storcli_bbu_controller_uuid uuid not null, |
||||||
|
scan_storcli_bbu_serial_number text not null, -- "Serial Number" |
||||||
|
scan_storcli_bbu_type text not null, -- "Type" |
||||||
|
scan_storcli_bbu_model text not null, -- "Manufacture Name" |
||||||
|
scan_storcli_bbu_state text not null, -- "Battery State" |
||||||
|
scan_storcli_bbu_manufacture_date text not null, -- "Date of Manufacture" |
||||||
|
scan_storcli_bbu_design_capacity text not null, -- "Design Capacity" |
||||||
|
scan_storcli_bbu_replacement_needed text not null, -- "Pack is about to fail & should be replaced" |
||||||
|
modified_date timestamp with time zone not null, |
||||||
|
|
||||||
|
FOREIGN KEY(scan_storcli_bbu_host_uuid) REFERENCES hosts(host_uuid), |
||||||
|
FOREIGN KEY(scan_storcli_bbu_controller_uuid) REFERENCES scan_storcli_controllers(scan_storcli_controller_uuid) |
||||||
|
); |
||||||
|
ALTER TABLE scan_storcli_bbus OWNER TO admin; |
||||||
|
|
||||||
|
CREATE TABLE history.scan_storcli_bbus ( |
||||||
|
history_id bigserial, |
||||||
|
scan_storcli_bbu_uuid uuid, |
||||||
|
scan_storcli_bbu_host_uuid uuid, |
||||||
|
scan_storcli_bbu_controller_uuid uuid, |
||||||
|
scan_storcli_bbu_serial_number text, |
||||||
|
scan_storcli_bbu_type text, |
||||||
|
scan_storcli_bbu_model text, |
||||||
|
scan_storcli_bbu_state text, |
||||||
|
scan_storcli_bbu_manufacture_date text, |
||||||
|
scan_storcli_bbu_design_capacity text, |
||||||
|
scan_storcli_bbu_replacement_needed text, |
||||||
|
modified_date timestamp with time zone |
||||||
|
); |
||||||
|
ALTER TABLE history.scan_storcli_bbus OWNER TO admin; |
||||||
|
|
||||||
|
CREATE FUNCTION history_scan_storcli_bbus() RETURNS trigger |
||||||
|
AS $$ |
||||||
|
DECLARE |
||||||
|
history_scan_storcli_bbus RECORD; |
||||||
|
BEGIN |
||||||
|
SELECT INTO history_scan_storcli_bbus * FROM scan_storcli_bbus WHERE scan_storcli_bbu_uuid=new.scan_storcli_bbu_uuid; |
||||||
|
INSERT INTO history.scan_storcli_bbus |
||||||
|
(scan_storcli_bbu_uuid, |
||||||
|
scan_storcli_bbu_host_uuid, |
||||||
|
scan_storcli_bbu_controller_uuid, |
||||||
|
scan_storcli_bbu_serial_number, |
||||||
|
scan_storcli_bbu_type, |
||||||
|
scan_storcli_bbu_model, |
||||||
|
scan_storcli_bbu_state, |
||||||
|
scan_storcli_bbu_manufacture_date, |
||||||
|
scan_storcli_bbu_design_capacity, |
||||||
|
scan_storcli_bbu_replacement_needed, |
||||||
|
modified_date) |
||||||
|
VALUES |
||||||
|
(history_scan_storcli_bbus.scan_storcli_bbu_uuid, |
||||||
|
history_scan_storcli_bbus.scan_storcli_bbu_host_uuid, |
||||||
|
history_scan_storcli_bbus.scan_storcli_bbu_controller_uuid, |
||||||
|
history_scan_storcli_bbus.scan_storcli_bbu_serial_number, |
||||||
|
history_scan_storcli_bbus.scan_storcli_bbu_type, |
||||||
|
history_scan_storcli_bbus.scan_storcli_bbu_model, |
||||||
|
history_scan_storcli_bbus.scan_storcli_bbu_state, |
||||||
|
history_scan_storcli_bbus.scan_storcli_bbu_manufacture_date, |
||||||
|
history_scan_storcli_bbus.scan_storcli_bbu_design_capacity, |
||||||
|
history_scan_storcli_bbus.scan_storcli_bbu_replacement_needed, |
||||||
|
history_scan_storcli_bbus.modified_date); |
||||||
|
RETURN NULL; |
||||||
|
END; |
||||||
|
$$ |
||||||
|
LANGUAGE plpgsql; |
||||||
|
ALTER FUNCTION history_scan_storcli_bbus() OWNER TO admin; |
||||||
|
|
||||||
|
CREATE TRIGGER trigger_scan_storcli_bbus |
||||||
|
AFTER INSERT OR UPDATE ON scan_storcli_bbus |
||||||
|
FOR EACH ROW EXECUTE PROCEDURE history_scan_storcli_bbus(); |
||||||
|
|
||||||
|
|
||||||
|
-- ------------------------------------------------------------------------------------------------------- -- |
||||||
|
-- Virtual Drives -- |
||||||
|
-- ------------------------------------------------------------------------------------------------------- -- |
||||||
|
|
||||||
|
-- This records the basic virtual drives. These contain one or more drive groups to form an array |
||||||
|
CREATE TABLE scan_storcli_virtual_drives ( |
||||||
|
scan_storcli_virtual_drive_uuid uuid not null primary key, |
||||||
|
scan_storcli_virtual_drive_host_uuid uuid not null, |
||||||
|
scan_storcli_virtual_drive_controller_uuid uuid not null, |
||||||
|
scan_storcli_virtual_drive_id_string text not null, -- This is '<host_controller_sn>-vd<x>' where 'x' is the virtual drive number. |
||||||
|
scan_storcli_virtual_drive_creation_date text not null, -- "Creation Date" and "Creation Time" |
||||||
|
scan_storcli_virtual_drive_data_protection text not null, -- "Data Protection" |
||||||
|
scan_storcli_virtual_drive_disk_cache_policy text not null, -- "Disk Cache Policy" |
||||||
|
scan_storcli_virtual_drive_emulation_type text not null, -- "Emulation type" |
||||||
|
scan_storcli_virtual_drive_encryption text not null, -- "Encryption" |
||||||
|
scan_storcli_virtual_drive_blocks numeric not null, -- "Number of Blocks" |
||||||
|
scan_storcli_virtual_drive_strip_size text not null, -- "Strip Size" (has the suffix 'Bytes', so not numeric) |
||||||
|
scan_storcli_virtual_drive_drives_per_span numeric not null, -- "Number of Drives Per Span" |
||||||
|
scan_storcli_virtual_drive_span_depth numeric not null, -- "Span Depth" |
||||||
|
scan_storcli_virtual_drive_scsi_naa_id text not null, -- "SCSI NAA Id" - https://en.wikipedia.org/wiki/ISCSI#Addressing |
||||||
|
modified_date timestamp with time zone not null, |
||||||
|
|
||||||
|
FOREIGN KEY(scan_storcli_virtual_drive_host_uuid) REFERENCES hosts(host_uuid), |
||||||
|
FOREIGN KEY(scan_storcli_virtual_drive_controller_uuid) REFERENCES scan_storcli_controllers(scan_storcli_controller_uuid) |
||||||
|
); |
||||||
|
ALTER TABLE scan_storcli_virtual_drives OWNER TO admin; |
||||||
|
|
||||||
|
CREATE TABLE history.scan_storcli_virtual_drives ( |
||||||
|
history_id bigserial, |
||||||
|
scan_storcli_virtual_drive_uuid uuid, |
||||||
|
scan_storcli_virtual_drive_host_uuid uuid, |
||||||
|
scan_storcli_virtual_drive_controller_uuid uuid, |
||||||
|
scan_storcli_virtual_drive_id_string text, |
||||||
|
scan_storcli_virtual_drive_creation_date text, |
||||||
|
scan_storcli_virtual_drive_data_protection text, |
||||||
|
scan_storcli_virtual_drive_disk_cache_policy text, |
||||||
|
scan_storcli_virtual_drive_emulation_type text, |
||||||
|
scan_storcli_virtual_drive_encryption text, |
||||||
|
scan_storcli_virtual_drive_blocks numeric, |
||||||
|
scan_storcli_virtual_drive_strip_size text, |
||||||
|
scan_storcli_virtual_drive_drives_per_span numeric, |
||||||
|
scan_storcli_virtual_drive_span_depth numeric, |
||||||
|
scan_storcli_virtual_drive_scsi_naa_id text, |
||||||
|
modified_date timestamp with time zone |
||||||
|
); |
||||||
|
ALTER TABLE history.scan_storcli_virtual_drives OWNER TO admin; |
||||||
|
|
||||||
|
CREATE FUNCTION history_scan_storcli_virtual_drives() RETURNS trigger |
||||||
|
AS $$ |
||||||
|
DECLARE |
||||||
|
history_scan_storcli_virtual_drives RECORD; |
||||||
|
BEGIN |
||||||
|
SELECT INTO history_scan_storcli_virtual_drives * FROM scan_storcli_virtual_drives WHERE scan_storcli_virtual_drive_uuid=new.scan_storcli_virtual_drive_uuid; |
||||||
|
INSERT INTO history.scan_storcli_virtual_drives |
||||||
|
(scan_storcli_virtual_drive_uuid, |
||||||
|
scan_storcli_virtual_drive_host_uuid, |
||||||
|
scan_storcli_virtual_drive_controller_uuid, |
||||||
|
scan_storcli_virtual_drive_id_string, |
||||||
|
scan_storcli_virtual_drive_creation_date, |
||||||
|
scan_storcli_virtual_drive_data_protection, |
||||||
|
scan_storcli_virtual_drive_disk_cache_policy, |
||||||
|
scan_storcli_virtual_drive_emulation_type, |
||||||
|
scan_storcli_virtual_drive_encryption, |
||||||
|
scan_storcli_virtual_drive_blocks, |
||||||
|
scan_storcli_virtual_drive_strip_size, |
||||||
|
scan_storcli_virtual_drive_drives_per_span, |
||||||
|
scan_storcli_virtual_drive_span_depth, |
||||||
|
scan_storcli_virtual_drive_scsi_naa_id, |
||||||
|
modified_date) |
||||||
|
VALUES |
||||||
|
(history_scan_storcli_virtual_drives.scan_storcli_virtual_drive_uuid, |
||||||
|
history_scan_storcli_virtual_drives.scan_storcli_virtual_drive_host_uuid, |
||||||
|
history_scan_storcli_virtual_drives.scan_storcli_virtual_drive_controller_uuid, |
||||||
|
history_scan_storcli_virtual_drives.scan_storcli_virtual_drive_id_string, |
||||||
|
history_scan_storcli_virtual_drives.scan_storcli_virtual_drive_creation_date, |
||||||
|
history_scan_storcli_virtual_drives.scan_storcli_virtual_drive_data_protection, |
||||||
|
history_scan_storcli_virtual_drives.scan_storcli_virtual_drive_disk_cache_policy, |
||||||
|
history_scan_storcli_virtual_drives.scan_storcli_virtual_drive_emulation_type, |
||||||
|
history_scan_storcli_virtual_drives.scan_storcli_virtual_drive_encryption, |
||||||
|
history_scan_storcli_virtual_drives.scan_storcli_virtual_drive_blocks, |
||||||
|
history_scan_storcli_virtual_drives.scan_storcli_virtual_drive_strip_size, |
||||||
|
history_scan_storcli_virtual_drives.scan_storcli_virtual_drive_drives_per_span, |
||||||
|
history_scan_storcli_virtual_drives.scan_storcli_virtual_drive_span_depth, |
||||||
|
history_scan_storcli_virtual_drives.scan_storcli_virtual_drive_scsi_naa_id, |
||||||
|
history_scan_storcli_virtual_drives.modified_date); |
||||||
|
RETURN NULL; |
||||||
|
END; |
||||||
|
$$ |
||||||
|
LANGUAGE plpgsql; |
||||||
|
ALTER FUNCTION history_scan_storcli_virtual_drives() OWNER TO admin; |
||||||
|
|
||||||
|
CREATE TRIGGER trigger_scan_storcli_virtual_drives |
||||||
|
AFTER INSERT OR UPDATE ON scan_storcli_virtual_drives |
||||||
|
FOR EACH ROW EXECUTE PROCEDURE history_scan_storcli_virtual_drives(); |
||||||
|
|
||||||
|
|
||||||
|
-- ------------------------------------------------------------------------------------------------------- -- |
||||||
|
-- Drive Groups -- |
||||||
|
-- ------------------------------------------------------------------------------------------------------- -- |
||||||
|
|
||||||
|
-- This records the basic drive group information. |
||||||
|
CREATE TABLE scan_storcli_drive_groups ( |
||||||
|
scan_storcli_drive_group_uuid uuid not null primary key, |
||||||
|
scan_storcli_drive_group_host_uuid uuid not null, |
||||||
|
scan_storcli_drive_group_virtual_drive_uuid uuid not null, |
||||||
|
scan_storcli_drive_group_id_string text not null, -- This is '<host_controller_sn>-vd<x>-dg<y>' where 'x' is the virtual drive number and 'y' is the drive group number. |
||||||
|
scan_storcli_drive_group_access text not null, -- "access" |
||||||
|
scan_storcli_drive_group_array_size text not null, -- "array_size" |
||||||
|
scan_storcli_drive_group_array_state text not null, -- "array_state" |
||||||
|
scan_storcli_drive_group_cache text not null, -- "cache" |
||||||
|
scan_storcli_drive_group_cachecade text not null, -- "cachecade" |
||||||
|
scan_storcli_drive_group_consistent text not null, -- "consistent" |
||||||
|
scan_storcli_drive_group_disk_cache text not null, -- "disk_cache" |
||||||
|
scan_storcli_drive_group_raid_type text not null, -- "raid_type" |
||||||
|
scan_storcli_drive_group_read_cache text not null, -- "read_cache" |
||||||
|
scan_storcli_drive_group_scheduled_cc text not null, -- "scheduled_consistency_check" |
||||||
|
scan_storcli_drive_group_write_cache text not null, -- "write_cache" |
||||||
|
modified_date timestamp with time zone not null, |
||||||
|
|
||||||
|
FOREIGN KEY(scan_storcli_drive_group_host_uuid) REFERENCES hosts(host_uuid), |
||||||
|
FOREIGN KEY(scan_storcli_drive_group_virtual_drive_uuid) REFERENCES scan_storcli_virtual_drives(scan_storcli_virtual_drive_uuid) |
||||||
|
); |
||||||
|
ALTER TABLE scan_storcli_drive_groups OWNER TO admin; |
||||||
|
|
||||||
|
CREATE TABLE history.scan_storcli_drive_groups ( |
||||||
|
history_id bigserial, |
||||||
|
scan_storcli_drive_group_uuid uuid, |
||||||
|
scan_storcli_drive_group_host_uuid uuid, |
||||||
|
scan_storcli_drive_group_virtual_drive_uuid uuid, |
||||||
|
scan_storcli_drive_group_id_string text, |
||||||
|
scan_storcli_drive_group_access text, |
||||||
|
scan_storcli_drive_group_array_size text, |
||||||
|
scan_storcli_drive_group_array_state text, |
||||||
|
scan_storcli_drive_group_cache text, |
||||||
|
scan_storcli_drive_group_cachecade text, |
||||||
|
scan_storcli_drive_group_consistent text, |
||||||
|
scan_storcli_drive_group_disk_cache text, |
||||||
|
scan_storcli_drive_group_raid_type text, |
||||||
|
scan_storcli_drive_group_read_cache text, |
||||||
|
scan_storcli_drive_group_scheduled_cc text, |
||||||
|
scan_storcli_drive_group_write_cache text, |
||||||
|
modified_date timestamp with time zone |
||||||
|
); |
||||||
|
ALTER TABLE history.scan_storcli_drive_groups OWNER TO admin; |
||||||
|
|
||||||
|
CREATE FUNCTION history_scan_storcli_drive_groups() RETURNS trigger |
||||||
|
AS $$ |
||||||
|
DECLARE |
||||||
|
history_scan_storcli_drive_groups RECORD; |
||||||
|
BEGIN |
||||||
|
SELECT INTO history_scan_storcli_drive_groups * FROM scan_storcli_drive_groups WHERE scan_storcli_drive_group_uuid=new.scan_storcli_drive_group_uuid; |
||||||
|
INSERT INTO history.scan_storcli_drive_groups |
||||||
|
(scan_storcli_drive_group_uuid, |
||||||
|
scan_storcli_drive_group_host_uuid, |
||||||
|
scan_storcli_drive_group_virtual_drive_uuid, |
||||||
|
scan_storcli_drive_group_id_string, |
||||||
|
scan_storcli_drive_group_access, |
||||||
|
scan_storcli_drive_group_array_size, |
||||||
|
scan_storcli_drive_group_array_state, |
||||||
|
scan_storcli_drive_group_cache, |
||||||
|
scan_storcli_drive_group_cachecade, |
||||||
|
scan_storcli_drive_group_consistent, |
||||||
|
scan_storcli_drive_group_disk_cache, |
||||||
|
scan_storcli_drive_group_raid_type, |
||||||
|
scan_storcli_drive_group_read_cache, |
||||||
|
scan_storcli_drive_group_scheduled_cc, |
||||||
|
scan_storcli_drive_group_write_cache, |
||||||
|
modified_date) |
||||||
|
VALUES |
||||||
|
(history_scan_storcli_drive_groups.scan_storcli_drive_group_uuid, |
||||||
|
history_scan_storcli_drive_groups.scan_storcli_drive_group_host_uuid, |
||||||
|
history_scan_storcli_drive_groups.scan_storcli_drive_group_virtual_drive_uuid, |
||||||
|
history_scan_storcli_drive_groups.scan_storcli_drive_group_id_string, |
||||||
|
history_scan_storcli_drive_groups.scan_storcli_drive_group_access, |
||||||
|
history_scan_storcli_drive_groups.scan_storcli_drive_group_array_size, |
||||||
|
history_scan_storcli_drive_groups.scan_storcli_drive_group_array_state, |
||||||
|
history_scan_storcli_drive_groups.scan_storcli_drive_group_cache, |
||||||
|
history_scan_storcli_drive_groups.scan_storcli_drive_group_cachecade, |
||||||
|
history_scan_storcli_drive_groups.scan_storcli_drive_group_consistent, |
||||||
|
history_scan_storcli_drive_groups.scan_storcli_drive_group_disk_cache, |
||||||
|
history_scan_storcli_drive_groups.scan_storcli_drive_group_raid_type, |
||||||
|
history_scan_storcli_drive_groups.scan_storcli_drive_group_read_cache, |
||||||
|
history_scan_storcli_drive_groups.scan_storcli_drive_group_scheduled_cc, |
||||||
|
history_scan_storcli_drive_groups.scan_storcli_drive_group_write_cache, |
||||||
|
history_scan_storcli_drive_groups.modified_date); |
||||||
|
RETURN NULL; |
||||||
|
END; |
||||||
|
$$ |
||||||
|
LANGUAGE plpgsql; |
||||||
|
ALTER FUNCTION history_scan_storcli_drive_groups() OWNER TO admin; |
||||||
|
|
||||||
|
CREATE TRIGGER trigger_scan_storcli_drive_groups |
||||||
|
AFTER INSERT OR UPDATE ON scan_storcli_drive_groups |
||||||
|
FOR EACH ROW EXECUTE PROCEDURE history_scan_storcli_drive_groups(); |
||||||
|
|
||||||
|
|
||||||
|
-- ------------------------------------------------------------------------------------------------------- -- |
||||||
|
-- Physical Drives -- |
||||||
|
-- ------------------------------------------------------------------------------------------------------- -- |
||||||
|
|
||||||
|
-- NOTE: More information to T10-PI (protection information) is available here: |
||||||
|
-- https://www.seagate.com/files/staticfiles/docs/pdf/whitepaper/safeguarding-data-from-corruption-technology-paper-tp621us.pdf |
||||||
|
|
||||||
|
-- This records the basic drive group information. |
||||||
|
-- Key variables; |
||||||
|
-- - "Drive Temperature" |
||||||
|
-- - "spun_up" |
||||||
|
-- - "state" |
||||||
|
-- - "Certified" |
||||||
|
-- - "Device Speed" |
||||||
|
-- - "Link Speed" |
||||||
|
-- - "sas_port_0_link_speed" |
||||||
|
-- - "sas_port_0_port_status" |
||||||
|
-- - "sas_port_0_sas_address" |
||||||
|
-- - "sas_port_1_link_speed" |
||||||
|
-- - "sas_port_1_port_status" |
||||||
|
-- - "sas_port_1_sas_address" |
||||||
|
-- - "drive_media" |
||||||
|
-- - "interface" |
||||||
|
-- - "NAND Vendor" |
||||||
|
-- - "Firmware Revision" |
||||||
|
-- - "World Wide Name" |
||||||
|
-- - "device_id" |
||||||
|
-- - "SED Enabled" |
||||||
|
-- - "Secured" |
||||||
|
-- - "Locked" |
||||||
|
-- - "Needs External Key Management Attention" |
||||||
|
-- - "protection_info", "Protection Information Eligible" |
||||||
|
-- - "Emergency Spare" |
||||||
|
-- - "Commissioned Spare" |
||||||
|
-- - "S.M.A.R.T alert flagged by drive" |
||||||
|
-- - "Media Error Count" |
||||||
|
-- - "Other Error Count" |
||||||
|
-- - "Predictive Failure Count" |
||||||
|
CREATE TABLE scan_storcli_physical_drives ( |
||||||
|
scan_storcli_physical_drive_uuid uuid not null primary key, |
||||||
|
scan_storcli_physical_drive_host_uuid uuid not null, |
||||||
|
scan_storcli_physical_drive_controller_uuid uuid not null, |
||||||
|
scan_storcli_physical_drive_virtual_drive text not null, |
||||||
|
scan_storcli_physical_drive_drive_group text not null, |
||||||
|
scan_storcli_physical_drive_enclosure_id text not null, |
||||||
|
scan_storcli_physical_drive_slot_number text not null, |
||||||
|
scan_storcli_physical_drive_serial_number text not null, -- "Serial Number" |
||||||
|
scan_storcli_physical_drive_size text not null, -- In 'text' because of 'Bytes' suffix - "drive_size" but also; "Raw size", "Non Coerced size" and "Coerced size" |
||||||
|
scan_storcli_physical_drive_sector_size text not null, -- In 'text' because of 'Bytes' suffix - "sector_size", "Sector Size" |
||||||
|
scan_storcli_physical_drive_vendor text not null, -- "Manufacturer Identification" |
||||||
|
scan_storcli_physical_drive_model text not null, -- "drive_model", "Model Number" |
||||||
|
scan_storcli_physical_drive_self_encrypting_drive text not null, -- "self_encrypting_drive", "SED Capable" |
||||||
|
modified_date timestamp with time zone not null, |
||||||
|
|
||||||
|
FOREIGN KEY(scan_storcli_physical_drive_host_uuid) REFERENCES hosts(host_uuid), |
||||||
|
FOREIGN KEY(scan_storcli_physical_drive_controller_uuid) REFERENCES scan_storcli_controllers(scan_storcli_controller_uuid) |
||||||
|
); |
||||||
|
ALTER TABLE scan_storcli_physical_drives OWNER TO admin; |
||||||
|
|
||||||
|
CREATE TABLE history.scan_storcli_physical_drives ( |
||||||
|
history_id bigserial, |
||||||
|
scan_storcli_physical_drive_uuid uuid, |
||||||
|
scan_storcli_physical_drive_host_uuid uuid, |
||||||
|
scan_storcli_physical_drive_controller_uuid uuid, |
||||||
|
scan_storcli_physical_drive_serial_number text, |
||||||
|
scan_storcli_physical_drive_virtual_drive text, |
||||||
|
scan_storcli_physical_drive_drive_group text, |
||||||
|
scan_storcli_physical_drive_enclosure_id text, |
||||||
|
scan_storcli_physical_drive_slot_number text, |
||||||
|
scan_storcli_physical_drive_size text, |
||||||
|
scan_storcli_physical_drive_sector_size text, |
||||||
|
scan_storcli_physical_drive_vendor text, |
||||||
|
scan_storcli_physical_drive_model text, |
||||||
|
scan_storcli_physical_drive_self_encrypting_drive text, |
||||||
|
modified_date timestamp with time zone |
||||||
|
); |
||||||
|
ALTER TABLE history.scan_storcli_physical_drives OWNER TO admin; |
||||||
|
|
||||||
|
CREATE FUNCTION history_scan_storcli_physical_drives() RETURNS trigger |
||||||
|
AS $$ |
||||||
|
DECLARE |
||||||
|
history_scan_storcli_physical_drives RECORD; |
||||||
|
BEGIN |
||||||
|
SELECT INTO history_scan_storcli_physical_drives * FROM scan_storcli_physical_drives WHERE scan_storcli_physical_drive_uuid=new.scan_storcli_physical_drive_uuid; |
||||||
|
INSERT INTO history.scan_storcli_physical_drives |
||||||
|
(scan_storcli_physical_drive_uuid, |
||||||
|
scan_storcli_physical_drive_host_uuid, |
||||||
|
scan_storcli_physical_drive_controller_uuid, |
||||||
|
scan_storcli_physical_drive_virtual_drive, |
||||||
|
scan_storcli_physical_drive_drive_group, |
||||||
|
scan_storcli_physical_drive_enclosure_id, |
||||||
|
scan_storcli_physical_drive_slot_number, |
||||||
|
scan_storcli_physical_drive_serial_number, |
||||||
|
scan_storcli_physical_drive_size, |
||||||
|
scan_storcli_physical_drive_sector_size, |
||||||
|
scan_storcli_physical_drive_vendor, |
||||||
|
scan_storcli_physical_drive_model, |
||||||
|
scan_storcli_physical_drive_self_encrypting_drive, |
||||||
|
modified_date) |
||||||
|
VALUES |
||||||
|
(history_scan_storcli_physical_drives.scan_storcli_physical_drive_uuid, |
||||||
|
history_scan_storcli_physical_drives.scan_storcli_physical_drive_host_uuid, |
||||||
|
history_scan_storcli_physical_drives.scan_storcli_physical_drive_controller_uuid, |
||||||
|
history_scan_storcli_physical_drives.scan_storcli_physical_drive_virtual_drive, |
||||||
|
history_scan_storcli_physical_drives.scan_storcli_physical_drive_drive_group, |
||||||
|
history_scan_storcli_physical_drives.scan_storcli_physical_drive_enclosure_id, |
||||||
|
history_scan_storcli_physical_drives.scan_storcli_physical_drive_slot_number, |
||||||
|
history_scan_storcli_physical_drives.scan_storcli_physical_drive_serial_number, |
||||||
|
history_scan_storcli_physical_drives.scan_storcli_physical_drive_size, |
||||||
|
history_scan_storcli_physical_drives.scan_storcli_physical_drive_sector_size, |
||||||
|
history_scan_storcli_physical_drives.scan_storcli_physical_drive_vendor, |
||||||
|
history_scan_storcli_physical_drives.scan_storcli_physical_drive_model, |
||||||
|
history_scan_storcli_physical_drives.scan_storcli_physical_drive_self_encrypting_drive, |
||||||
|
history_scan_storcli_physical_drives.modified_date); |
||||||
|
RETURN NULL; |
||||||
|
END; |
||||||
|
$$ |
||||||
|
LANGUAGE plpgsql; |
||||||
|
ALTER FUNCTION history_scan_storcli_physical_drives() OWNER TO admin; |
||||||
|
|
||||||
|
CREATE TRIGGER trigger_scan_storcli_physical_drives |
||||||
|
AFTER INSERT OR UPDATE ON scan_storcli_physical_drives |
||||||
|
FOR EACH ROW EXECUTE PROCEDURE history_scan_storcli_physical_drives(); |
||||||
|
|
||||||
|
|
||||||
|
-- ------------------------------------------------------------------------------------------------------- -- |
||||||
|
-- Each data type has several variables that we're not storing in the component-specific tables. To do so -- |
||||||
|
-- would be to create massive tables that would miss variables not shown for all controllers or when new -- |
||||||
|
-- variables are added or renamed. So this table is used to store all those myriade of variables. Each -- |
||||||
|
-- entry will reference the table it is attached to and the UUID of the record in that table. The column -- |
||||||
|
|
||||||
|
-- 'storcli_variable_is_temperature' will be used to know what data is a temperature and will be then used -- |
||||||
|
-- to inform on the host's thermal health. -- |
||||||
|
-- ------------------------------------------------------------------------------------------------------- -- |
||||||
|
|
||||||
|
-- This stores various variables found for a given controller but not explicitely checked for (or that |
||||||
|
-- change frequently). |
||||||
|
CREATE TABLE scan_storcli_variables ( |
||||||
|
scan_storcli_variable_uuid uuid not null primary key, |
||||||
|
scan_storcli_variable_host_uuid uuid not null, |
||||||
|
scan_storcli_variable_source_table text not null, |
||||||
|
scan_storcli_variable_source_uuid uuid not null, |
||||||
|
scan_storcli_variable_is_temperature boolean not null default FALSE, |
||||||
|
scan_storcli_variable_name text not null, |
||||||
|
scan_storcli_variable_value text not null, |
||||||
|
modified_date timestamp with time zone not null, |
||||||
|
|
||||||
|
FOREIGN KEY(scan_storcli_variable_host_uuid) REFERENCES hosts(host_uuid) |
||||||
|
); |
||||||
|
ALTER TABLE scan_storcli_variables OWNER TO admin; |
||||||
|
|
||||||
|
CREATE TABLE history.scan_storcli_variables ( |
||||||
|
history_id bigserial, |
||||||
|
scan_storcli_variable_uuid uuid, |
||||||
|
scan_storcli_variable_host_uuid uuid, |
||||||
|
scan_storcli_variable_source_table text, |
||||||
|
scan_storcli_variable_source_uuid uuid, |
||||||
|
scan_storcli_variable_is_temperature boolean, |
||||||
|
scan_storcli_variable_name text, |
||||||
|
scan_storcli_variable_value text, |
||||||
|
modified_date timestamp with time zone |
||||||
|
); |
||||||
|
ALTER TABLE history.scan_storcli_variables OWNER TO admin; |
||||||
|
|
||||||
|
CREATE FUNCTION history_scan_storcli_variables() RETURNS trigger |
||||||
|
AS $$ |
||||||
|
DECLARE |
||||||
|
history_scan_storcli_variables RECORD; |
||||||
|
BEGIN |
||||||
|
SELECT INTO history_scan_storcli_variables * FROM scan_storcli_variables WHERE scan_storcli_variable_uuid=new.scan_storcli_variable_uuid; |
||||||
|
INSERT INTO history.scan_storcli_variables |
||||||
|
(scan_storcli_variable_uuid, |
||||||
|
scan_storcli_variable_host_uuid, |
||||||
|
scan_storcli_variable_source_table, |
||||||
|
scan_storcli_variable_source_uuid, |
||||||
|
scan_storcli_variable_is_temperature, |
||||||
|
scan_storcli_variable_name, |
||||||
|
scan_storcli_variable_value, |
||||||
|
modified_date) |
||||||
|
VALUES |
||||||
|
(history_scan_storcli_variables.scan_storcli_variable_uuid, |
||||||
|
history_scan_storcli_variables.scan_storcli_variable_host_uuid, |
||||||
|
history_scan_storcli_variables.scan_storcli_variable_source_table, |
||||||
|
history_scan_storcli_variables.scan_storcli_variable_source_uuid, |
||||||
|
history_scan_storcli_variables.scan_storcli_variable_is_temperature, |
||||||
|
history_scan_storcli_variables.scan_storcli_variable_name, |
||||||
|
history_scan_storcli_variables.scan_storcli_variable_value, |
||||||
|
history_scan_storcli_variables.modified_date); |
||||||
|
RETURN NULL; |
||||||
|
END; |
||||||
|
$$ |
||||||
|
LANGUAGE plpgsql; |
||||||
|
ALTER FUNCTION history_scan_storcli_variables() OWNER TO admin; |
||||||
|
|
||||||
|
CREATE TRIGGER trigger_scan_storcli_variables |
||||||
|
AFTER INSERT OR UPDATE ON scan_storcli_variables |
||||||
|
FOR EACH ROW EXECUTE PROCEDURE history_scan_storcli_variables(); |
File diff suppressed because it is too large
Load Diff
@ -1,43 +1,37 @@ |
|||||||
#!/usr/bin/perl |
#!/usr/bin/perl |
||||||
# |
# |
||||||
|
|
||||||
use strict; |
|
||||||
use warnings; |
use warnings; |
||||||
use Anvil::Tools; |
use strict; |
||||||
use Data::Dumper; |
|
||||||
use String::ShellQuote; |
|
||||||
use utf8; |
|
||||||
binmode(STDERR, ':encoding(utf-8)'); |
|
||||||
binmode(STDOUT, ':encoding(utf-8)'); |
|
||||||
|
|
||||||
my $THIS_FILE = ($0 =~ /^.*\/(.*)$/)[0]; |
my $sysstat_directory = "/var/log/sa/"; |
||||||
my $running_directory = ($0 =~ /^(.*?)\/$THIS_FILE$/)[0]; |
my $hostname = `hostname | cut -f 1 -d .`; |
||||||
if (($running_directory =~ /^\./) && ($ENV{PWD})) |
|
||||||
{ |
|
||||||
$running_directory =~ s/^\./$ENV{PWD}/; |
|
||||||
} |
|
||||||
|
|
||||||
# Turn off buffering so that the pinwheel will display while waiting for the SSH call(s) to complete. |
opendir(my $directory_handle, $sysstat_directory) || die "Can't locate ".$sysstat_directory."\n"; |
||||||
$| = 1; |
|
||||||
|
|
||||||
my $anvil = Anvil::Tools->new(); |
my @file_list = grep { /^sa[0-9]./ } readdir($directory_handle); |
||||||
$anvil->Log->level({set => 2}); |
|
||||||
$anvil->Log->secure({set => 1}); |
|
||||||
|
|
||||||
$anvil->data->{switches}{'shutdown'} = ""; |
printf "Hostname is ... ".$hostname."\n"; |
||||||
$anvil->data->{switches}{boot} = ""; |
foreach my $filename (sort {$a cmp $b} @file_list) |
||||||
$anvil->data->{switches}{server} = ""; |
{ |
||||||
$anvil->Get->switches; |
#printf "Filepath: ....".$sysstat_directory.$filepath."\n" |
||||||
|
my $shell_call = "sadf -dht ".$sysstat_directory.$filename." -- -S -u -r -p -q -n DEV"; |
||||||
|
printf "Shell Call - ... ".$shell_call."\n"; |
||||||
|
open(my $file_handle, "$shell_call 2>&1 |") || die "Failed to parse output of [".$shell_call."].\n"; |
||||||
|
while (<$file_handle>) |
||||||
|
{ |
||||||
|
chomp; |
||||||
|
my $csv_line = $_; |
||||||
|
|
||||||
print "Connecting to the database(s);\n"; |
if ($csv_line =~ /$hostname/) |
||||||
$anvil->Database->connect({debug => 3}); |
{ |
||||||
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 2, secure => 0, key => "log_0132"}); |
#printf "CSV Line... ".$csv_line."\n"; |
||||||
|
printf "Variable Match!\n"; |
||||||
|
} |
||||||
|
if ($csv_line =~ 'thinkpad-06HCV0') |
||||||
|
{ |
||||||
|
printf "String Match!\n"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
my $agent = "scan-apc-ups"; |
|
||||||
my $schema_file = $anvil->data->{path}{directories}{scan_agents}."/".$agent."/".$agent.".sql"; |
|
||||||
my $tables = $anvil->Database->get_tables_from_schema({debug => 2, schema_file => $schema_file}); |
|
||||||
print "Schema file: [".$schema_file."]\n"; |
|
||||||
foreach my $table (@{$tables}) |
|
||||||
{ |
|
||||||
print "- ".$table."\n"; |
|
||||||
} |
} |
Loading…
Reference in new issue