Subversion Repositories camp_sysinfo_client_3

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
71 rodolico 1
#! /usr/bin/env perl
2
 
3
# parse a Belarc Advisor file to get the values out of it
4
# there are many more values available, but we are only getting a few
5
 
6
use strict;
7
use warnings;
8
 
9
my $VERSION = 0.9;
10
my $DATE = '20180824';
11
 
12
my @out;
13
 
14
package HTMLStrip;
15
use base "HTML::Parser";
16
 
17
sub cleanup {
18
   my $line = shift;
19
   $line =~ s/ / /g;
20
   #chomp $line;
21
   # ltrim only
22
   #$line =~ s/^\s+//;
23
   # rtrim only
24
   #$line =~ s/\s+$//;
25
   # trim
26
   $line =~ s/^\s+|\s+$//g;
27
   return $line;
28
}
29
 
30
 
31
sub text {
32
   my ( $self,$text) = @_;
33
   chomp $text;
34
   push @out, &cleanup( $text ) if $text !~ m/^\s*$/;
35
}
36
 
37
my $client = shift;
38
 
39
my $p = new HTMLStrip;
40
 
41
while (<>) {
42
   $p->parse($_);
43
}
44
# flush and parse remaining unparsed HTML
45
$p->eof;
46
 
47
my %definition;
48
 
49
#print join( "\n", @out );
50
my $i = 0;
51
while ( $i < @out ) {
52
   if ( $out[$i] eq 'Computer Name:' ) {
53
      $definition{'hostname'} = $out[++$i];
54
   } elsif ($out[$i] eq 'DNS Suffix:' ) {
55
      $definition{'dns'} = $out[++$i];
56
   } elsif ($out[$i] eq 'Profile Date:' ) {
57
      $definition{'reportdate'} = $out[++$i];
58
   } elsif ($out[$i] eq 'Operating System' ) {
59
      $definition{'os'} = $out[++$i];
60
   } elsif ($out[$i] eq 'Auto IP Address:' ) {
61
      $definition{'ip'} = $out[++$i];
62
      my $j = $i;
63
      for ( my $j = $i; $j - $i < 10; $j++ ) {
64
         if ( $out[$j] eq 'Physical Address:' ) {
65
            $definition{'mac'} = $out[$j+1];
66
            $i = $j;
67
            last;
68
         } # for
69
      } # foreach
70
   } elsif ($out[$i] =~ m/System Serial Number: (.*)/ ) {
71
      $definition{'serial'} = $1;
72
   } elsif ($out[$i] =~ m/Chassis Serial Number: (.*)/ ) {
73
      $definition{'tag'} = $1;
74
   } elsif ($out[$i] =~ m/Enclosure Type: (.*)/ ) {
75
      $definition{'enclosure'} = $1;
76
   } elsif ($out[$i] eq 'System Model' ) {
77
      $definition{'model'} = $out[++$i];
78
   } elsif ($out[$i] eq 'Processor' ) {
79
      $i += 2;
80
      $definition{'cpu'} = $out[$i];
81
   } elsif ($out[$i] eq 'Memory Modules' ) {
82
      $i += 2;
83
      $definition{'memory'} = $out[$i];
84
   } elsif ($out[$i] eq 'Software Licenses' ) {
85
      if ( $out[$i+1] eq '[' ) {
86
         $i += 4;
87
         while ( $i < @out && $out[$i] ne 'Find unused software and reduce licensing costs...' ) {
88
            $definition{'--' . $out[$i]} = $out[$i+1];
89
            $i += 2;
90
         }
91
      }
92
   }
93
   $i++;
94
}
95
 
96
# dump storage
97
#foreach my $key ( sort keys %definition ) {  print "$key\t$definition{$key}\n"; }
98
 
99
my $output;
100
my $temp;
101
my @temp;
102
 
103
# for several things, we need to double quote them, so we do it all at once
104
foreach my $toQuote ( 'os', 'os_installed', 'mac', 'serial', 'tag', 'reportdate' ) {
105
   $definition{$toQuote} = qq/$definition{$toQuote}/ if $definition{$toQuote};
106
}
107
 
