]> kaliko git repositories - mpd-sima.git/blobdiff - sima/utils/utils.py
simadb: Propagate add option
[mpd-sima.git] / sima / utils / utils.py
index ff0641057afdb57ce11c57131202f9d6378cbac0..b9dc980c37f5a109b207e133b660df4bb26517df 100644 (file)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (c) 2010, 2011, 2013, 2014 Jack Kaliko <kaliko@azylum.org>
+# Copyright (c) 2010, 2011, 2013, 2014, 2015, 2020 kaliko <kaliko@azylum.org>
 #
 #  This file is part of sima
 #
@@ -22,6 +22,7 @@
 """
 # pylint: disable=C0111
 
+import logging
 import traceback
 import sys
 
@@ -29,7 +30,7 @@ from argparse import ArgumentError, Action
 from base64 import b64decode as push
 from codecs import getencoder
 from datetime import datetime
-from os import environ, access, getcwd, W_OK, R_OK
+from os import getenv, access, getcwd, W_OK, R_OK
 from os.path import dirname, isabs, join, normpath, exists, isdir, isfile
 from time import sleep
 
@@ -42,23 +43,36 @@ def getws(dic):
     """
     aka = push(bytes(dic.get('apikey') + '=', 'utf-8'))
     aka = getencoder('rot-13')(str((aka), 'utf-8'))[0]
-    dic.update({'apikey':aka})
+    dic.update({'apikey': aka})
+
+def parse_mpd_host(value):
+    passwd = host = None
+    # If password is set: MPD_HOST=pass@host
+    if '@' in value:
+        mpd_host_env = value.split('@', 1)
+        if mpd_host_env[0]:
+            # A password is actually set
+            passwd = mpd_host_env[0]
+            if mpd_host_env[1]:
+                host = mpd_host_env[1]
+        elif mpd_host_env[1]:
+            # No password set but leading @ is an abstract socket
+            host = '@'+mpd_host_env[1]
+    else:
+        # MPD_HOST is a plain host
+        host = value
+    return host, passwd
+
 
 def get_mpd_environ():
     """
     Retrieve MPD env. var.
     """
     passwd = host = None
-    mpd_host_env = environ.get('MPD_HOST')
-    if mpd_host_env:
-        # If password is set:
-        # mpd_host_env = ['pass', 'host'] because MPD_HOST=pass@host
-        mpd_host_env = mpd_host_env.split('@')
-        mpd_host_env.reverse()
-        host = mpd_host_env[0]
-        if len(mpd_host_env) > 1 and mpd_host_env[1]:
-            passwd = mpd_host_env[1]
-    return (host, environ.get('MPD_PORT', None), passwd)
+    if getenv('MPD_HOST'):
+        host, passwd = parse_mpd_host(getenv('MPD_HOST'))
+    return (host, getenv('MPD_PORT', None), passwd)
+
 
 def normalize_path(path):
     """Get absolute path
@@ -67,10 +81,10 @@ def normalize_path(path):
         return normpath(join(getcwd(), path))
     return path
 
+
 def exception_log():
     """Log unknown exceptions"""
-    import logging
-    log = logging.getLogger('sima')
+    log = logging.getLogger(__name__)
     log.error('Unhandled Exception!!!')
     log.error(''.join(traceback.format_exc()))
     log.info('Please report the previous message'
@@ -82,7 +96,7 @@ def exception_log():
 
 class SigHup(Exception):
     """SIGHUP raises this Exception"""
-    pass
+
 
 # ArgParse Callbacks
 class Obsolete(Action):
@@ -92,6 +106,7 @@ class Obsolete(Action):
     def __call__(self, parser, namespace, values, option_string=None):
         raise ArgumentError(self, 'obsolete argument')
 
+
 class FileAction(Action):
     """Generic class to inherit from for ArgParse action on file/dir
     """
@@ -106,16 +121,18 @@ class FileAction(Action):
     def checks(self):
         """control method
         """
-        pass
+
 
 class Wfile(FileAction):
     # pylint: disable=R0903
     """Is file writable
     """
     def checks(self):
+        if isdir(self._file):
+            self.parser.error('need a file not a directory: {}'.format(self._file))
         if not exists(self._dir):
             #raise ArgumentError(self, '"{0}" does not exist'.format(self._dir))
-            self.parser.error('file does not exist: {0}'.format(self._dir))
+            self.parser.error('directory does not exist: {0}'.format(self._dir))
         if not exists(self._file):
             # Is parent directory writable then
             if not access(self._dir, W_OK):
@@ -124,6 +141,7 @@ class Wfile(FileAction):
             if not access(self._file, W_OK):
                 self.parser.error('no write access to "{0}"'.format(self._file))
 
+
 class Rfile(FileAction):
     # pylint: disable=R0903
     """Is file readable
@@ -136,6 +154,7 @@ class Rfile(FileAction):
         if not access(self._file, R_OK):
             self.parser.error('no read access to "{0}"'.format(self._file))
 
+
 class Wdir(FileAction):
     # pylint: disable=R0903
     """Is directory writable
@@ -148,6 +167,7 @@ class Wdir(FileAction):
         if not access(self._file, W_OK):
             self.parser.error('no write access to "{0}"'.format(self._file))
 
+
 class Throttle:
     """throttle decorator"""
     def __init__(self, wait):
@@ -163,20 +183,30 @@ class Throttle:
             return result
         return wrapper
 
-# http client exceptions (for webservices)
 
-class WSError(Exception):
+class MPDSimaException(Exception):
+    """Generic MPD_sima Exception"""
+
+
+# http client exceptions (for webservices)
+class WSError(MPDSimaException):
     pass
 
+
 class WSNotFound(WSError):
     pass
 
+
 class WSTimeout(WSError):
     pass
 
+
 class WSHTTPError(WSError):
     pass
 
 
+class PluginException(MPDSimaException):
+    pass
+
 # VIM MODLINE
 # vim: ai ts=4 sw=4 sts=4 expandtab