Hi all,

I've been very busy in these last days, so my reply comes only now...

Beside all, I've added some minor fixes and improvements in my
bittorrent patch (attached), in particular I moved to the version 4.4.0,
which seems to offer very better performances compared with the previous
release. I did also additional tests comparing performances between
libbt (using btget) and the standard python client. Results on a single
client are followings:

- btget (libbt): max bandwidth 1.6MB/s, average 1.1MB/s
- BitTorrent client (freezed python scripts): max bandwidth 4.9 MB/s,
average 4.3MB/s

These values are reported directly by the bittorrent client on the image
server, si_monitortk statistics differ for about a 10%, since it
considers the blocks written to the disk to evaluate the transfer
bandwidth and obviously there is a little overhead in space from the
real bytes transmitted.

As I said I got the values installing a single client, so they are not
so meaningful... I hope in the next week I'll be able to repeat my tests
with 6-7 clients... and so I hope I'll be able to give meaningful results...

Moreover looking at some bittorrent papers it seems that there are not
any improvements in synchronizing the clients installation (I mean to
synchronize the image download from all clients). So IMO there are no
meaninful advantages integrating the bittorrent  ransport in
flametrhrower. Do you see any other advantages other than performances?
otherwise I think it'll be better to use bittorrent as a standalone
transport (like rsync), since in this way it'll be easier for a user to
configure and setup the bittorrent stuff, in fact flamethrower needs a
lot of preparations and setups to be used...

Best regards,
-Andrea

