A new patch that fixes some monitoring errors using bittorrent...
Regards, -Andrea
diff -urN trunk/etc/autoinstallscript.template bittorrent/etc/autoinstallscript.template --- trunk/etc/autoinstallscript.template 2006-01-02 09:40:53.000000000 +0100 +++ bittorrent/etc/autoinstallscript.template 2006-01-02 22:24:05.000000000 +0100 @@ -216,6 +216,29 @@ if [ ! -z $MONITOR_SERVER ]; then stop_report_task 100 fi +elif [ ! -z $BITTORRENT_STAGING ]; then + bittorrent_log=/tmp/bittorrent.log + bittorrent_polling_time=30 + logmsg "Start downloading image using torrent ${IMAGENAME}.tar.torrent" + cd ${BITTORRENT_STAGING} && /usr/bin/python /usr/bin/bittorrent-console --no_start_trackerless_client --max_upload_rate 0 --display_interval 1 --bind ${IPADDR} /scripts/${IMAGENAME}.tar.torrent > $bittorrent_log & + pid=$! + while :; do + status=`grep "percent done:" $bittorrent_log | sed -ne '$p' | sed 's/percent done: *//'` + [ -z "$status" ] && status=0.0 + echo "percent done: $status %" + if [ "$status" = "100.0" ]; then + kill -9 $pid + unset bittorrent_log pid + break + fi + sleep $bittorrent_polling_time + done + unset bittorrent_polling_time + if [ ! -z $MONITOR_SERVER ]; then + stop_report_task 100 + fi + logmsg "Extracting image ${IMAGENAME}.tar ..." + cd /a/ && tar -xvf ${BITTORRENT_STAGING}/${IMAGENAME}.tar && rm -f ${BITTORRENT_STAGING}/${IMAGENAME}.tar else # Use rsync if [ $NO_LISTING ]; then diff -urN trunk/initrd_source/skel/etc/init.d/functions bittorrent/initrd_source/skel/etc/init.d/functions --- trunk/initrd_source/skel/etc/init.d/functions 2006-01-02 23:30:45.000000000 +0100 +++ bittorrent/initrd_source/skel/etc/init.d/functions 2006-01-02 23:33:48.000000000 +0100 @@ -193,6 +193,8 @@ echo "MONITOR_SERVER=$MONITOR_SERVER" >> /tmp/variables.txt echo "MONITOR_PORT=$MONITOR_PORT" >> /tmp/variables.txt echo "MONITOR_CONSOLE=$MONITOR_CONSOLE" >> /tmp/variables.txt + + echo "BITTORRENT_STAGING=$BITTORRENT_STAGING" >> /tmp/variables.txt } # ################################################################################ @@ -1418,7 +1420,11 @@ # Evaluate image size. logmsg "Evaluating image size." - IMAGESIZE=`rsync -av $IMAGESERVER::$IMAGENAME | grep "total size" | sed -e "s/total size is \([0-9]*\).*/\1/"` + if [ -z $BITTORRENT_STAGING ]; then + IMAGESIZE=`rsync -av $IMAGESERVER::$IMAGENAME | grep "total size" | sed -e "s/total size is \([0-9]*\).*/\1/"` + else + IMAGESIZE=`python /usr/bin/torrentinfo-console /scripts/$IMAGENAME.tar.torrent | sed -ne "s/file size\.*: \([0-9]*\) .*$/\1/p"` + fi IMAGESIZE=`expr $IMAGESIZE / 1024` # Evaluate disks size. diff -urN trunk/make.d/bittorrent.rul bittorrent/make.d/bittorrent.rul --- trunk/make.d/bittorrent.rul 1970-01-01 01:00:00.000000000 +0100 +++ bittorrent/make.d/bittorrent.rul 2006-01-02 09:51:18.000000000 +0100 @@ -0,0 +1,31 @@ +# +# 2005-12-28 Andrea Righi +# - Bittorrent scripts +# + + +BITTORRENT_VERSION := 4.3.4 +BITTORRENT_DIR := BitTorrent-$(BITTORRENT_VERSION) +BITTORRENT_TARBALL := BitTorrent-$(BITTORRENT_VERSION).tar.gz +BITTORRENT_URL := http://www.bittorrent.com/dl/$(BITTORRENT_TARBALL) +BITTORRENT_BINARY := $(SRC_DIR)/$(BITTORRENT_DIR)/bittorrent.py + +PHONY += bittorrent + +bittorrent: $(BITTORRENT_BINARY) + +$(BITTORRENT_BINARY): $(SRC_DIR)/$(BITTORRENT_TARBALL) + rm -rf $(SRC_DIR)/$(BITTORRENT_DIR) + cd $(SRC_DIR) && tar -xvzf $(BITTORRENT_TARBALL) + +$(SRC_DIR)/$(BITTORRENT_TARBALL): + [ -d $(SRC_DIR) ] || mkdir -p $(SRC_DIR) + $(GETSOURCE) $(BITTORRENT_URL) $(SRC_DIR) + +ALL_SOURCE += $(SRC_DIR)/$(BITTORRENT_TARBALL) + +PHONY += bittorrent_clean +bittorrent_clean: + rm -rf $(SRC_DIR)/$(BITTORRENT_DIR) + +# /* vi: set noet ts=4: */ diff -urN trunk/make.d/python.rul bittorrent/make.d/python.rul --- trunk/make.d/python.rul 1970-01-01 01:00:00.000000000 +0100 +++ bittorrent/make.d/python.rul 2006-01-02 09:48:55.000000000 +0100 @@ -0,0 +1,33 @@ +# +# 2005-12-20 Andrea Righi +# - Python interpreter +# + + +PYTHON_VERSION := 2.4.2 +PYTHON_DIR := Python-$(PYTHON_VERSION) +PYTHON_TARBALL := Python-$(PYTHON_VERSION).tar.bz2 +PYTHON_URL := http://www.python.org/ftp/python/2.4.2/$(PYTHON_TARBALL) +PYTHON_BINARY := $(SRC_DIR)/$(PYTHON_DIR)/python + +PHONY += python +python: $(PYTHON_BINARY) +$(PYTHON_BINARY): $(SRC_DIR)/$(PYTHON_TARBALL) + rm -rf $(SRC_DIR)/$(PYTHON_DIR) + cd $(SRC_DIR) && tar -xvjf $(PYTHON_TARBALL) + cd $(SRC_DIR)/$(PYTHON_DIR) && \ + ./configure --prefix=/usr --disable-shared --disable-ipv6 --disable-profiling --without-tsc --without-pymalloc --disable-toolbox-glue CFLAGS="-Os" + export CFLAGS="-Os" + $(MAKE) -C $(SRC_DIR)/$(PYTHON_DIR) CFLAGS="-Os" + +$(SRC_DIR)/$(PYTHON_TARBALL): + [ -d $(SRC_DIR) ] || mkdir -p $(SRC_DIR) + $(GETSOURCE) $(PYTHON_URL) $(SRC_DIR) + +ALL_SOURCE += $(SRC_DIR)/$(PYTHON_TARBALL) + +PHONY += python_clean +python_clean: + rm -rf $(SRC_DIR)/$(PYTHON_DIR) + +# /* vi: set noet ts=4: */ diff -urN trunk/Makefile bittorrent/Makefile --- trunk/Makefile 2006-01-02 09:40:53.000000000 +0100 +++ bittorrent/Makefile 2006-01-02 09:45:23.000000000 +0100 @@ -164,7 +164,7 @@ PXE_CONF_DEST = $(ETC)/systemimager/pxelinux.cfg BINARIES := si_mkautoinstallcd si_mkautoinstalldiskette si_mkbootmedia -SBINARIES := si_addclients si_cpimage si_getimage si_mkdhcpserver si_mkdhcpstatic si_mkautoinstallscript si_mkbootserver si_mvimage si_pushupdate si_rmimage si_mkrsyncd_conf si_mkclientnetboot si_netbootmond si_imagemanip si_mkbootpackage si_monitor si_monitortk +SBINARIES := si_addclients si_cpimage si_getimage si_mkdhcpserver si_mkdhcpstatic si_mkautoinstallscript si_mkbootserver si_mvimage si_pushupdate si_rmimage si_mkrsyncd_conf si_mkclientnetboot si_netbootmond si_imagemanip si_mkbootpackage si_monitor si_monitortk si_startbttrack CLIENT_SBINARIES := si_updateclient si_prepareclient COMMON_BINARIES = si_lsimage @@ -314,6 +314,9 @@ $(SI_INSTALL) -d -m 755 $(FLAMETHROWER_STATE_DIR) + # Install server-side BitTorrent. + cd $(SRC_DIR)/$(BITTORRENT_DIR) && $(PYTHON) setup.py install --prefix /usr + # install client-only files .PHONY: install_client install_client: install_client_man install_client_libs @@ -497,6 +500,8 @@ $(OPENSSH_BINARIES) \ $(OPENSSH_CONF_FILES) \ $(LVM_BINARY) \ + $(PYTHON_BINARY) \ + $(BITTORRENT_BINARY) \ $(SRC_DIR)/modules_build-stamp # # Put binaries in the boel_binaries_tarball... @@ -535,6 +540,12 @@ # cd $(BOEL_BINARIES_DIR)/sbin && $(foreach binary,$(shell cat $(SRC_DIR)/$(LVM_DIR)/tools/.commands),ln -s -f lvm $(binary) && ) /bin/true + # Python installation + cd $(SRC_DIR)/$(PYTHON_DIR) && export DESTDIR=$(BOEL_BINARIES_DIR) && make install + + # BitTorrent installation (refquire python-devel and python-xml packages) + cd $(SRC_DIR)/$(BITTORRENT_DIR) && $(BOEL_BINARIES_DIR)/usr/bin/python setup.py install --prefix $(PREFIX) --root $(BOEL_BINARIES_DIR) + mkdir -m 755 -p $(BOEL_BINARIES_DIR)/lib test ! -d /lib64 || mkdir -m 755 -p $(BOEL_BINARIES_DIR)/lib64 @@ -590,7 +601,7 @@ TGTLIBDIR=lib ; \ test ! -d /lib64 || TGTLIBDIR=lib64 ; \ cd $(BOEL_BINARIES_DIR) \ - && $(PYTHON) $(TOPDIR)/initrd_source/mklibs -L $(SRC_DIR)/$(PARTED_DIR)/libparted/.libs:$(SRC_DIR)/$(DISCOVER_DIR)/lib/.libs:$(SRC_DIR)/$(DEVMAPPER_DIR)/lib/ioctl:$(SRC_DIR)/$(E2FSPROGS_DIR)/lib:/lib64:/usr/lib64:/usr/kerberos/lib64:/lib:/usr/lib:/usr/kerberos/lib -v -d $$TGTLIBDIR bin/* sbin/* + && $(PYTHON) $(TOPDIR)/initrd_source/mklibs -L $(SRC_DIR)/$(PARTED_DIR)/libparted/.libs:$(SRC_DIR)/$(DISCOVER_DIR)/lib/.libs:$(SRC_DIR)/$(DEVMAPPER_DIR)/lib/ioctl:$(SRC_DIR)/$(E2FSPROGS_DIR)/lib:/lib64:/usr/lib64:/usr/kerberos/lib64:/lib:/usr/lib:/usr/kerberos/lib -v -d $$TGTLIBDIR bin/* sbin/* usr/bin/* # # Include other files required by openssh that apparently aren't # picked up by mklibs for some reason. -BEF- diff -urN trunk/sbin/si_startbttrack bittorrent/sbin/si_startbttrack --- trunk/sbin/si_startbttrack 1970-01-01 01:00:00.000000000 +0100 +++ bittorrent/sbin/si_startbttrack 2006-01-02 09:45:37.000000000 +0100 @@ -0,0 +1,139 @@ +#!/usr/bin/perl -w +# +# "SystemImager" +# +# Copyright (C) 2005 Andrea Righi <[EMAIL PROTECTED]> + +use lib "USR_PREFIX/lib/systemimager/perl"; +use strict; +use Getopt::Long; +use vars qw($config $VERSION); +use constant DEFAULT_TRACKER_PORT => 6969; + +my $VERSION = "SYSTEMIMAGER_VERSION_STRING"; +my $program_name = "si_startbttrack"; +my $version_info = << "EOF"; +$program_name (part of SystemImager) v$VERSION + +Copyright (C) 1999-2001 Andrea Righi <[EMAIL PROTECTED]> +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +EOF + +my $get_help = "\n Try \"--help\" for more options."; + +my $help_info = $version_info . <<"EOF"; + +Usage: $program_name --image_server <Hostname|IP> --image <IMAGE> + [OPTION]... + +Options: (options can be presented in any order and may be abbreviated) + --help Display this output. + + --version Display version and copyright information. + + --image_server HOSTNAME | IP + Specify the hostname or ip of the image server. + + --image IMAGENAME + Specify the name of the image to distribute. + + --tracker_port PORT Specify an optional tracker port (default 6969). + + --update_image Update image tar file. + + --quiet Run image server seeder in background. + +Download, report bugs, and make suggestions at: +http://systemimager.org/ + +EOF + +my ($help, $version, $quiet, $update_image, $image_server, $image_name, $tracker_port); +GetOptions( + "help" => \$help, + "version" => \$version, + "quiet" => \$quiet, + "update_image" => \$update_image, + "image_server=s" => \$image_server, + "tracker_port=s" => \$tracker_port, + "image=s" => \$image_name, +) or die "$help_info"; + +### BEGIN evaluate commad line options ### +if ($help) { + print "$help_info"; + exit(0); +} + +if ($version) { + print "$version_info"; + exit(0); +} + +unless ($image_server) { + die "\n$program_name: --image_server HOSTNAME | IP must be specified.\n$get_help\n\n"; +} + +unless ($image_name) { + die "\n$program_name: --image IMAGENAME must be specified.\n$get_help\n\n"; +} + +unless ($tracker_port) { + $tracker_port = DEFAULT_TRACKER_PORT; +} + +my $IMAGE_DIR = "/var/lib/systemimager/images"; +my $SCRIPTS_DIR = "/var/lib/systemimager/scripts"; + +unless (-d "$IMAGE_DIR/$image_name") { + die "\n$program_name --image $image_name: not a valid image!.\n$get_help\n\n"; +} + +# Prepare tar file. +print "Preparing tar file for $image_name...\n"; +if ($update_image) { + unlink("$IMAGE_DIR/$image_name.tar"); +} +unless (-f "$IMAGE_DIR/$image_name.tar") { + system "cd $IMAGE_DIR/$image_name && tar -cf $IMAGE_DIR/$image_name.tar ."; + if ($?) { + die "error: cannot create image tar file!\n"; + } +} +print "done.\n"; + +# Prepare torrent file. +print "Preparing torrent file for $image_name...\n"; +if ($update_image) { + unlink("$SCRIPTS_DIR/$image_name.tar.torrent"); +} +unless (-f "$SCRIPTS_DIR/$image_name.tar.torrent") { + system "maketorrent-console --target $SCRIPTS_DIR/$image_name.tar.torrent http://$image_server:$tracker_port/announce $IMAGE_DIR/$image_name.tar"; + if ($?) { + die "error: cannot create torrent file!\n"; + } +} +print "done.\n"; + +# Start tracker. +print "Starting tracker...\n"; +unlink('/tmp/dstate', '/var/log/systemimager/tracker.log'); +system "bittorrent-tracker --port $tracker_port --dfile /tmp/dstate --logfile /var/log/systemimager/tracker.log &"; +if ($?) { + die "error: cannot start tracker!\n"; +} +print "done.\n"; + +print "Starting first seeder...\n"; +if ($quiet) { + $quiet = '>/dev/null 2>&1 &'; +} else { + $quiet = ''; +} +system "cd $IMAGE_DIR && bittorrent-console --no_start_trackerless_client --max_upload_rate 0 $SCRIPTS_DIR/$image_name.tar.torrent $quiet"; +print "done.\n"; + +# Well done. +exit(0); +