diff --git a/scripts/pisi-sandbox b/scripts/pisi-sandbox new file mode 100755 index 00000000..866ba473 --- /dev/null +++ b/scripts/pisi-sandbox @@ -0,0 +1,117 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2009, TUBITAK/UEKAE +# +# 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. Please read the COPYING file. +# + +import os +import shutil +import subprocess +import sys +import stat +import time +import socket +import getopt + +def chroot_comar(image_dir): + if os.fork() == 0: + try: + os.makedirs(os.path.join(image_dir, "var/db"), 0700) + except OSError: + pass + os.chroot(image_dir) + if not os.path.exists("/var/lib/dbus/machine-id"): + run("/usr/bin/dbus-uuidgen --ensure") + run("/sbin/start-stop-daemon -b --start --pidfile /var/run/dbus/pid --exec /usr/bin/dbus-daemon -- --system") + sys.exit(0) + + # wait comar to start + timeout = 5 + wait = 0.1 + sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + while timeout > 0: + try: + sock.connect("%s/var/run/dbus/system_bus_socket" % image_dir) + return True + except: + timeout -= wait + time.sleep(wait) + return False + +# run command and terminate if something goes wrong +def run(cmd, ignore_error=False): + print cmd + ret = os.system(cmd) + if ret and not ignore_error: + print "%s returned %s" % (cmd, ret) + sys.exit(1) + +def create_sandbox(output_dir, repository): + try: + # Add repository of the packages + run('pisi --yes-all --destdir="%s" add-repo pardus %s' % (output_dir, repository)) + + # Install system.base and system.devel + run('pisi --yes-all --ignore-comar --ignore-file-conflicts -D"%s" it -c system.base -c system.devel' % output_dir) + + # Create /etc from baselayout + path = "%s/usr/share/baselayout/" % output_dir + path2 = "%s/etc" % output_dir + for name in os.listdir(path): + run('cp -p "%s" "%s"' % (os.path.join(path, name), os.path.join(path2, name))) + + # Create character device + os.mknod("%s/dev/null" % output_dir, 0666 | stat.S_IFCHR, os.makedev(1, 3)) + os.mknod("%s/dev/console" % output_dir, 0666 | stat.S_IFCHR, os.makedev(5, 1)) + + # Create urandom character device + os.mknod("%s/dev/urandom" % output_dir, 0666 | stat.S_IFCHR, os.makedev(1, 9)) + + # run command in chroot + def chrun(cmd): + run('chroot "%s" %s' % (output_dir, cmd)) + + chrun("/sbin/ldconfig") + chrun("/sbin/update-environment") + chroot_comar(output_dir) + + chrun("/usr/bin/pisi cp baselayout") + chrun("/usr/bin/pisi cp") + chrun("/usr/bin/hav call baselayout User.Manager setUser 0 'Root' '/root' '/bin/bash' 'pardus' '' ") + + # Now it is 2009 release + file(os.path.join(output_dir, "etc/pardus-release"), "w").write("Pardus 2009\n") + + except KeyboardInterrupt: + run('umount %s/proc' % output_dir, ignore_error=True) + run('umount %s/sys' % output_dir, ignore_error=True) + sys.exit(1) + +def mount_sandbox(): + run("mkdir -p tmpfs") + run("mount -t tmpfs -o size=1024M,mode=0744 tmpfs tmpfs/") + run("mkdir -p sandbox") + run("mount -t aufs -o br=tmpfs=rw:base=ro none sandbox/") + run('/bin/mount --bind /proc sandbox/proc') + run('/bin/mount --bind /dev sandbox/dev') + +def umount_sandbox(): + run('/bin/umount sandbox/dev') + run('/bin/umount sandbox/proc') + run('/bin/umount sandbox') + run('/bin/umount tmpfs') + +cmd = sys.argv[1] + +if cmd == "create": + create_sandbox("base", "http://192.168.3.110/pardus-2009/pisi-index.xml.bz2") +elif cmd == "build": + pspec = sys.argv[2] + mount_sandbox() + run('chroot sandbox pisi build %s' % pspec) + umount_sandbox()