]> git.ipfire.org Git - people/jschlag/pbs.git/blob - src/buildservice/__init__.py
The config now also passed as environment variables.
[people/jschlag/pbs.git] / src / buildservice / __init__.py
1 #!/usr/bin/python
2
3 from __future__ import absolute_import
4
5 import ConfigParser
6 import logging
7 import os
8 import pakfire
9
10 from . import arches
11 from . import bugtracker
12 from . import builders
13 from . import builds
14 from . import cache
15 from . import database
16 from . import distribution
17 from . import geoip
18 from . import jobqueue
19 from . import keys
20 from . import logs
21 from . import messages
22 from . import mirrors
23 from . import packages
24 from . import repository
25 from . import settings
26 from . import sessions
27 from . import sources
28 from . import updates
29 from . import uploads
30 from . import users
31
32 log = logging.getLogger("backend")
33 log.propagate = 1
34
35 # Import version
36 from .__version__ import VERSION as __version__
37
38 from .decorators import *
39 from .constants import *
40
41 class Backend(object):
42 def __init__(self, config_file=None):
43 # Read configuration file.
44 self.config = self.read_config(config_file)
45
46 # Global pakfire settings (from database).
47 self.settings = settings.Settings(self)
48
49 self.arches = arches.Arches(self)
50 self.builds = builds.Builds(self)
51 self.cache = cache.Cache(self)
52 self.geoip = geoip.GeoIP(self)
53 self.jobs = builds.Jobs(self)
54 self.builders = builders.Builders(self)
55 self.distros = distribution.Distributions(self)
56 self.jobqueue = jobqueue.JobQueue(self)
57 self.keys = keys.Keys(self)
58 self.messages = messages.Messages(self)
59 self.mirrors = mirrors.Mirrors(self)
60 self.packages = packages.Packages(self)
61 self.repos = repository.Repositories(self)
62 self.sessions = sessions.Sessions(self)
63 self.sources = sources.Sources(self)
64 self.updates = updates.Updates(self)
65 self.uploads = uploads.Uploads(self)
66 self.users = users.Users(self)
67
68 # Open a connection to bugzilla.
69 self.bugzilla = bugtracker.Bugzilla(self)
70
71 # A pool to store strings (for comparison).
72 self.pool = pakfire.satsolver.Pool("dummy")
73
74 def read_config(self, path):
75 c = ConfigParser.SafeConfigParser()
76
77 c.add_section("database")
78 c.set("database", "name", os.environ.get("PBS_DATABASE_NAME"))
79 c.set("database", "hostname", os.environ.get("PBS_DATABASE_HOSTNAME"))
80 c.set("database", "user", os.environ.get("PBS_DATABASE_USER"))
81 c.set("database", "password", os.environ.get("PBS_DATABASE_PASSWORD"))
82
83 # Load default configuration file first
84 paths = [
85 os.path.join(CONFIGSDIR, "pbs.conf"),
86 ]
87
88 if path:
89 paths.append(path)
90
91 # Load all configuration files
92 for path in paths:
93 if os.path.exists(path):
94 log.debug("Loading configuration from %s" % path)
95 c.read(path)
96 else:
97 log.error("No such file %s" % path)
98
99 return c
100
101 @lazy_property
102 def db(self):
103 try:
104 name = self.config.get("database", "name")
105 hostname = self.config.get("database", "hostname")
106 user = self.config.get("database", "user")
107 password = self.config.get("database", "password")
108 except ConfigParser.Error as e:
109 log.error("Error parsing the config: %s" % e.message)
110
111 log.debug("Connecting to database %s @ %s" % (name, hostname))
112
113 return database.Connection(hostname, name, user=user, password=password)
114
115 def cleanup_files(self):
116 query = self.db.query("SELECT * FROM queue_delete")
117
118 for row in query:
119 if not row.path:
120 continue
121
122 path = os.path.join(PACKAGES_DIR, row.path)
123
124 try:
125 logging.debug("Removing %s..." % path)
126 os.unlink(path)
127 except OSError, e:
128 logging.error("Could not remove %s: %s" % (path, e))
129
130 while True:
131 path = os.path.dirname(path)
132
133 # Stop if we are running outside of the tree.
134 if not path.startswith(PACKAGES_DIR):
135 break
136
137 # If the directory is not empty, we cannot remove it.
138 if os.path.exists(path) and os.listdir(path):
139 break
140
141 try:
142 logging.debug("Removing %s..." % path)
143 os.rmdir(path)
144 except OSError, e:
145 logging.error("Could not remove %s: %s" % (path, e))
146 break
147
148 self.db.execute("DELETE FROM queue_delete WHERE id = %s", row.id)