From: <ap...@re...> - 2005-02-03 22:51:57
|
Author: apevec Date: 2005-02-03 23:51:30 +0100 (Thu, 03 Feb 2005) New Revision: 196 Added: tools/trunk/tools/commands/mkservice tools/trunk/tools/commands/mkservice.help tools/trunk/tools/commands/mkservice.usage Modified: tools/trunk/tools/ChangeLog tools/trunk/tools/bin/ccm tools/trunk/tools/commands/Makefile.am tools/trunk/tools/configure.in Log: added ccm mkservice for running multiple CCM instance out of CCM RPMs It creates new CCM_HOME hierarchy and initscript i.e. service. Modified: tools/trunk/tools/ChangeLog =================================================================== --- tools/trunk/tools/ChangeLog 2005-02-03 19:52:55 UTC (rev 195) +++ tools/trunk/tools/ChangeLog 2005-02-03 22:51:30 UTC (rev 196) @@ -1,10 +1,16 @@ - CCM Devel Change Log + CCM Tools Change Log ===================== +2.1.2 +----- + + * added ccm mkservice [apevec] + + Genesis ------- - * CCM Devel package created + * CCM Tools package created -- End of file Modified: tools/trunk/tools/bin/ccm =================================================================== --- tools/trunk/tools/bin/ccm 2005-02-03 19:52:55 UTC (rev 195) +++ tools/trunk/tools/bin/ccm 2005-02-03 22:51:30 UTC (rev 196) @@ -84,13 +84,14 @@ if ($command) { unless ($ARGV[0] eq "hostinit" || $ARGV[0] eq "hostinit-bundle" || + $ARGV[0] eq "mkservice" || $ARGV[0] eq "load-bundle") { CCM::Util::setuser('servlet'); } shift @ARGV; &run("$command", @other_args, @ARGV); } else { - if ($ARGV[0] eq 'load' && $^O ne 'MSWin32' && $< == 0) { + if ($ARGV[0] eq 'load' && $OS ne 'MSWin32' && $< == 0) { my $config = grep { $_ eq '--config' } @ARGV; my $data = grep { $_ eq '--data' } @ARGV; my $schema = grep { $_ eq '--schema' } @ARGV; @@ -126,7 +127,7 @@ &run('ccm-run', @other_args, "com.arsdigita.packaging.MasterTool", @ARGV); } } - } elsif ($ARGV[0] eq 'upgrade' && $^O ne 'MSWin32' && $< == 0) { + } elsif ($ARGV[0] eq 'upgrade' && $OS ne 'MSWin32' && $< == 0) { my $ccm_user_id = getpwnam('servlet'); my $runtime = new CCM::Runtime; find( sub { chown ($ccm_user_id, -1, $File::Find::name); }, Modified: tools/trunk/tools/commands/Makefile.am =================================================================== --- tools/trunk/tools/commands/Makefile.am 2005-02-03 19:52:55 UTC (rev 195) +++ tools/trunk/tools/commands/Makefile.am 2005-02-03 22:51:30 UTC (rev 196) @@ -3,13 +3,14 @@ AUTOMAKE_OPTIONS = foreign no-dependencies 1.4 commandsdir = $(pkgdatadir)/commands -commands_SCRIPTS = start stop hostinit +commands_SCRIPTS = start stop hostinit mkservice commands_DATA = *.help *.usage EXTRA_DIST = $(commands_SCRIPTS) $(commands_DATA) check-local: perl -I ../lib -c hostinit + perl -I ../lib -c mkservice perl -I ../lib -c start perl -I ../lib -c stop # End of files Added: tools/trunk/tools/commands/mkservice =================================================================== --- tools/trunk/tools/commands/mkservice 2005-02-03 19:52:55 UTC (rev 195) +++ tools/trunk/tools/commands/mkservice 2005-02-03 22:51:30 UTC (rev 196) @@ -0,0 +1,187 @@ +#!/usr/bin/perl -w + +BEGIN { + if ( exists $ENV{'CCM_TOOLS_HOME'} && defined $ENV{'CCM_TOOLS_HOME'} ) { + if ( -d "$ENV{'CCM_TOOLS_HOME'}/lib" ) { + push @INC, "$ENV{'CCM_TOOLS_HOME'}/lib"; + } else { + print "$ENV{'CCM_TOOLS_HOME'}/lib was not found\n"; + exit 1; + } + } else { + print "The CCM_TOOLS_HOME environment variable must be set first.\n"; + exit 1; + } +} + +use strict; +use CCM::CommandsUtil; +use CCM::Util; +use File::Copy; +use File::Path; +use File::Spec; +use File::stat; +use Getopt::Long; + +my $OS = $^O; +my $ROOT =File::Spec->rootdir(); +my $help = 0; +my $usage = 0; +my $verbose = 0; +my $CCM_HOME = $ARGV[0]; +my $service_name = $ARGV[1]; +my @apps; +for (my $i=2; $i <= $#ARGV; $i++) { + push @apps, $ARGV[$i]; +} + +Getopt::Long::Configure("pass_through"); +if ( ! GetOptions( + 'help' => \$help, + 'usage' => \$usage, + 'verbose+' => \$verbose + ) + ) { + CCM::CommandsUtil::printUsageAndExit(); +} + +CCM::CommandsUtil::printHelpAndExit() if $help; +CCM::CommandsUtil::printUsageAndExit() if $usage; + +if ( ! defined($CCM_HOME) + || ! defined($service_name) + || ! @apps + ) { + CCM::CommandsUtil::printUsageAndExit(); +} + +if ($OS eq 'MSWin32') { + CCM::Util::error("$OS not supported"); +} +$CCM_HOME = File::Spec->rel2abs($CCM_HOME); + +# global list of classpaths maintained by %post in ccm RPMs +my $classpath = File::Spec->catfile("$ROOT", "etc", "ccm", "ccm.classpath"); +stat($classpath) or CCM::Util::error("could not find global ccm.classpath"); + +# global list of webapps maintained by %post in ccm RPMs +my $webapps = File::Spec->catfile("$ROOT", "etc", "ccm", "ccm.webapps"); +stat($webapps) or CCM::Util::error("could not find ccm.webapps"); + +# envvars provided by ccm-tools +my $envvars = File::Spec->catfile("$ROOT", "etc", "ccm", "conf", "envvars"); +stat($envvars) or CCM::Util::error("could not find envvars"); + +# log4j.properties provided by ccm-core +my $log4j = File::Spec->catfile("$ROOT", "etc", "ccm", "conf", "log4j.properties"); +stat($log4j) or CCM::Util::error("could not find log4j.properties"); + +# ccm initscript provided by ccm-tools +my $ccminit = File::Spec->catfile("$ROOT", "etc", "rc.d", "init.d", "ccm"); +stat($ccminit) or CCM::Util::error("could not find ccm initscript"); + +# don't overwrite existing $CCM_HOME and /etc/rc.d/init.d/$service_name +my $service = File::Spec->catfile("$ROOT", "etc", "rc.d", "init.d", $service_name); +!stat($service) or CCM::Util::error("service $service already present"); +!stat($CCM_HOME) or CCM::Util::error("$CCM_HOME already present"); + +my $verbose_args = ""; +for (1..$verbose) { + $verbose_args .= " --verbose"; +} + +# create new CCM_HOME with appropriate folder structure +mkpath($CCM_HOME); +chdir $CCM_HOME; +mkdir 'conf'; +mkdir 'webapps'; +mkdir 'data'; +mkdir 'logs'; +mkdir 'tmp'; +my ($ignore, $uid, $gid); +# owner: ccmadmin +($ignore,$ignore,$uid,$gid) = getpwnam('ccmadmin') + or CCM::Util::error("ccmadmin account missing"); +chown $uid, $gid, 'conf', 'webapps'; +# copy envvars log4j.properties from /etc/ccm/conf/ to conf/ +chdir 'conf'; +copy($envvars, File::Spec->curdir()) + or CCM::Util::error("envvars copy failed"); +copy($log4j, File::Spec->curdir()) + or CCM::Util::error("log4j copy failed"); +chown $uid, $gid, 'log4j.properties'; +chdir File::Spec->updir(); + +#owner: servlet +($ignore,$ignore,$uid,$gid) = getpwnam('servlet') + or CCM::Util::error("servlet account missing"); +chown $uid, $gid, 'data', 'logs', 'tmp'; +my $templates = File::Spec->catdir('webapps','ROOT','packages','content-section','templates'); +mkpath($templates); +chown $uid, $gid, $templates; + +# copy $webapps $classpath to new CCM_HOME, filtering thru @apps +&filter($webapps, 'ccm.webapps', \@apps); +&filter($classpath, 'ccm.classpath', \@apps); + +# copy $ccminit to $service, with modifications +open DST,">$service" + or CCM::Util::error("$service create failed"); +open SRC,"<$ccminit"; +while(<SRC>) { + if (/prog=ccm/) { + print DST <<"EOF"; +prog=$service_name +CCM_HOME=$CCM_HOME +export CCM_HOME +EOF + } else { + print DST $_; + } +} +close SRC; +close DST; +chmod 0755, $service; + +print <<"EOF"; +You can now load your CCM instance "$service_name" using: +# CCM_HOME=$CCM_HOME ccm load ... +# CCM_HOME=$CCM_HOME ccm hostinit ... +Start using: +# service $service_name start +EOF + +# copy from src to dst only those lines matching one of patterns in @apps +sub filter { + my $src = shift; + my $dst = shift; + my $apps = shift; + + open DST,">$dst" + or CCM::Util::error("$dst filter copy failed"); + open SRC,"<$src"; + my %app_seen; + while(<SRC>) { + my $line = $_; + my @matches = grep($line =~ $_, @{$apps}); + my $times = scalar @matches; + if ($times > 0) { + $app_seen{$matches[0]} = 1; + print DST $line; + } + if ($times > 1) { + CCM::Util::warn("duplicate package: $matches[0]"); + } + } + close SRC; + close DST; + # check that all wanted apps are actually installed + my @apps_not_seen; + foreach (@{$apps}) { + push(@apps_not_seen, $_) unless exists $app_seen{$_}; + } + if (scalar @apps_not_seen > 0) { + CCM::Util::error("unable to locate package: $apps_not_seen[0]"); + } +} + Property changes on: tools/trunk/tools/commands/mkservice ___________________________________________________________________ Name: svn:executable + * Added: tools/trunk/tools/commands/mkservice.help =================================================================== --- tools/trunk/tools/commands/mkservice.help 2005-02-03 19:52:55 UTC (rev 195) +++ tools/trunk/tools/commands/mkservice.help 2005-02-03 22:51:30 UTC (rev 196) @@ -0,0 +1 @@ +Prepare a new CCM instance (CCM_HOME tree and initscript). Added: tools/trunk/tools/commands/mkservice.usage =================================================================== --- tools/trunk/tools/commands/mkservice.usage 2005-02-03 19:52:55 UTC (rev 195) +++ tools/trunk/tools/commands/mkservice.usage 2005-02-03 22:51:30 UTC (rev 196) @@ -0,0 +1,5 @@ +usage: mkservice [OPTIONS] instance_root_directory service_name PACKAGE-KEYS + +Options: + --help Display help + --usage Print this message Modified: tools/trunk/tools/configure.in =================================================================== --- tools/trunk/tools/configure.in 2005-02-03 19:52:55 UTC (rev 195) +++ tools/trunk/tools/configure.in 2005-02-03 22:51:30 UTC (rev 196) @@ -3,8 +3,8 @@ AC_INIT(ccm-tools.spec.in) -VERSION=2.1.1 -RELEASE=2 +VERSION=2.1.2 +RELEASE=1 AM_INIT_AUTOMAKE(ccm-tools, $VERSION) AC_SUBST(RELEASE) |