Changed cvs_man.php -> scm_man.php.
[clearscm.git] / clearadm / updatesystem.pl
1 #!/usr/bin/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' ? 'df -TP' : 'df -l -TP';
83    
84   my ($status, @output) = $clearexec->execute ($cmd);
85   
86   error "Unable to execute uname -a - $!", $status . join ("\n". @output)
87     if $status;
88   
89   # Real file systems start with "/"
90   @output = grep { /^\// } @output;
91   
92   my @filesystems;
93     
94   foreach (@output) {
95         if (/^(\S+)\s+(\S+).+?(\S+)$/) {
96       my %filesystem;
97       
98       $filesystem{system}     = $system{name};
99           $filesystem{filesystem} = $1;
100           $filesystem{fstype}     = $2;
101           $filesystem{mount}      = $3;
102
103       push @filesystems, \%filesystem;    
104         } # if
105   } # foreach
106   
107   return @filesystems;
108 } # GetFilesystems
109
110 sub GatherSysInfo (;%) {
111   my (%system) = @_;
112
113   # Set name if not currently set  
114   $system{name} = $host
115     unless $system{name};
116     
117   my ($status, @output);
118   
119   $system{port} ||= $port;
120
121   # Connect to clearexec server
122   $status = $clearexec->connectToServer ($system{name}, $system{port});
123
124   unless ($status) {
125     warning "Unable to connect to $system{name}:$port";
126     return %system;
127   } # if
128
129   # Get OS info
130   my $cmd = 'uname -a';
131
132   ($status, @output) = $clearexec->execute ($cmd);
133   
134   error "Unable to execute '$cmd' - $!", $status . join ("\n". @output)
135     if $status;
136   
137   $system{os} = $output[0];
138   
139   $system{clearagent} = 1;
140   
141   $cmd = 'uname -s';
142   
143   ($status, @output) = $clearexec->execute ($cmd);
144
145   error "Unable to execute '$cmd' - $!", $status . join ("\n". @output)
146     if $status;
147   
148   # TODO: Need to handle this better
149   $system{type} = $output[0] =~ /cygwin/i ? 'Windows' : $output[0];
150   
151   return %system;  
152 } # GatherSysInfo
153
154 sub AddFilesystems (%) {
155   my (%system) = @_;
156
157   my ($err, $msg);
158     
159   foreach (GetFilesystems %system) {
160     my %filesystem = %{$_};
161     
162     my %oldfilesystem = $clearadm->GetFilesystem (
163       $filesystem{system},
164       $filesystem{filesystem}
165     );
166     
167     if (%oldfilesystem) {
168       verbose "Updating filesystem $filesystem{system}:$filesystem{filesystem}";
169       
170       ($err, $msg) = $clearadm->UpdateFilesystem (
171         $filesystem{system},
172         $filesystem{filesystem},
173         %filesystem,
174       );
175       
176       error 'Unable to update filesystem '
177           . "$filesystem{system}:$filesystem{filesystem}"
178         if $err;
179     } else {
180       verbose 'Adding filesystem '
181             . "$filesystem{system}:$filesystem{filesystem}";
182     
183       ($err, $msg) = $clearadm->AddFilesystem (%filesystem);
184
185       error 'Unable to add filesystem '
186           . "$filesystem{system}:$filesystem{filesystem}"
187         if $err;
188     } # if      
189   } # foreach
190   
191   return ($err, $msg);  
192 } # AddFilesystems
193
194 sub AddSystem ($) {
195   my ($system) = @_;
196   
197   verbose "Adding newhost $system";
198
199   my %system = GatherSysInfo;
200   
201   # If GatherSysInfo was able to connect to clearagent it will set this field
202   my $clearagent = delete $system{clearagent};
203   
204   my ($err, $msg) = $clearadm->AddSystem (%system);
205   
206   return ($err, $msg)
207     if $err;
208     
209   if ($clearagent) {
210     return AddFilesystems %system;
211   } else {
212     return ($err, $msg);
213   } # if
214 } # AddSystem
215
216 sub UpdateSystem (%) {
217   my (%system) = @_;
218   
219   my ($err, $msg);
220   
221   %system = GatherSysInfo (%system);
222   
223   # If GatherSysInfo was able to connect to clearagent it will set this field
224   my $clearagent = delete $system{clearagent};
225   
226   return ($err, $msg) unless $clearagent;
227   
228   verbose "Updating existing host $system{name}";
229   
230   ($err, $msg) = $clearadm->UpdateSystem ($system{name}, %system);
231     
232   return ($err, $msg) if $err;
233
234   ($err, $msg) = AddFilesystems %system;
235   
236   $clearexec->disconnectFromServer;
237   
238   return ($err, $msg);
239 } # UpdateSystem
240
241 # Main
242 $host = hostname;
243 $port = $Clearexec::CLEAROPTS{CLEAREXEC_PORT};
244
245 GetOptions (
246   'usage'   => sub { Usage },
247   'verbose' => sub { set_verbose },
248   'debug'   => sub { set_debug },
249   'delete'  => \$delete,
250   'host=s'  => \$host,
251   'port=s'  => \$port,
252 ) or Usage "Invalid parameter";
253
254 Usage 'Extraneous options: ' . join ' ', @ARGV
255   if @ARGV;
256
257 if ($delete) {
258   error "Must specify -host if you specify -delete", 1
259     unless $host;
260 } # if
261
262 # Announce ourselves
263 verbose "$FindBin::Script V$VERSION";
264
265 my ($err, $msg);
266
267 if ($delete) {
268   display_nolf "Delete host $host (y/N):";
269   
270   my $answer = <STDIN>;
271   
272   if ($answer =~ /(y|yes)/i) {
273     ($err, $msg) = $clearadm->DeleteSystem ($host);
274   
275     if ($err == 0) {
276        error "No host named $host in database";
277     } elsif ($err < 0) {
278       error "Unable to delete $host" . $msg, $err;
279     } else {
280       verbose "Deleted host $host";
281     } # if
282   } else {
283         display "Host $host not deleted";
284   } # if
285 } else {
286   if ($host eq 'all') {
287     foreach ($clearadm->FindSystem) {
288       my %system = %$_;
289       
290       ($err, $msg) = UpdateSystem (%system);
291   
292       error "Unable to update host $system{name}\n$msg", $err
293         if $err;
294     } # foreach
295   } else {
296     my %system = $clearadm->GetSystem ($host);
297     
298     if (%system) {
299       ($err, $msg) = UpdateSystem (%system);
300     } else {
301       ($err, $msg) = AddSystem ($host);
302     } # if
303
304     if ($err) {
305       my $errmsg  = 'Unable to ';
306          $errmsg .= %system ? 'update' : 'add';
307          $errmsg .= " host $host\$msg"; 
308
309       error "Unable to add host $host\n$msg", $err;
310     } # if
311   } # if
312 } # if
313
314 =pod
315
316 =head1 CONFIGURATION AND ENVIRONMENT
317
318 DEBUG: If set then $debug is set to this level.
319
320 VERBOSE: If set then $verbose is set to this level.
321
322 TRACE: If set then $trace is set to this level.
323
324 =head1 DEPENDENCIES
325
326 =head2 Perl Modules
327
328 L<FindBin>
329
330 L<Getop::Long|Getopt::Long>
331
332 L<Sys::Hostname|Sys::Hostname>
333
334 =head2 ClearSCM Perl Modules
335
336 =begin man 
337
338  Clearadm
339  Clearexec
340  Display
341  Utils
342
343 =end man
344
345 =begin html
346
347 <blockquote>
348 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/Clearadm.pm">Clearadm</a><br>
349 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/Clearexec.pm">Clearexec</a><br>
350 <a href="http://clearscm.com/php/scm_man.php?file=lib/Display.pm">Display</a><br>
351 <a href="http://clearscm.com/php/scm_man.php?file=lib/Utils.pm">Utils</a><br>
352 </blockquote>
353
354 =end html
355
356 =head1 BUGS AND LIMITATIONS
357
358 There are no known bugs in this script
359
360 Please report problems to Andrew DeFaria <Andrew@ClearSCM.com>.
361
362 =head1 LICENSE AND COPYRIGHT
363
364 Copyright (c) 2010, ClearSCM, Inc. All rights reserved.
365
366 =cut