#!/opt/vdops/bin/perl # This script automates the process of setting variables in UPSes # V Who When What # --------------------------------------------------------------------------- # 1.6.0 skendric 03-30-2010 Upgrade to perl 5.10.1 # 1.5.5 skendric 12-31-2008 Support new snmpSet format # 1.5.4 skendric 03-21-2007 Stylistic mods # 1.5.3 skendric 11-16-2006 Replace Object Values with OIDs # 1.5.2 skendric 09-22-2006 Change variable names # 1.5.1 skendric 11-05-2005 Upgrade to new FHCRC::VDOPS module structure # 1.5.0 skendric 05-09-2005 Support Netops.pm-1.2 # 1.4.1 skendric 05-19-2004 Fix bug in acquring/setting time # 1.4.0 skendric 05-10-2004 Migrate common functions to Netops.pm # 1.3.0 skendric 04-30-2004 Enhance command-line options # 1.2.3 skendric 02-02-2004 Documentation fixes # 1.2.2 skendric 11-16-2003 Use Net::Ping::External # 1.2.1 skendric 08-10-2003 Minor bug fixes # 1.2.0 skendric 03-16-2003 Tighted scoping, changed DEBUG to $debug # 1.1.1 skendric 12-12-2002 Fixed write string bug in info_before # 1.1.0 skendric 11-17-2002 Added @version, improved build_target() # 1.0.0 skendric 10-22-2002 First Version # # Author: Stuart Kendrick, sbk {put at sign here} skendric {put dot here} com # # Source: http://www.skendric.com/device # # This software is available under the GNU GENERAL PUBLIC LICENSE, see # http://www.fsf.org/licenses/gpl.html # # # This script takes the following approach: # -Parses the hosts table for a list of targets (or accepts a command- # line list) # -Sets name, date, and time # # Requirements: # -The target(s) must be pingable # # -The following MIB modules stashed in /opt/vdops/share/snmp/mibs, # or wherever it is that you store MIB modules: # PowerNet-MIB # # -PERL modules: the FHCRC::Netops collection # # # # Assumptions: # # # Tested on: # -APC 9606 Web/SNMP card, APC 961x Network Management Card # -perl-5.10.1 # -net-snmp-5.5 # # # Instructions: # -Customize the script for your site: find the 'user-configurable # variables' section and modify as appropriate # -Type "apc-set-stuff" to see the command-line options # -Try it out # # # Caveats: # # # Known Bugs: # # # To do: # -Test username/password foo # # Begin script # Load modules use strict; use warnings; use feature 'say'; use feature 'switch'; use Carp qw(carp cluck croak confess); use Data::Dumper; use DateTime; use English qw( -no_match_vars ); use Getopt::Std; use FHCRC::Netops::APCTools 1.1.1; use FHCRC::Netops::HostTools 1.0.3; use FHCRC::Netops::NetopsTools 2.0.7; use FHCRC::Netops::NetopsData 1.3.0; use FHCRC::Netops::PingTools 1.1.5; use FHCRC::Netops::SNMPTools 1.3.9; use FHCRC::Netops::Utilities 1.3.9; # Declare global variables # Define global variables $debug = 0; # 10 = Logging # 9 = Database SELECT operations # 8 = Per IP/MAC/Port processing # 7 = Database INSERT/UPDATE/DELETE # 6 = Dump SNMP var # 5 = Dump snmp_packets # 4 = Grody: print big var # 3 = Verbose: print mid var # 2 = Simple: print small var # 1 = Basic: subroutine trace # 0 = Disable debugging $program_name = 'apc-set-stuff'; $usage = 'Usage: apc-set-stuff -s {yes|no} [-d {integer}] [-r] [-a | -e {expr} | -f {filename} | target1 target2 target3 ...]'; $version = '1.6.0'; # Define user-configurable variables # Binaries $grab_hosts = '/bin/cat /etc/hosts'; # Pause parameters $long = 30; $mid = 10; $short = 5; # Ping Stuff $ping_count = 3; $ping_timeout = 1; # SNMP Stuff # Optimize performance by sorting your community strings and SNMP version # list, most frequently used to the left, least frequently used to the right @mib_dir = qw(/opt/vdops/share/snmp/mibs); @mib_file = qw/PowerNet-MIB/; @snmp_read_list = qw/not-secret public public/; @snmp_write_list = qw/private secret private/; @snmp_version_list = qw/2 1/; $snmp_port = 161; $snmp_retries = 3; $snmp_timeout = 2000000; # Syslog stuff $syslog_facility = 'local5'; $syslog_host = 'localhost'; $syslog_port = 514; $syslog_priority = 'info'; $syslog_socket = 'unix'; # Other possibilites include 'udp' and # 'stream'; depending on the flavor of Unix, # I've employed each of these # Target details @skip_name = qw/swamp/; @suffixes = qw/-bat -emu -pdu -ups/; # Grab arguments getopts('ad:e:f:s:', \%option); @target = @ARGV; # Set mode if ($option{r}) { $mode = 'report' } elsif (-t STDIN) { $mode = 'interactive' } else { $mode = 'batch' } ### Begin Main Program ############################################### { check_args(); # Check arguments compile_mibs(); # Compile MIB files build_target(); # Populate @target target_check(); # Look for errors in @target basic_info(); # Gather information sanity_check(); # Check for major errors print_before(); # Tell operator what I will do do_the_work(); # Set variables info_after(); # Gather information print_after(); # Tell the operator what I did } ##### End Main Program ############################################### ######################################################################## # Do the work ######################################################################## sub do_the_work { # Debug trace trace_location('begin') if $debug; # Notify operator say 'Setting variables...' if $mode eq 'interactive'; # Loop through @target, setting various variables for my $target (@target) { my ($dt, $date, $time, $val, @varbind); # Define time $dt = DateTime->now( time_zone => 'local' ); $date = $dt->mdy($DASH); $time = $dt->hms; # Add date push @varbind, 'mconfigClockDate', 0, $date, 'OCTETSTR'; # Add time push @varbind, 'mconfigClockTime', 0, $time, 'OCTETSTR'; # Add name given ($target) { when (/\-bat/) { say "Setting experimental.94.1.6.1.20.1 to $target" if $debug > 3; push @varbind, '.1.3.6.1.4.1.318.1.4.94.1.6.1.20', 1, $target, 'OCTETSTR'; } when (/\-emu/) { push @varbind, 'emsIdentEMSName', 0, $target, 'OCTETSTR'; } when (/\-pdu/) { push @varbind, 'rPDUIdentName', 0, $target, 'OCTETSTR'; } when (/\-ups/) { push @varbind, 'upsBasicIdentName', 0, $target, 'OCTETSTR'; } } # Perform the set if ($dome) { $val = snmpSet( {host => $target, varbind => \@varbind} ); given ($val) { when (undef) { say " Failed on $target" } default { say " Succeeded on $target" } } } else { say " Just kidding for $target"; } } # Make things look pretty say "\n" if $mode eq 'interactive'; # Debug trace trace_location('end') if $debug; return 1; } ######################################################################## # Gather information after file uploads ######################################################################## sub info_after { # Debug trace trace_location('begin') if $debug; # Notify operator print_it('Pinging targets...'); # If we are running in test mode, pause briefly, then return unless ($dome) { sleep $short; return 1; } # Loop through targets, gathering file information for my $target (@target) { # If we can't ping the target, skip to the next one unless (ping_it($target)) { print_it("\nCannot ping $target"); $error{$target} .= 'Cannot ping '; } } # Debug trace trace_location('end') if $debug; return 1; } ######################################################################## # Tell operator what I did ######################################################################## sub print_after { my $shit_happens = 0; # Debug trace trace_location('begin') if $debug; # If running from cron, don't print report return 1 if $mode eq 'batch'; say "\n\n# Here is what I see"; # If we are running in test mode, then return unless ($dome) { print "Running in test mode, cannot print a meaningful report\n\n"; return 1; } # Iterate through @target for my $target (@target) { log_it("Set variables on $target") if $dome; $shit_happens++ if $error{$target} ne $EMPTY_STR; } return 1 unless $mode eq 'interactive'; # Congratulate operator say "\n\nDone setting variables"; print "\n"; print < 0) { print "\n\n\n\n"; print <