iro/install.py
changeset 302 3f4bdea2abbf
parent 294 0e75bd39767d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/iro/install.py	Thu Sep 27 17:15:46 2012 +0200
@@ -0,0 +1,123 @@
+# Copyright (c) 2012 netzguerilla.net <iro@netzguerilla.net>
+# 
+# This file is part of Iro.
+# 
+# Permission is hereby granted, free of charge, to any person obtaining a copy of
+# this software and associated documentation files (the "Software"), to deal in
+# the Software without restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+# #Software, and to permit persons to whom the Software is furnished to do so,
+# subject to the following conditions:
+# 
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+# 
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+# -*- 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
+