Move bin stuff to bin
authorMichael Spang <mspang@csclub.uwaterloo.ca>
Mon, 8 Mar 2010 00:50:07 +0000 (19:50 -0500)
committerMichael Spang <mspang@csclub.uwaterloo.ca>
Mon, 8 Mar 2010 00:50:07 +0000 (19:50 -0500)
12 files changed:
bin/csc-sync-debian [new file with mode: 0755]
bin/csc-sync-debian-cd [new file with mode: 0755]
bin/csc-sync-standard [new file with mode: 0755]
bin/make-torrents [new file with mode: 0755]
bin/report_mirror [new file with mode: 0755]
bin/ubuntu-releases-sync [new file with mode: 0755]
csc-sync-debian [deleted file]
csc-sync-debian-cd [deleted file]
csc-sync-standard [deleted file]
make-torrents [deleted file]
report_mirror [deleted file]
ubuntu-releases-sync [deleted file]

diff --git a/bin/csc-sync-debian b/bin/csc-sync-debian
new file mode 100755 (executable)
index 0000000..50f06cd
--- /dev/null
@@ -0,0 +1,246 @@
+#! /bin/bash
+
+if [[ $# < 3 ]]; then
+  echo 'Usage: sync local_dir rsync_host rsync_dir [trace_host [trace_dir]]'
+  exit 1
+fi
+
+set -e
+
+TOP_DIR=/mirror
+TO=$TOP_DIR/root/$1
+RSYNC_HOST=$2
+RSYNC_DIR=$3
+if [ $# = 4 ]; then
+    TRACE_HOST=$4
+fi
+TRACE_DIR=project/trace
+if [ $# = 5 ]; then
+    TRACE_DIR=$5
+fi
+LOGDIR=/var/log/mirror/$1_$2
+ADDRESS=129.97.134.71
+
+mkdir -p $LOGDIR
+
+# This script originates from http://www.debian.org/mirror/anonftpsync
+
+# CVS: cvs.debian.org:/cvs/webwml - webwml/english/mirror/anonftpsync
+# Version: $Id: anonftpsync,v 1.33 2007/09/12 15:19:03 joy Exp $ 
+
+# Note: You MUST have rsync 2.6.4 or newer, which is available in sarge
+# and all newer Debian releases, or at http://rsync.samba.org/
+
+# Don't forget:
+# chmod u+x anonftpsync
+
+# Set the variables below to fit your site. You can then use cron to have
+# this script run daily to automatically update your copy of the archive.
+
+# TO is the destination for the base of the Debian mirror directory
+# (the dir that holds dists/ and ls-lR).
+# (mandatory)
+
+#TO=
+
+# RSYNC_HOST is the site you have chosen from the mirrors file.
+# (http://www.debian.org/mirror/list-full)
+# (mandatory)
+
+#RSYNC_HOST=
+
+# RSYNC_DIR is the directory given in the "Packages over rsync:" line of
+# the mirrors file for the site you have chosen to mirror.
+# (mandatory)
+
+#RSYNC_DIR=
+
+# LOGDIR is the directory where the logs will be written to
+# (mandatory)
+
+#LOGDIR=
+
+# ARCH_EXCLUDE can be used to exclude a complete architecture from
+# mirrorring. Please use as space seperated list.
+# Possible values are:
+# alpha, amd64, arm, hppa, hurd-i386, i386, ia64, m68k, mipsel, mips, powerpc, s390, sh and sparc
+#
+# There is one special value: source
+# This is not an architecture but will exclude all source code in /pool
+#
+# eg.
+# ARCH_EXCLUDE="alpha arm hppa hurd-i386 ia64 m68k mipsel mips s390 sparc"
+# 
+# With a blank ARCH_EXCLUDE you will mirror all available architectures
+# (optional)
+
+# EXCLUDE is a list of parameters listing patterns that rsync will exclude, in
+# addition to the architectures excluded by ARCH_EXCLUDE.
+#
+# Use ARCH_EXCLUDE to exclude specific architectures or all sources
+#
+# --exclude stable, testing, unstable options DON'T remove the packages of
+# the given distribution. If you want do so, use debmirror instead.
+#
+# The following example would exclude mostly everything:
+#EXCLUDE="\
+#  --exclude stable/ --exclude testing/ --exclude unstable/ \
+#  --exclude source/ \
+#  --exclude *.orig.tar.gz --exclude *.diff.gz --exclude *.dsc \
+#  --exclude /contrib/ --exclude /non-free/ \
+# "
+
+# With a blank EXCLUDE you will mirror the entire archive, except the
+# architectures excluded by ARCH_EXCLUDE.
+# (optional)
+
+EXCLUDE=
+
+# LOCK_TIMEOUT is a timeout in minutes.  Defaults to 360 (6 hours).
+# This program creates a lock to ensure that only one copy
+# of it is mirroring any one archive at any one time.
+# Locks held for longer than the timeout are broken, unless
+# a running rsync process appears to be connected to $RSYNC_HOST.
+
+LOCK_TIMEOUT=360
+
+# There should be no need to edit anything below this point, unless there
+# are problems.
+
+#-----------------------------------------------------------------------------#
+
+# If you are accessing a rsync server/module which is password-protected,
+# uncomment the following lines (and edit the other file).
+
+# . ftpsync.conf
+# export RSYNC_PASSWORD
+# RSYNC_HOST=$RSYNC_USER@$RSYNC_HOST
+
+#-----------------------------------------------------------------------------#
+
+# Check for some environment variables
+if [ -z $TO ] || [ -z $RSYNC_HOST ] || [ -z $RSYNC_DIR ] || [ -z $LOGDIR ]; then
+       echo "One of the following variables seems to be empty:"
+       echo "TO, RSYNC_HOST, RSYNC_DIR or LOGDIR"
+       exit 2
+fi
+
+if ! [ -d ${TO}/${TRACE_DIR} ]; then
+       # we are running mirror script for the first time
+       umask 002
+       mkdir -p ${TO}/${TRACE_DIR}
+fi
+
+# Note: on some non-Debian systems, hostname doesn't accept -f option.
+# If that's the case on your system, make sure hostname prints the full
+# hostname, and remove the -f option. If there's no hostname command,
+# explicitly replace `hostname -f` with the hostname.
+
+HOSTNAME=`hostname -f`
+
+# The hostname must match the "Site" field written in the list of mirrors.
+# If hostname doesn't returns the correct value, fill and uncomment below 
+HOSTNAME=mirror.csclub.uwaterloo.ca
+LOCK="${TO}/Archive-Update-in-Progress-${HOSTNAME}"
+
+# The temp directory used by rsync --delay-updates is not
+# world-readable remotely. It must be excluded to avoid errors. 
+TMP_EXCLUDE="--exclude .~tmp~/"
+
+# Exclude architectures defined in $ARCH_EXCLUDE
+for ARCH in $ARCH_EXCLUDE; do
+       EXCLUDE=$EXCLUDE"\
+               --exclude binary-$ARCH/ \
+               --exclude disks-$ARCH/ \
+               --exclude installer-$ARCH/ \
+               --exclude Contents-$ARCH.gz \
+               --exclude Contents-$ARCH.diff/ \
+               --exclude arch-$ARCH.files \
+               --exclude arch-$ARCH.list.gz \
+               --exclude *_$ARCH.deb \
+               --exclude *_$ARCH.udeb "
+       if [ "$ARCH" == "source" ]; then
+               SOURCE_EXCLUDE="\
+               --exclude source/ \
+               --exclude *.tar.gz \
+               --exclude *.diff.gz \
+               --exclude *.dsc "
+       fi
+done
+
+# Logfile
+LOGFILE=$LOGDIR/mirror.log
+
+# Get in the right directory and set the umask to be group writable
+# 
+cd $HOME
+umask 002
+
+# Check to see if another sync is in progress
+if [ -f "$LOCK" ]; then
+# Note: this requires the findutils find; for other finds, adjust as necessary
+  if [ "`find $LOCK -maxdepth 1 -amin -$LOCK_TIMEOUT`" = "" ]; then
+# Note: this requires the procps ps; for other ps', adjust as necessary
+    if ps ax | grep '[r]'sync | grep -q $RSYNC_HOST; then
+      echo "stale lock found, but a rsync is still running, aiee!" >&2
+      exit 1
+    else
+      echo "stale lock found (not accessed in the last $LOCK_TIMEOUT minutes), forcing update!"
+      rm -f $LOCK
+    fi
+  else
+    echo "current lock file exists, unable to start rsync!"
+    exit 1
+  fi
+fi
+
+touch $LOCK
+# Note: on some non-Debian systems, trap doesn't accept "exit" as signal
+# specification. If that's the case on your system, try using "0".
+trap "rm -f $LOCK" exit
+
+set +e
+
+# check if we need to sync
+if [[ "$TRACE_HOST" != "" ]]; then
+    TRACE_OLD_TIME=`stat -c%Y $TO/$TRACE_DIR/$TRACE_HOST 2> /dev/null`
+    TRACE_NEW_FILE=/tmp/$RSYNC_HOST_$RSYNC_DIR_$RANDOM
+    nice rsync -tv -4 --address=$ADDRESS \
+        $RSYNC_HOST::$RSYNC_DIR/$TRACE_DIR/$TRACE_HOST \
+        $TRACE_NEW_FILE >> $LOGFILE 2>&1
+    TRACE_NEW_TIME=`stat -c%Y $TRACE_NEW_FILE`
+    rm -f $TRACE_NEW_FILE
+    if [ "$TRACE_OLD_TIME" = "$TRACE_NEW_TIME" ]; then
+        echo 'Trace file for' $RSYNC_HOST::$RSYNC_DIR \
+            'unchanged, not rsyncing.' >> $LOGFILE
+        exit 0
+    fi
+fi
+
+# First sync /pool
+nice rsync -rlHtv \
+     $TMP_EXCLUDE $EXCLUDE $SOURCE_EXCLUDE \
+     --timeout=3600 -4 --address=$ADDRESS \
+     $RSYNC_HOST::$RSYNC_DIR/pool/ $TO/pool/ >> $LOGFILE 2>&1
+result=$?
+
+if [ 0 = $result ]; then
+       # Now sync the remaining stuff
+       nice rsync -rlHtv --delay-updates --delete-after \
+            --exclude "Archive-Update-in-Progress-${HOSTNAME}" \
+            --exclude "${TRACE_DIR}/${HOSTNAME}" \
+            --timeout=3600 -4 --address=$ADDRESS \
+            $TMP_EXCLUDE $EXCLUDE $SOURCE_EXCLUDE \
+            $RSYNC_HOST::$RSYNC_DIR $TO >> $LOGFILE 2>&1
+
+       mkdir -p ${TO}/${TRACE_DIR}
+       LANG=C date -u > "${TO}/${TRACE_DIR}/${HOSTNAME}"
+else
+       echo "ERROR: Help, something weird happened" | tee -a $LOGFILE
+       echo "mirroring /pool exited with exitcode" $result | tee -a $LOGFILE
+fi
+
+savelog $LOGFILE >/dev/null
+
+rm $LOCK
diff --git a/bin/csc-sync-debian-cd b/bin/csc-sync-debian-cd
new file mode 100755 (executable)
index 0000000..11abcbc
--- /dev/null
@@ -0,0 +1,112 @@
+#! /bin/bash
+
+set -e
+
+TOP_DIR=/mirror
+TO=$TOP_DIR/root/debian-cd
+RSYNC_HOST=cdimage.debian.org
+RSYNC_DIR=debian-cd
+LOGDIR=/var/log/mirror/debian-cd_cdimage.debian.org
+ADDRESS=129.97.134.71
+
+mkdir -p $LOGDIR
+
+# LOCK_TIMEOUT is a timeout in minutes.  Defaults to 360 (6 hours).
+# This program creates a lock to ensure that only one copy
+# of it is mirroring any one archive at any one time.
+# Locks held for longer than the timeout are broken, unless
+# a running rsync process appears to be connected to $RSYNC_HOST.
+
+LOCK_TIMEOUT=360
+
+# There should be no need to edit anything below this point, unless there
+# are problems.
+
+#-----------------------------------------------------------------------------#
+
+# If you are accessing a rsync server/module which is password-protected,
+# uncomment the following lines (and edit the other file).
+
+# . ftpsync.conf
+export RSYNC_PASSWORD
+if [[ "$RSYNC_USER" != "" ]]; then
+    RSYNC_HOST=$RSYNC_USER@$RSYNC_HOST
+fi
+
+#-----------------------------------------------------------------------------#
+
+# Check for some environment variables
+if [ -z $TO ] || [ -z $RSYNC_HOST ] || [ -z $RSYNC_DIR ] || [ -z $LOGDIR ]; then
+       echo "One of the following variables seems to be empty:"
+       echo "TO, RSYNC_HOST, RSYNC_DIR or LOGDIR"
+       exit 2
+fi
+
+# Note: on some non-Debian systems, hostname doesn't accept -f option.
+# If that's the case on your system, make sure hostname prints the full
+# hostname, and remove the -f option. If there's no hostname command,
+# explicitly replace `hostname -f` with the hostname.
+
+HOSTNAME=`hostname -f`
+
+# The hostname must match the "Site" field written in the list of mirrors.
+# If hostname doesn't returns the correct value, fill and uncomment below 
+HOSTNAME=mirror.csclub.uwaterloo.ca
+LOCK="${TO}/Archive-Update-in-Progress-${HOSTNAME}"
+
+# The temp directory used by rsync --delay-updates is not
+# world-readable remotely. It must be excluded to avoid errors. 
+TMP_EXCLUDE="--exclude .~tmp~/"
+
+# Logfile
+LOGFILE=$LOGDIR/mirror.log
+
+# Get in the right directory and set the umask to be group writable
+# 
+cd $HOME
+umask 002
+
+# Check to see if another sync is in progress
+if [ -f "$LOCK" ]; then
+# Note: this requires the findutils find; for other finds, adjust as necessary
+  if [ "`find $LOCK -maxdepth 1 -amin -$LOCK_TIMEOUT`" = "" ]; then
+# Note: this requires the procps ps; for other ps', adjust as necessary
+    if ps ax | grep '[r]'sync | grep -q $RSYNC_HOST; then
+      echo "stale lock found, but a rsync is still running, aiee!" >&2
+      exit 1
+    else
+      echo "stale lock found (not accessed in the last $LOCK_TIMEOUT minutes), forcing update!"
+      rm -f $LOCK
+    fi
+  else
+    echo "current lock file exists, unable to start rsync!"
+    exit 1
+  fi
+fi
+
+touch $LOCK
+# Note: on some non-Debian systems, trap doesn't accept "exit" as signal
+# specification. If that's the case on your system, try using "0".
+trap "rm -f $LOCK" exit
+
+set +e
+
+# Now sync the remaining stuff
+nice rsync -rlHtv --delete \
+     --include='*-businesscard.iso' \
+     --include='*-netinst.iso' \
+     --include='*-CD-1.iso' \
+     --include='*-amd64-DVD-1.iso' \
+     --include='*-i386-DVD-1.iso' \
+     --exclude='*.iso' --timeout=3600 -4 --address=$ADDRESS $TMP_EXCLUDE \
+     --exclude "Archive-Update-in-Progress-${HOSTNAME}" \
+     $RSYNC_HOST::$RSYNC_DIR $TO >> $LOGFILE 2>&1
+if [[ "$?" != "0" ]]; then
+    echo "ERROR: Help, something weird happened" | tee -a $LOGFILE
+    echo "mirroring /pool exited with exitcode" $result | tee -a $LOGFILE
+fi
+
+savelog $LOGFILE >/dev/null
+
+rm $LOCK
diff --git a/bin/csc-sync-standard b/bin/csc-sync-standard
new file mode 100755 (executable)
index 0000000..e1ad951
--- /dev/null
@@ -0,0 +1,21 @@
+#!/bin/bash -e
+
+if [ $# -lt 3 ]; then
+  echo 'Usage: sync local_dir rsync_host rsync_dir'
+  exit 1
+fi
+
+umask 002
+
+TO=/mirror/root/$1
+RSYNC_HOST=$2
+RSYNC_DIR=$3
+if test -n "$RSYNC_USER"; then
+  RSYNC_HOST=$RSYNC_USER@$RSYNC_HOST
+fi
+
+exec nice rsync -aH --no-owner --no-group --delete \
+     --timeout=3600 -4 --address=129.97.134.71 \
+     --exclude .~tmp~/ \
+     --quiet --stats --log-file=/home/mirror/merlin/logs/transfer.log \
+     $RSYNC_HOST::$RSYNC_DIR $TO
diff --git a/bin/make-torrents b/bin/make-torrents
new file mode 100755 (executable)
index 0000000..bc7a9ac
--- /dev/null
@@ -0,0 +1,31 @@
+#!/usr/bin/python
+import os.path
+
+base = '/mirror/root/csclub'
+htbase = 'http://csclub.uwaterloo.ca/media/files'
+announce = 'http://bittorrent.csclub.uwaterloo.ca/announce'
+scpto = 'bittorrent.csclub:/var/lib/bnbt/torrents/'
+comment = 'Produced by the University of Waterloo Computer Science Club (http://csclub.uwaterloo.ca/)'
+minsize = 10*1024*1024 # 10 MiB
+
+btmake = '/usr/bin/btmakemetafile.bittornado'
+scp = '/usr/bin/scp'
+
+mediafiles = [ file for file in os.listdir(base) if
+    not file.endswith('.torrent') and
+    not os.path.basename(file).startswith('.') and
+    not os.path.isdir(base + '/' + file) and
+    os.path.getsize(base + '/' + file) > minsize
+]
+
+for file in mediafiles:
+    path = base + '/' + file
+    torrentpath = path + '.torrent'
+    htpath = htbase + '/' + file
+    if not os.path.exists(torrentpath):
+        print "Making torrent for %s..." % torrentpath
+        os.spawnl(os.P_WAIT, btmake, btmake, announce, path,
+                '--comment', comment, '--target', torrentpath,
+                '--httpseeds', htpath)
+        os.spawnl(os.P_WAIT, scp, scp, torrentpath, scpto)
+print "The bittorrent tracker will begin tracking new torrents within five minutes."
diff --git a/bin/report_mirror b/bin/report_mirror
new file mode 100755 (executable)
index 0000000..2f1054f
--- /dev/null
@@ -0,0 +1,272 @@
+#!/usr/bin/python
+
+import os, sys
+from os.path import join
+import pickle
+import re
+import ConfigParser
+import pprint
+import time
+import xmlrpclib
+import base64
+import bz2
+import socket
+
+class HostConfig(object):
+    """Holder for config info from the configuration file"""
+    def __init__(self):
+        self.config = { 'version' : 0,
+                        'global': {},
+                        'site': {},
+                        'host': {},
+                        'stats': {},
+                        }
+
+_translation = [chr(_x) for _x in range(256)]
+def _translate(s, altchars):
+    translation = _translation[:]
+    for k, v in altchars.items():
+        translation[ord(k)] = v
+    return s.translate(''.join(translation))
+
+def urlsafe_b64encode(s):
+   import binascii
+   altchars = '-_'
+   encoded = binascii.b2a_base64(s)[:-1]
+   if altchars is not None:
+      return _translate(encoded, {'+': altchars[0], '/': altchars[1]})
+   return encoded
+
+def gen_dirtree(path):
+    # structure here is:
+    # dirtree is a dict
+    # {
+    #   dirpath :
+    #                {
+    #                   filename1 : size1,
+    #                   filename2 : size2,
+    #                   ...
+    #                 },
+    #   ...
+    # }
+    # 
+    # 2009-03-09: MM's web app ignores the statfiles dict.  So don't bother generating it.
+
+    dirtree = {}
+    for dirpath, dirnames, filenames in os.walk(path):
+        statfiles = {}
+        if path.endswith('/'):
+            short_path = dirpath[len(path):]
+        else:
+            short_path = dirpath[len(path)+1:]
+        if len(short_path) > 0:
+            dirtree[short_path] = statfiles
+        else:
+            dirtree[''] = statfiles
+
+    return dirtree
+
+def errorprint(error):
+    sys.stderr.write(error+'\n')
+
+class MissingOption(Exception):
+    pass
+
+def check_required_options(conf, section, required_options):
+    for o in required_options:
+        if not conf.has_option(section, o):
+            errorprint('missing required option %s in config [%s]' % (o, section))
+            raise MissingOption()
+    return True
+
+def parse_value(value):
+    """Split multi-line values into a list"""
+    if value.find('\n') > -1:
+        return value.split()
+    return value
+
+def parse_section(conf, section, item, required_options, optional_options=[]):
+    if conf.has_option(section, 'enabled'):
+        if conf.get(section, 'enabled') != '1' and section.lower() in item.config:
+            print 'removing disabled section %s' % (section)
+            del item.config[section.lower()]
+            return False
+
+    if not check_required_options(conf, section, required_options):
+        return False
+
+    if not section.lower() in item.config:
+        item.config[section.lower()] = {}
+
+    for o in required_options:
+        item.config[section.lower()][o] = parse_value(conf.get(section, o))
+    for o in optional_options:
+        if conf.has_option(section, o):
+            item.config[section.lower()][o] = parse_value(conf.get(section, o))
+
+    return True
+
+def parse_global(conf, section, item):
+    required_options = [ 'enabled', 'server' ]
+    if not parse_section(conf, section, item, required_options):
+        errorprint('missing required options (server AND enabled) in [%s] section' % (section))
+        return False
+    return True
+
+def parse_site(conf, section, item):
+    required_options = [ 'enabled', 'name', 'password' ]
+    return parse_section(conf, section, item, required_options)
+
+def parse_host(conf, section, item):
+    required_options = [ 'enabled', 'name' ]
+    optional_options = [ 'user_active' ]
+    return parse_section(conf, section, item, required_options, optional_options=optional_options)
+
+def get_stats(conf, section):
+    if conf.has_option(section, 'enabled'):
+        if conf.get(section, 'enabled') != '1':
+            return None
+    statsdata = {}
+    for name, value in conf.items(section):
+        if name == 'enabled':
+            continue
+        filenames = parse_value(conf.get(section, name))
+        if type(filenames) != list:
+            filenames = [ filenames ]
+        for fn in filenames:
+            try:
+                f = open(fn, 'r')
+                contents = contents + f.readlines()
+                statsdata[name] = pickle.dumps(contents, -1)
+                f.close()
+            except:
+                pass
+    return statsdata
+
+def parse_category(conf, section, item, crawl):
+    required_options = [ 'enabled', 'path' ]
+    if not parse_section(conf, section, item, required_options):
+        return False
+
+    if crawl:
+        dirtree = gen_dirtree(conf.get(section, 'path'))
+        item.config[section.lower()]['dirtree'] = dirtree
+    # database doesn't need to know the disk path
+    del item.config[section.lower()]['path']
+
+def config(cfg, item, crawl=True):
+    broken = False
+    conf = ConfigParser.ConfigParser()
+    files = conf.read(cfg)
+    if files == []:
+        errorprint('Configuration file %s not found' % (cfg))
+        return False
+    conf.read(cfg)
+
+    try:
+        # don't grab parse_stats here
+        for section, parsefunc in [ ('global', parse_global), ('site', parse_site),
+                                    ('host', parse_host)]:
+            if conf.has_section(section):
+                if not parsefunc(conf, section, item):
+                    return False
+            else:
+                errorprint('Invalid configuration - missing section [%s]' % (section))
+                sys.exit(1)
+
+        for section in conf.sections():
+            if section in [ 'global', 'site', 'host', 'stats']:
+                continue
+            parse_category(conf, section, item, crawl)
+
+    except MissingOption:
+        errorprint('Invalid configuration - Exiting')
+        sys.exit(1)
+
+    return True
+
+
+
+def main():
+    from optparse import OptionParser
+    parser = OptionParser(usage= sys.argv[0] + " [options]")
+    parser.add_option("-c", "--config",
+                      dest="config",
+                      default='/etc/mirrormanager-client/report_mirror.conf',
+                      help='Configuration filename (required)')
+    parser.add_option("-s", "--stats",
+                      action="store_true",
+                      dest="stats",
+                      default=False,
+                      help='Send stats')
+    parser.add_option("-i", "--input",
+                      dest="input",
+                      default=None,
+                      help="Input filename (for debugging)")
+    parser.add_option("-o", "--output",
+                      dest="output",
+                      default=None,
+                      help="Output filename (for debugging)")
+    parser.add_option("-n", "--no-send",
+                      action="store_true",
+                      dest="no_send",
+                      default=False,
+                      help="Don't send data to the server.")
+    parser.add_option("-d", "--debug",
+                      action="store_true",
+                      dest="debug",
+                      default=False,
+                      help='Enable debugging output')
+
+
+    (options, args) = parser.parse_args()
+    item = HostConfig()
+    if options.input:
+        infile = open(options.input, 'rb')
+        item.config = pickle.load(infile)
+        infile.close()
+        if not config(options.config, item, crawl=False):
+            sys.exit(1)
+    else:
+        if not config(options.config, item, crawl=True):
+            sys.exit(1)
+
+    p = pickle.dumps(item.config, -1)
+
+    if options.debug:
+        pp = pprint.PrettyPrinter(indent=4)
+        pp.pprint(item.config)
+        
+    if options.output is not None:
+        outfile = open(options.output, 'wb')
+        outfile.write(p)
+        outfile.close()
+
+    if options.stats:
+        statdata = get_stats(conf, 'stats')
+
+    # upload p and statsdata here
+    if not item.config.has_key('global') or not item.config['global'].has_key('enabled') or item.config['global']['enabled'] != '1':
+        sys.exit(1)
+
+    if not options.no_send:
+        #   print "Connecting to %s" % item.config['global']['server']
+        server = xmlrpclib.ServerProxy(item.config['global']['server'])
+        data = None
+        try:
+            data = base64.urlsafe_b64encode(bz2.compress(p))
+        except AttributeError:
+            data = urlsafe_b64encode(bz2.compress(p))
+
+        if data is not None:
+            try:
+                print server.checkin(data)
+            except socket.error, m:
+                print "Error checking in: %s.  Please try again later." % (m[1])
+            except xmlrpclib.Fault:
+                print "Error checking in.  Connection closed before checkin complete.  Please try again later."
+                sys.exit(1)                
+
+
+if __name__ == '__main__':
+    main()
diff --git a/bin/ubuntu-releases-sync b/bin/ubuntu-releases-sync
new file mode 100755 (executable)
index 0000000..078b559
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+# This file is used for ubuntu push mirroring. Do not remove it!
+exec ~/bin/csc-sync-standard ubuntu-releases rsync.releases.ubuntu.com releases
diff --git a/csc-sync-debian b/csc-sync-debian
deleted file mode 100755 (executable)
index 50f06cd..0000000
+++ /dev/null
@@ -1,246 +0,0 @@
-#! /bin/bash
-
-if [[ $# < 3 ]]; then
-  echo 'Usage: sync local_dir rsync_host rsync_dir [trace_host [trace_dir]]'
-  exit 1
-fi
-
-set -e
-
-TOP_DIR=/mirror
-TO=$TOP_DIR/root/$1
-RSYNC_HOST=$2
-RSYNC_DIR=$3
-if [ $# = 4 ]; then
-    TRACE_HOST=$4
-fi
-TRACE_DIR=project/trace
-if [ $# = 5 ]; then
-    TRACE_DIR=$5
-fi
-LOGDIR=/var/log/mirror/$1_$2
-ADDRESS=129.97.134.71
-
-mkdir -p $LOGDIR
-
-# This script originates from http://www.debian.org/mirror/anonftpsync
-
-# CVS: cvs.debian.org:/cvs/webwml - webwml/english/mirror/anonftpsync
-# Version: $Id: anonftpsync,v 1.33 2007/09/12 15:19:03 joy Exp $ 
-
-# Note: You MUST have rsync 2.6.4 or newer, which is available in sarge
-# and all newer Debian releases, or at http://rsync.samba.org/
-
-# Don't forget:
-# chmod u+x anonftpsync
-
-# Set the variables below to fit your site. You can then use cron to have
-# this script run daily to automatically update your copy of the archive.
-
-# TO is the destination for the base of the Debian mirror directory
-# (the dir that holds dists/ and ls-lR).
-# (mandatory)
-
-#TO=
-
-# RSYNC_HOST is the site you have chosen from the mirrors file.
-# (http://www.debian.org/mirror/list-full)
-# (mandatory)
-
-#RSYNC_HOST=
-
-# RSYNC_DIR is the directory given in the "Packages over rsync:" line of
-# the mirrors file for the site you have chosen to mirror.
-# (mandatory)
-
-#RSYNC_DIR=
-
-# LOGDIR is the directory where the logs will be written to
-# (mandatory)
-
-#LOGDIR=
-
-# ARCH_EXCLUDE can be used to exclude a complete architecture from
-# mirrorring. Please use as space seperated list.
-# Possible values are:
-# alpha, amd64, arm, hppa, hurd-i386, i386, ia64, m68k, mipsel, mips, powerpc, s390, sh and sparc
-#
-# There is one special value: source
-# This is not an architecture but will exclude all source code in /pool
-#
-# eg.
-# ARCH_EXCLUDE="alpha arm hppa hurd-i386 ia64 m68k mipsel mips s390 sparc"
-# 
-# With a blank ARCH_EXCLUDE you will mirror all available architectures
-# (optional)
-
-# EXCLUDE is a list of parameters listing patterns that rsync will exclude, in
-# addition to the architectures excluded by ARCH_EXCLUDE.
-#
-# Use ARCH_EXCLUDE to exclude specific architectures or all sources
-#
-# --exclude stable, testing, unstable options DON'T remove the packages of
-# the given distribution. If you want do so, use debmirror instead.
-#
-# The following example would exclude mostly everything:
-#EXCLUDE="\
-#  --exclude stable/ --exclude testing/ --exclude unstable/ \
-#  --exclude source/ \
-#  --exclude *.orig.tar.gz --exclude *.diff.gz --exclude *.dsc \
-#  --exclude /contrib/ --exclude /non-free/ \
-# "
-
-# With a blank EXCLUDE you will mirror the entire archive, except the
-# architectures excluded by ARCH_EXCLUDE.
-# (optional)
-
-EXCLUDE=
-
-# LOCK_TIMEOUT is a timeout in minutes.  Defaults to 360 (6 hours).
-# This program creates a lock to ensure that only one copy
-# of it is mirroring any one archive at any one time.
-# Locks held for longer than the timeout are broken, unless
-# a running rsync process appears to be connected to $RSYNC_HOST.
-
-LOCK_TIMEOUT=360
-
-# There should be no need to edit anything below this point, unless there
-# are problems.
-
-#-----------------------------------------------------------------------------#
-
-# If you are accessing a rsync server/module which is password-protected,
-# uncomment the following lines (and edit the other file).
-
-# . ftpsync.conf
-# export RSYNC_PASSWORD
-# RSYNC_HOST=$RSYNC_USER@$RSYNC_HOST
-
-#-----------------------------------------------------------------------------#
-
-# Check for some environment variables
-if [ -z $TO ] || [ -z $RSYNC_HOST ] || [ -z $RSYNC_DIR ] || [ -z $LOGDIR ]; then
-       echo "One of the following variables seems to be empty:"
-       echo "TO, RSYNC_HOST, RSYNC_DIR or LOGDIR"
-       exit 2
-fi
-
-if ! [ -d ${TO}/${TRACE_DIR} ]; then
-       # we are running mirror script for the first time
-       umask 002
-       mkdir -p ${TO}/${TRACE_DIR}
-fi
-
-# Note: on some non-Debian systems, hostname doesn't accept -f option.
-# If that's the case on your system, make sure hostname prints the full
-# hostname, and remove the -f option. If there's no hostname command,
-# explicitly replace `hostname -f` with the hostname.
-
-HOSTNAME=`hostname -f`
-
-# The hostname must match the "Site" field written in the list of mirrors.
-# If hostname doesn't returns the correct value, fill and uncomment below 
-HOSTNAME=mirror.csclub.uwaterloo.ca
-LOCK="${TO}/Archive-Update-in-Progress-${HOSTNAME}"
-
-# The temp directory used by rsync --delay-updates is not
-# world-readable remotely. It must be excluded to avoid errors. 
-TMP_EXCLUDE="--exclude .~tmp~/"
-
-# Exclude architectures defined in $ARCH_EXCLUDE
-for ARCH in $ARCH_EXCLUDE; do
-       EXCLUDE=$EXCLUDE"\
-               --exclude binary-$ARCH/ \
-               --exclude disks-$ARCH/ \
-               --exclude installer-$ARCH/ \
-               --exclude Contents-$ARCH.gz \
-               --exclude Contents-$ARCH.diff/ \
-               --exclude arch-$ARCH.files \
-               --exclude arch-$ARCH.list.gz \
-               --exclude *_$ARCH.deb \
-               --exclude *_$ARCH.udeb "
-       if [ "$ARCH" == "source" ]; then
-               SOURCE_EXCLUDE="\
-               --exclude source/ \
-               --exclude *.tar.gz \
-               --exclude *.diff.gz \
-               --exclude *.dsc "
-       fi
-done
-
-# Logfile
-LOGFILE=$LOGDIR/mirror.log
-
-# Get in the right directory and set the umask to be group writable
-# 
-cd $HOME
-umask 002
-
-# Check to see if another sync is in progress
-if [ -f "$LOCK" ]; then
-# Note: this requires the findutils find; for other finds, adjust as necessary
-  if [ "`find $LOCK -maxdepth 1 -amin -$LOCK_TIMEOUT`" = "" ]; then
-# Note: this requires the procps ps; for other ps', adjust as necessary
-    if ps ax | grep '[r]'sync | grep -q $RSYNC_HOST; then
-      echo "stale lock found, but a rsync is still running, aiee!" >&2
-      exit 1
-    else
-      echo "stale lock found (not accessed in the last $LOCK_TIMEOUT minutes), forcing update!"
-      rm -f $LOCK
-    fi
-  else
-    echo "current lock file exists, unable to start rsync!"
-    exit 1
-  fi
-fi
-
-touch $LOCK
-# Note: on some non-Debian systems, trap doesn't accept "exit" as signal
-# specification. If that's the case on your system, try using "0".
-trap "rm -f $LOCK" exit
-
-set +e
-
-# check if we need to sync
-if [[ "$TRACE_HOST" != "" ]]; then
-    TRACE_OLD_TIME=`stat -c%Y $TO/$TRACE_DIR/$TRACE_HOST 2> /dev/null`
-    TRACE_NEW_FILE=/tmp/$RSYNC_HOST_$RSYNC_DIR_$RANDOM
-    nice rsync -tv -4 --address=$ADDRESS \
-        $RSYNC_HOST::$RSYNC_DIR/$TRACE_DIR/$TRACE_HOST \
-        $TRACE_NEW_FILE >> $LOGFILE 2>&1
-    TRACE_NEW_TIME=`stat -c%Y $TRACE_NEW_FILE`
-    rm -f $TRACE_NEW_FILE
-    if [ "$TRACE_OLD_TIME" = "$TRACE_NEW_TIME" ]; then
-        echo 'Trace file for' $RSYNC_HOST::$RSYNC_DIR \
-            'unchanged, not rsyncing.' >> $LOGFILE
-        exit 0
-    fi
-fi
-
-# First sync /pool
-nice rsync -rlHtv \
-     $TMP_EXCLUDE $EXCLUDE $SOURCE_EXCLUDE \
-     --timeout=3600 -4 --address=$ADDRESS \
-     $RSYNC_HOST::$RSYNC_DIR/pool/ $TO/pool/ >> $LOGFILE 2>&1
-result=$?
-
-if [ 0 = $result ]; then
-       # Now sync the remaining stuff
-       nice rsync -rlHtv --delay-updates --delete-after \
-            --exclude "Archive-Update-in-Progress-${HOSTNAME}" \
-            --exclude "${TRACE_DIR}/${HOSTNAME}" \
-            --timeout=3600 -4 --address=$ADDRESS \
-            $TMP_EXCLUDE $EXCLUDE $SOURCE_EXCLUDE \
-            $RSYNC_HOST::$RSYNC_DIR $TO >> $LOGFILE 2>&1
-
-       mkdir -p ${TO}/${TRACE_DIR}
-       LANG=C date -u > "${TO}/${TRACE_DIR}/${HOSTNAME}"
-else
-       echo "ERROR: Help, something weird happened" | tee -a $LOGFILE
-       echo "mirroring /pool exited with exitcode" $result | tee -a $LOGFILE
-fi
-
-savelog $LOGFILE >/dev/null
-
-rm $LOCK
diff --git a/csc-sync-debian-cd b/csc-sync-debian-cd
deleted file mode 100755 (executable)
index 11abcbc..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-#! /bin/bash
-
-set -e
-
-TOP_DIR=/mirror
-TO=$TOP_DIR/root/debian-cd
-RSYNC_HOST=cdimage.debian.org
-RSYNC_DIR=debian-cd
-LOGDIR=/var/log/mirror/debian-cd_cdimage.debian.org
-ADDRESS=129.97.134.71
-
-mkdir -p $LOGDIR
-
-# LOCK_TIMEOUT is a timeout in minutes.  Defaults to 360 (6 hours).
-# This program creates a lock to ensure that only one copy
-# of it is mirroring any one archive at any one time.
-# Locks held for longer than the timeout are broken, unless
-# a running rsync process appears to be connected to $RSYNC_HOST.
-
-LOCK_TIMEOUT=360
-
-# There should be no need to edit anything below this point, unless there
-# are problems.
-
-#-----------------------------------------------------------------------------#
-
-# If you are accessing a rsync server/module which is password-protected,
-# uncomment the following lines (and edit the other file).
-
-# . ftpsync.conf
-export RSYNC_PASSWORD
-if [[ "$RSYNC_USER" != "" ]]; then
-    RSYNC_HOST=$RSYNC_USER@$RSYNC_HOST
-fi
-
-#-----------------------------------------------------------------------------#
-
-# Check for some environment variables
-if [ -z $TO ] || [ -z $RSYNC_HOST ] || [ -z $RSYNC_DIR ] || [ -z $LOGDIR ]; then
-       echo "One of the following variables seems to be empty:"
-       echo "TO, RSYNC_HOST, RSYNC_DIR or LOGDIR"
-       exit 2
-fi
-
-# Note: on some non-Debian systems, hostname doesn't accept -f option.
-# If that's the case on your system, make sure hostname prints the full
-# hostname, and remove the -f option. If there's no hostname command,
-# explicitly replace `hostname -f` with the hostname.
-
-HOSTNAME=`hostname -f`
-
-# The hostname must match the "Site" field written in the list of mirrors.
-# If hostname doesn't returns the correct value, fill and uncomment below 
-HOSTNAME=mirror.csclub.uwaterloo.ca
-LOCK="${TO}/Archive-Update-in-Progress-${HOSTNAME}"
-
-# The temp directory used by rsync --delay-updates is not
-# world-readable remotely. It must be excluded to avoid errors. 
-TMP_EXCLUDE="--exclude .~tmp~/"
-
-# Logfile
-LOGFILE=$LOGDIR/mirror.log
-
-# Get in the right directory and set the umask to be group writable
-# 
-cd $HOME
-umask 002
-
-# Check to see if another sync is in progress
-if [ -f "$LOCK" ]; then
-# Note: this requires the findutils find; for other finds, adjust as necessary
-  if [ "`find $LOCK -maxdepth 1 -amin -$LOCK_TIMEOUT`" = "" ]; then
-# Note: this requires the procps ps; for other ps', adjust as necessary
-    if ps ax | grep '[r]'sync | grep -q $RSYNC_HOST; then
-      echo "stale lock found, but a rsync is still running, aiee!" >&2
-      exit 1
-    else
-      echo "stale lock found (not accessed in the last $LOCK_TIMEOUT minutes), forcing update!"
-      rm -f $LOCK
-    fi
-  else
-    echo "current lock file exists, unable to start rsync!"
-    exit 1
-  fi
-fi
-
-touch $LOCK
-# Note: on some non-Debian systems, trap doesn't accept "exit" as signal
-# specification. If that's the case on your system, try using "0".
-trap "rm -f $LOCK" exit
-
-set +e
-
-# Now sync the remaining stuff
-nice rsync -rlHtv --delete \
-     --include='*-businesscard.iso' \
-     --include='*-netinst.iso' \
-     --include='*-CD-1.iso' \
-     --include='*-amd64-DVD-1.iso' \
-     --include='*-i386-DVD-1.iso' \
-     --exclude='*.iso' --timeout=3600 -4 --address=$ADDRESS $TMP_EXCLUDE \
-     --exclude "Archive-Update-in-Progress-${HOSTNAME}" \
-     $RSYNC_HOST::$RSYNC_DIR $TO >> $LOGFILE 2>&1
-if [[ "$?" != "0" ]]; then
-    echo "ERROR: Help, something weird happened" | tee -a $LOGFILE
-    echo "mirroring /pool exited with exitcode" $result | tee -a $LOGFILE
-fi
-
-savelog $LOGFILE >/dev/null
-
-rm $LOCK
diff --git a/csc-sync-standard b/csc-sync-standard
deleted file mode 100755 (executable)
index e1ad951..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash -e
-
-if [ $# -lt 3 ]; then
-  echo 'Usage: sync local_dir rsync_host rsync_dir'
-  exit 1
-fi
-
-umask 002
-
-TO=/mirror/root/$1
-RSYNC_HOST=$2
-RSYNC_DIR=$3
-if test -n "$RSYNC_USER"; then
-  RSYNC_HOST=$RSYNC_USER@$RSYNC_HOST
-fi
-
-exec nice rsync -aH --no-owner --no-group --delete \
-     --timeout=3600 -4 --address=129.97.134.71 \
-     --exclude .~tmp~/ \
-     --quiet --stats --log-file=/home/mirror/merlin/logs/transfer.log \
-     $RSYNC_HOST::$RSYNC_DIR $TO
diff --git a/make-torrents b/make-torrents
deleted file mode 100755 (executable)
index bc7a9ac..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/usr/bin/python
-import os.path
-
-base = '/mirror/root/csclub'
-htbase = 'http://csclub.uwaterloo.ca/media/files'
-announce = 'http://bittorrent.csclub.uwaterloo.ca/announce'
-scpto = 'bittorrent.csclub:/var/lib/bnbt/torrents/'
-comment = 'Produced by the University of Waterloo Computer Science Club (http://csclub.uwaterloo.ca/)'
-minsize = 10*1024*1024 # 10 MiB
-
-btmake = '/usr/bin/btmakemetafile.bittornado'
-scp = '/usr/bin/scp'
-
-mediafiles = [ file for file in os.listdir(base) if
-    not file.endswith('.torrent') and
-    not os.path.basename(file).startswith('.') and
-    not os.path.isdir(base + '/' + file) and
-    os.path.getsize(base + '/' + file) > minsize
-]
-
-for file in mediafiles:
-    path = base + '/' + file
-    torrentpath = path + '.torrent'
-    htpath = htbase + '/' + file
-    if not os.path.exists(torrentpath):
-        print "Making torrent for %s..." % torrentpath
-        os.spawnl(os.P_WAIT, btmake, btmake, announce, path,
-                '--comment', comment, '--target', torrentpath,
-                '--httpseeds', htpath)
-        os.spawnl(os.P_WAIT, scp, scp, torrentpath, scpto)
-print "The bittorrent tracker will begin tracking new torrents within five minutes."
diff --git a/report_mirror b/report_mirror
deleted file mode 100755 (executable)
index 2f1054f..0000000
+++ /dev/null
@@ -1,272 +0,0 @@
-#!/usr/bin/python
-
-import os, sys
-from os.path import join
-import pickle
-import re
-import ConfigParser
-import pprint
-import time
-import xmlrpclib
-import base64
-import bz2
-import socket
-
-class HostConfig(object):
-    """Holder for config info from the configuration file"""
-    def __init__(self):
-        self.config = { 'version' : 0,
-                        'global': {},
-                        'site': {},
-                        'host': {},
-                        'stats': {},
-                        }
-
-_translation = [chr(_x) for _x in range(256)]
-def _translate(s, altchars):
-    translation = _translation[:]
-    for k, v in altchars.items():
-        translation[ord(k)] = v
-    return s.translate(''.join(translation))
-
-def urlsafe_b64encode(s):
-   import binascii
-   altchars = '-_'
-   encoded = binascii.b2a_base64(s)[:-1]
-   if altchars is not None:
-      return _translate(encoded, {'+': altchars[0], '/': altchars[1]})
-   return encoded
-
-def gen_dirtree(path):
-    # structure here is:
-    # dirtree is a dict
-    # {
-    #   dirpath :
-    #                {
-    #                   filename1 : size1,
-    #                   filename2 : size2,
-    #                   ...
-    #                 },
-    #   ...
-    # }
-    # 
-    # 2009-03-09: MM's web app ignores the statfiles dict.  So don't bother generating it.
-
-    dirtree = {}
-    for dirpath, dirnames, filenames in os.walk(path):
-        statfiles = {}
-        if path.endswith('/'):
-            short_path = dirpath[len(path):]
-        else:
-            short_path = dirpath[len(path)+1:]
-        if len(short_path) > 0:
-            dirtree[short_path] = statfiles
-        else:
-            dirtree[''] = statfiles
-
-    return dirtree
-
-def errorprint(error):
-    sys.stderr.write(error+'\n')
-
-class MissingOption(Exception):
-    pass
-
-def check_required_options(conf, section, required_options):
-    for o in required_options:
-        if not conf.has_option(section, o):
-            errorprint('missing required option %s in config [%s]' % (o, section))
-            raise MissingOption()
-    return True
-
-def parse_value(value):
-    """Split multi-line values into a list"""
-    if value.find('\n') > -1:
-        return value.split()
-    return value
-
-def parse_section(conf, section, item, required_options, optional_options=[]):
-    if conf.has_option(section, 'enabled'):
-        if conf.get(section, 'enabled') != '1' and section.lower() in item.config:
-            print 'removing disabled section %s' % (section)
-            del item.config[section.lower()]
-            return False
-
-    if not check_required_options(conf, section, required_options):
-        return False
-
-    if not section.lower() in item.config:
-        item.config[section.lower()] = {}
-
-    for o in required_options:
-        item.config[section.lower()][o] = parse_value(conf.get(section, o))
-    for o in optional_options:
-        if conf.has_option(section, o):
-            item.config[section.lower()][o] = parse_value(conf.get(section, o))
-
-    return True
-
-def parse_global(conf, section, item):
-    required_options = [ 'enabled', 'server' ]
-    if not parse_section(conf, section, item, required_options):
-        errorprint('missing required options (server AND enabled) in [%s] section' % (section))
-        return False
-    return True
-
-def parse_site(conf, section, item):
-    required_options = [ 'enabled', 'name', 'password' ]
-    return parse_section(conf, section, item, required_options)
-
-def parse_host(conf, section, item):
-    required_options = [ 'enabled', 'name' ]
-    optional_options = [ 'user_active' ]
-    return parse_section(conf, section, item, required_options, optional_options=optional_options)
-
-def get_stats(conf, section):
-    if conf.has_option(section, 'enabled'):
-        if conf.get(section, 'enabled') != '1':
-            return None
-    statsdata = {}
-    for name, value in conf.items(section):
-        if name == 'enabled':
-            continue
-        filenames = parse_value(conf.get(section, name))
-        if type(filenames) != list:
-            filenames = [ filenames ]
-        for fn in filenames:
-            try:
-                f = open(fn, 'r')
-                contents = contents + f.readlines()
-                statsdata[name] = pickle.dumps(contents, -1)
-                f.close()
-            except:
-                pass
-    return statsdata
-
-def parse_category(conf, section, item, crawl):
-    required_options = [ 'enabled', 'path' ]
-    if not parse_section(conf, section, item, required_options):
-        return False
-
-    if crawl:
-        dirtree = gen_dirtree(conf.get(section, 'path'))
-        item.config[section.lower()]['dirtree'] = dirtree
-    # database doesn't need to know the disk path
-    del item.config[section.lower()]['path']
-
-def config(cfg, item, crawl=True):
-    broken = False
-    conf = ConfigParser.ConfigParser()
-    files = conf.read(cfg)
-    if files == []:
-        errorprint('Configuration file %s not found' % (cfg))
-        return False
-    conf.read(cfg)
-
-    try:
-        # don't grab parse_stats here
-        for section, parsefunc in [ ('global', parse_global), ('site', parse_site),
-                                    ('host', parse_host)]:
-            if conf.has_section(section):
-                if not parsefunc(conf, section, item):
-                    return False
-            else:
-                errorprint('Invalid configuration - missing section [%s]' % (section))
-                sys.exit(1)
-
-        for section in conf.sections():
-            if section in [ 'global', 'site', 'host', 'stats']:
-                continue
-            parse_category(conf, section, item, crawl)
-
-    except MissingOption:
-        errorprint('Invalid configuration - Exiting')
-        sys.exit(1)
-
-    return True
-
-
-
-def main():
-    from optparse import OptionParser
-    parser = OptionParser(usage= sys.argv[0] + " [options]")
-    parser.add_option("-c", "--config",
-                      dest="config",
-                      default='/etc/mirrormanager-client/report_mirror.conf',
-                      help='Configuration filename (required)')
-    parser.add_option("-s", "--stats",
-                      action="store_true",
-                      dest="stats",
-                      default=False,
-                      help='Send stats')
-    parser.add_option("-i", "--input",
-                      dest="input",
-                      default=None,
-                      help="Input filename (for debugging)")
-    parser.add_option("-o", "--output",
-                      dest="output",
-                      default=None,
-                      help="Output filename (for debugging)")
-    parser.add_option("-n", "--no-send",
-                      action="store_true",
-                      dest="no_send",
-                      default=False,
-                      help="Don't send data to the server.")
-    parser.add_option("-d", "--debug",
-                      action="store_true",
-                      dest="debug",
-                      default=False,
-                      help='Enable debugging output')
-
-
-    (options, args) = parser.parse_args()
-    item = HostConfig()
-    if options.input:
-        infile = open(options.input, 'rb')
-        item.config = pickle.load(infile)
-        infile.close()
-        if not config(options.config, item, crawl=False):
-            sys.exit(1)
-    else:
-        if not config(options.config, item, crawl=True):
-            sys.exit(1)
-
-    p = pickle.dumps(item.config, -1)
-
-    if options.debug:
-        pp = pprint.PrettyPrinter(indent=4)
-        pp.pprint(item.config)
-        
-    if options.output is not None:
-        outfile = open(options.output, 'wb')
-        outfile.write(p)
-        outfile.close()
-
-    if options.stats:
-        statdata = get_stats(conf, 'stats')
-
-    # upload p and statsdata here
-    if not item.config.has_key('global') or not item.config['global'].has_key('enabled') or item.config['global']['enabled'] != '1':
-        sys.exit(1)
-
-    if not options.no_send:
-        #   print "Connecting to %s" % item.config['global']['server']
-        server = xmlrpclib.ServerProxy(item.config['global']['server'])
-        data = None
-        try:
-            data = base64.urlsafe_b64encode(bz2.compress(p))
-        except AttributeError:
-            data = urlsafe_b64encode(bz2.compress(p))
-
-        if data is not None:
-            try:
-                print server.checkin(data)
-            except socket.error, m:
-                print "Error checking in: %s.  Please try again later." % (m[1])
-            except xmlrpclib.Fault:
-                print "Error checking in.  Connection closed before checkin complete.  Please try again later."
-                sys.exit(1)                
-
-
-if __name__ == '__main__':
-    main()
diff --git a/ubuntu-releases-sync b/ubuntu-releases-sync
deleted file mode 100755 (executable)
index 078b559..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-# This file is used for ubuntu push mirroring. Do not remove it!
-exec ~/bin/csc-sync-standard ubuntu-releases rsync.releases.ubuntu.com releases