# HG changeset patch # User Mahlon E. Smith # Date 1230190400 0 # Node ID b1426511fb64f58e035a70845883bc8fe46cac2c # Parent 4c51ebe6e9b6e6d2d750bf94855a4e385df1923a Merged changes from trunk@4:8. diff -r 4c51ebe6e9b6 -r b1426511fb64 README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/README Thu Dec 25 07:33:20 2008 +0000 @@ -0,0 +1,19 @@ += jparallel + +jparallel is a "parallel jail shell" written in Ruby. + +This is shell that can be used to interact with multiple FreeBSD jail instances +simultaneously. It includes a Ruby binding to the FreeBSD jail(2) functions. + +It's still under development, but in the meantime, you can check out the +current development source with Subversion from the following URL: + + svn://deveiate.org/jparallel/trunk + +The project page is also likely to have more details: + + http://deveiate.org/projects/Jparallel/ + +== License + +See the LICENSE file in the same directory for licensing details. diff -r 4c51ebe6e9b6 -r b1426511fb64 Rakefile --- a/Rakefile Tue Oct 14 16:11:19 2008 +0000 +++ b/Rakefile Thu Dec 25 07:33:20 2008 +0000 @@ -21,9 +21,10 @@ $LOAD_PATH.unshift( extdir.to_s ) unless $LOAD_PATH.include?( extdir.to_s ) } +require 'rubygems' +gem 'rake', '>= 0.8.3' require 'rbconfig' -require 'rubygems' require 'rake' require 'rake/rdoctask' require 'rake/testtask' @@ -34,26 +35,43 @@ ### Config constants BASEDIR = Pathname.new( __FILE__ ).dirname.relative_path_from( Pathname.getwd ) +BINDIR = BASEDIR + 'bin' LIBDIR = BASEDIR + 'lib' EXTDIR = BASEDIR + 'ext' DOCSDIR = BASEDIR + 'docs' PKGDIR = BASEDIR + 'pkg' +DATADIR = BASEDIR + 'data' -PKG_NAME = 'jparallel' +PROJECT_NAME = 'jparallel' +PKG_NAME = PROJECT_NAME.downcase PKG_SUMMARY = 'A "parallel jail shell" written in Ruby' + VERSION_FILE = LIBDIR + 'jparallel.rb' -PKG_VERSION = VERSION_FILE.read[ /VERSION = '(\d+\.\d+\.\d+)'/, 1 ] +if VERSION_FILE.exist? && buildrev = ENV['CC_BUILD_LABEL'] + PKG_VERSION = VERSION_FILE.read[ /VERSION\s*=\s*['"](\d+\.\d+\.\d+)['"]/, 1 ] + '.' + buildrev +elsif VERSION_FILE.exist? + PKG_VERSION = VERSION_FILE.read[ /VERSION\s*=\s*['"](\d+\.\d+\.\d+)['"]/, 1 ] +else + PKG_VERSION = '0.0.0' +end + PKG_FILE_NAME = "#{PKG_NAME.downcase}-#{PKG_VERSION}" GEM_FILE_NAME = "#{PKG_FILE_NAME}.gem" +EXTCONF = EXTDIR + 'extconf.rb' + ARTIFACTS_DIR = Pathname.new( ENV['CC_BUILD_ARTIFACTS'] || 'artifacts' ) TEXT_FILES = %w( Rakefile ChangeLog README LICENSE ).collect {|filename| BASEDIR + filename } +BIN_FILES = Pathname.glob( BINDIR + '*' ).delete_if {|item| item =~ /\.svn/ } LIB_FILES = Pathname.glob( LIBDIR + '**/*.rb' ).delete_if {|item| item =~ /\.svn/ } EXT_FILES = Pathname.glob( EXTDIR + '**/*.{c,h,rb}' ).delete_if {|item| item =~ /\.svn/ } +DATA_FILES = Pathname.glob( DATADIR + '**/*' ).delete_if {|item| item =~ /\.svn/ } SPECDIR = BASEDIR + 'spec' -SPEC_FILES = Pathname.glob( SPECDIR + '**/*_spec.rb' ).delete_if {|item| item =~ /\.svn/ } +SPECLIBDIR = SPECDIR + 'lib' +SPEC_FILES = Pathname.glob( SPECDIR + '**/*_spec.rb' ).delete_if {|item| item =~ /\.svn/ } + + Pathname.glob( SPECLIBDIR + '**/*.rb' ).delete_if {|item| item =~ /\.svn/ } TESTDIR = BASEDIR + 'tests' TEST_FILES = Pathname.glob( TESTDIR + '**/*.tests.rb' ).delete_if {|item| item =~ /\.svn/ } @@ -64,14 +82,16 @@ LOCAL_RAKEFILE = BASEDIR + 'Rakefile.local' EXTRA_PKGFILES = [] -EXTRA_PKGFILES += Pathname.glob( BASEDIR + 'examples/*.{c,rb}' ).delete_if {|item| item =~ /\.svn/ } +EXTRA_PKGFILES.concat Pathname.glob( BASEDIR + 'examples/*.{c,rb}' ).delete_if {|item| item =~ /\.svn/ } EXTRA_PKGFILES.concat Pathname.glob( BASEDIR + 'misc/monkeypatches.rb' ).delete_if {|item| item =~ /\.svn/ } RELEASE_FILES = TEXT_FILES + SPEC_FILES + TEST_FILES + + BIN_FILES + LIB_FILES + EXT_FILES + + DATA_FILES + RAKE_TASKLIBS + EXTRA_PKGFILES @@ -109,12 +129,13 @@ SNAPSHOT_GEM_NAME = "#{SNAPSHOT_PKG_NAME}.gem" # Documentation constants +RDOCDIR = DOCSDIR + 'api' RDOC_OPTIONS = [ '-w', '4', '-SHN', '-i', '.', '-m', 'README', - '-W', 'http://deveiate.org/projects/Jparallel//browser/trunk/' + '-W', 'http://deveiate.org/projects/jParallel//browser/trunk/' ] # Release constants @@ -125,7 +146,8 @@ PROJECT_HOST = 'deveiate.org' PROJECT_PUBDIR = "/usr/local/www/public/code" PROJECT_DOCDIR = "#{PROJECT_PUBDIR}/#{PKG_NAME}" -PROJECT_SCPURL = "#{PROJECT_HOST}:#{PROJECT_DOCDIR}" +PROJECT_SCPPUBURL = "#{PROJECT_HOST}:#{PROJECT_PUBDIR}" +PROJECT_SCPDOCURL = "#{PROJECT_HOST}:#{PROJECT_DOCDIR}" # Rubyforge stuff RUBYFORGE_GROUP = 'deveiate' @@ -135,9 +157,25 @@ DEPENDENCIES = { } +# Developer Gem dependencies: gemname => version +DEVELOPMENT_DEPENDENCIES = { + 'amatch' => '>= 0.2.3', + 'rake' => '>= 0.8.1', + 'rcodetools' => '>= 0.7.0.0', + 'rcov' => '>= 0', + 'RedCloth' => '>= 4.0.3', + 'rspec' => '>= 0', + 'rubyforge' => '>= 0', + 'termios' => '>= 0', + 'text-format' => '>= 1.0.0', + 'tmail' => '>= 1.2.3.1', + 'ultraviolet' => '>= 0.10.2', + 'libxml-ruby' => '>= 0.8.3', +} + # Non-gem requirements: packagename => version REQUIREMENTS = { - 'FreeBSD' => '>= 7.0', + 'FreeBSD' => '>= 5.0', } # RubyGem specification @@ -148,18 +186,23 @@ gem.summary = PKG_SUMMARY gem.description = <<-EOD This is shell that can be used to interact with multiple FreeBSD jail instances - simultaneously. It includes a Ruby binding to the FreeBSD jail(2) functions. EOD gem.authors = 'Michael Granger and Mahlon Smith' gem.email = 'ged@FaerieMUD.org, mahlon@martini.nu' - gem.homepage = 'http://deveiate.org/projects/Jparallel/' + gem.homepage = 'http://deveiate.org/projects/jParallel/' gem.rubyforge_project = RUBYFORGE_PROJECT gem.has_rdoc = true gem.rdoc_options = RDOC_OPTIONS + gem.bindir = BINDIR.relative_path_from(BASEDIR).to_s + + if EXTCONF.exist? + gem.extensions << EXTCONF.relative_path_from( BASEDIR ).to_s + end + gem.files = RELEASE_FILES. collect {|f| f.relative_path_from(BASEDIR).to_s } gem.test_files = SPEC_FILES. @@ -167,7 +210,15 @@ DEPENDENCIES.each do |name, version| version = '>= 0' if version.length.zero? - gem.add_dependency( name, version ) + gem.add_runtime_dependency( name, version ) + end + + # Developmental dependencies don't work as of RubyGems 1.2.0 + unless Gem::Version.new( Gem::RubyGemsVersion ) <= Gem::Version.new( "1.2.0" ) + DEVELOPMENT_DEPENDENCIES.each do |name, version| + version = '>= 0' if version.length.zero? + gem.add_development_dependency( name, version ) + end end REQUIREMENTS.each do |name, version| @@ -175,6 +226,9 @@ end end +# Manual-generation config +MANUALDIR = DOCSDIR + 'manual' + $trace = Rake.application.options.trace ? true : false $dryrun = Rake.application.options.dryrun ? true : false @@ -204,7 +258,10 @@ ##################################################################### ### Default task -task :default => [:clean, :spec, :rdoc, :package] +task :default => [:clean, :local, :spec, :rdoc, :package] + +### Task the local Rakefile can append to -- no-op by default +task :local ### Task: clean @@ -227,13 +284,16 @@ ### Task: cruise (Cruisecontrol task) desc "Cruisecontrol build" -task :cruise => [:clean, :spec, :package] do |task| +task :cruise => [:clean, 'spec:quiet', :package] do |task| raise "Artifacts dir not set." if ARTIFACTS_DIR.to_s.empty? - artifact_dir = ARTIFACTS_DIR.cleanpath + artifact_dir = ARTIFACTS_DIR.cleanpath + ENV['CC_BUILD_LABEL'] artifact_dir.mkpath - $stderr.puts "Copying coverage stats..." - FileUtils.cp_r( 'coverage', artifact_dir ) + coverage = BASEDIR + 'coverage' + if coverage.exist? && coverage.directory? + $stderr.puts "Copying coverage stats..." + FileUtils.cp_r( 'coverage', artifact_dir ) + end $stderr.puts "Copying packages..." FileUtils.cp_r( FileList['pkg/*'].to_a, artifact_dir ) diff -r 4c51ebe6e9b6 -r b1426511fb64 Rakefile.local --- a/Rakefile.local Tue Oct 14 16:11:19 2008 +0000 +++ b/Rakefile.local Thu Dec 25 07:33:20 2008 +0000 @@ -1,89 +1,62 @@ +#!rake + #!rake -begin - require 'mkrf' -rescue LoadError => err - unless Object.const_defined?( :Gem ) - require 'rubygems' - retry - end - - fail "You need to have the mkrf library installed to build this." -end - - # C extension constants -EXT_RAKEFILE = EXTDIR + 'Rakefile' -EXT_SO = EXTDIR + "redleaf_ext.#{CONFIG['DLEXT']}" - -ADDITIONAL_INCLUDE_DIRS = %w[ - /usr/local/include - /opt/include - /opt/local/include -] - -# Additional (auto-generated) spec constants -SPEC_RAKEFILE = SPECDIR + 'Rakefile' +EXT_MAKEFILE = EXTDIR + 'Makefile' +EXT_SOURCES = FileList[ EXTDIR + '*.c' ] +EXT_SO = EXTDIR + "bsdjail.#{CONFIG['DLEXT']}" ##################################################################### ### T A S K S ##################################################################### -# task :local => [ :build, :build_specs ] -task :local => [ :build ] -task :spec => [ :build ] +# Make both the default task and the spec task depend on building the extension +task :local => :build +task :spec => :build +namespace :spec do + task :doc => [ :build ] + task :quiet => [ :build ] + task :html => [ :build ] + task :text => [ :build ] +end -desc "Make the Rakefile for the C extension" -file EXT_RAKEFILE.to_s => FileList[ 'Rakefile', EXTDIR + '*.c' ] do - require 'misc/monkeypatches' # Fix Mkrf's output - +desc "Make the Makefile for the C extension" +file EXT_MAKEFILE.to_s => EXT_SOURCES do log "Configuring bsdjail C extension" - Dir.chdir( EXTDIR ) do - Mkrf::Generator.new( 'bsdjail', FileList['*.c'] ) do |gen| - trace "Setting CFLAGS" - gen.cflags << ' -Wall' - gen.cflags << ' -DDEBUG' - - # Make sure we have the ODE library and header available - trace "checking for sys/param.h" - gen.include_header( "sys/param.h" ) or - fail "Can't find the sys/param.h header." - - trace "checking for sys/jail.h" - gen.include_header( "sys/jail.h" ) or - fail "Can't find the sys/jail.h header." - - gen.include_library( "c", "jail_attach" ) or - fail "Can't find jail_attach in the stdlib." - end + in_subdirectory( EXTDIR ) do + ruby 'extconf.rb' end end -CLOBBER.include( EXTDIR + 'mkrf.log' ) - +CLOBBER.include( EXTDIR + 'mkmf.log', EXT_SO ) desc "Build the C extension" -task :build => EXT_RAKEFILE.to_s do - Dir.chdir( EXTDIR ) do - sh 'rake' +task :build => [ EXT_MAKEFILE.to_s, *EXT_SOURCES ] do + in_subdirectory( EXTDIR ) do + sh 'make' end end +desc "Rebuild the C extension" +task :rebuild => [ :clean, :build ] + + task :clean do - if EXT_RAKEFILE.exist? - Dir.chdir( EXTDIR ) do - sh 'rake', 'clean' + if EXT_MAKEFILE.exist? + in_subdirectory( EXTDIR ) do + sh 'make clean' end end end task :clobber do - if EXT_RAKEFILE.exist? - Dir.chdir( EXTDIR ) do - sh 'rake', 'clobber' + if EXT_MAKEFILE.exist? + in_subdirectory( EXTDIR ) do + sh 'make distclean' end end end -CLOBBER.include( EXT_RAKEFILE ) +CLOBBER.include( EXT_MAKEFILE ) diff -r 4c51ebe6e9b6 -r b1426511fb64 examples/startjail.rb diff -r 4c51ebe6e9b6 -r b1426511fb64 ext/bsdjail.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ext/bsdjail.h Thu Dec 25 07:33:20 2008 +0000 @@ -0,0 +1,74 @@ +/* + * bsdjail.h - Header for the bsdjail extension + * $Id$ + * + * Authors: + * * Michael Granger + * * Mahlon E. Smith + * + * Copyright (c) 2008, Michael Granger and Mahlon Smith + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of the author/s, nor the names of the project's + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _BSDJAIL_H_ +#define _BSDJAIL_H_ + + +#include +#include +#include +#include +#include + +#include +#include /* For rb_dbl2big() */ + + +/* Debugging functions/macros */ +#ifdef HAVE_STDARG_PROTOTYPES +#include +#define va_init_list(a,b) va_start(a,b) +extern void rbjail_debug(const char *fmt, ...); +#else +#include +#define va_init_list(a,b) va_start(a) +extern void rbjail_debug(fmt, va_alist); +#endif + + +/* Debugging macro */ +#if DEBUG +# define debugMsg(f) rbjail_debug f +#else /* ! DEBUG */ +# define debugMsg(f) +#endif /* DEBUG */ + + +#endif /* _BSDJAIL_H_ */ + diff -r 4c51ebe6e9b6 -r b1426511fb64 ext/extconf.rb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ext/extconf.rb Thu Dec 25 07:33:20 2008 +0000 @@ -0,0 +1,36 @@ +#!/usr/bin/env ruby + +require 'mkmf' +require 'fileutils' + +ADDITIONAL_LIBRARY_DIRS = %w[ + /usr/local/lib + /opt/lib + /opt/local/lib +] +ADDITIONAL_INCLUDE_DIRS = %w[ + /usr/local/include + /opt/include + /opt/local/include +] + +$CFLAGS << ' -Wall' << ' -ggdb' << ' -DDEBUG' + +def fail( *messages ) + $stderr.puts( *messages ) + exit( 1 ) +end + + +dir_config( 'bsdjail' ) + +have_header( 'stdio.h' ) or fail "Can't find the stdio.h header." +have_header( 'sys/param.h' ) or fail "Can't find the sys/param.h header." +have_header( 'sys/jail.h' ) or fail "Can't find the sys/jail.h header." +have_header( 'sys/types.h' ) or fail "Can't find the sys/types.h header." +have_header( 'unistd.h' ) or fail "Can't find the unistd.h header." + +have_func( "jail_attach" ) or fail "Can't find jail_attach in the stdlib." + +create_makefile( 'bsdjail' ) + diff -r 4c51ebe6e9b6 -r b1426511fb64 misc/monkeypatches.rb --- a/misc/monkeypatches.rb Tue Oct 14 16:11:19 2008 +0000 +++ b/misc/monkeypatches.rb Thu Dec 25 07:33:20 2008 +0000 @@ -42,12 +42,14 @@ task :default => EXT rule '.#{objext}' => '.#{@source_extension}' do |t| - sh "\#{CC} \#{CFLAGS} \#{INCLUDES} -c \#{t.source}" + $stderr.puts " building \#{t.name} from \#{t.source}" + sh "\#{CC} \#{CFLAGS} \#{INCLUDES} -c \#{t.source}" end desc "Build this extension" file EXT => OBJ do - sh "\#{LDSHARED} \#{LIBPATH} #{@available.ld_outfile(@extension_name)} \#{OBJ} \#{ADDITIONAL_OBJECTS} \#{LIBS} \#{LIBRUBYARG_SHARED}" + $stderr.puts " linking \#{OBJ.join(', ')} into \#{EXT}" + sh "\#{LDSHARED} \#{LIBPATH} #{@available.ld_outfile(@extension_name)} \#{OBJ} \#{ADDITIONAL_OBJECTS} \#{LIBS} \#{LIBRUBYARG_SHARED}" end @@ -55,7 +57,7 @@ desc "Install this extension" task :install => [EXT, RUBYARCHDIR] do - install EXT, RUBYARCHDIR, :verbose => true + install EXT, RUBYARCHDIR, :verbose => true end #{additional_code} diff -r 4c51ebe6e9b6 -r b1426511fb64 project.yml --- a/project.yml Tue Oct 14 16:11:19 2008 +0000 +++ b/project.yml Thu Dec 25 07:33:20 2008 +0000 @@ -7,11 +7,14 @@ simultaneously. It includes a Ruby binding to the FreeBSD jail(2) functions. rubyforge_group: deveiate author_name: Michael Granger and Mahlon Smith -project_homepage: http://deveiate.org/projects/Jparallel/ +project_homepage: http://deveiate.org/projects/jParallel/ project_dependencies: {} project_summary: A "parallel jail shell" written in Ruby project_name: jparallel +version_file: "jparallel.rb" additional_pkgfiles: - examples/*.{c,rb} +dev_dependencies: {} + author_email: ged@FaerieMUD.org, mahlon@martini.nu