Removed /usr/local from CDPATH
[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 if $status;
125
126       $cmd = "chmod 777 $Clearadm::CLEAROPTS{CLEARADM_BASE}/$_";
127
128       ($status, @output) = Execute "$cmd 2>&1";
129
130       error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
131         if $status;
132     } # for
133   
134     verbose "[$Arch] Setting up clearagent daemon";
135        
136     # Symlink $CLEARADM/etc/conf.d/clearadm -> /etc/init.d
137     my $confdir = '/etc/init.d';
138
139     error "Cannot find conf.d directory ($confdir)", 1 unless -d $confdir;
140
141     unless (-e "$confdir/clearagent") {
142       $cmd = "ln -s $FindBin::Bin/etc/init.d/clearagent $confdir";
143   
144       ($status, @output) = Execute "$cmd 2>&1";
145   
146       error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
147         if $status;
148     } # unless
149
150     # Setup runlevel links
151     if ($ARCHITECTURE eq 'solaris') {
152       $cmd = "ln -s /etc/init.d/clearagent /etc/rc2.d/S90clearagent";
153
154       ($status, @output) = Execute "$cmd 2>&1";
155
156       error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
157
158       verbose 'Starting clearagent';
159     
160       $cmd = '/etc/init.d/clearagent';
161
162       ($status, @output) = Execute "$cmd 2>&1";
163   
164       error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
165     } else {
166       $cmd = 'update-rc.d clearagent defaults';
167     
168       ($status, @output) = Execute "$cmd 2>&1";
169   
170       error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
171
172       verbose 'Starting clearagent';
173     
174       $cmd = 'service clearagent start';
175   
176       error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
177         if $status;
178     } # if
179   } # if
180
181   verbose "Done";
182         
183   return;
184 } # SetupAgent
185
186 sub SetupTasks() {
187   my ($status, @output, $cmd);
188    
189   verbose 'Setting up Tasks...';
190
191   # Symlink $CLEARADM/etc/conf.d/cleartasks -> /etc/init.d
192   my $confdir = '/etc/init.d';
193
194   error "Cannot find conf.d directory ($confdir)", 1 unless -d $confdir;
195
196   unless (-e "$confdir/clearadm") {
197     $cmd = "ln -s $FindBin::Bin/etc/init.d/cleartasks $confdir";
198   
199     ($status, @output) = Execute "$cmd 2>&1";
200  
201     error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
202   } # unless
203
204   # Setup runlevel links
205   $cmd = 'update-rc.d cleartasks defaults';
206     
207   ($status, @output) = Execute "$cmd 2>&1";
208   
209   error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
210  
211   verbose 'Starting cleartasks';
212     
213   $cmd = 'service cleartasks start';
214   
215   ($status, @output) = Execute "$cmd 2>&1";
216   
217   error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
218
219   verbose 'Done';
220         
221   return;
222 } # SetupTasks
223  
224 sub SetupWeb() {
225   verbose 'Setting up Web...';
226   
227   my ($status, @output, $cmd);
228   
229   # Symlink $CLEARADM/etc/conf.d/clearadm -> /etc/apache2/conf.d
230   my $confdir = '/etc/apache2/conf.d';
231
232   error "Cannot find Apache 2 conf.d directory ($confdir)", 1 unless -d $confdir;
233
234   unless (-e "$confdir/clearadm") {
235     $cmd = "ln -s $FindBin::Bin/etc/conf.d/clearadm $confdir";
236   
237     ($status, @output) = Execute "$cmd 2>&1";
238   
239     error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
240       if $status;
241   } # unless
242     
243   if ($ARCHITECTURE eq 'cygwin') {
244     $cmd = 'net stop apache2; net start apache2';
245   } else {
246     $cmd = '/etc/init.d/apache2 restart';
247   } # if
248   
249   ($status, @output) = Execute "$cmd 2>&1";
250   
251   error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status
252     if $status;
253
254   verbose 'Done';
255   
256   return;
257 } # SetupWeb
258
259 sub SetupDatabase() {
260   verbose 'Setting up Database';
261   
262   my ($status, @output, $cmd);
263   
264   # TODO: Probably need to use -u root -p and prompt for MySQL root user's
265   # password.
266   $cmd = "mysql < $Clearadm::CLEAROPTS{CLEARADM_BASE}/etc/clearadm.sql";
267   
268   ($status, @output) = Execute "$cmd 2>&1";
269   
270   error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
271
272   verbose 'Setting up database users';
273         
274   $cmd = "mysql clearadm < $Clearadm::CLEAROPTS{CLEARADM_BASE}/etc/users.sql";
275   
276   ($status, @output) = Execute "$cmd 2>&1";
277   
278   error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
279
280   verbose 'Setting up predefined tasks';
281         
282   $cmd = "mysql clearadm < $Clearadm::CLEAROPTS{CLEARADM_BASE}/etc/load.sql";
283   
284   ($status, @output) = Execute "$cmd 2>&1";
285   
286   error "Unable to execute $cmd (Status: $status)\n" . join("\n", @output), $status if $status;
287
288   verbose 'Done';
289   
290   return;
291 } # SetupDatbase
292
293 # Main
294 error "Cannot setup Clearadm when using Windows - hint try using Cgywin", 1 
295   if $ARCHITECTURE eq 'windows';
296
297 Usage 'You must be root'
298   unless $> == 0 or $ARCHITECTURE eq 'cygwin'; 
299   
300 my $package = 'all';
301
302 GetOptions(
303   usage       => sub { Usage },
304   verbose     => sub { set_verbose },
305   debug       => sub { set_debug },
306   'package=s' => \$package,
307 ) or Usage "Invalid parameter";
308
309 Usage 'Extraneous options: ' . join ' ', @ARGV if @ARGV;
310
311 # Announce ourselves
312 verbose "$FindBin::Script V$VERSION";
313
314 my @validPackages = (
315   'all',
316   'agent',
317   'database',
318   'tasks',
319   'web',
320 );
321
322 my $lcpackage = lc $package;
323
324 unless (InArray $lcpackage, @validPackages) {
325   Usage "Invalid -package $package";
326 } # unless
327
328 if ($lcpackage eq 'all') {
329   SetupAgent;
330   SetupDatabase;
331   SetupTasks;
332   SetupWeb;
333 } elsif ($lcpackage eq 'agent') {
334   SetupAgent;
335 } elsif ($lcpackage eq 'database') {
336   SetupDatabase;
337 } elsif ($lcpackage eq 'tasks') {
338   SetupTasks;
339 } elsif ($lcpackage eq 'agent') {
340   SetupWeb;
341 } # if
342  
343 =pod