~launchpad-pqm/launchpad/devel

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
#!/usr/bin/env python
# Copyright 2004 Canonical Ltd.  All rights reserved.

# This script updates the cached stats in the system

import sys

from optparse import OptionParser

from zope.component import getUtility

from canonical.lp import initZopeless
from canonical.launchpad.interfaces import IDistributionSet
from canonical.launchpad.scripts import (execute_zcml_for_scripts,
    logger_options, logger)
from canonical.launchpad.scripts.lockfile import LockFile

default_lock_file = '/var/lock/launchpad-stats.lock'

def parse_options(args):
    """Parse a set of command line options.

    Return an optparse.Values object.
    """
    parser = OptionParser()
    parser.add_option("-l", "--lockfile", dest="lockfilename",
        default=default_lock_file,
        help="The file the script should use to lock the process.")

    # Add the verbose/quiet options.
    logger_options(parser)

    (options, args) = parser.parse_args(args)

    return options

def main(argv):
    options = parse_options(argv[1:])

    # Get the global logger for this task.
    logger_object = logger(options, 'launchpad-stats')

    # Create a lock file so we don't have two daemons running at the same time.
    lockfile = LockFile(options.lockfilename, logger=logger_object)
    try:
        lockfile.acquire()
    except OSError:
        logger_object.info("lockfile %s already exists, exiting",
                           options.lockfilename)
        return 0

    # Setup zcml machinery to be able to use getUtility
    execute_zcml_for_scripts()
    ztm = initZopeless()

    # Bare except clause: so that the lockfile is reliably deleted.

    try:
        # Do the stats update
        logger_object.debug('Starting the stats update')
        distroset = getUtility(IDistributionSet)
        for distro in distroset:
            for distrorelease in distro.releases:
                distrorelease.updateStatistics()
        ztm.commit()
        logger_object.debug('Finished the stats update')
    except:
        # Release the lock for the next invocation.
        logger_object.exception('An unexpected exception ocurred!')
        lockfile.release()
        return 1

    # Release the lock for the next invocation.
    lockfile.release()
    return 0

if __name__ == '__main__':
    sys.exit(main(sys.argv))