]> git.ipfire.org Git - ipfire-2.x.git/commitdiff
ddns: Add upstream patch for fixing bug 10815.
authorStefan Schantl <stefan.schantl@ipfire.org>
Sun, 26 Apr 2015 15:12:55 +0000 (17:12 +0200)
committerStefan Schantl <stefan.schantl@ipfire.org>
Sun, 26 Apr 2015 15:12:55 +0000 (17:12 +0200)
lfs/ddns
src/patches/ddns/ddns-007-perform-lazy-database-init.patch [new file with mode: 0644]

index e736e101ce3ce4f4d7a1e1a83a63c130db399528..93f6667e658ea1152735e6435dd53a3c44b4571d 100644 (file)
--- a/lfs/ddns
+++ b/lfs/ddns
@@ -71,6 +71,8 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
        @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE)
 
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/ddns/ddns-007-perform-lazy-database-init.patch
+
        cd $(DIR_APP) && [ -x "configure" ] || sh ./autogen.sh
        cd $(DIR_APP) && ./configure \
                --prefix=/usr \
diff --git a/src/patches/ddns/ddns-007-perform-lazy-database-init.patch b/src/patches/ddns/ddns-007-perform-lazy-database-init.patch
new file mode 100644 (file)
index 0000000..c9b893e
--- /dev/null
@@ -0,0 +1,89 @@
+commit 63e16feedea3639ef1f21fecbff9ed2ae256728b
+Author: Michael Tremer <michael.tremer@ipfire.org>
+Date:   Sat Apr 25 13:18:07 2015 +0200
+
+    Perform lazy initialization of the database
+    
+    The database will only be initialized when it is actually
+    needed. That makes starting up ddns a bit faster and allows
+    us to execute it as non-root for simple commands like
+    "list-providers".
+    
+    If the database path is not writable at all, the database
+    feature is disable and an error message is logged. This
+    will hopefully help us to perform the DNS update even when
+    there is a local misconfiguration.
+
+diff --git a/src/ddns/database.py b/src/ddns/database.py
+index 5d4ffc9..42c3433 100644
+--- a/src/ddns/database.py
++++ b/src/ddns/database.py
+@@ -20,7 +20,7 @@
+ ###############################################################################
+ import datetime
+-import os.path
++import os
+ import sqlite3
+ # Initialize the logger.
+@@ -31,9 +31,11 @@ logger.propagate = 1
+ class DDNSDatabase(object):
+       def __init__(self, core, path):
+               self.core = core
++              self.path = path
+-              # Open the database file
+-              self._db = self._open_database(path)
++              # We won't open the connection to the database directly
++              # so that we do not do it unnecessarily.
++              self._db = None
+       def __del__(self):
+               self._close_database()
+@@ -46,7 +48,7 @@ class DDNSDatabase(object):
+               conn = sqlite3.connect(path, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
+               conn.isolation_level = None
+-              if not exists:
++              if not exists and self.is_writable():
+                       logger.debug("Initialising database layout")
+                       c = conn.cursor()
+                       c.executescript("""
+@@ -68,12 +70,25 @@ class DDNSDatabase(object):
+               return conn
++      def is_writable(self):
++              # Check if the database file exists and is writable.
++              ret = os.access(self.path, os.W_OK)
++              if ret:
++                      return True
++
++              # If not, we check if we are able to write to the directory.
++              # In that case the database file will be created in _open_database().
++              return os.access(os.path.dirname(self.path), os.W_OK)
++
+       def _close_database(self):
+               if self._db:
+                       self._db_close()
+                       self._db = None
+       def _execute(self, query, *parameters):
++              if self._db is None:
++                      self._db = self._open_database(self.path)
++
+               c = self._db.cursor()
+               try:
+                       c.execute(query, parameters)
+@@ -81,6 +96,10 @@ class DDNSDatabase(object):
+                       c.close()
+       def add_update(self, hostname, status, message=None):
++              if not self.is_writable():
++                      logger.warning("Could not log any updates because the database is not writable")
++                      return
++
+               self._execute("INSERT INTO updates(hostname, status, message, timestamp) \
+                       VALUES(?, ?, ?, ?)", hostname, status, message, datetime.datetime.utcnow())