iro/install.py
author Sandro Knauß <bugs@sandroknauss.de>
Tue, 15 Apr 2025 01:22:19 +0200
changeset 316 63c681b8e92c
parent 294 0e75bd39767d
permissions -rw-r--r--
fix link to about.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
294
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
     1
# Copyright (c) 2012 netzguerilla.net <iro@netzguerilla.net>
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
     2
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
     3
# This file is part of Iro.
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
     4
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
     5
# Permission is hereby granted, free of charge, to any person obtaining a copy of
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
     6
# this software and associated documentation files (the "Software"), to deal in
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
     7
# the Software without restriction, including without limitation the rights to use,
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
     8
# copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
     9
# #Software, and to permit persons to whom the Software is furnished to do so,
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
    10
# subject to the following conditions:
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
    11
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
    12
# The above copyright notice and this permission notice shall be included in
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
    13
# all copies or substantial portions of the Software.
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
    14
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
    15
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
    16
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
    17
# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
    18
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
    19
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
    20
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 285
diff changeset
    21
242
745d829d1e02 tests for iro.install.getAllRoutes added
Sandro Knauß <knauss@netzguerilla.net>
parents: 226
diff changeset
    22
# -*- test-case-name: iro.tests.test_install -*-
745d829d1e02 tests for iro.install.getAllRoutes added
Sandro Knauß <knauss@netzguerilla.net>
parents: 226
diff changeset
    23
221
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    24
from twisted.python import log
226
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
    25
import logging
221
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    26
from sqlalchemy import create_engine
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    27
from sqlalchemy.exc import DatabaseError
226
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
    28
from sets import Set
221
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    29
import os
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    30
226
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
    31
from .config import configParser, confFiles, main
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
    32
from .error import NeededOption, ValidateException
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
    33
from .offer.provider import providers, getProvider
221
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    34
226
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
    35
from .model.schema import Base, Offer
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
    36
from .model.utils import WithSession
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
    37
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
    38
from . import config
221
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    39
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    40
def checkConfig():
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
    41
    """check configuration file syntax.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
    42
285
9eb5b7ff0e38 small typo
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
    43
    :return: boolean value.
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
    44
    """
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
    45
            
221
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    46
    try:
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    47
        l = configParser.read(confFiles)
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    48
        if len(l) > 0:
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    49
            return True
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    50
        return False
226
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
    51
    except (NeededOption,ValidateException) as e:
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
    52
        log.msg("Error while processing config file: %s"%e,logLevel=logging.ERROR)
221
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    53
        return False
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    54
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    55
def checkDatabase():
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
    56
    """Checks, if all tables are created.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
    57
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
    58
    :return: boolean value
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
    59
    """
221
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    60
    engine = create_engine(config.main.dburl)
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    61
    for t in Base.metadata.sorted_tables:
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    62
        if not t.exists(engine):
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    63
            return False
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    64
    return True
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    65
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    66
def checkDatabaseConnection():
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
    67
    """Checks, if database can be connected.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
    68
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
    69
    :return: boolean value
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
    70
    """
221
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    71
    try:
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    72
        engine = create_engine(config.main.dburl)
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    73
        con = engine.connect()
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    74
        con.close()
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    75
        return True
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    76
    except DatabaseError as e:
226
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
    77
        log.msg("Error while trying to connect to database\n%s"%e,logLevel=logging.ERROR)
221
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    78
        return False
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    79
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    80
def createDatabase():
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
    81
    """Create all database tables or only missing."""
221
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    82
    engine = create_engine(config.main.dburl)
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    83
    Base.metadata.create_all(engine)
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    84
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    85
def createSampleConfig():
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
    86
    """create a sample configuration file 'iro.conf' with all possible provider sections."""
221
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    87
    if not os.path.exists("iro.conf"):
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    88
        with open("iro.conf",'w') as fp:
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    89
            fp.write("\n".join(main.sampleConf()))
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    90
            fp.write("\n")
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    91
            k = providers.keys()
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    92
            k.sort()
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    93
            for p in k:
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    94
                fp.write("\n".join(providers[p](p).sampleConf()))
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    95
                fp.write("\n")
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    96
    else:
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    97
        log.msg("iro.conf exists and will not be overwritten.")
c8615310da30 adding install functions like checkDatabase, checkConfig etc. + tests
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    98
226
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
    99
def getAllRoutes(providers,write=False):
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
   100
    """Checks and update offer list.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
   101
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
   102
    :param boolean write: check or update list
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
   103
    :return dict:
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
   104
        - **"orphand"** (Set) -- a set of orphand offers
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
   105
        - **"added"** (Set) -- a set of new offers. The new name have a schema provider_typ_route
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
   106
                
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 242
diff changeset
   107
    """
226
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
   108
    engine = create_engine(config.main.dburl)
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
   109
    ret={"orphand":Set(),"added":Set()}
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
   110
    with WithSession(engine,write) as session:
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
   111
        ret["orphand"]=Set([i[0] for i in session.query(Offer.name).all()])
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
   112
        for provider in providers:
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
   113
            p=getProvider(provider,configParser.get(provider,"typ"),configParser.items(provider))
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
   114
            for t in p.typs:
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
   115
                for r in p.typs[t]:
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
   116
                    try:
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
   117
                        ret["orphand"].remove(Offer.get(session, provider, r, t).name)
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
   118
                    except:
242
745d829d1e02 tests for iro.install.getAllRoutes added
Sandro Knauß <knauss@netzguerilla.net>
parents: 226
diff changeset
   119
                        if write:
745d829d1e02 tests for iro.install.getAllRoutes added
Sandro Knauß <knauss@netzguerilla.net>
parents: 226
diff changeset
   120
                            session.add(Offer(provider=provider,route=r,typ=t,name='%s_%s_%s'%(provider,t,r)))
226
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
   121
                        ret["added"].add("%s_%s_%s"%(provider,t,r))
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
   122
    return ret
5f1e9eb30709 adding install.getAllRoutes
Sandro Knauß <knauss@netzguerilla.net>
parents: 221
diff changeset
   123