Index: patches/bittorrent.freezehack.patch
===================================================================
--- patches/bittorrent.freezehack.patch (revision 0)
+++ patches/bittorrent.freezehack.patch (revision 0)
@@ -0,0 +1,125 @@
+--- bittorrent-console.py.orig 2006-01-08 18:44:54.374123448 +0100
++++ bittorrent-console.py      2006-01-08 18:46:56.425568808 +0100
+@@ -14,6 +14,122 @@
+ 
+ from __future__ import division
+ 
++try:
++    import re
++    import encodings
++    import encodings.ascii
++    import encodings.base64_codec
++    import encodings.big5hkscs
++    import encodings.big5
++    import encodings.bz2_codec
++    import encodings.charmap
++    import encodings.cp037
++    import encodings.cp1006
++    import encodings.cp1026
++    import encodings.cp1140
++    import encodings.cp1250
++    import encodings.cp1251
++    import encodings.cp1252
++    import encodings.cp1253
++    import encodings.cp1254
++    import encodings.cp1255
++    import encodings.cp1256
++    import encodings.cp1257
++    import encodings.cp1258
++    import encodings.cp424
++    import encodings.cp437
++    import encodings.cp500
++    import encodings.cp737
++    import encodings.cp775
++    import encodings.cp850
++    import encodings.cp852
++    import encodings.cp855
++    import encodings.cp856
++    import encodings.cp857
++    import encodings.cp860
++    import encodings.cp861
++    import encodings.cp862
++    import encodings.cp863
++    import encodings.cp864
++    import encodings.cp865
++    import encodings.cp866
++    import encodings.cp869
++    import encodings.cp874
++    import encodings.cp875
++    import encodings.cp932
++    import encodings.cp949
++    import encodings.cp950
++    import encodings.euc_jis_2004
++    import encodings.euc_jisx0213
++    import encodings.euc_jp
++    import encodings.euc_kr
++    import encodings.gb18030
++    import encodings.gb2312
++    import encodings.gbk
++    import encodings.hex_codec
++    import encodings.hp_roman8
++    import encodings.hz
++    import encodings.idna
++    import encodings.iso2022_jp_1
++    import encodings.iso2022_jp_2004
++    import encodings.iso2022_jp_2
++    import encodings.iso2022_jp_3
++    import encodings.iso2022_jp_ext
++    import encodings.iso2022_jp
++    import encodings.iso2022_kr
++    import encodings.iso8859_10
++    import encodings.iso8859_11
++    import encodings.iso8859_13
++    import encodings.iso8859_14
++    import encodings.iso8859_15
++    import encodings.iso8859_16
++    import encodings.iso8859_1
++    import encodings.iso8859_2
++    import encodings.iso8859_3
++    import encodings.iso8859_4
++    import encodings.iso8859_5
++    import encodings.iso8859_6
++    import encodings.iso8859_7
++    import encodings.iso8859_8
++    import encodings.iso8859_9
++    import encodings.johab
++    import encodings.koi8_r
++    import encodings.koi8_u
++    import encodings.latin_1
++    import encodings.mac_cyrillic
++    import encodings.mac_greek
++    import encodings.mac_iceland
++    import encodings.mac_latin2
++    import encodings.mac_roman
++    import encodings.mac_turkish
++    import encodings.mbcs
++    import encodings.palmos
++    import encodings.ptcp154
++    import encodings.punycode
++    import encodings.quopri_codec
++    import encodings.raw_unicode_escape
++    import encodings.rot_13
++    import encodings.shift_jis_2004
++    import encodings.shift_jis
++    import encodings.shift_jisx0213
++    import encodings.string_escape
++    import encodings.tis_620
++    import encodings.undefined
++    import encodings.unicode_escape
++    import encodings.unicode_internal
++    import encodings.utf_16_be
++    import encodings.utf_16_le
++    import encodings.utf_16
++    import encodings.utf_7
++    import encodings.utf_8
++    import encodings.uu_codec
++    import encodings.zlib_codec
++    import cStringIO
++    import gc
++    import xml.dom
++except:
++    pass
++
+ from BitTorrent.platform import install_translation
+ install_translation()
+ 
Index: sbin/si_installbtimage
===================================================================
--- sbin/si_installbtimage      (revision 0)
+++ sbin/si_installbtimage      (revision 0)
@@ -0,0 +1,299 @@
+#!/usr/bin/perl -w
+#
+#  "SystemImager"
+#
+#  Copyright (C) 2005 Andrea Righi <[EMAIL PROTECTED]>
+
+use lib "USR_PREFIX/lib/systemimager/perl";
+use strict;
+use POSIX;
+use Getopt::Long;
+use SystemImager::Config;
+use vars qw($config $VERSION);
+
+my $config_dir = "/etc/systemimager";
+
+my $VERSION = "SYSTEMIMAGER_VERSION_STRING";
+my $program_name = "si_installbtimage";
+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 --images IMAGE1,IMAGE2,...IMAGEn [OPTION]...
+
+Options: (options can be presented in any order and may be abbreviated)
+ --help                 Display this output.
+
+ --version              Display version and copyright information.
+
+ --images IMAGE1,IMAGE2,...,IMAGEn
+                        Specify a comma separated list of the images to
+                        distribute.
+
+ --update               Update images tar file.
+
+ --compress             Compress the image tar file with gzip.
+                        (Default: don't compress)
+
+ --quiet                Run image server seeder in background.
+
+Download, report bugs, and make suggestions at:
+http://systemimager.org/
+
+EOF
+
+my ($help, $version, $quiet, $compress, $update, $images);
+GetOptions(
+    "help"      => \$help,
+    "version"   => \$version,
+    "quiet"     => \$quiet,
+    "compress"  => \$compress,
+    "update"    => \$update,
+    "images=s"  => \$images,
+) or die "$help_info";
+
+### BEGIN evaluate commad line options ###
+if ($help) {
+    print "$help_info";
+    exit(0);
+}
+if ($version) {
+    print "$version_info";
+    exit(0);
+}
+
+# Get SystemImager directories.
+my $IMAGE_DIR = $config->default_image_dir();
+my $SCRIPTS_DIR = $config->autoinstall_script_dir();
+
+# Get tracker port and interface from the configuration file.
+my ($tracker_port, $image_server);
+my $config_file = $config_dir . '/bittorrent.conf';
+open(IN, '<', $config_file) or
+    die "error: cannot open configuration file $config_file!\n";
+while(<IN>) {
+    if (m/BT_TRACKER_PORT=([0-9]+)/) {
+        $tracker_port = $1;
+    } elsif (m/BT_INTERFACE=(.+)/) {
+        ($image_server) = (`/sbin/ifconfig $1`)[1] =~ /inet addr:(\S+)/;
+    }
+}
+unless ($tracker_port) {
+    die "error in $config_file: BT_TRACKER_PORT not specified!\n";
+}
+unless ($image_server) {
+    die "error in $config_file: BT_INTERFACE not specified or not valid!\n";
+}
+
+# Check the status of the tracker.
+my $PIDFILE='/var/run/systemimager-server-bttracker.pid';
+system "ps -p `cat $PIDFILE 2>/dev/null` >/dev/null 2>&1";
+if ($?) {
+    print "error: systemimager tracker seems to be down...\n" .
+        "Try with:\n" .
+        "\t# /etc/init.d/systemimager-server-bittorrent restart\n";
+    exit(1);
+}
+
+# Check to use tarball or tar.gz.
+if ($compress) {
+    $compress = 'z';
+} else {
+    $compress = '';
+}
+
+# Prepare all images for seeding.
+foreach my $image_name (split(',', $images)) {
+    unless (-d "$IMAGE_DIR/$image_name") {
+        print "warning: \"$image_name\" is not a valid image!\n";
+        next;
+    }
+
+    # Create the tarball of the image.
+    my $tarball_file;
+    print "Preparing tar file for $image_name...\n";
+    if ($update) {
+        unlink("$IMAGE_DIR/$image_name.tar", "$IMAGE_DIR/$image_name.tar.gz");
+    }
+    if ($compress eq 'z') {
+        unlink ("$IMAGE_DIR/$image_name.tar")
+            if (-f "$IMAGE_DIR/$image_name.tar");
+        $tarball_file = "$IMAGE_DIR/$image_name.tar.gz"
+    } else {
+        unlink ("$IMAGE_DIR/$image_name.tar.gz")
+            if (-f "$IMAGE_DIR/$image_name.tar.gz");
+        $tarball_file = "$IMAGE_DIR/$image_name.tar"
+    }
+    unless (-f "$tarball_file") {
+        system "cd $IMAGE_DIR/$image_name && tar -c${compress}f $tarball_file 
.";
+        if ($?) {
+            die "error: cannot create image tar file!\n";
+        }
+    }
+    print "done.\n";
+    
+    # Prepare torrent file.
+    my $torrent_file;
+    print "Preparing torrent file for $image_name...\n";
+    if ($update) {
+        unlink("$SCRIPTS_DIR/$image_name.tar.torrent", 
+            "$SCRIPTS_DIR/$image_name.tar.gz.torrent");
+    }
+    if ($compress eq 'z') {
+        unlink ("$SCRIPTS_DIR/$image_name.tar.torrent")
+            if (-f "$SCRIPTS_DIR/$image_name.tar.torrent");
+        $torrent_file = "$SCRIPTS_DIR/$image_name.tar.gz.torrent"
+    } else {
+        unlink ("$SCRIPTS_DIR/$image_name.tar.gz.torrent")
+            if (-f "$SCRIPTS_DIR/$image_name.tar.gz.torrent");
+        $torrent_file = "$SCRIPTS_DIR/$image_name.tar.torrent"
+    }
+    unless (-f "$torrent_file") {
+        system "maketorrent-console --target $torrent_file 
http://$image_server:$tracker_port/announce $tarball_file";
+        if ($?) {
+            die "error: cannot create torrent file!\n";
+        }
+    }
+    print "done.\n";
+}
+
+# Prepare torrent file for the BOEL binaries.
+my $ARCH = (uname())[4];
+$ARCH =~ s/i.86/i386/;
+
+my $boel_binaries = "$IMAGE_DIR/boel_binaries.tar.gz";
+print "Preparing torrent file for BOEL binaries...\n";
+# Create the symbolic link into the image directory.
+symlink($config->autoinstall_boot_dir() . '/' . $ARCH .
+    '/standard/boel_binaries.tar.gz', $boel_binaries) 
+    if (! -e $boel_binaries);
+# Make .torrent file.
+system "maketorrent-console --target $SCRIPTS_DIR/boel_binaries.tar.gz.torrent 
http://$image_server:$tracker_port/announce $boel_binaries";
+if ($?) {
+    die "error: cannot create torrent file!\n";
+}
+print "done.\n";
+
+# Starting first image seeder.
+print "Starting first image server seeder...\n";
+if ($quiet) {
+    system "cd $IMAGE_DIR && launchmany-console --no_start_trackerless_client 
--max_upload_rate 0 --rerequest_interval 1 --bind $image_server --save_in 
$IMAGE_DIR $SCRIPTS_DIR >/dev/null 2>&1 &";
+} else {
+    # Evaluate if python-curses is installed.
+    `/usr/bin/env python << EOF
+import sys, os;
+try:
+    import curses
+except:
+    sys.exit(1)
+sys.exit(0);
+EOF
+`;
+    my $bt_ui = ($?) ? 'console' : 'curses';
+    system "cd $IMAGE_DIR && launchmany-$bt_ui --no_start_trackerless_client 
--max_upload_rate 0 --rerequest_interval 1 --bind $image_server --save_in 
$IMAGE_DIR $SCRIPTS_DIR";
+}
+print "done.\n";
+
+# Well done.
+exit(0);
+
+__END__
+
+=head1 NAME
+
+si_installbtimage - systemimager bittorrent seeder
+
+=head1 SYNOPSIS
+
+si_installbtimage --images IMAGE1,IMAGE2,...IMAGEn [OPTIONS]...
+
+=head1 DESCRIPTION
+
+B<si_installbtimage> is a program that configures the image server
+to distribute an image using the bittorrent protocol as transport.
+
+Before using this program the tracker must be running on the image
+server (see B</etc/init.d/systemimager-server-bittorrent>).
+
+The program provides:
+  - to create a tarball of the whole image,
+  - to create a .torrent file associated to the tarball,
+  - to start a "first seeder" on the image server.
+
+To install a client using the bittorrent transport you must define
+in the B<BITTORRENT_STAGING=E<lt>pathE<gt>> parameter in the kernel boot
+options (see /etc/systemimager/pxelinux.cfg/syslinux.cfg for a network
+installation).
+
+If you think the clients have sufficient memory to host the whole
+image in RAM you can specify B<BITTORRENT_STAGING=/tmp> to improve
+performance.
+
+Otherwise you can choose to deploy the image tarball using the client
+disk as a staging area, for example: B<BITTORRENT_STAGING=/a/tmp>
+(where /a/ is the root of the file system of the client).
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<--help>
+
+Display a short help.
+
+=item B<--version>
+
+Display version and copyright information.
+
+=item B<--images IMAGE1,IMAGE2,...,IMAGEn>
+
+Specify a comma separated list of the images to deploy.
+
+=item B<--update>
+
+Rebuild the image tarball and the .torrent file. This option is
+needed when the image has been modified (for example by the
+B<si_getimage(8)> command or by direct changes in the image chrooted
+file system).
+
+=item B<--compress>
+
+Compress the image tar file (with gzip).
+
+=item B<--quiet>
+
+Run the "first seeder" process in background. In this way you cannot
+see the upload informations during the installtion of the clients.
+
+=head1 SEE ALSO
+
+systemimager(8), si_lsimage(8), si_getimage(8)
+
+=head1 AUTHOR
+
+Andrea Righi <[EMAIL PROTECTED]>.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2003 by Andrea Righi <[EMAIL PROTECTED]>.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+=cut
+

Property changes on: sbin/si_installbtimage
___________________________________________________________________
Name: svn:executable
   + *

Index: systemimager.spec
===================================================================
--- systemimager.spec   (revision 3409)
+++ systemimager.spec   (working copy)
@@ -54,7 +54,7 @@
 Packager: dann frazier <[EMAIL PROTECTED]>
 URL: http://systemimager.org/
 Distribution: System Installation Suite
-Requires: rsync >= 2.4.6, systemimager-common = %{version}, perl-AppConfig, 
dosfstools, /sbin/chkconfig, perl, perl(XML::Simple) >= 2.08
+Requires: rsync >= 2.4.6, systemimager-common = %{version}, perl-AppConfig, 
dosfstools, /sbin/chkconfig, perl, perl(XML::Simple) >= 2.08, python
 AutoReqProv: no
 
 %description server
@@ -181,6 +181,7 @@
 URL: http://systemimager.org/
 Distribution: System Installation Suite
 Obsoletes: systemimager-%{_build_arch}boot
+BuildRequires: python, python-devel, python-xml
 Requires: systemimager-server >= %{version}
 AutoReqProv: no
 
@@ -214,6 +215,7 @@
 URL: http://systemimager.org/
 Distribution: System Installation Suite
 Obsoletes: systemimager-%{_build_arch}initrd_template
+BuildRequires: python, python-devel, python-xml
 Requires: systemimager-client >= %{version}
 AutoReqProv: no
 
Index: initrd_source/make.d/cx_freeze.rul
===================================================================
--- initrd_source/make.d/cx_freeze.rul  (revision 0)
+++ initrd_source/make.d/cx_freeze.rul  (revision 0)
@@ -0,0 +1,34 @@
+#
+#      2005-12-28 Andrea Righi
+#      - Tool to freeze python script into binary
+#
+
+
+CX_FREEZE_VERSION       := 3.0.2
+CX_FREEZE_DIR           := cx_Freeze-$(CX_FREEZE_VERSION)
+CX_FREEZE_TARBALL       := cx_Freeze-$(CX_FREEZE_VERSION)-source.tgz
+CX_FREEZE_URL           := 
http://switch.dl.sourceforge.net/sourceforge/cx-freeze/$(CX_FREEZE_TARBALL)
+#CX_FREEZE_URL          := 
http://download.systemimager.org/pub/cx-freeze/$(CX_FREEZE_TARBALL)
+CX_FREEZE_BINARY        := $(INITRD_SRC_DIR)/$(CX_FREEZE_DIR)/FreezePython
+
+PHONY += cx_freeze
+
+cx_freeze:  $(CX_FREEZE_BINARY)
+
+$(CX_FREEZE_BINARY): $(INITRD_SRC_DIR)/$(CX_FREEZE_TARBALL)
+       rm -rf $(INITRD_SRC_DIR)/$(CX_FREEZE_DIR)
+       cd $(INITRD_SRC_DIR) && tar -xvzf $(CX_FREEZE_TARBALL)
+       cd $(INITRD_SRC_DIR)/$(CX_FREEZE_DIR) && $(PYTHON) MakeFrozenBases.py 
&& \
+               $(PYTHON) FreezePython.py --no-copy-deps FreezePython.py
+
+$(INITRD_SRC_DIR)/$(CX_FREEZE_TARBALL):
+       [ -d $(INITRD_SRC_DIR) ] || mkdir -p $(INITRD_SRC_DIR)
+       $(GETSOURCE) $(CX_FREEZE_URL) $(INITRD_SRC_DIR)
+
+ALL_SOURCE += $(INITRD_SRC_DIR)/$(CX_FREEZE_TARBALL)
+
+PHONY += cx_freeze_clean
+cx_freeze_clean:
+       rm -rf $(INITRD_SRC_DIR)/$(CX_FREEZE_DIR)
+
+# /* vi: set noet ts=4: */
Index: initrd_source/make.d/bittorrent.rul
===================================================================
--- initrd_source/make.d/bittorrent.rul (revision 0)
+++ initrd_source/make.d/bittorrent.rul (revision 0)
@@ -0,0 +1,36 @@
+#
+#      2005-12-28 Andrea Righi
+#      - Bittorrent binaries
+#
+
+
+BITTORRENT_VERSION      := 4.4.0
+BITTORRENT_DIR          := BitTorrent-$(BITTORRENT_VERSION)
+BITTORRENT_TARBALL      := BitTorrent-$(BITTORRENT_VERSION).tar.gz
+BITTORRENT_URL          := http://www.bittorrent.com/dl/$(BITTORRENT_TARBALL)
+#BITTORRENT_URL          := 
http://download.systemimager.org/pub/bittorrent/$(BITTORRENT_TARBALL)
+BITTORRENT_BINARY       := $(INITRD_SRC_DIR)/$(BITTORRENT_DIR)/bittorrent.py
+BITTORRENT_PATCHES      := $(shell ls $(PATCH_DIR)/bittorrent.*.patch 
2>/dev/null | sort)
+
+
+PHONY += bittorrent
+
+bittorrent:  $(BITTORRENT_BINARY)
+
+$(BITTORRENT_BINARY): $(INITRD_SRC_DIR)/$(BITTORRENT_TARBALL)
+       rm -rf $(INITRD_SRC_DIR)/$(BITTORRENT_DIR)
+       cd $(INITRD_SRC_DIR) && tar -xvzf $(BITTORRENT_TARBALL)
+       cd $(INITRD_SRC_DIR)/$(BITTORRENT_DIR) && \
+               patch -p0 < $(BITTORRENT_PATCHES)
+
+$(INITRD_SRC_DIR)/$(BITTORRENT_TARBALL):
+       [ -d $(INITRD_SRC_DIR) ] || mkdir -p $(INITRD_SRC_DIR)
+       $(GETSOURCE) $(BITTORRENT_URL) $(INITRD_SRC_DIR)
+
+ALL_SOURCE += $(INITRD_SRC_DIR)/$(BITTORRENT_TARBALL)
+
+PHONY += bittorrent_clean
+bittorrent_clean:
+       rm -rf $(INITRD_SRC_DIR)/$(BITTORRENT_DIR)
+
+# /* vi: set noet ts=4: */
Index: initrd_source/initrd.rul
===================================================================
--- initrd_source/initrd.rul    (revision 3409)
+++ initrd_source/initrd.rul    (working copy)
@@ -116,6 +116,8 @@
                                                                
$(UCLIBC_TARGET) \
                                                                
$(INSMOD_BINARY) \
                                                                
$(MODPROBE_BINARY) \
+                                                               
$(BITTORRENT_BINARY) \
+                                                               
$(CX_FREEZE_BINARY) \
                                                                
$(UDPCAST_BINARY)
        # Create directory structure.
        rm -fr $(INITRD_BUILD_DIR)
@@ -138,7 +140,16 @@
        cp -a $(DHCLIENT_BINARY)    $(INITRD_BUILD_DIR)/sbin
        cp -a $(RSYNC_BINARY)       $(INITRD_BUILD_DIR)/bin
        cp -a $(UDPCAST_BINARY)     $(INITRD_BUILD_DIR)/bin
-       
+
+       # Bittorrent installation.
+       $(CX_FREEZE_BINARY) --install-dir=$(INITRD_BUILD_DIR)/lib/bittorrent 
--exclude-modules=gobject,pango,gtk 
$(INITRD_SRC_DIR)/$(BITTORRENT_DIR)/torrentinfo-console.py
+       $(CX_FREEZE_BINARY) --install-dir=$(INITRD_BUILD_DIR)/lib/bittorrent 
--exclude-modules=gobject,pango,gtk 
$(INITRD_SRC_DIR)/$(BITTORRENT_DIR)/bittorrent-console.py
+
+       # Explicit copy shared libraries needed by bittorrent binaries.
+       ( for l in $$(ldd $(INITRD_BUILD_DIR)/lib/bittorrent/* 2>/dev/null | 
sed -ne 's/.*=> \(.*\) (.*)/\1/p' | sort -u); do cp -pf $$l 
$(INITRD_BUILD_DIR)/lib; done )
+       # Make sure the dynamic linker is present.
+       (for l in $$(readelf --program-headers 
$(INITRD_BUILD_DIR)/lib/bittorrent/* | sed -ne 's/^.*\[Requesting program 
interpreter: \(.*\)\]$$/\1/p' | sort -u); do cp -pf $$l 
$(INITRD_BUILD_DIR)/lib; done )
+
 ifdef  INSMOD_BINARY
        ( [ ! -e $(INITRD_BUILD_DIR)/sbin/insmod ] && \
           cp -a $(INSMOD_BINARY) $(INITRD_BUILD_DIR)/sbin/insmod ) || \
@@ -179,6 +190,10 @@
        strip $(INITRD_BUILD_DIR)/usr/bin/*
        strip $(INITRD_BUILD_DIR)/usr/sbin/*
 
+       # Create the bittorrent links.
+       cd $(INITRD_BUILD_DIR)/bin && ln -s 
../lib/bittorrent/torrentinfo-console
+       cd $(INITRD_BUILD_DIR)/bin && ln -s ../lib/bittorrent/bittorrent-console
+
        # Copy over text files from the skel directory.
        cp -a $(INITRD_DIR)/skel/* $(INITRD_BUILD_DIR)
 
@@ -200,8 +215,8 @@
        cp -a $(INITRD_DIR)/my_modules $(INITRD_BUILD_DIR)
 
        # Clear out CVS cruft.
-       find $(INITRD_BUILD_DIR) -type d -name CVS -depth | xargs rm -rf
-       find $(INITRD_BUILD_DIR) -type d -name .svn -depth | xargs rm -rf
+       find $(INITRD_BUILD_DIR) -depth -type d -name CVS | xargs rm -rf
+       find $(INITRD_BUILD_DIR) -depth -type d -name .svn | xargs rm -rf
        mkdir $(INITRD_BUILD_DIR)/new_root
 
        touch $(INITRD_DIR)/build_dir-stamp
Index: initrd_source/skel/etc/init.d/rcS
===================================================================
--- initrd_source/skel/etc/init.d/rcS   (revision 3409)
+++ initrd_source/skel/etc/init.d/rcS   (working copy)
@@ -82,13 +82,13 @@
     get_flamethrower_directory
 fi
 
+get_scripts_directory
+
 get_boel_binaries_tarball
 beep
 
 tmpfs_watcher
 
-get_scripts_directory
-
 autodetect_hardware_and_load_modules
 
 if [ ! -z $SSH_DOWNLOAD_URL ]; then
Index: initrd_source/skel/etc/init.d/functions
===================================================================
--- initrd_source/skel/etc/init.d/functions     (revision 3409)
+++ initrd_source/skel/etc/init.d/functions     (working copy)
@@ -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
 }
 #
 
################################################################################
@@ -516,6 +518,44 @@
         logmsg "$CMD"
         $CMD || shellout
 
+    elif [ ! -z $BITTORRENT_STAGING ]; then
+
+        # Bittorrent log file
+        bittorrent_log=/tmp/bittorrent.log
+        # Time to poll bittorrent events
+        bittorrent_polling_time=30
+        # Minimum upload rate threshold (KB/s), if lesser stop seeding
+        bittorrent_upload_min=5
+        # Download BOEL binaries from peers
+        bittorrent_tarball="boel_binaries.tar.gz"
+        logmsg "Start downloading ${bittorrent_tarball} using bitorrent"
+        logmsg ""
+        logmsg "--> INFO: remember to run si_installbtimage on the image 
server!"
+        logmsg ""
+        cd ${BOEL_BINARIES_DIR} && bittorrent-console 
--no_start_trackerless_client --max_upload_rate 0 --display_interval 1 
--rerequest_interval 1 --bind ${IPADDR} /scripts/${bittorrent_tarball}.torrent 
> $bittorrent_log &
+        pid=$!
+        while :; do
+            status=`grep 'percent done:' $bittorrent_log | sed -ne '$p' | sed 
's/percent done: *//'`
+            [ -z "$status" ] && status=0.0
+            logmsg "percent done: $status %"
+            if [ "$status" = "100.0" ]; then
+                # Sleep until upload rate reaches the minimum threshold
+                while :; do
+                    sleep $bittorrent_polling_time
+                    upload_rate=`grep 'upload rate:' $bittorrent_log | sed -ne 
'$p' | sed 's/upload rate: *\([0-9]*\)\.[0-9]* .*$/\1/'`
+                    logmsg "upload rate: $upload_rate KB/s"
+                    [ $upload_rate -lt $bittorrent_upload_min ] && break
+                done
+                logmsg "Stop seeding"
+                kill -9 $pid
+                unset bittorrent_log pid upload_rate
+                break
+            fi
+            sleep $bittorrent_polling_time
+        done
+        unset bittorrent_polling_time
+        unset bittorrent_tarball
+
     elif [ ! -z $FLAMETHROWER_DIRECTORY_PORTBASE ]; then
 
         MODULE_NAME="boot-${ARCH}-${FLAVOR}"
@@ -1423,7 +1463,19 @@
 
     # 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
+        if [ -f "/scripts/$IMAGENAME.tar.torrent" ]; then
+            torrent_file="/scripts/$IMAGENAME.tar.torrent"
+        elif [ -f "/scripts/$IMAGENAME.tar.gz.torrent" ]; then
+            torrent_file="/scripts/$IMAGENAME.tar.gz.torrent"
+        else
+            logmsg "error: cannot find a valid torrent file for image 
${IMAGENAME}"
+            shellout
+        fi
+        IMAGESIZE=`torrentinfo-console $torrent_file | sed -ne "s/file 
size\.*: \([0-9]*\) .*$/\1/p"`
+    fi
     IMAGESIZE=`expr $IMAGESIZE / 1024`
 
     # Evaluate disks size.
Index: etc/bittorrent.conf
===================================================================
--- etc/bittorrent.conf (revision 0)
+++ etc/bittorrent.conf (revision 0)
@@ -0,0 +1,19 @@
+#
+# "SystemImager"
+#
+#  Copyright (C) 2006 Andrea Righi <[EMAIL PROTECTED]>
+#
+#  $Id$
+#
+
+# The bittorrent tracker port.
+BT_TRACKER_PORT=6969
+
+# Tracker state file.
+BT_TRACKER_STATE=/tmp/dstate
+
+# Tracker log file.
+BT_TRACKER_LOG=/var/log/systemimager/bittorrent-tracker.log
+
+# Interface used to seed files with bittorrent.
+BT_INTERFACE=eth0
Index: etc/init.d/systemimager-server-bittorrent
===================================================================
--- etc/init.d/systemimager-server-bittorrent   (revision 0)
+++ etc/init.d/systemimager-server-bittorrent   (revision 0)
@@ -0,0 +1,81 @@
+#!/bin/sh
+#
+#   "SystemImager"
+#
+#   Copyright (C) 2005 Andrea Righi
+#
+# Support for IRIX style chkconfig:
+# chkconfig:   2345 20 20
+# description: The SystemImager tracker daemon.
+#
+#
+# Support for LSB compliant init system:
+### BEGIN INIT INFO
+# Provides: systemimager
+# Required-Start: $network
+# Required-Stop:
+# Default-Start:  3 5
+# Default-Stop:   0 1 2 6
+# Short-Description: SystemImager's tracker daemon.
+# Description: This daemon is needed to image clients using the
+#              bittorrent protocol as transport.
+#
+### END INIT INFO
+
+. /etc/systemimager/bittorrent.conf
+
+PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin:
+PIDFILE=/var/run/systemimager-server-bttracker.pid
+
+# Check configuration 
+[ -z $BT_TRACKER_PORT ] &&
+    echo "error in /etc/systemimager/bittorrent.conf: BT_TRACKER_PORT not 
specified!" &&
+    exit 1
+[ -z $BT_TRACKER_STATE ] &&
+    echo "error in /etc/systemimager/bittorrent.conf: BT_TRACKER_STATE not 
specified!" &&
+    exit 1
+[ -z $BT_TRACKER_LOG ] &&
+    echo "error in /etc/systemimager/bittorrent.conf: BT_TRACKER_LOG not 
specified!" &&
+    exit 1
+
+case "$1" in
+  start)
+    echo -n "Starting SystemImager's tracker: systemimager-server-bttracker... 
"
+    if [ -e $PIDFILE ]; then
+        echo -e "failed.\nPID file $PIDFILE exists.  Must be already running."
+        exit 1
+    fi
+    # Remove the previous state file (if present).
+    rm -f $BT_TRACKER_STATE
+    # Start tracker in background.
+    bittorrent-tracker --port $BT_TRACKER_PORT --dfile $BT_TRACKER_STATE 
--logfile $BT_TRACKER_LOG &
+    if [ $? -ne 0 ]; then
+        echo failed.
+       exit 1
+    else
+        echo $! > $PIDFILE
+        echo ok.
+    fi
+    ;;
+  stop)
+    echo -n "Stopping SystemImager's tracker: 
systemimager-server-bittorrent... "
+    [ -f $PIDFILE ] && kill -9 `cat $PIDFILE` >/dev/null 2>&1
+    rm -f $PIDFILE
+    rm -f $BT_TRACKER_STATE
+    echo "stopped."
+    ;;
+  status)
+    echo -n "Status of SystemImager's tracker: 
systemimager-server-bittorrent... "
+    ([ -f $PIDFILE ] && ps -p `cat $PIDFILE 2>/dev/null` >/dev/null 2>&1 && 
echo running.) || echo not running.
+    ;;
+  force-reload|restart)
+    sh $0 stop
+    sh $0 start
+    ;;
+  *)
+    echo "Usage: $0 {start|stop|status|restart}"
+    exit 1
+    ;;
+esac
+
+exit 0

