config.py 4.35 KB
Newer Older
1
#
David Trattnig's avatar
David Trattnig committed
2
3
4
# Aura Engine (https://gitlab.servus.at/aura/engine)
#
# Copyright (C) 2017-2020 - The Aura Engine Team.
5
#
6
7
8
9
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
David Trattnig's avatar
David Trattnig committed
10
#
11
12
13
14
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
David Trattnig's avatar
David Trattnig committed
15
#
16
17
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
18

David Trattnig's avatar
David Trattnig committed
19

20
import os
21
import os.path
22
23
24
import sys
import logging

25
from pathlib import Path
26
from configparser import ConfigParser
27
28
29


class AuraConfig:
30
31
32
33
34
    """ 
    AuraConfig Class
    
    Holds the Aura Configuration as in the file `engine.ini`.
    """
35
36
37
    ini_path = ""
    logger = None

38
39
40
41
42
43
44
45
46
47
48
49
50
51

    def __init__(self, ini_path="/etc/aura/engine.ini"): 
        """
        Initializes the configuration, defaults to `/etc/aura/engine.ini`.
        If this file doesn't exist it uses `./configuration/engine.ini` from
        the project directory.

        Args:
            ini_path(String):      The path to the configuration file `engine.ini`
        """
        config_file = Path(ini_path)
        if not config_file.is_file():
            ini_path = "%s/configuration/engine.ini" % Path(__file__).parent.parent.parent.absolute()

52
53
54
55
        self.ini_path = ini_path
        self.logger = logging.getLogger("AuraEngine")
        self.load_config()

56
57


58
59
    def set(self, key, value):
        """
David Trattnig's avatar
David Trattnig committed
60
61
62
63
64
        Setter for some specific config property.

        Args:
            key (String):   key
            default (*):    value
65
66
67
68
69
70
        """
        try:
            self.__dict__[key] = int(value)
        except:
            self.__dict__[key] = str(value)

David Trattnig's avatar
David Trattnig committed
71
72


73
74
    def get(self, key, default=None):
        """
David Trattnig's avatar
David Trattnig committed
75
        Getter for some specific config property.
76

David Trattnig's avatar
David Trattnig committed
77
78
79
80
        Args:
            key (String):   key
            default (*):    value
        """
81
82
83
84
85
86
        if key not in self.__dict__:
            if default:
                self.set(key, default)
            else:
                self.logger.warning("Key " + key + " not found in configfile " + self.ini_path + "!")
                return None
87

88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
        if key == "loglevel":
            loglvl = self.__dict__[key]

            if loglvl == "debug":
                return logging.DEBUG
            elif loglvl == "info":
                return logging.INFO
            elif loglvl == "warning":
                return logging.WARNING
            elif loglvl == "error":
                return logging.ERROR
            else:
                return logging.CRITICAL

        if key == "debug":
            return self.__dict__[key].count("y")

        return self.__dict__[key]

David Trattnig's avatar
David Trattnig committed
107
108


109
    def load_config(self):
110
        """
111
        Set config defaults and load settings from file
112
        """
113
114
115
116
        if not os.path.isfile(self.ini_path):
            self.logger.critical(self.ini_path + " not found  :(")
            sys.exit(1)

David Trattnig's avatar
David Trattnig committed
117
        # Read the file
118
119
120
121
        f = open(self.ini_path, 'r')
        ini_str = f.read()
        f.close()

David Trattnig's avatar
David Trattnig committed
122
        # Parse the values
123
124
125
126
127
128
129
130
131
132
133
134
        config_parser = ConfigParser()
        try:
            config_parser.read_string(ini_str)
        except Exception as e:
            self.logger.critical("Cannot read " + self.ini_path + "! Reason: " + str(e))
            sys.exit(0)

        for section in config_parser.sections():
            for key, value in config_parser.items(section):
                v = config_parser.get(section, key).replace('"', '').strip()
                self.set(key, v)

135
        # Custom overrides and defaults
136
        self.set("install_dir", os.path.realpath(__file__ + "../../../.."))
David Trattnig's avatar
David Trattnig committed
137
        self.set("use_test_data", False)
138
        self.set("api_prefix", "/api/v1")
David Trattnig's avatar
David Trattnig committed
139
140
141
142
143
144
145
146
147
148
149
150
151



    def get_database_uri(self):
        """
        Retrieves the database connection string.
        """
        db_name = self.get("db_name")
        db_user = self.get("db_user")
        db_pass = self.get("db_pass")
        db_host = self.get("db_host")
        db_charset = self.get("db_charset", "utf8")
        return "mysql://" + db_user + ":" + db_pass + "@" + db_host + "/" + db_name + "?charset=" + db_charset