Big update of Clearadm
[clearscm.git] / clearadm / discovery.pl
1 #!/usr/bin/env perl
2
3 =pod
4
5 =head1 NAME $RCSfile: discovery.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.1 $
20
21 =item Created:
22
23 Mon Dec 13 09:13:27 EST 2010
24
25 =item Modified:
26
27 $Date: 2011/01/07 20:48:22 $
28
29 =back
30
31 =head1 SYNOPSIS
32
33  Usage updatesystem.pl: [-u|sage] [-ve|rbose] [-deb|ug]
34                         [-b|roadcastTime <seconds>]
35
36  Where:
37    -u|sage:       Displays usage
38  
39    -ve|rbose:     Be verbose
40    -deb|ug:       Output debug messages
41    
42    -broadcastA|ddr <ip>:      Broadcast IP (Default: Current subnet)
43    -broadcastT|ime <seconds>: Number of sends to wait for responses to broadcast
44                               (Default: 10 seconds)
45
46 =head1 DESCRIPTION
47
48 This script will discover systems on the local subnet and then add or update
49 them in the Clearadm database.
50
51 =cut
52
53 use strict;
54 use warnings;
55
56 use Socket;
57
58 use FindBin;
59 use Getopt::Long;
60
61 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
62
63 use Clearadm;
64 use Display;
65 use OSDep;
66 use Utils;
67
68 my $VERSION  = '$Revision: 1.1 $';
69   ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
70
71 my $clearadm = Clearadm->new;
72
73 my $broadcastTime = 10;
74
75 sub discover ($) {
76   my ($broadcast) = @_;
77   
78   my $startTime = time;
79
80   my %hosts;
81
82   verbose "Performing discovery (for $broadcastTime seconds)...";
83
84   while (<$broadcast>) {
85     display "Received line: $_";
86     if (/from (\S+) \((.+)\)/) {
87       my $hostname = $1;
88       my $ip       = $2;
89
90       # Remove domain
91       $hostname =~ s/(\w+)\..*/$1/;
92
93       unless ($hosts{$ip}) {
94         verbose "Received response from ($ip): $hostname";
95         $hosts{$ip} = $hostname;
96       } # unless
97     } # if
98   
99     last
100       if (time () - $startTime) > $broadcastTime;
101   } # while
102
103   verbose "$broadcastTime seconds has elapsed - discovery complete";
104
105   return %hosts
106 } # discover
107
108 # Main
109 my $broadcastAddress = inet_ntoa (INADDR_BROADCAST);
110
111 GetOptions (
112   usage             => sub { Usage },
113   verbose           => sub { set_verbose },
114   debug             => sub { set_debug },
115   'broadcastTime=s' => \$broadcastTime,
116   'broadcastAddr=s' => \$broadcastAddress,  
117 ) or Usage "Invalid parameter";
118
119 Usage 'Extraneous options: ' . join ' ', @ARGV
120   if @ARGV;
121
122 # Announce ourselves
123 verbose "$FindBin::Script V$VERSION";
124
125 my $broadcastCmd = 'ping ';
126
127 if ($ARCHITECTURE eq 'solaris') {
128   $broadcastCmd .= '-s ';
129 } else {
130   $broadcastCmd .= '-b ';
131 } # if
132
133 $broadcastCmd .= "$broadcastAddress 2>&1";
134   
135 my $pid = open my $broadcast, '-|', $broadcastCmd
136   or error "Unable to do $broadcastCmd", 1;
137
138 my %hosts = discover $broadcast;
139
140 kill TERM => $pid;
141
142 close $broadcast;
143
144 my $nbrHosts = scalar keys %hosts;  
145
146 verbose_nolf "Found $nbrHosts host";
147 verbose_nolf 's' if $nbrHosts != 1;
148 verbose      " on subnet $broadcastAddress";
149
150 foreach (sort values %hosts) {
151   my $verbose = get_verbose () ? '-verbose' : '';
152   
153   my ($status, @output) = Execute "updatesystem.pl -host $_ $verbose";
154
155   error "Unable to update host $_ (Status: $status)\n"
156       . join ("\n", @output), 1
157     if $status;
158     
159   verbose join "\n", @output;
160 } # foreach
161
162 =pod
163
164 =head1 CONFIGURATION AND ENVIRONMENT
165
166 DEBUG: If set then $debug is set to this level.
167
168 VERBOSE: If set then $verbose is set to this level.
169
170 TRACE: If set then $trace is set to this level.
171
172 =head1 DEPENDENCIES
173
174 =head2 Perl Modules
175
176 L<FindBin>
177
178 L<Getop::Long|Getopt::Long>
179
180 L<Socket>
181
182 =head2 ClearSCM Perl Modules
183
184 =begin man 
185
186  Clearadm
187  Display
188  Utils
189
190 =end man
191
192 =begin html
193
194 <blockquote>
195 <a href="http://clearscm.com/php/scm_man.php?file=clearadm/lib/Clearadm.pm">Clearadm</a><br>
196 <a href="http://clearscm.com/php/scm_man.php?file=lib/Display.pm">Display</a><br>
197 <a href="http://clearscm.com/php/scm_man.php?file=lib/Utils.pm">Utils</a><br>
198 </blockquote>
199
200 =end html
201
202 =head1 BUGS AND LIMITATIONS
203
204 There are no known bugs in this script
205
206 Please report problems to Andrew DeFaria <Andrew@ClearSCM.com>.
207
208 =head1 LICENSE AND COPYRIGHT
209
210 Copyright (c) 2010, ClearSCM, Inc. All rights reserved.
211
212 =cut