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
|
# Copyright 2009-2011 Canonical Ltd. This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).
#
# This is the python package that defines the
# 'lp.archivepublisher.config' package. This package is related
# to managing the archive publisher's configuration as stored in the
# distribution and distroseries tables
import os
from zope.component import getUtility
from lp.services.config import config
from lp.archivepublisher.interfaces.publisherconfig import IPublisherConfigSet
from lp.soyuz.enums import (
archive_suffixes,
ArchivePurpose,
)
APT_FTPARCHIVE_PURPOSES = (ArchivePurpose.PRIMARY, ArchivePurpose.COPY)
def getPubConfig(archive):
"""Return an overridden Publisher Configuration instance.
The original publisher configuration based on the distribution is
modified according local context, it basically fixes the archive
paths to cope with non-primary and PPA archives publication workflow.
"""
pubconf = Config()
ppa_config = config.personalpackagearchive
db_pubconf = getUtility(
IPublisherConfigSet).getByDistribution(archive.distribution)
if db_pubconf is None:
return None
pubconf.temproot = os.path.join(
db_pubconf.root_dir, '%s-temp' % archive.distribution.name)
if archive.is_ppa:
if archive.private:
pubconf.distroroot = ppa_config.private_root
pubconf.htaccessroot = os.path.join(
pubconf.distroroot, archive.owner.name, archive.name)
else:
pubconf.distroroot = ppa_config.root
pubconf.htaccessroot = None
pubconf.archiveroot = os.path.join(
pubconf.distroroot, archive.owner.name, archive.name,
archive.distribution.name)
elif archive.is_main:
pubconf.distroroot = db_pubconf.root_dir
pubconf.archiveroot = os.path.join(
pubconf.distroroot, archive.distribution.name)
pubconf.archiveroot += archive_suffixes[archive.purpose]
elif archive.is_copy:
pubconf.distroroot = db_pubconf.root_dir
pubconf.archiveroot = os.path.join(
pubconf.distroroot,
archive.distribution.name + '-' + archive.name,
archive.distribution.name)
else:
raise AssertionError(
"Unknown archive purpose %s when getting publisher config.",
archive.purpose)
# There can be multiple copy archives, so the temp dir needs to be
# within the archive.
if archive.is_copy:
pubconf.temproot = pubconf.archiveroot + '-temp'
if archive.purpose in APT_FTPARCHIVE_PURPOSES:
pubconf.overrideroot = pubconf.archiveroot + '-overrides'
pubconf.cacheroot = pubconf.archiveroot + '-cache'
pubconf.miscroot = pubconf.archiveroot + '-misc'
pubconf.germinateroot = pubconf.archiveroot + '-germinate'
else:
pubconf.overrideroot = None
pubconf.cacheroot = None
pubconf.miscroot = None
pubconf.germinateroot = None
pubconf.poolroot = os.path.join(pubconf.archiveroot, 'pool')
pubconf.distsroot = os.path.join(pubconf.archiveroot, 'dists')
meta_root = os.path.join(
pubconf.distroroot, archive.owner.name)
pubconf.metaroot = os.path.join(
meta_root, "meta", archive.name)
return pubconf
class Config(object):
"""Manage a publisher configuration from the database. (Read Only)
This class provides a useful abstraction so that if we change
how the database stores configuration then the publisher will not
need to be re-coded to cope"""
def setupArchiveDirs(self):
"""Create missing required directories in archive."""
required_directories = [
self.distroroot,
self.poolroot,
self.distsroot,
self.archiveroot,
self.cacheroot,
self.overrideroot,
self.miscroot,
self.germinateroot,
self.temproot,
]
for directory in required_directories:
if directory is None:
continue
if not os.path.exists(directory):
os.makedirs(directory, 0755)
|