Property changes on: etc/init.d/systemimager-server-bittorrent
___________________________________________________________________
Name: svn:executable
   + *

Index: etc/autoinstallscript.template
===================================================================
--- etc/autoinstallscript.template      (revision 3409)
+++ etc/autoinstallscript.template      (working copy)
@@ -216,6 +216,60 @@
     if [ ! -z $MONITOR_SERVER ]; then
         stop_report_task 100
     fi
+elif [ ! -z $BITTORRENT_STAGING ]; then
+    # Bittorrent log file
+    bittorrent_log=/tmp/bittorrent.log
+    # Time to poll bittorrent events
+    bittorrent_polling_time=30
+    # Minimum upload rate threshold (KB/s), if lesser stop seeding
+    bittorrent_upload_min=5
+    # Get the right .torrent file.
+    if [ -f "/scripts/${IMAGENAME}.tar.gz.torrent" ]; then
+        bittorrent_tarball="${IMAGENAME}.tar.gz"
+        compress='z'
+    elif [ -f "/scripts/${IMAGENAME}.tar.torrent" ]; then
+        bittorrent_tarball="${IMAGENAME}.tar"
+        compress=''
+    else
+        logmsg "error: cannot find a valid torrent file for the image 
${IMAGENAME}"
+        shellout
+    fi
+
+    # Download image from peers
+    logmsg "Start downloading image using torrent 
${bittorrent_tarball}.torrent"
+    logmsg ""
+    logmsg "--> INFO: remember to run si_installbtimage on the image server!"
+    logmsg ""
+    cd ${BITTORRENT_STAGING} && bittorrent-console 
--no_start_trackerless_client --max_upload_rate 0 --display_interval 1 
--rerequest_interval 1 --bind ${IPADDR} /scripts/${bittorrent_tarball}.torrent 
> $bittorrent_log &
+    pid=$!
+    while :; do
+        status=`grep 'percent done:' $bittorrent_log | sed -ne '$p' | sed 
's/percent done: *//'`
+        [ -z "$status" ] && status=0.0
+        logmsg "percent done: $status %"
+        if [ "$status" = "100.0" ]; then
+            # Sleep until upload rate reaches the minimum threshold
+            while :; do
+                sleep $bittorrent_polling_time
+                upload_rate=`grep 'upload rate:' $bittorrent_log | sed -ne 
'$p' | sed 's/upload rate: *\([0-9\.]*\) .*$/\1/'`
+                logmsg "upload rate: $upload_rate KB/s"
+                [ `echo $upload_rate \< $bittorrent_upload_min | bc` = 1 ] && 
break
+            done
+            logmsg "Stop seeding"
+            kill -9 $pid
+            unset bittorrent_log pid upload_rate
+            break
+        fi
+        sleep $bittorrent_polling_time
+    done
+    unset bittorrent_polling_time
+    if [ ! -z $MONITOR_SERVER ]; then
+        stop_report_task 100
+    fi
+    # Extract image.
+    logmsg "Extracting image from ${bittorrent_tarball} ..."
+    (cd /a/ && tar -xv${compress}f 
${BITTORRENT_STAGING}/${bittorrent_tarball}) || shellout
+    rm -f ${BITTORRRENT_STAGING}/${bittorrent_tarball}
+    unset bittorrent_tarball
 else 
     # Use rsync 
     if [ $NO_LISTING ]; then
