| 
     
      
      
      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)
 |