pisi sandbox build - build with only base and devel
Usage: # create your build dir and enter $ mkdir build $ cd build # create your sandbox $ pisi-sandbox create # build whatever package you like $ pisi-sandbox build http://svn.pardus.org.tr/pardus/2009/devel/network/analyzer/traceroute/pspec.xml Currently tmpfs is using 1GB of ram... this can be decreased or increased or no tmpfs can be used but disk can be used... but after build when tmpfs is unmounted, memory is the fastest to clean everything.
This commit is contained in:
Executable
+117
@@ -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()
|
||||
Reference in New Issue
Block a user