Index: Makefile
===================================================================
--- Makefile    (revision 3409)
+++ Makefile    (working copy)
@@ -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_installbtimage
 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 $(INITRD_SRC_DIR)/$(BITTORRENT_DIR) && $(PYTHON) setup.py install 
--prefix $(PREFIX)
+
 # install client-only files
 .PHONY:        install_client
 install_client: install_client_man install_client_libs
@@ -386,6 +389,7 @@
        $(SI_INSTALL) -d $(ETC)/systemimager
        $(SI_INSTALL) -m 644 etc/systemimager.conf $(ETC)/systemimager/
        $(SI_INSTALL) -m 644 etc/flamethrower.conf $(ETC)/systemimager/
+       $(SI_INSTALL) -m 644 etc/bittorrent.conf $(ETC)/systemimager/
        $(SI_INSTALL) -m 644 etc/autoinstallscript.template $(ETC)/systemimager/
        $(SI_INSTALL) -m 644 etc/imagemanip.conf $(ETC)/systemimager/
        $(SI_INSTALL) -m 644 etc/imagemanip.perm $(ETC)/systemimager/
@@ -402,6 +406,7 @@
        $(SI_INSTALL) -b -m 755 etc/init.d/systemimager-server-rsyncd           
        $(INITD)
        $(SI_INSTALL) -b -m 755 etc/init.d/systemimager-server-netbootmond      
        $(INITD)
        $(SI_INSTALL) -b -m 755 etc/init.d/systemimager-server-flamethrowerd    
$(INITD)
+       $(SI_INSTALL) -b -m 755 etc/init.d/systemimager-server-bittorrent       
$(INITD)
        $(SI_INSTALL) -b -m 755 etc/init.d/systemimager-server-monitord         
$(INITD)
 
 ########## END initrd ##########
@@ -591,6 +596,7 @@
        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/*
+
        #
        # Include other files required by openssh that apparently aren't 
        # picked up by mklibs for some reason. -BEF-

Reply via email to