1
2
3
4 from __future__ import with_statement
5
6 import os
7 import flask
8
9 from werkzeug.routing import RequestRedirect
10 from flask_sqlalchemy import SQLAlchemy
11 from contextlib import contextmanager
12 try:
13 from flask_caching import Cache
14 except ImportError:
15 from flask_cache import Cache
16 from flask_openid import OpenID
17 from flask_whooshee import Whooshee
18 from openid_teams.teams import TeamsResponse
19
20 from coprs.redis_session import RedisSessionInterface
21
22 app = flask.Flask(__name__)
23 if "COPRS_ENVIRON_PRODUCTION" in os.environ:
24 app.config.from_object("coprs.config.ProductionConfig")
25 elif "COPRS_ENVIRON_UNITTEST" in os.environ:
26 app.config.from_object("coprs.config.UnitTestConfig")
27 else:
28 app.config.from_object("coprs.config.DevelopmentConfig")
29 if os.environ.get("COPR_CONFIG"):
30 app.config.from_envvar("COPR_CONFIG")
31 else:
32 app.config.from_pyfile("/etc/copr/copr.conf", silent=True)
33
34 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
35
36 oid = OpenID(
37 app, app.config["OPENID_STORE"],
38 safe_roots=[],
39 extension_responses=[TeamsResponse]
40 )
41
42 db = SQLAlchemy(app)
46 """Provide a transactional scope around a series of operations."""
47 session = db.session
48 try:
49 yield session
50 session.commit()
51 except Exception as err:
52 session.rollback()
53 raise
54
55 whooshee = Whooshee(app)
56
57
58 import coprs.filters
59 import coprs.log
60 from coprs.log import setup_log
61 import coprs.whoosheers
62
63 from coprs.helpers import RedisConnectionProvider
64 rcp = RedisConnectionProvider(config=app.config)
65 app.session_interface = RedisSessionInterface(rcp.get_connection())
66
67 cache_rcp = RedisConnectionProvider(config=app.config, db=1)
68 cache = Cache(app, config={
69 'CACHE_TYPE': 'redis',
70 'CACHE_REDIS_DB': 1,
71 'CACHE_KEY_PREFIX': 'copr_cache_',
72 'CACHE_REDIS_HOST': cache_rcp.host,
73 'CACHE_REDIS_PORT': cache_rcp.port,
74 })
75
76 from coprs.views import admin_ns
77 from coprs.views.admin_ns import admin_general
78 from coprs.views import api_ns
79 from coprs.views.api_ns import api_general
80 from coprs.views import apiv3_ns
81 from coprs.views.apiv3_ns import (apiv3_general, apiv3_builds, apiv3_packages, apiv3_projects, apiv3_project_chroots,
82 apiv3_modules, apiv3_build_chroots, apiv3_mock_chroots,
83 apiv3_permissions)
84
85 from coprs.views import batches_ns
86 from coprs.views.batches_ns import coprs_batches
87 from coprs.views import coprs_ns
88 from coprs.views.coprs_ns import coprs_builds
89 from coprs.views.coprs_ns import coprs_general
90 from coprs.views.coprs_ns import coprs_chroots
91 from coprs.views.coprs_ns import coprs_packages
92 from coprs.views import backend_ns
93 from coprs.views.backend_ns import backend_general
94 from coprs.views import misc
95 from coprs.views import status_ns
96 from coprs.views.status_ns import status_general
97 from coprs.views import recent_ns
98 from coprs.views.recent_ns import recent_general
99 from coprs.views.stats_ns import stats_receiver
100 from coprs.views import tmp_ns
101 from coprs.views.tmp_ns import tmp_general
102 from coprs.views.groups_ns import groups_ns
103 from coprs.views.groups_ns import groups_general
104 from coprs.views.user_ns import user_ns
105 from coprs.views.user_ns import user_general
106 from coprs.views.webhooks_ns import webhooks_ns
107 from coprs.views.webhooks_ns import webhooks_general
108 from coprs.views.rss_ns import rss_ns
109 from coprs.views.rss_ns import rss_general
110 from coprs.exceptions import (
111 AccessRestricted,
112 BadRequest,
113 CoprHttpException,
114 ConflictingRequest,
115 MalformedArgumentException,
116 ObjectNotFound,
117 NonAdminCannotCreatePersistentProject,
118 NonAdminCannotDisableAutoPrunning,
119 )
120 from coprs.error_handlers import get_error_handler
121 from .context_processors import include_banner, inject_fedmenu, counter_processor
122
123 setup_log()
124
125 app.register_blueprint(api_ns.api_ns)
126 app.register_blueprint(apiv3_ns.apiv3_ns)
127 app.register_blueprint(admin_ns.admin_ns)
128 app.register_blueprint(batches_ns.batches_ns)
129 app.register_blueprint(coprs_ns.coprs_ns)
130 app.register_blueprint(misc.misc)
131 app.register_blueprint(backend_ns.backend_ns)
132 app.register_blueprint(status_ns.status_ns)
133 app.register_blueprint(recent_ns.recent_ns)
134 app.register_blueprint(stats_receiver.stats_rcv_ns)
135 app.register_blueprint(tmp_ns.tmp_ns)
136 app.register_blueprint(groups_ns)
137 app.register_blueprint(user_ns)
138 app.register_blueprint(webhooks_ns)
139 app.register_blueprint(rss_ns)
140
141 app.add_url_rule("/", "coprs_ns.coprs_show", coprs_general.coprs_show)
146 return error.get_response(None)
147
153
154
155 app.jinja_env.trim_blocks = True
156 app.jinja_env.lstrip_blocks = True
157
158 from coprs.rest_api import rest_api_bp, register_api_error_handler, URL_PREFIX
159 register_api_error_handler(app)
160 app.register_blueprint(rest_api_bp, url_prefix=URL_PREFIX)
161
162
163 from flask_sqlalchemy import models_committed
164 models_committed.connect(coprs.whoosheers.CoprWhoosheer.on_commit, sender=app)
165
166
167 @app.route('/system_static/<component>/<path:filename>')
168 @app.route('/system_static/<path:filename>')
169 -def system_static(filename, component=""):
170 """
171 :param component: name of the javascript component provided by a RPM package
172 do not confuse with a name of the RPM package itself
173 (e.g. 'jquery' component is provided by 'js-jquery' package)
174 :param filename: path to a file relative to the component root directory
175 :return: content of a static file
176 """
177 path = os.path.join("/usr/share/javascript", component)
178 return flask.send_from_directory(path, filename)
179