aboutsummaryrefslogtreecommitdiff
path: root/buildtools/rpki-pbuilder.py
blob: d934c9d900b22b15f5676b0fe2729415b4b5bc65 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#!/usr/bin/python
#
# $Id$
#
# Copyright (C) 2013 Internet Systems Consortium ("ISC")
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.

import os
import sys
import time
import fcntl
import errno
import socket
import subprocess

debug  = False
upload = socket.getfqdn() == "build-u.rpki.net"

def run(*args, **kwargs):
    if debug:
        log("Running %r %r" % (args, kwargs))
    subprocess.check_call(args, **kwargs)

def log(msg):
    # Maybe this should go to syslog instead, but this works for now.
    sys.stdout.write(time.strftime("%Y-%m-%dT%H:%M:%SZ ", time.gmtime()))
    sys.stdout.write(msg)
    sys.stdout.write("\n")
    sys.stdout.flush()

lockfile = os.path.expanduser("~/builder.lock")
svn_tree = os.path.expanduser("~/source/trunk/")
apt_tree = os.path.expanduser("~/repository/")
ubu_tree = os.path.join(apt_tree, "ubuntu/")
deb_tree = os.path.join(apt_tree, "debian/")
srv_path = "aptbot@download.rpki.net:/usr/local/www/data/download.rpki.net/APT/"
ubu_env  = dict(os.environ,
                OTHERMIRROR = "deb http://download.rpki.net/APT/ubuntu precise main")
deb_env  = os.environ

log("Starting")

try:
    lock = os.open(lockfile, os.O_RDONLY | os.O_CREAT | os.O_NONBLOCK, 0666)
    fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB)
except (IOError, OSError), e:
    sys.exit(0 if e.errno == errno.EAGAIN else "Error %r opening lock %r" % lockfile)

os.chdir(svn_tree)

run("svn", "--quiet", "update")

version = subprocess.check_output(("svnversion", "-c")).strip().split(":")[-1]

if not version.isdigit() and not debug:
    sys.exit("Sources don't look pristine, not building (%r)" % version)

version = "0." + version

dsc = os.path.join(svn_tree, "..", "rpki_%s.dsc" % version)

if not os.path.exists(dsc):
    log("Building source package %s" % version)
    for fn in os.listdir(".."):
        if fn != "trunk":
            os.unlink(os.path.join("..", fn))
    run("rm", "-rf", "debian")
    run("python", "buildtools/make-version.py")
    run("python", "buildtools/build-ubuntu-ports.py")
    run("dpkg-buildpackage", "-S", "-us", "-uc", "-rfakeroot")

for dist, tree, env in (("precise", ubu_tree, ubu_env),
                        ("wheezy",  deb_tree, deb_env)):

    for arch, tag in (("amd64", ""), ("i386",  "-i386")):

        basedir = os.path.expanduser("~/pbuilder/%s%s-base.tgz" % (dist, tag))
        result  = os.path.expanduser("~/pbuilder/%s%s_result" % (dist, tag))
        changes = os.path.join(result, "rpki_%s_%s.changes" % (version, arch))

        # Update the build environment if it's been more than a week since
        # we last did that.  If this turns out to be error-prone, we might
        # want to put it in a cron job of its own so it doesn't crash the
        # normal cycle, but let's try it this way for a start.
        #
        if time.time() > os.stat(basedir).st_mtime + (7 * 24 * 60 * 60):
            log("Updating build environment %s %s" % (dist, arch))
            run("pbuilder-dist", dist, arch, "update",
                env = env)

        if not os.path.exists(changes):
            # The need for --ignore=wrongdistribution may indicate
            # something I'm doing wrong in hack-debian-changelog.py,
            # revisit that later.  For now, just whack with a stick.
            #
            log("Building binary packages %s %s %s" % (dist, arch, version))
            for fn in os.listdir(result):
                os.unlink(os.path.join(result, fn))
            run("pbuilder-dist", dist, arch, "build", dsc,
                env = env)
            run("reprepro", "--ignore=wrongdistribution", "include", dist, changes,
                cwd = tree)

if upload:
    log("Synching repository to server")
    run("rsync", "-ai4",
        "--ignore-existing",
        apt_tree, srv_path)
    run("rsync", "-ai4",
        "--exclude", "HEADER.html",
        "--exclude", "HEADER.css",
        "--delete", "--delete-delay",
        apt_tree, srv_path)

log("Done")