Big update of Clearadm
[clearscm.git] / clearadm / setup.pl
1 #!/usr/bin/env perl
2
3 =pod
4
5 =head1 NAME $RCSfile: setup.pl,v $
6
7 Setup Clearadm
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/09 18:12:05 $
28
29 =back
30
31 =head1 SYNOPSIS
32
33  Usage setup.pl: [-u|sage] [-ve|rbose] [-deb|ug]
34                  [-package [all|agent|database|tasks|web]]
35
36  Where:
37    -u|sage:       Displays usage
38  
39    -ve|rbose:     Be verbose
40    -deb|ug:       Output debug messages
41    
42    -package:      Which subpackage to set up (Default: all). 
43
44 =head1 DESCRIPTION
45
46 This script will setup Clearadm packages on machines. You must be root
47 (or administrator on Windows) to setup packages. Setting up web package
48 configures the web server. Setting up the tasks portion sets up cleartasks
49 poriton. Cleartasks periodically runs the predefined and user defined
50 tasks and should only be set up on one machine. The agent package sets up 
51 clearagent.pl. This should be run on all machines that you intend to monitor. 
52 The database package sets up the Clearadm database.
53  
54 Default, sets up all packages on the current machine.
55
56 =cut
57
58 use strict;
59 use warnings;
60
61 use Socket;
62
63 use FindBin;
64 use Getopt::Long;
65
66 use lib "$FindBin::Bin/lib", "$FindBin::Bin/../lib";
67
68 use Clearadm;
69 use Display;
70 use OSDep;
71 use Utils;
72
73 my $VERSION  = '$Revision: 1.1 $';
74   ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
75   
76 sub SetupAgent () {
77   verbose 'Setting up Agent...';
78   
79   my ($status, @output, $cmd);
80   
81   if ($ARCHITECTURE eq 'cygwin') {
82      verbose '[Cygwin] Creating up Clearagent Service';
83      
84      $cmd  = 'cygrunsrv -I clearagent -p C:/Cygwin/bin/perl ';
85      $cmd .= '> -a "/opt/clearscm/clearadm/clearagent.pl -nodaemon"';
86      
87     ($status, @output) = Execute "$cmd 2>&1";
88   
89     error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
90       if $status;
91       
92     verbose '[Cygwin] Starting Clearagent Service';
93     
94     $cmd .= 'net start clearagent';
95     ($status, @output) = Execute "$cmd 2>&1";
96   
97     error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
98       if $status;
99   } else {
100     my $Arch = ucfirst $ARCHITECTURE;
101   
102     verbose 'Creating clearagent user';
103     
104     $cmd = 'useradd -Mr clearagent';
105     $cmd = 'useradd clearagent' if $ARCHITECTURE eq 'solaris';
106     
107     ($status, @output) = Execute "$cmd 2>&1";
108   
109     if ($status == 9) {
110        warning "The user clearagent already exists";
111     } elsif ($status == 2304) {
112       # Stupid Solaris...
113     } elsif ($status != 0) {
114       error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status;
115     } # if
116
117     verbose 'Setting permissions on log and var directories';
118
119     for (qw(var var/run log)) {
120       $cmd = "mkdir -p $Clearadm::CLEAROPTS{CLEARADM_BASE}/$_";
121
122       ($status, @output) = Execute "$cmd 2>&1";
123
124       error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
125         if $status;
126
127       $cmd = "chmod 777 $Clearadm::CLEAROPTS{CLEARADM_BASE}/$_";
128
129       ($status, @output) = Execute "$cmd 2>&1";
130
131       error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
132         if $status;
133     } # for
134   
135     verbose "[$Arch] Setting up clearagent daemon";
136        
137     # Symlink $CLEARADM/etc/conf.d/clearadm -> /etc/init.d
138     my $confdir = '/etc/init.d';
139
140     error "Cannot find conf.d directory ($confdir)", 1
141       unless -d $confdir;
142
143     unless (-e "$confdir/clearagent") {
144       $cmd = "ln -s $FindBin::Bin/etc/init.d/clearagent $confdir";
145   
146       ($status, @output) = Execute "$cmd 2>&1";
147   
148       error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
149         if $status;
150     } # unless
151
152     # Setup runlevel links
153     if ($ARCHITECTURE eq 'solaris') {
154       $cmd = "ln -s /etc/init.d/clearagent /etc/rc2.d/S90clearagent";
155
156       ($status, @output) = Execute "$cmd 2>&1";
157
158       error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
159         if $status;
160
161       verbose 'Starting clearagent';
162     
163       $cmd = '/etc/init.d/clearagent';
164
165       ($status, @output) = Execute "$cmd 2>&1";
166   
167       error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
168         if $status;
169     } else {
170       $cmd = 'update-rc.d clearagent defaults';
171     
172       ($status, @output) = Execute "$cmd 2>&1";
173   
174       error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
175         if $status;
176
177       verbose 'Starting clearagent';
178     
179       $cmd = 'service clearagent start';
180   
181       error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
182         if $status;
183     } # if
184   } # if
185
186   verbose "Done";
187         
188   return;
189 } # SetupAgent
190
191 sub SetupTasks () {
192   my ($status, @output, $cmd);
193    
194   verbose 'Setting up Tasks...';
195
196   # Symlink $CLEARADM/etc/conf.d/cleartasks -> /etc/init.d
197   my $confdir = '/etc/init.d';
198
199   error "Cannot find conf.d directory ($confdir)", 1
200     unless -d $confdir;
201
202   unless (-e "$confdir/clearadm") {
203     $cmd = "ln -s $FindBin::Bin/etc/init.d/cleartasks $confdir";
204   
205     ($status, @output) = Execute "$cmd 2>&1";
206  
207     error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
208       if $status;
209   } # unless
210
211   # Setup runlevel links
212   $cmd = 'update-rc.d cleartasks defaults';
213     
214   ($status, @output) = Execute "$cmd 2>&1";
215   
216   error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
217     if $status;
218  
219   verbose 'Starting cleartasks';
220     
221   $cmd = 'service cleartasks start';
222   
223   ($status, @output) = Execute "$cmd 2>&1";
224   
225   error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
226     if $status;
227
228   verbose 'Done';
229         
230   return;
231 } # SetupTasks
232  
233 sub SetupWeb () {
234   verbose 'Setting up Web...';
235   
236   my ($status, @output, $cmd);
237   
238   # Symlink $CLEARADM/etc/conf.d/clearadm -> /etc/apache2/conf.d
239   my $confdir = '/etc/apache2/conf.d';
240
241   error "Cannot find Apache 2 conf.d directory ($confdir)", 1
242     unless -d $confdir;
243
244   unless (-e "$confdir/clearadm") {
245     $cmd = "ln -s $FindBin::Bin/etc/conf.d/clearadm $confdir";
246   
247     ($status, @output) = Execute "$cmd 2>&1";
248   
249     error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
250       if $status;
251   } # unless
252     
253   if ($ARCHITECTURE eq 'cygwin') {
254     $cmd = 'net stop apache2; net start apache2';
255   } else {
256     $cmd = '/etc/init.d/apache2 restart';
257   } # if
258   
259   ($status, @output) = Execute "$cmd 2>&1";
260   
261   error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
262     if $status;
263
264   verbose 'Done';
265   
266   return;
267 } # SetupWeb
268
269 sub SetupDatabase () {
270   verbose 'Setting up Database';
271   
272   my ($status, @output, $cmd);
273   
274   # TODO: Probably need to use -u root -p and prompt for MySQL root user's
275   # password.
276   $cmd = "mysql < $Clearadm::CLEAROPTS{CLEARADM_BASE}/etc/clearadm.sql";
277   
278   ($status, @output) = Execute "$cmd 2>&1";
279   
280   error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
281     if $status;
282
283   verbose 'Setting up database users';
284         
285   $cmd = "mysql clearadm < $Clearadm::CLEAROPTS{CLEARADM_BASE}/etc/users.sql";
286   
287   ($status, @output) = Execute "$cmd 2>&1";
288   
289   error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
290     if $status;
291
292   verbose 'Setting up predefined tasks';
293         
294   $cmd = "mysql clearadm < $Clearadm::CLEAROPTS{CLEARADM_BASE}/etc/load.sql";
295   
296   ($status, @output) = Execute "$cmd 2>&1";
297   
298   error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
299     if $status;
300
301   verbose 'Done';
302   
303   return;
304 } # SetupDatbase
305
306 # Main
307 error "Cannot setup Clearadm when using Windows - hint try using Cgywin", 1 
308   if $ARCHITECTURE eq 'windows';
309
310 Usage 'You must be root'
311   unless $> == 0 or $ARCHITECTURE eq 'cygwin'; 
312   
313 my $package = 'all';
314
315 GetOptions (
316   usage       => sub { Usage },
317   verbose     => sub { set_verbose },
318   debug       => sub { set_debug },
319   'package=s' => \$package,
320 ) or Usage "Invalid parameter";
321
322 Usage 'Extraneous options: ' . join ' ', @ARGV
323   if @ARGV;
324
325 # Announce ourselves
326 verbose "$FindBin::Script V$VERSION";
327
328 my @validPackages = (
329   'all',
330   'agent',
331   'database',
332   'tasks',
333   'web',
334 );
335
336 my $lcpackage = lc $package;
337
338 unless (InArray $lcpackage, @validPackages) {
339   Usage "Invalid -package $package";
340 } # unless
341
342 if ($lcpackage eq 'all') {
343   SetupAgent;
344   SetupDatabase;
345   SetupTasks;
346   SetupWeb;
347 } elsif ($lcpackage eq 'agent') {
348   SetupAgent;
349 } elsif ($lcpackage eq 'database') {
350   SetupDatabase;
351 } elsif ($lcpackage eq 'tasks') {
352   SetupTasks;
353 } elsif ($lcpackage eq 'agent') {
354   SetupWeb;
355 } # if
356  
357 =pod