iro/install.py
author Sandro Knauß <knauss@netzguerilla.net>
Fri, 10 Aug 2012 13:13:20 +0200
branchdevel
changeset 285 9eb5b7ff0e38
parent 267 ef2df3f23cb1
child 294 0e75bd39767d
permissions -rw-r--r--
small typo

# -*- test-case-name: iro.tests.test_install -*-

from twisted.python import log
import logging
from sqlalchemy import create_engine
from sqlalchemy.exc import DatabaseError
from sets import Set
import os

from .config import configParser, confFiles, main
from .error import NeededOption, ValidateException
from .offer.provider import providers, getProvider

from .model.schema import Base, Offer
from .model.utils import WithSession

from . import config

def checkConfig():
    """check configuration file syntax.

    :return: boolean value.
    """
            
    try:
        l = configParser.read(confFiles)
        if len(l) > 0:
            return True
        return False
    except (NeededOption,ValidateException) as e:
        log.msg("Error while processing config file: %s"%e,logLevel=logging.ERROR)
        return False

def checkDatabase():
    """Checks, if all tables are created.

    :return: boolean value
    """
    engine = create_engine(config.main.dburl)
    for t in Base.metadata.sorted_tables:
        if not t.exists(engine):
            return False
    return True

def checkDatabaseConnection():
    """Checks, if database can be connected.

    :return: boolean value
    """
    try:
        engine = create_engine(config.main.dburl)
        con = engine.connect()
        con.close()
        return True
    except DatabaseError as e:
        log.msg("Error while trying to connect to database\n%s"%e,logLevel=logging.ERROR)
        return False

def createDatabase():
    """Create all database tables or only missing."""
    engine = create_engine(config.main.dburl)
    Base.metadata.create_all(engine)

def createSampleConfig():
    """create a sample configuration file 'iro.conf' with all possible provider sections."""
    if not os.path.exists("iro.conf"):
        with open("iro.conf",'w') as fp:
            fp.write("\n".join(main.sampleConf()))
            fp.write("\n")
            k = providers.keys()
            k.sort()
            for p in k:
                fp.write("\n".join(providers[p](p).sampleConf()))
                fp.write("\n")
    else:
        log.msg("iro.conf exists and will not be overwritten.")

def getAllRoutes(providers,write=False):
    """Checks and update offer list.

    :param boolean write: check or update list
    :return dict:
        - **"orphand"** (Set) -- a set of orphand offers
        - **"added"** (Set) -- a set of new offers. The new name have a schema provider_typ_route
                
    """
    engine = create_engine(config.main.dburl)
    ret={"orphand":Set(),"added":Set()}
    with WithSession(engine,write) as session:
        ret["orphand"]=Set([i[0] for i in session.query(Offer.name).all()])
        for provider in providers:
            p=getProvider(provider,configParser.get(provider,"typ"),configParser.items(provider))
            for t in p.typs:
                for r in p.typs[t]:
                    try:
                        ret["orphand"].remove(Offer.get(session, provider, r, t).name)
                    except:
                        if write:
                            session.add(Offer(provider=provider,route=r,typ=t,name='%s_%s_%s'%(provider,t,r)))
                        ret["added"].add("%s_%s_%s"%(provider,t,r))
    return ret