| Line 149... | 
            Line 149... | 
          
          
            | 149 | 
            # Finally got a semi-stable version of this running. Fixed a bunch of bugs
  | 
            149 | 
            # Finally got a semi-stable version of this running. Fixed a bunch of bugs
  | 
          
          
            | 150 | 
            # and appears to be working correctly.
  | 
            150 | 
            # and appears to be working correctly.
  | 
          
          
            | 151 | 
            #
  | 
            151 | 
            #
  | 
          
          
            | 152 | 
            # Version 3.3.0 20190419 RWR
  | 
            152 | 
            # Version 3.3.0 20190419 RWR
  | 
          
          
            | 153 | 
            # Converted to use YAML config file
  | 
            153 | 
            # Converted to use YAML config file
  | 
          
          
            | - | 
               | 
            154 | 
            #
  | 
          
          
            | - | 
               | 
            155 | 
            # Version 3.4.0 20191111 RWR
  | 
          
          
            | - | 
               | 
            156 | 
            # adding logging with priority. logging is a hash inside of %cvonfiguration which contains the following
  | 
          
          
            | - | 
               | 
            157 | 
            # $configuration{ 'logging' } = {
  | 
          
          
            | - | 
               | 
            158 | 
            #    'log type'  => 'string',
  | 
          
          
            | - | 
               | 
            159 | 
            #    'log level' => #,
  | 
          
          
            | - | 
               | 
            160 | 
            #    'other params' => something,
  | 
          
          
            | - | 
               | 
            161 | 
            # };
  | 
          
          
            | - | 
               | 
            162 | 
            # Currently, the only log type is 'file', which has one other additional parameter, 'log path' which
  | 
          
          
            | - | 
               | 
            163 | 
            # points to the actual log to be created. The log is NOT limited in size, so use something else to
  | 
          
          
            | - | 
               | 
            164 | 
            # do that.
  | 
          
          
            | - | 
               | 
            165 | 
            # log level is an integer which is compared the a priority passed to the logging function. The
  | 
          
          
            | - | 
               | 
            166 | 
            # higher log level is set, the more verbose the log.
  | 
          
          
            | - | 
               | 
            167 | 
            # 0 - Normal, basically logs when the program starts and ends, and any warnings.
  | 
          
          
            | - | 
               | 
            168 | 
            # 1 - a little more information about flow
  | 
          
          
            | - | 
               | 
            169 | 
            # 2 - Gives ending information on structures
  | 
          
          
            | - | 
               | 
            170 | 
            # 3 - Gives a lot of info about structures when they are initialized and at the end
  | 
          
          
            | - | 
               | 
            171 | 
            # 4 - Crazy. Dumps just about every structure every time they are changed
  | 
          
          
            | - | 
               | 
            172 | 
            #
  | 
          
          
            | - | 
               | 
            173 | 
            # $TESTING has been set to a binary. If true, the report is not sent via the transports, but is dumped to /tmp/sysinfo.testing.yaml
  | 
          
          
            | - | 
               | 
            174 | 
               
  | 
          
          
            | 154 | 
             
  | 
            175 | 
             
  | 
          
          
            | 155 | 
            # find our location and use it for searching for libraries
  | 
            176 | 
            # find our location and use it for searching for libraries
  | 
          
          
            | 156 | 
            BEGIN {
  | 
            177 | 
            BEGIN {
  | 
          
          
            | 157 | 
               use FindBin;
  | 
            178 | 
               use FindBin;
  | 
          
          
            | 158 | 
               use File::Spec;
  | 
            179 | 
               use File::Spec;
  | 
          
          
            | Line 161... | 
            Line 182... | 
          
          
            | 161 | 
             
  | 
            182 | 
             
  | 
          
          
            | 162 | 
            use YAML::Tiny;
  | 
            183 | 
            use YAML::Tiny;
  | 
          
          
            | 163 | 
             
  | 
            184 | 
             
  | 
          
          
            | 164 | 
            # Following are global variables overridden if configuration file exists
  | 
            185 | 
            # Following are global variables overridden if configuration file exists
  | 
          
          
            | 165 | 
             
  | 
            186 | 
             
  | 
          
          
            | 166 | 
            my $TESTING = 0; # level's 0 (none) to 4 defined and increase verbosity while decreasing functionality
  | 
            187 | 
            my $TESTING = 0; # if set to 1, will do everything, but will dump output to /tmp/sysinfo.testing.yaml
  | 
          
          
            | 167 | 
            our $VERSION = '3.3.0';
  | 
            - | 
               | 
          
          
            | 168 | 
             
  | 
            188 | 
             
  | 
          
          
            | 169 | 
            my $indentLevel = 2; # number of spaces to indent per level in XML or YAML
  | 
            189 | 
            our $VERSION = '3.4.0';
  | 
          
          
            | 170 | 
             
  | 
            190 | 
             
  | 
          
          
            | 171 | 
            $indentLevel = 3 if $TESTING;
  | 
            191 | 
            my $indentLevel = 2; # number of spaces to indent per level in XML or YAML
  | 
          
          
            | 172 | 
            if ($TESTING) {
  | 
            - | 
               | 
          
          
            | 173 | 
               use Data::Dumper;
  | 
            - | 
               | 
          
          
            | 174 | 
            }
  | 
            - | 
               | 
          
          
            | 175 | 
             
  | 
            192 | 
             
  | 
          
          
            | 176 | 
            # paths to search for configuration file
  | 
            193 | 
            # paths to search for configuration file
  | 
          
          
            | 177 | 
            my @confFileSearchPath = ( '.', '/etc/camp/sysinfo-client', '/etc/camp', '/usr/local/etc/camp/sysinfo-client' );
  | 
            194 | 
            my @confFileSearchPath = ( '.', '/etc/camp/sysinfo-client', '/etc/camp', '/usr/local/etc/camp/sysinfo-client' );
  | 
          
          
            | 178 | 
             
  | 
            195 | 
             
  | 
          
          
            | 179 | 
            my $configurationFile = 'sysinfo-client.yaml'; # name of the configuration file
  | 
            196 | 
            my $configurationFile = 'sysinfo-client.yaml'; # name of the configuration file
  | 
          
          
            | 180 | 
             
  | 
            197 | 
             
  | 
          
          
            | 181 | 
            my $reportDate = &getReportDate; # set report date
  | 
            198 | 
            my $reportDate = &timeStamp(); # set report date
  | 
          
          
            | 182 | 
             
  | 
            199 | 
             
  | 
          
          
            | 183 | 
            my %configuration = (
  | 
            200 | 
            my %configuration = (
  | 
          
          
            | - | 
               | 
            201 | 
               'logging' => [],    # if set, will point to logging
  | 
          
          
            | 184 | 
               'moduleDirs' => [], # search paths for modules
  | 
            202 | 
               'moduleDirs' => [], # search paths for modules
  | 
          
          
            | 185 | 
               'scriptDirs' => [], # search paths for scripts
  | 
            203 | 
               'scriptDirs' => [], # search paths for scripts
  | 
          
          
            | 186 | 
               'clientName' => '',  # Required!! Must be set in conf file (no defaults)
  | 
            204 | 
               'clientName' => '',  # Required!! Must be set in conf file (no defaults)
  | 
          
          
            | 187 | 
               'serialNumber' => '', # serial number of machine
  | 
            205 | 
               'serialNumber' => '', # serial number of machine
  | 
          
          
            | 188 | 
               'UUID'         => '', # UUID of machine
  | 
            206 | 
               'UUID'         => '', # UUID of machine
  | 
          
          
            | Line 192... | 
            Line 210... | 
          
          
            | 192 | 
            ;
  | 
            210 | 
            ;
  | 
          
          
            | 193 | 
             
  | 
            211 | 
             
  | 
          
          
            | 194 | 
            my $DATA_VERSION = '3.0.0'; # used in sending the data file. sets version of XML/YAML data file
  | 
            212 | 
            my $DATA_VERSION = '3.0.0'; # used in sending the data file. sets version of XML/YAML data file
  | 
          
          
            | 195 | 
             
  | 
            213 | 
             
  | 
          
          
            | 196 | 
             
  | 
            214 | 
             
  | 
          
          
            | - | 
               | 
            215 | 
            # function to simply things
  | 
          
          
            | - | 
               | 
            216 | 
            # first parameter is the priority, if <= $logDef->{'log level'} will print
  | 
          
          
            | - | 
               | 
            217 | 
            # all subsequent parameters assumed to be strings to sent to the log
  | 
          
          
            | - | 
               | 
            218 | 
            # returns 0 on failure
  | 
          
          
            | - | 
               | 
            219 | 
            #         1 on success
  | 
          
          
            | - | 
               | 
            220 | 
            #         2 if priority > log level
  | 
          
          
            | - | 
               | 
            221 | 
            #        -1 if $logDef is unset
  | 
          
          
            | - | 
               | 
            222 | 
            # currently, only logs to a file
  | 
          
          
            | - | 
               | 
            223 | 
            sub logIt {
  | 
          
          
            | - | 
               | 
            224 | 
               my $priority = shift;
  | 
          
          
            | - | 
               | 
            225 | 
             
  | 
          
          
            | - | 
               | 
            226 | 
               return -1 unless exists $configuration{'logging'};
  | 
          
          
            | - | 
               | 
            227 | 
               return 2 unless $priority <= $configuration{'logging'}{'log level'};
  | 
          
          
            | - | 
               | 
            228 | 
               if ( $configuration{'logging'}{'log type'} eq 'file' ) {
  | 
          
          
            | - | 
               | 
            229 | 
                  if ( open LOG, '>>' . $configuration{'logging'}{'log path'} ) {
  | 
          
          
            | - | 
               | 
            230 | 
                     while ( my $t = shift ) {
  | 
          
          
            | - | 
               | 
            231 | 
                        print LOG &timeStamp() . "\t$t\n";
  | 
          
          
            | - | 
               | 
            232 | 
                     }
  | 
          
          
            | - | 
               | 
            233 | 
                     close LOG;
  | 
          
          
            | - | 
               | 
            234 | 
                  }
  | 
          
          
            | - | 
               | 
            235 | 
               } else {
  | 
          
          
            | - | 
               | 
            236 | 
                  warn "Log type $configuration{'logging'} incorrectly configured\n";
  | 
          
          
            | - | 
               | 
            237 | 
                  return 0;
  | 
          
          
            | - | 
               | 
            238 | 
               }
  | 
          
          
            | - | 
               | 
            239 | 
               return 1;
  | 
          
          
            | - | 
               | 
            240 | 
            }
  | 
          
          
            | - | 
               | 
            241 | 
             
  | 
          
          
            | 197 | 
             
  | 
            242 | 
             
  | 
          
          
            | 198 | 
            #######################################################
  | 
            243 | 
            #######################################################
  | 
          
          
            | 199 | 
            #
  | 
            244 | 
            #
  | 
          
          
            | 200 | 
            # findFile( $filename, @directories )
  | 
            245 | 
            # findFile( $filename, @directories )
  | 
          
          
            | 201 | 
            #
  | 
            246 | 
            #
  | 
          
          
            | Line 225... | 
            Line 270... | 
          
          
            | 225 | 
            # Parameters: configuration file fully path/file name
  | 
            270 | 
            # Parameters: configuration file fully path/file name
  | 
          
          
            | 226 | 
            # NOTE: conf file must be a valid Perl file
  | 
            271 | 
            # NOTE: conf file must be a valid Perl file
  | 
          
          
            | 227 | 
            #
  | 
            272 | 
            #
  | 
          
          
            | 228 | 
            #######################################################
  | 
            273 | 
            #######################################################
  | 
          
          
            | 229 | 
             
  | 
            274 | 
             
  | 
          
          
            | 230 | 
            sub loadConfigurationFile {
  | 
            275 | 
            sub loadConfigurationFile {   
  | 
          
          
            | 231 | 
               my ( $fileName, @searchPath ) = @_;
  | 
            276 | 
               my ( $fileName, @searchPath ) = @_;
  | 
          
          
            | 232 | 
               my $confFile;
  | 
            277 | 
               my $confFile;
  | 
          
          
            | 233 | 
               if ( $confFile = &findFile( $fileName, \@searchPath ) ) {
  | 
            278 | 
               if ( $confFile = &findFile( $fileName, \@searchPath ) ) {
  | 
          
          
            | 234 | 
                  print "Opening configuration from $confFile\n" if $TESTING > 2;
  | 
            279 | 
                  &logIt( 2, "Opening configuration from $confFile" );
  | 
          
          
            | 235 | 
                  my $yaml = YAML::Tiny->read( $confFile );
  | 
            280 | 
                  my $yaml = YAML::Tiny->read( $confFile );
  | 
          
          
            | - | 
               | 
            281 | 
                  &logIt( 4, "Opening configuration from $confFile" );
  | 
          
          
            | 236 | 
                  return $yaml->[0];
  | 
            282 | 
                  return $yaml->[0];
  | 
          
          
            | 237 | 
               }
  | 
            283 | 
               }
  | 
          
          
            | 238 | 
               die "Can not find $fileName in any of " . join( "\n\t", @searchPath ) . "\n";
  | 
            284 | 
               die "Can not find $fileName in any of " . join( "\n\t", @searchPath ) . "\n";
  | 
          
          
            | 239 | 
            }
  | 
            285 | 
            }
  | 
          
          
            | 240 | 
             
  | 
            286 | 
             
  | 
          
          
            | Line 265... | 
            Line 311... | 
          
          
            | 265 | 
            # would then be sent via e-mail to an administrative account, possibly root
  | 
            311 | 
            # would then be sent via e-mail to an administrative account, possibly root
  | 
          
          
            | 266 | 
            #
  | 
            312 | 
            #
  | 
          
          
            | 267 | 
            #######################################################
  | 
            313 | 
            #######################################################
  | 
          
          
            | 268 | 
            sub sendResults {
  | 
            314 | 
            sub sendResults {
  | 
          
          
            | 269 | 
               my ( $globals, $transports, $message, $scriptDirectory ) = @_;
  | 
            315 | 
               my ( $globals, $transports, $message, $scriptDirectory ) = @_;
  | 
          
          
            | 270 | 
            #   die Dumper( $transports );
  | 
            316 | 
               &logIt( 3, "Entering sendResults" );
  | 
          
          
            | 271 | 
               foreach my $key ( sort { $a <=> $b } %$transports ) {
  | 
            317 | 
               foreach my $key ( sort { $a <=> $b } %$transports ) {
  | 
          
          
            | 272 | 
                  if ( $transports->{$key}->{'sendScript'} ) {
  | 
            318 | 
                  if ( $transports->{$key}->{'sendScript'} ) {
  | 
          
          
            | 273 | 
                     print "Trying to find file " . $transports->{$key}->{'sendScript'} . " in " . join( "\n\t", @{$scriptDirectory} ) . "\n" if $TESTING > 2;;
  | 
            319 | 
                     &logIt( 3, "Trying to find file " . $transports->{$key}->{'sendScript'} . " in " . join( "\n\t", @{$scriptDirectory} ) );
  | 
          
          
            | 274 | 
                     my $sendScript = &findFile( $transports->{$key}->{'sendScript'}, $scriptDirectory );
  | 
            320 | 
                     my $sendScript = &findFile( $transports->{$key}->{'sendScript'}, $scriptDirectory );
  | 
          
          
            | 275 | 
                     if ( $sendScript ) {
  | 
            321 | 
                     if ( $sendScript ) {
  | 
          
          
            | 276 | 
                        # load the chosen script into memory
  | 
            322 | 
                        # load the chosen script into memory
  | 
          
          
            | 277 | 
                        require $sendScript;
  | 
            323 | 
                        require $sendScript;
  | 
          
          
            | 278 | 
                        # merge the globals in
  | 
            324 | 
                        # merge the globals in
  | 
          
          
            | 279 | 
                        while ( my ( $gkey, $value ) = each %$globals ) { 
  | 
            325 | 
                        while ( my ( $gkey, $value ) = each %$globals ) { 
  | 
          
          
            | 280 | 
                           $transports->{$key}->{$gkey} = $value; 
  | 
            326 | 
                           $transports->{$key}->{$gkey} = $value; 
  | 
          
          
            | 281 | 
                        }
  | 
            327 | 
                        }
  | 
          
          
            | 282 | 
                        # do variable substitution for any values which need it
  | 
            328 | 
                        # do variable substitution for any values which need it
  | 
          
          
            | 283 | 
                        foreach my $thisOne ( keys %{$transports->{$key}} ) {
  | 
            329 | 
                        foreach my $thisOne ( keys %{$transports->{$key}} ) {
  | 
          
          
            | 284 | 
                           print "$thisOne\n" if $TESTING > 3;
  | 
            330 | 
                           &logIt( 4, "$thisOne" );
  | 
          
          
            | 285 | 
                           if ( $transports->{$key}->{$thisOne} =~ m/(\$configuration\{'hostname'\})|(\$reportDate)|(\$configuration\{'clientName'\})|(\$configuration\{'serialNumber'\})/ ) {
  | 
            331 | 
                           if ( $transports->{$key}->{$thisOne} =~ m/(\$configuration\{'hostname'\})|(\$reportDate)|(\$configuration\{'clientName'\})|(\$configuration\{'serialNumber'\})/ ) {
  | 
          
          
            | 286 | 
                              $transports->{$key}->{$thisOne} = eval "\"$transports->{$key}->{$thisOne}\"";
  | 
            332 | 
                              $transports->{$key}->{$thisOne} = eval "\"$transports->{$key}->{$thisOne}\"";
  | 
          
          
            | 287 | 
                           }
  | 
            333 | 
                           }
  | 
          
          
            | 288 | 
                        }
  | 
            334 | 
                        }
  | 
          
          
            | 289 | 
                        
  | 
            335 | 
                        
  | 
          
          
            | 290 | 
                        #%$transports{$key}{keys %$globals} = values %$globals;
  | 
            336 | 
                        #%$transports{$key}{keys %$globals} = values %$globals;
  | 
          
          
            | 291 | 
                        #print Dumper( $$transports[$key] );
  | 
            337 | 
                        #print Dumper( $$transports[$key] );
  | 
          
          
            | 292 | 
                        #next;
  | 
            338 | 
                        #next;
  | 
          
          
            | 293 | 
                        # execute the "doit" sub from that script
  | 
            339 | 
                        # execute the "doit" sub from that script
  | 
          
          
            | 294 | 
                        if ( $TESTING > 3 ) {
  | 
            - | 
               | 
          
          
            | 295 | 
                           print $message;
  | 
            340 | 
                        &logIt( 3, $message );
  | 
          
          
            | 296 | 
                        } else {
  | 
            - | 
               | 
          
          
            | 297 | 
                           my $return = &doit( $transports->{$key}, $message );
  | 
            341 | 
                        my $return = &doit( $transports->{$key}, $message );
  | 
          
          
            | 298 | 
                           return $return if ( $return == 1 );
  | 
            342 | 
                        return $return if ( $return == 1 );
  | 
          
          
            | 299 | 
                        }
  | 
            - | 
               | 
          
          
            | 300 | 
                     } else {
  | 
            343 | 
                     } else {
  | 
          
          
            | 301 | 
                        print "Could not find " . $$transports[$key]{'sendScript'} . ", trying next transport\n";
  | 
            344 | 
                        &logIt( 0,"Could not find " . $$transports[$key]{'sendScript'} . ", trying next transport" );
  | 
          
          
            | 302 | 
                     } # if..else
  | 
            345 | 
                     } # if..else
  | 
          
          
            | 303 | 
                  } # if
  | 
            346 | 
                  } # if
  | 
          
          
            | 304 | 
               } # foreach
  | 
            347 | 
               } # foreach
  | 
          
          
            | 305 | 
               # if we made it here, we have not sent the report, so just return it to the user
  | 
            348 | 
               # if we made it here, we have not sent the report, so just return it to the user
  | 
          
          
            | 306 | 
               # if called from a cron job, it will (hopefully) be sent to root
  | 
            349 | 
               # if called from a cron job, it will (hopefully) be sent to root
  | 
          
          
            | - | 
               | 
            350 | 
               &logIt( 0, 'Error, reached ' . __LINE__ . " which should not happen, message was\n$message" );
  | 
          
          
            | 307 | 
               print $message;
  | 
            351 | 
               print $message;
  | 
          
          
            | 308 | 
               return 1;
  | 
            352 | 
               return 1;
  | 
          
          
            | 309 | 
            }
  | 
            353 | 
            }
  | 
          
          
            | 310 | 
             
  | 
            354 | 
             
  | 
          
          
            | 311 | 
            #######################################################
  | 
            355 | 
            #######################################################
  | 
          
          
            | 312 | 
            #
  | 
            356 | 
            #
  | 
          
          
            | 313 | 
            # getReportDate
  | 
            - | 
               | 
          
          
            | 314 | 
            #
  | 
            - | 
               | 
          
          
            | 315 | 
            # return current system date as YYYY-MM-DD HH:MM:SS
  | 
            - | 
               | 
          
          
            | 316 | 
            #
  | 
            - | 
               | 
          
          
            | 317 | 
            #######################################################
  | 
            - | 
               | 
          
          
            | 318 | 
            sub getReportDate {
  | 
            - | 
               | 
          
          
            | 319 | 
               my ($second, $minute, $hour, $dayOfMonth, $month, $year) = localtime();
  | 
            - | 
               | 
          
          
            | 320 | 
               return sprintf( "%4u-%02u-%02u %02u:%02u:%02u", $year+1900, $month+1, $dayOfMonth, $hour, $minute, $second );
  | 
            - | 
               | 
          
          
            | 321 | 
            }
  | 
            - | 
               | 
          
          
            | 322 | 
             
  | 
            - | 
               | 
          
          
            | 323 | 
            #######################################################
  | 
            - | 
               | 
          
          
            | 324 | 
            #
  | 
            - | 
               | 
          
          
            | 325 | 
            # getHostName
  | 
            357 | 
            # getHostName
  | 
          
          
            | 326 | 
            #
  | 
            358 | 
            #
  | 
          
          
            | 327 | 
            # return hostname from hostname -f
  | 
            359 | 
            # return hostname from hostname -f
  | 
          
          
            | 328 | 
            #
  | 
            360 | 
            #
  | 
          
          
            | 329 | 
            #######################################################
  | 
            361 | 
            #######################################################
  | 
          
          
            | 330 | 
            sub getHostName {
  | 
            362 | 
            sub getHostName {
  | 
          
          
            | - | 
               | 
            363 | 
               &logIt( 3, "Entering getHostName" );
  | 
          
          
            | 331 | 
               my $hostname = `hostname -f`;
  | 
            364 | 
               my $hostname = `hostname -f`;
  | 
          
          
            | 332 | 
               chomp $hostname;
  | 
            365 | 
               chomp $hostname;
  | 
          
          
            | 333 | 
               return $hostname;
  | 
            366 | 
               return $hostname;
  | 
          
          
            | 334 | 
            }
  | 
            367 | 
            }
  | 
          
          
            | 335 | 
             
  | 
            368 | 
             
  | 
          
          
            | Line 418... | 
            Line 451... | 
          
          
            | 418 | 
            #
  | 
            451 | 
            #
  | 
          
          
            | 419 | 
            #
  | 
            452 | 
            #
  | 
          
          
            | 420 | 
            #######################################################
  | 
            453 | 
            #######################################################
  | 
          
          
            | 421 | 
            sub tabDelimitedToHash {
  | 
            454 | 
            sub tabDelimitedToHash {
  | 
          
          
            | 422 | 
               my ($hashRef, $tabdelim) = @_;
  | 
            455 | 
               my ($hashRef, $tabdelim) = @_;
  | 
          
          
            | - | 
               | 
            456 | 
               &logIt( 3, "Entering tabDelimitedToHash" );
  | 
          
          
            | 423 | 
               foreach my $line ( split( "\n", $tabdelim ) ) { # split on newlines, then process each line in turn
  | 
            457 | 
               foreach my $line ( split( "\n", $tabdelim ) ) { # split on newlines, then process each line in turn
  | 
          
          
            | 424 | 
                  $line =~ s/'/\\'/gi; # escape single quotes
  | 
            458 | 
                  $line =~ s/'/\\'/gi; # escape single quotes
  | 
          
          
            | 425 | 
                  my @fields = split( / *\t */, $line ); # get all the field values into array
  | 
            459 | 
                  my @fields = split( / *\t */, $line ); # get all the field values into array
  | 
          
          
            | 426 | 
                  my $theValue = pop @fields; # the last one is the value, so save it
  | 
            460 | 
                  my $theValue = pop @fields; # the last one is the value, so save it
  | 
          
          
            | 427 | 
                  # now, we build a Perl statement that would create the assignment. The goal is
  | 
            461 | 
                  # now, we build a Perl statement that would create the assignment. The goal is
  | 
          
          
            | Line 449... | 
            Line 483... | 
          
          
            | 449 | 
            #
  | 
            483 | 
            #
  | 
          
          
            | 450 | 
            #######################################################
  | 
            484 | 
            #######################################################
  | 
          
          
            | 451 | 
             
  | 
            485 | 
             
  | 
          
          
            | 452 | 
            sub validatePermission {
  | 
            486 | 
            sub validatePermission {
  | 
          
          
            | 453 | 
               my $file = shift;
  | 
            487 | 
               my $file = shift;
  | 
          
          
            | - | 
               | 
            488 | 
               &logIt( 3, "Entering validatePermission with $file" );
  | 
          
          
            | 454 | 
               my $return;
  | 
            489 | 
               my $return;
  | 
          
          
            | 455 | 
               # must be owned by root
  | 
            490 | 
               # must be owned by root
  | 
          
          
            | 456 | 
               my $owner = (stat($file))[4];
  | 
            491 | 
               my $owner = (stat($file))[4];
  | 
          
          
            | 457 | 
               $return .= " - Bad Owner [$owner]" if $owner;
  | 
            492 | 
               $return .= " - Bad Owner [$owner]" if $owner;
  | 
          
          
            | 458 | 
               # must not have any permissions for group or world
  | 
            493 | 
               # must not have any permissions for group or world
  | 
          
          
            | Line 482... | 
            Line 517... | 
          
          
            | 482 | 
            # on failure, the returned output of the script is assumed to be an error message
  | 
            517 | 
            # on failure, the returned output of the script is assumed to be an error message
  | 
          
          
            | 483 | 
            # and is displayed on STDERR
  | 
            518 | 
            # and is displayed on STDERR
  | 
          
          
            | 484 | 
            #######################################################
  | 
            519 | 
            #######################################################
  | 
          
          
            | 485 | 
            sub ProcessModules {
  | 
            520 | 
            sub ProcessModules {
  | 
          
          
            | 486 | 
               my ( $system, $moduleDir ) = @_;
  | 
            521 | 
               my ( $system, $moduleDir ) = @_;
  | 
          
          
            | - | 
               | 
            522 | 
               &logIt( 3, "Entering processModules" );
  | 
          
          
            | 487 | 
               # open the module directory
  | 
            523 | 
               # open the module directory
  | 
          
          
            | 488 | 
               return unless -d $moduleDir;
  | 
            524 | 
               return unless -d $moduleDir;
  | 
          
          
            | 489 | 
               opendir( my $dh, $moduleDir ) || die "Module Directory $moduleDir can not be opened: $!\n";
  | 
            525 | 
               opendir( my $dh, $moduleDir ) || die "Module Directory $moduleDir can not be opened: $!\n";
  | 
          
          
            | 490 | 
               # and get all files which are executable and contain nothing but alpha-numerics and underscores (must begin with alpha-numeric)
  | 
            526 | 
               # and get all files which are executable and contain nothing but alpha-numerics and underscores (must begin with alpha-numeric)
  | 
          
          
            | 491 | 
               my @modules = grep { /^[a-zA-Z0-9][a-zA-Z0-9_]+$/ && -x "$moduleDir/$_" } readdir( $dh );
  | 
            527 | 
               my @modules = grep { /^[a-zA-Z0-9][a-zA-Z0-9_]+$/ && -x "$moduleDir/$_" } readdir( $dh );
  | 
          
          
            | Line 493... | 
            Line 529... | 
          
          
            | 493 | 
               foreach my $modFile ( sort @modules ) { # for each valid script
  | 
            529 | 
               foreach my $modFile ( sort @modules ) { # for each valid script
  | 
          
          
            | 494 | 
                  if ( my $error = &validatePermission( "$moduleDir$modFile" ) ) {
  | 
            530 | 
                  if ( my $error = &validatePermission( "$moduleDir$modFile" ) ) {
  | 
          
          
            | 495 | 
                     print STDERR "Not Processed: $error\n";
  | 
            531 | 
                     print STDERR "Not Processed: $error\n";
  | 
          
          
            | 496 | 
                     next;
  | 
            532 | 
                     next;
  | 
          
          
            | 497 | 
                  }
  | 
            533 | 
                  }
  | 
          
          
            | 498 | 
                  print "Processing module $moduleDir$modFile\n" if $TESTING > 2;
  | 
            534 | 
                  &logIt( 3, "Processing module $moduleDir$modFile");
  | 
          
          
            | 499 | 
                  my $output = qx/$moduleDir$modFile $moduleDir/; # execute it and grab the output
  | 
            535 | 
                  my $output = qx/$moduleDir$modFile $moduleDir/; # execute it and grab the output
  | 
          
          
            | 500 | 
                  my $exitCode = $? >> 8; # process the exitCode
  | 
            536 | 
                  my $exitCode = $? >> 8; # process the exitCode
  | 
          
          
            | 501 | 
                  # exitCode 0 - processed normally
  | 
            537 | 
                  # exitCode 0 - processed normally
  | 
          
          
            | 502 | 
                  # exitCode 1 - not applicable to this machine
  | 
            538 | 
                  # exitCode 1 - not applicable to this machine
  | 
          
          
            | 503 | 
                  if ( $exitCode && $exitCode > 1) { # if non-zero, error, so show an error message
  | 
            539 | 
                  if ( $exitCode && $exitCode > 1) { # if non-zero, error, so show an error message
  | 
          
          
            | 504 | 
                     warn "Error in $moduleDir$modFile, [$output]\n";
  | 
            540 | 
                     warn "Error in $moduleDir$modFile, [$output]\n";
  | 
          
          
            | - | 
               | 
            541 | 
                     &logIt( 0, "Error in $moduleDir$modFile, [$output]" );
  | 
          
          
            | 505 | 
                  } else { # otherwise, call tabDelimitedToHash to save the data
  | 
            542 | 
                  } else { # otherwise, call tabDelimitedToHash to save the data
  | 
          
          
            | 506 | 
                     &tabDelimitedToHash( $system, $output );
  | 
            543 | 
                     &tabDelimitedToHash( $system, $output );
  | 
          
          
            | 507 | 
                  } # if
  | 
            544 | 
                  } # if
  | 
          
          
            | 508 | 
               } # foreach
  | 
            545 | 
               } # foreach
  | 
          
          
            | 509 | 
               # add sysinfo-client (me) to the software list, since we're obviously installed
  | 
            546 | 
               # add sysinfo-client (me) to the software list, since we're obviously installed
  | 
          
          
            | Line 520... | 
            Line 557... | 
          
          
            | 520 | 
            }
  | 
            557 | 
            }
  | 
          
          
            | 521 | 
             
  | 
            558 | 
             
  | 
          
          
            | 522 | 
            &processParameters( @ARGV );
  | 
            559 | 
            &processParameters( @ARGV );
  | 
          
          
            | 523 | 
             
  | 
            560 | 
             
  | 
          
          
            | 524 | 
            # load the configuration file
  | 
            561 | 
            # load the configuration file
  | 
          
          
            | 525 | 
             
  | 
            - | 
               | 
          
          
            | 526 | 
            #die "Searching for $configurationFile in = \n" . join( "\n", @confFileSearchPath ) . "\n";
  | 
            - | 
               | 
          
          
            | 527 | 
            %configuration = %{ &loadConfigurationFile( $configurationFile, @confFileSearchPath) };
  | 
            562 | 
            %configuration = %{ &loadConfigurationFile( $configurationFile, @confFileSearchPath) };
  | 
          
          
            | 528 | 
            #eval ( &loadConfigurationFile( $configurationFile, @confFileSearchPath) ) or die "Could not load config: $@\n";
  | 
            - | 
               | 
          
          
            | 529 | 
            die Dumper( \%configuration ) . "\n" if $TESTING > 4;
  | 
            - | 
               | 
          
          
            | 530 | 
             
  | 
            563 | 
             
  | 
          
          
            | 531 | 
            # user did not define a serial number, so make something up
  | 
            564 | 
            # user did not define a serial number, so make something up
  | 
          
          
            | 532 | 
            $configuration{'serialNumber'} = '' unless $configuration{'serialNumber'};
  | 
            565 | 
            $configuration{'serialNumber'} = '' unless $configuration{'serialNumber'};
  | 
          
          
            | 533 | 
            # oops, no client name (required) so tell them and exit
  | 
            566 | 
            # oops, no client name (required) so tell them and exit
  | 
          
          
            | 534 | 
            die "No client name defined in $configurationFile" unless $configuration{'clientName'};
  | 
            567 | 
            die "No client name defined in $configurationFile" unless $configuration{'clientName'};
  | 
          
          
            | 535 | 
             
  | 
            568 | 
             
  | 
          
          
            | - | 
               | 
            569 | 
            &logIt( 0, 'Starting sysinfo Run' );
  | 
          
          
            | - | 
               | 
            570 | 
            &logIt( 3, "Configuration is\n" . Data::Dumper->Dump( [\%configuration], [ qw($configuration) ] ) );
  | 
          
          
            | - | 
               | 
            571 | 
             
  | 
          
          
            | 536 | 
            $TESTING = $configuration{'TESTING'} if defined $configuration{'TESTING'};
  | 
            572 | 
            $TESTING = $configuration{'TESTING'} if defined $configuration{'TESTING'};
  | 
          
          
            | 537 | 
             
  | 
            573 | 
             
  | 
          
          
            | 538 | 
            print "Testing => $TESTING\n" if $TESTING;
  | 
            574 | 
            &logIt( 0, "Testing => $TESTING" ) if $TESTING;
  | 
          
          
            | 539 | 
             
  | 
            575 | 
             
  | 
          
          
            | 540 | 
             
  | 
            576 | 
             
  | 
          
          
            | 541 | 
            my $System; # hash reference that will store all info we are going to send to the server
  | 
            577 | 
            my $System; # hash reference that will store all info we are going to send to the server
  | 
          
          
            | 542 | 
            # some defaults.
  | 
            578 | 
            # some defaults.
  | 
          
          
            | 543 | 
            $$System{'report'}{'version'} = $DATA_VERSION;
  | 
            579 | 
            $System->{'report'}->{'version'} = $DATA_VERSION;
  | 
          
          
            | 544 | 
            $$System{'report'}{'date'} = $reportDate;
  | 
            580 | 
            $System->{'report'}->{'date'} = $reportDate;
  | 
          
          
            | 545 | 
            $$System{'report'}{'client'} = $configuration{'clientName'};
  | 
            581 | 
            $System->{'report'}->{'client'} = $configuration{'clientName'};
  | 
          
          
            | 546 | 
            $$System{'system'}{'hostname'} = $configuration{'hostname'};
  | 
            582 | 
            $System->{'system'}->{'hostname'} = $configuration{'hostname'};
  | 
          
          
            | 547 | 
            $$System{'system'}{'serial'} = $configuration{'serialNumber'};
  | 
            583 | 
            $System->{'system'}->{'serial'} = $configuration{'serialNumber'};
  | 
          
          
            | 548 | 
            $$System{'system'}{'UUID'} = $configuration{'UUID'};
  | 
            584 | 
            $System->{'system'}->{'UUID'} = $configuration{'UUID'};
  | 
          
          
            | - | 
               | 
            585 | 
             
  | 
          
          
            | - | 
               | 
            586 | 
            &logIt( 3, "Initial System\n" . Data::Dumper->Dump( [$System], [qw( $System )] ) );
  | 
          
          
            | 549 | 
             
  | 
            587 | 
             
  | 
          
          
            | 550 | 
            # process any modules in the system
  | 
            588 | 
            # process any modules in the system
  | 
          
          
            | 551 | 
            foreach my $moduleDir ( @{$configuration{'moduleDirs'}} ) {
  | 
            589 | 
            foreach my $moduleDir ( @{$configuration{'moduleDirs'}} ) {
  | 
          
          
            | - | 
               | 
            590 | 
               &logIt( 3, "Processing modules from $moduleDir" );
  | 
          
          
            | 552 | 
               &ProcessModules( $System, "$moduleDir/" );
  | 
            591 | 
               &ProcessModules( $System, "$moduleDir/" );
  | 
          
          
            | 553 | 
            }
  | 
            592 | 
            }
  | 
          
          
            | 554 | 
             
  | 
            593 | 
             
  | 
          
          
            | - | 
               | 
            594 | 
            &logIt( 4, "After processing modules\n" . Data::Dumper->Dump( [$System], [qw( $System )] ) );
  | 
          
          
            | - | 
               | 
            595 | 
             
  | 
          
          
            | 555 | 
            # now, everything ins in $System, so convert it to the proper output format
  | 
            596 | 
            # now, everything ins in $System, so convert it to the proper output format
  | 
          
          
            | 556 | 
            #my $out = "#sysinfo: $VERSION YAML\n---\n" . &hashToYAML( $System ) . "...\n";
  | 
            597 | 
            #my $out = "#sysinfo: $VERSION YAML\n---\n" . &hashToYAML( $System ) . "...\n";
  | 
          
          
            | 557 | 
             
  | 
            598 | 
             
  | 
          
          
            | 558 | 
            my $out =  "#sysinfo: $VERSION YAML\n" . Dump( $System );
  | 
            599 | 
            my $out =  "#sysinfo: $VERSION YAML\n" . Dump( $System );
  | 
          
          
            | 559 | 
             
  | 
            600 | 
             
  | 
          
          
            | 560 | 
            #print Data::Dumper->Dump([$System],['System']) if $TESTING>2;
  | 
            601 | 
            &logIt( 4, 'At line number ' . __LINE__ . "\n" . Data::Dumper->Dump([$System],[qw($System)]) );
  | 
          
          
            | 561 | 
             
  | 
            602 | 
             
  | 
          
          
            | 562 | 
            # load some global values for use in the script, if required
  | 
            603 | 
            # load some global values for use in the script, if required
  | 
          
          
            | 563 | 
            my $globals = { 
  | 
            604 | 
            my $globals = { 
  | 
          
          
            | 564 | 
                  'data version' => $DATA_VERSION,
  | 
            605 | 
                  'data version' => $DATA_VERSION,
  | 
          
          
            | 565 | 
                  'report date'  => $reportDate,
  | 
            606 | 
                  'report date'  => $reportDate,
  | 
          
          
            | Line 567... | 
            Line 608... | 
          
          
            | 567 | 
                  'host name'    => $configuration{'hostname'},
  | 
            608 | 
                  'host name'    => $configuration{'hostname'},
  | 
          
          
            | 568 | 
                  'serial number'=> $configuration{'serialNumber'},
  | 
            609 | 
                  'serial number'=> $configuration{'serialNumber'},
  | 
          
          
            | 569 | 
                  'UUID'         => $configuration{'UUID'}
  | 
            610 | 
                  'UUID'         => $configuration{'UUID'}
  | 
          
          
            | 570 | 
                  };
  | 
            611 | 
                  };
  | 
          
          
            | 571 | 
             
  | 
            612 | 
             
  | 
          
          
            | - | 
               | 
            613 | 
            &logIt( 4, "Globals initialized\n" . Data::Dumper->Dump([$globals],[qw($globals)]) );
  | 
          
          
            | - | 
               | 
            614 | 
             
  | 
          
          
            | - | 
               | 
            615 | 
            if ( $TESTING ) {
  | 
          
          
            | - | 
               | 
            616 | 
               open DATA, ">/tmp/sysinfo.testing.yaml" or die "Could not write to /tmp/sysinfo.testing.yaml: $!\n";
  | 
          
          
            | - | 
               | 
            617 | 
               print DATA $out;
  | 
          
          
            | - | 
               | 
            618 | 
               close DATA;
  | 
          
          
            | - | 
               | 
            619 | 
            } else {
  | 
          
          
            | 572 | 
            # and send the results to the server
  | 
            620 | 
               # and send the results to the server
  | 
          
          
            | 573 | 
            if ( my $success = &sendResults( $globals, $configuration{'transports'}, $out, $configuration{'scriptDirs'} ) != 1 ) {
  | 
            621 | 
               if ( my $success = &sendResults( $globals, $configuration{'transports'}, $out, $configuration{'scriptDirs'} ) != 1 ) {
  | 
          
          
            | 574 | 
               print "Error $success while sending report from $configuration{'hostname'}\n";
  | 
            622 | 
                  &logIt( 0, "Error $success while sending report from $configuration{'hostname'}" );
  | 
          
          
            | - | 
               | 
            623 | 
               }
  | 
          
          
            | 575 | 
            }
  | 
            624 | 
            }
  | 
          
          
            | 576 | 
             
  | 
            625 | 
             
  | 
          
          
            | - | 
               | 
            626 | 
            &logIt( 0, 'Ending sysinfo Run' );
  | 
          
          
            | - | 
               | 
            627 | 
             
  | 
          
          
            | 577 | 
            1;
  | 
            628 | 
            1;
  |