-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpackage_repository.py
More file actions
134 lines (114 loc) · 4.92 KB
/
package_repository.py
File metadata and controls
134 lines (114 loc) · 4.92 KB
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
127
128
129
130
131
132
133
__author__ = 'dim'
from tempfile import mkdtemp
from sh import grep_dctrl
from sh import wget
from sh import awk
from sh import zcat
import os.path, time
class PackageRepository():
def __init__(self, name):
self.name = name
self.base_url = ''
self.packages_gz_url = ''
self.local_packages_gz = ''
self.cache_threshold_sec = 60 * 60
self.broken = False
print("")
print("New repository '{0}'".format(name))
def grep_package(self, name, pattern="(^|-){0}$"):
try:
return [
line.rstrip().split(' ', 1)
for line in awk(
grep_dctrl(
zcat(self.local_packages_gz),
'-F', 'Package',
'-e', pattern.format(name),
'-s', 'Package,Version'
),
'/Package/{p=$2;next} /Version/{print p " " $2}'
)
]
except:
return []
def test_cache(self):
if self.local_packages_gz:
if os.path.exists(self.local_packages_gz):
file_age = time.time() - os.path.getctime(self.local_packages_gz)
if file_age > self.cache_threshold_sec:
print("File '{0}' too old.".format(self.local_packages_gz))
return False
else:
print("No such file '{0}'".format(self.local_packages_gz))
return False
else:
print("Local Packages.gz isn't defined yet.")
return False
print("Cached file is up-to-date (updated {0} sec ago).".format(file_age))
return True
def update_cache(self):
if not self.test_cache():
print("Downloading file ...")
self.local_packages_gz = mkdtemp() + "/Packages.gz"
try:
wget(self.packages_gz_url, '-O', self.local_packages_gz)
except:
self.broken = True
def __str__(self):
return "Remote URL: {0}, Cached file: {1}".format(
self.packages_gz_url,
self.local_packages_gz
)
class MirantisOSCIRepository(PackageRepository):
def __init__(self, name='Mirantis OSCI Repository', dist_name='ubuntu',
dist_release='precise', fuel_release='5.0', fuel_type='stable'):
PackageRepository.__init__(self, name=name)
#self.base_url = 'http://osci-obs.vm.mirantis.net:82'
self.base_url = 'http://fuel-repository.mirantis.com/osci'
self.dist_name = dist_name
self.dist_release = dist_release
self.fuel_release = fuel_release
self.fuel_type = fuel_type
self.packages_gz_url = "{0}/{1}-fuel-{2}-{3}/{1}/Packages.gz".format(
self.base_url, self.dist_name, self.fuel_release, self.fuel_type)
class MirantisPublicRepository(PackageRepository):
def __init__(self, name='Mirantis Public Repository', dist_name='ubuntu',
dist_release='precise', fuel_release='5.0', fuel_type='stable'):
PackageRepository.__init__(self, name=name)
self.base_url = 'http://fuel-repository.mirantis.com/fwm'
self.dist_name = dist_name
self.dist_release = dist_release
self.fuel_release = fuel_release
self.fuel_type = fuel_type
self.packages_gz_url = "{0}/{1}/{2}/dists/{3}/main/binary-amd64/Packages.gz".format(
self.base_url, fuel_release, dist_name, dist_release)
class UbuntuPublicRepository(PackageRepository):
def __init__(self, name='Ubuntu Public Repository', dist_name='ubuntu',
dist_release='precise', fuel_release='5.0', fuel_type='stable'):
PackageRepository.__init__(self, name=name)
self.base_url = 'http://ru.archive.ubuntu.com'
self.dist_name = dist_name
self.dist_release = dist_release
self.fuel_release = fuel_release
self.fuel_type = fuel_type
self.packages_gz_url = "{0}/{1}/dists/{2}/main/binary-amd64/Packages.gz".format(
self.base_url, dist_name, dist_release)
class PackageRepositorySet():
def __init__(self):
self.repository_list = []
self.custom_package_set = None
def add(self, repository):
repository.update_cache()
if repository.broken:
print("Repository '{0}' is broken.".format(repository.name))
return
print("Adding repository '{0}' ({1})".format(repository.name, repository.packages_gz_url))
self.repository_list.append(repository)
def add_custom_packages(self, custom_package_set=None):
self.custom_package_set = custom_package_set
def grep_package(self, name):
for repository in self.repository_list:
if name in self.custom_package_set:
name = self.custom_package_set.deb_package_for(name)
for p, v in repository.grep_package(name=name):
yield repository, p, v