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