f5fbb060ed18e3bfd636d41ed3d7efcdadddda17
[clearscm.git] / clearadm / updatesystem.pl
1 #!/usr/bin/env perl
2
3 =pod
4
5 =head1 NAME $RCSfile: updatesystem.pl,v $
6
7 Update System
8
9 =head1 VERSION
10
11 =over
12
13 =item Author
14
15 Andrew DeFaria <Andrew@ClearSCM.com>
16
17 =item Revision
18
19 $Revision: 1.17 $
20
21 =item Created:
22
23 Mon Dec 13 09:13:27 EST 2010
24
25 =item Modified:
26
27 $Date: 2012/11/09 06:44:38 $
28
29 =back
30
31 =head1 SYNOPSIS
32
33  Usage updatesystem.pl: [-u|sage] [-ve|rbose] [-deb|ug]
34                         [-del|ete -h|ost <host>]
35
36  Where:
37    -u|sage:       Displays usage
38  
39    -ve|rbose:     Be verbose
40    -deb|ug:       Output debug messages
41    
42    -del|ete:      Delete host
43    -h|ost <host>: Host to operate on (Default: Current host)
44    -p|ort <port>: Clearexec port to connect to
45
46 =head1 DESCRIPTION
47
48 This script will add/update the system to the Clearadm database.  You can also
49 delete a system from the Clearadm database.
50
51 =cut
52
53 use strict;
54 use warnings;
55
56 use Sys::Hostname;
57
58 use FindBin;
59 use Getopt::Long;
60
61 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
62
63 use Clearadm;
64 use Clearexec;
65 use Display;
66 use Utils;
67
68 my $VERSION  = '$Revision: 1.17 $';
69   ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
70
71 my $clearadm  = Clearadm->new;
72 my $clearexec = Clearexec->new;
73
74 my ($delete, $host, $port);
75
76 sub GetFilesystems(%) {
77   my (%system) = @_;
78   
79   # TODO: Unix/Linux systems often vary as to what parameters df supports. The
80   # -P is to intended to make this POSIX standard. Need to make sure this works
81   # on other systems (i.e. Solaris, HP-UX, Redhat, etc.).
82   my $cmd = $system{type} eq 'Windows'
83           ? 'df -TP'
84           : $system{type} eq 'Unix' # I think I need to add a Solaris type
85           ? '/usr/xpg4/bin/df -l -P'
86           : 'df -l -TP';
87    
88   my ($status, @output) = $clearexec->execute ($cmd);
89   
90   error "Unable to execute $cmd - $! (Status: $status)\n" . join ("\n". @output), $status
91     if $status;
92   
93   # Real file systems start with "/"
94   my @fs = grep { /^\// } @output;
95
96   # Also add lines that start with rpool (This is for Solaris zones
97   push @fs, grep { /^rpool/ } @output;
98   
99   my @filesystems;
100     
101   for (@fs) {
102     if (/^(\S+)\s+(\S+).+?(\S+)$/) {
103       my %filesystem;
104       
105       $filesystem{system}     = $system{name};
106       $filesystem{filesystem} = $1;
107       $filesystem{fstype}     = $2;
108       $filesystem{mount}      = $3;
109
110       push @filesystems, \%filesystem;    
111     } # if
112   } # for
113   
114   return @filesystems;
115 } # GetFilesystems
116
117 sub GatherSysInfo (;%) {
118   my (%system) = @_;
119
120   # Set name if not currently set  
121   $system{name} = $host
122     unless $system{name};
123     
124   my ($status, @output);
125   
126   $system{port} ||= $port;
127
128   # Connect to clearexec server
129   $status = $clearexec->connectToServer ($system{name}, $system{port});
130
131   unless ($status) {
132     warning "Unable to connect to $system{name}:$port";
133     return %system;
134   } # if
135
136   # Get OS info
137   my $cmd = 'uname -a';
138
139   ($status, @output) = $clearexec->execute ($cmd);
140   
141   error "Unable to execute '$cmd' - $!", $status . join ("\n". @output)
142     if $status;
143   
144   $system{os} = $output[0];
145   
146   $system{clearagent} = 1;
147   
148   $cmd = 'uname -s';
149   
150   ($status, @output) = $clearexec->execute ($cmd);
151
152   error "Unable to execute '$cmd' - $!", $status . join ("\n". @output)
153     if $status;
154   
155   # TODO: Need to handle this better
156   if ($output[0] =~ /sunos/i) {
157     $system{type} = 'Unix';
158   } elsif ($output[0] =~ /cygwin/i) {
159     $system{type} = 'Windows';
160   } else {
161     $system{type} = 'Linux';
162   } # if
163   
164   return %system;  
165 } # GatherSysInfo
166
167 sub AddFilesystems (%) {
168   my (%system) = @_;
169
170   my ($err, $msg);
171     
172   for (GetFilesystems %system) {
173     my %filesystem = %{$_};
174     
175     my %oldfilesystem = $clearadm->GetFilesystem (
176       $filesystem{system},
177       $filesystem{filesystem}
178     );
179     
180     if (%oldfilesystem) {
181       verbose "Updating filesystem $filesystem{system}:$filesystem{filesystem}";
182       
183       ($err, $msg) = $clearadm->UpdateFilesystem (
184         $filesystem{system},
185         $filesystem{filesystem},
186         %filesystem,
187       );
188       
189       error 'Unable to update filesystem '
190           . "$filesystem{system}:$filesystem{filesystem}"
191         if $err;
192     } else {
193       verbose 'Adding filesystem '
194             . "$filesystem{system}:$filesystem{filesystem}";
195     
196       ($err, $msg) = $clearadm->AddFilesystem (%filesystem);
197
198       error 'Unable to add filesystem '
199           . "$filesystem{system}:$filesystem{filesystem}"
200         if $err;
201     } # if      
202   } # for
203   
204   return ($err, $msg);  
205 } # AddFilesystems
206
207 sub AddSystem ($) {
208   my ($system) = @_;
209   
210   verbose "Adding newhost $system";
211
212   my %system = GatherSysInfo;
213   
214   # If GatherSysInfo was able to connect to clearagent it will set this field
215   my $clearagent = delete $system{clearagent};
216   
217   my ($err, $msg) = $clearadm->AddSystem (%system);
218   
219   return ($err, $msg)
220     if $err;
221     
222   if ($clearagent) {
223     return AddFilesystems %system;
224   } else {
225     return ($err, $msg);
226   } # if
227 } # AddSystem
228
229 sub UpdateSystem (%) {
230   my (%system) = @_;
231   
232   my ($err, $msg);
233   
234   %system = GatherSysInfo (%system);
235   
236   # If GatherSysInfo was able to connect to clearagent it will set this field
237   my $clearagent = delete $system{clearagent};
238   
239   return ($err, $msg) unless $clearagent;
240   
241   verbose "Updating existing host $system{name}";
242   
243   ($err, $msg) = $clearadm->UpdateSystem ($system{name}, %system);
244     
245   return ($err, $msg) if $err;
246
247   ($err, $msg) = AddFilesystems %system;
248   
249   $clearexec->disconnectFromServer;
250   
251   return ($err, $msg);
252 } # UpdateSystem
253
254 # Main
255 $host = hostname;
256 $port = $Clearexec::CLEAROPTS{CLEAREXEC_PORT};
257
258 GetOptions (
259   'usage'   => sub { Usage },
260   'verbose' => sub { set_verbose },
261   'debug'   => sub { set_debug },
262   'delete'  => \$delete,
263   'host=s'  => \$host,
264   'port=s'  => \$port,
265 ) or Usage "Invalid parameter";
266
267 Usage 'Extraneous options: ' . join ' ', @ARGV
268   if @ARGV;
269
270 if ($delete) {
271   error "Must specify -host if you specify -delete", 1
272     unless $host;
273 } # if
274
275 # Announce ourselves
276 verbose "$FindBin::Script V$VERSION";
277
278 my ($err, $msg);
279
280 if ($delete) {
281   display_nolf "Delete host $host (y/N):";
282   
283   my $answer = <STDIN>;
284   
285   if ($answer =~ /(y|yes)/i) {
286     ($err, $msg) = $clearadm->DeleteSystem ($host);
287   
288     if ($err == 0) {
289        error "No host named $host in database";
290     } elsif ($err < 0) {
291       error "Unable to delete $host" . $msg, $err;
292     } else {
293       verbose "Deleted host $host";
294     } # if
295   } else {
296         display "Host $host not deleted";
297   } # if
298 } else {
299   if ($host eq 'all') {
300     for ($clearadm->FindSystem) {
301       my %system = %$_;
302       
303       ($err, $msg) = UpdateSystem (%system);
304   
305       error "Unable to update host $system{name}\n$msg", $err
306         if $err;
307     } # for
308   } else {
309     my %system = $clearadm->GetSystem ($host);
310     
311     if (%system) {
312       ($err, $msg) = UpdateSystem (%system);
313     } else {
314       ($err, $msg) = AddSystem ($host);
315     } # if
316
317     if ($err) {
318       my $errmsg  = 'Unable to ';
319          $errmsg .= %system ? 'update' : 'add';
320          $errmsg .= " host $host\$msg"; 
321
322       error "Unable to add host $host\n$msg", $err;
323     } # if
324   } # if
325 } # if
326
327 =pod
328
329 =head1 CONFIGURATION AND ENVIRONMENT
330
331 DEBUG: If set then $debug is set to this level.
332
333 VERBOSE: If set then $verbose is set to this level.
334
335 TRACE: If set then $trace is set to this level.
336
337 =head1 DEPENDENCIES
338
339 =head2 Perl Modules
340
341 L<FindBin>
342
343 L<Getop::Long|Getopt::Long>
344
345 L<Sys::Hostname|Sys::Hostname>
346
347 =head2 ClearSCM Perl Modules
348
349 =begin man 
350
351  Clearadm
352  Clearexec
353  Display
354  Utils
355
356 =end man
357
358 =begin html
359
360 <blockquote>
361 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/Clearadm.pm">Clearadm</a><br>
362 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/Clearexec.pm">Clearexec</a><br>
363 <a href="http://clearscm.com/php/scm_man.php?file=lib/Display.pm">Display</a><br>
364 <a href="http://clearscm.com/php/scm_man.php?file=lib/Utils.pm">Utils</a><br>
365 </blockquote>
366
367 =end html
368
369 =head1 BUGS AND LIMITATIONS
370
371 There are no known bugs in this script
372
373 Please report problems to Andrew DeFaria <Andrew@ClearSCM.com>.
374
375 =head1 LICENSE AND COPYRIGHT
376
377 Copyright (c) 2010, ClearSCM, Inc. All rights reserved.
378
379 =cut