108
# calculate system information
109
# clean hostname and add dns name if it exists
110
$definition{'hostname'} =~ m/^([a-z0-9.-]+)/;
111
$definition{'hostname'} = $1;
112
$definition{'hostname'} .= '.' . $definition{'dns'} if $definition{'dns'};
113
# clean memory and convert to kb
114
@temp = split( ' ', $definition{'memory'} );
115
$temp[0] *= 1024 if ( $temp[1] eq 'Megabytes' );
116
$definition{'memory'} = $temp[0];
117
 
118
# if serial not defined but tag is, set serial to tag
119
if ( $definition{'tag'} && ! $definition{'serial'} ) {
120
   $definition{'serial'} = $definition{'tag'};
121
   $definition{'tag'} = undef;
122
};
123
 
124
# parse cpu type, etc..
125
if ( $definition{'cpu'} =~ m/([0-9.]+) gigahertz (\w+) (.*)/ ) {
126
   $definition{'cpu_speed'} = $1 * 1024;
127
   $definition{'cpu_type'} = $2;
128
   $definition{'cpu_sub'} = $3;
129
}
130
 
131
 
132
# populate system information
133
$output = "system:\n";
134
$output .= "  hostname: $definition{hostname}\n";
135
$output .= "  serial: $definition{serial}\n" if $definition{'serial'};
136
$output .= "  tag: $definition{tag}\n" if $definition{'tag'};
137
$output .= "  memory: $definition{memory}\n" if $definition{'memory'};
138
$output .= "  cpu: $definition{cpu}\n" if $definition{'cpu'};
139
$output .= "  cpu_speed: $definition{cpu_speed}\n" if $definition{'cpu_speed'};
140
$output .= "  cpu_type: $definition{cpu_type}\n" if $definition{'cpu_type'};
141
$output .= "  cpu_sub: $definition{cpu_sub}\n" if $definition{'cpu_sub'};
142
 
143
# network information
144
@temp = split( '/', $definition{'ip'} );
145
$output .= "\nnetwork:\n  NIC:\n";
146
$output .= "    address: $temp[0]\n" if $temp[0];
147
$output .= "    netmask: $temp[1]\n" if $temp[1];
148
$output .= "    mac: $definition{mac}\n" if $definition{'mac'};
149
 
150
$output .= "\noperatingsystem:\n";
151
$output .= "  os_version:  \"$definition{os}\"\n" if $definition{'os'};
152
$output .= "  installed: $definition{os_installed}\n" if $definition{'os_installed'};
153
 
154
# report information
155
$output .= "\nreport:\n";
156
$output .= "  date: $definition{reportdate}\n" if $definition{'reportdate'};
157
$output .= "  version: 3.0.0\n";
158
$output .= "  client: $client\n";
159
 
160
# clean up YAML
161
$output = "#parseBelarc $VERSION YAML\n---\n" . $output . "---\n";
162
open REPORT,">$definition{hostname}.yaml" or die "Could not write to $definition{hostname}.yaml: $!\n";
163
print REPORT "$output";
164
close REPORT;
165
 
166
open SOFTWARE,">$definition{hostname}.csv" or die "Could not write to $definition{hostname}.csv: $!\n";
167
foreach my $key ( keys %definition ) {
168
   next if $key !~ m/^\-\-(.*)$/;
169
   my $product = $1;
170
   next if $key =~ m/Microsoft - PowerShell/;
171
   next if $key =~ m/Microsoft - Internet Explorer/;
172
   next if $key =~ m/Belarc - Advisor/;
173
   if ( $definition{$key} =~ m/\(Key: ([^)]+)/ ) { 
174
      $definition{$key} = $1;
175
   }
176
   print SOFTWARE "$client\t$product\t$definition{$key}\t$definition{hostname}\n";
177
}
178
close SOFTWARE;
179
 
180
 
181
#print '='x40 . "\n"; print join( "\n", @out );
182