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