]> kaliko git repositories - mpd-sima.git/blobdiff - sima/utils/config.py
Improved CLI error handling
[mpd-sima.git] / sima / utils / config.py
index e9da8f8f4c245f72b38a27f58f4e97df654c0002..0e775ecc54d5c1294daebdc643b1250fe3037d0f 100644 (file)
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# Copyright (c) 2009, 2010, 2011, 2013, 2014 Jack Kaliko <kaliko@azylum.org>
+# Copyright (c) 2009, 2010, 2011, 2013, 2014, 2015 Jack Kaliko <kaliko@azylum.org>
 #
 #  This file is part of sima
 #
@@ -25,18 +25,19 @@ Parse configuration file and set defaults for missing options.
 
 # IMPORTS
 import configparser
+import logging
 import sys
 
 from configparser import Error
-from os import (makedirs, environ, stat, chmod)
-from os.path import (join, isdir, isfile)
+from os import (access, makedirs, environ, stat, chmod, W_OK, R_OK)
+from os.path import (join, isdir, isfile, dirname, exists)
 from stat import (S_IMODE, ST_MODE, S_IRWXO, S_IRWXG)
 
 from . import utils
 
 # DEFAULTS
 DIRNAME = 'mpd_sima'
-CONF_FILE = 'sima.cfg'
+CONF_FILE = 'mpd_sima.cfg'
 
 DEFAULT_CONF = {
         'MPD': {
@@ -49,8 +50,9 @@ DEFAULT_CONF = {
             'contrib': "",
             'user_db': "false",
             'history_duration': 8,
-            'queue_length': 1,
+            'queue_length': 2,
             'var_dir': 'empty',
+            'musicbrainzid': "true",
             },
         'daemon':{
             'daemon': False,
@@ -105,8 +107,8 @@ class ConfMan(object):  # CONFIG MANAGER CLASS
         * command line options (overrides previous)
     """
 
-    def __init__(self, logger, options=None):
-        self.log = logger
+    def __init__(self, options=None):
+        self.log = logging.getLogger('sima')
         # options settings priority:
         # defauts < env. var. < conf. file < command line
         self.conf_file = options.get('conf_file')
@@ -119,22 +121,39 @@ class ConfMan(object):  # CONFIG MANAGER CLASS
         ## INIT CALLS
         self.init_config()
         self.supersedes_config_with_cmd_line_options()
+        # Controls files access
+        self.control_facc()
         # generate dbfile
         self.config['sima']['db_file'] = join(self.config['sima']['var_dir'], 'sima.db')
 
-    def get_pw(self):
-        try:
-            self.config.getboolean('MPD', 'password')
-            self.log.debug('No password set, proceeding without ' +
-                           'authentication...')
-            return None
-        except ValueError:
-            # ValueError if password not a boolean, hence an actual password.
-            pwd = self.config.get('MPD', 'password')
-            if not pwd:
-                self.log.debug('Password set as an empty string.')
-                return None
-            return pwd
+    def control_facc(self):
+        """Controls file access.
+        This is relevant only for file provided through the configuration file
+        since files provided on the command line are already checked with
+        argparse.
+        """
+        ok = True
+        for op, ftochk in [('log', self.config['log']['logfile']),
+                           ('pidfile', self.config['daemon']['pidfile']),]:
+            if not ftochk:
+                continue
+            if isdir(ftochk):
+                self.log.critical('Need a file not a directory: "{}"'.format(ftochk))
+                ok = False
+            if not exists(ftochk):
+                # Is parent directory writable then
+                filedir = dirname(ftochk)
+                if not access(filedir, W_OK):
+                    self.log.critical('no write access to "{0}" ({1})'.format(filedir, op))
+                    ok = False
+            else:
+                if not access(ftochk, W_OK):
+                    self.log.critical('no write access to "{0}" ({1})'.format(ftochk, op))
+                    ok = False
+        if not ok:
+            if exists(self.conf_file):
+                self.log.warning('Try to check the configuration file: {}'.format(self.conf_file))
+            sys.exit(2)
 
     def control_mod(self):
         """
@@ -204,8 +223,8 @@ class ConfMan(object):  # CONFIG MANAGER CLASS
                 chmod(conf_dir, 0o700)
             self.conf_file = join(conf_dir, CONF_FILE)
         else:
-            self.log.error('Can\'t find a suitable location for config folder (XDG_CONFIG_HOME)')
-            self.log.error('Please use "--config" to locate the conf file')
+            self.log.critical('Can\'t find a suitable location for config folder (XDG_CONFIG_HOME)')
+            self.log.critical('Please use "--config" to locate the conf file')
             sys.exit(1)
 
         ## Sima sqlite DB