]> git.ipfire.org Git - people/jschlag/pbs.git/blame - src/buildservice/__init__.py
Initialise database connection only when we need it
[people/jschlag/pbs.git] / src / buildservice / __init__.py
CommitLineData
9137135a
MT
1#!/usr/bin/python
2
2c909128
MT
3from __future__ import absolute_import
4
085af6d4
MT
5import ConfigParser
6import logging
7import os
8import pakfire
9
10from . import arches
11from . import bugtracker
12from . import builders
13from . import builds
14from . import cache
15from . import database
16from . import distribution
17from . import keys
18from . import logs
19from . import messages
20from . import mirrors
21from . import packages
22from . import repository
23from . import settings
24from . import sessions
25from . import sources
26from . import updates
27from . import uploads
28from . import users
29
5c8b4bfd 30from .decorators import *
085af6d4
MT
31from .constants import *
32
57859ebc 33class Backend(object):
085af6d4
MT
34 def __init__(self, config_file="pbs.conf"):
35 # Read configuration file.
36 self.config = self.read_config(config_file)
37
38 # Connect to databases.
085af6d4
MT
39 self.geoip_db = self.connect_database("geoip-database")
40
41 # Global pakfire settings (from database).
42 self.settings = settings.Settings(self)
43
44 self.arches = arches.Arches(self)
45 self.builds = builds.Builds(self)
46 self.cache = cache.Cache(self)
47 self.geoip = mirrors.GeoIP(self)
48 self.jobs = builds.Jobs(self)
49 self.builders = builders.Builders(self)
50 self.distros = distribution.Distributions(self)
51 self.keys = keys.Keys(self)
52 self.messages = messages.Messages(self)
53 self.mirrors = mirrors.Mirrors(self)
54 self.packages = packages.Packages(self)
55 self.repos = repository.Repositories(self)
56 self.sessions = sessions.Sessions(self)
57 self.sources = sources.Sources(self)
58 self.updates = updates.Updates(self)
59 self.uploads = uploads.Uploads(self)
60 self.users = users.Users(self)
61
62 # Open a connection to bugzilla.
63 self.bugzilla = bugtracker.Bugzilla(self)
64
65 # A pool to store strings (for comparison).
66 self.pool = pakfire.satsolver.Pool("dummy")
67
085af6d4
MT
68 def read_config(self, path):
69 c = ConfigParser.SafeConfigParser()
70 c.read(path)
71
72 return c
73
5c8b4bfd
MT
74 @lazy_property
75 def db(self):
76 return self.connect_database()
77
085af6d4
MT
78 def connect_database(self, section="database"):
79 db = self.config.get(section, "db")
80 host = self.config.get(section, "host")
81 user = self.config.get(section, "user")
82
83 if self.config.has_option(section, "pass"):
84 pw = self.config.get(section, "pass")
85 else:
86 pw = None
87
88 return database.Connection(host, db, user=user, password=pw)
89
90 def cleanup_files(self):
91 query = self.db.query("SELECT * FROM queue_delete")
92
93 for row in query:
94 if not row.path:
95 continue
96
97 path = os.path.join(PACKAGES_DIR, row.path)
98
99 try:
100 logging.debug("Removing %s..." % path)
101 os.unlink(path)
102 except OSError, e:
103 logging.error("Could not remove %s: %s" % (path, e))
104
105 while True:
106 path = os.path.dirname(path)
107
108 # Stop if we are running outside of the tree.
109 if not path.startswith(PACKAGES_DIR):
110 break
111
112 # If the directory is not empty, we cannot remove it.
113 if os.path.exists(path) and os.listdir(path):
114 break
115
116 try:
117 logging.debug("Removing %s..." % path)
118 os.rmdir(path)
119 except OSError, e:
120 logging.error("Could not remove %s: %s" % (path, e))
121 break
122
123 self.db.execute("DELETE FROM queue_delete WHERE id = %s", row.id)