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))
|