From b0b8729a32a4c43a76184432a7c624c58874d155 Mon Sep 17 00:00:00 2001 From: Stefan Schantl Date: Sun, 26 Apr 2015 17:12:55 +0200 Subject: [PATCH] ddns: Add upstream patch for fixing bug 10815. --- lfs/ddns | 2 + .../ddns-007-perform-lazy-database-init.patch | 89 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 src/patches/ddns/ddns-007-perform-lazy-database-init.patch diff --git a/lfs/ddns b/lfs/ddns index e736e101ce..93f6667e65 100644 --- 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 index 0000000000..c9b893e581 --- /dev/null +++ b/src/patches/ddns/ddns-007-perform-lazy-database-init.patch @@ -0,0 +1,89 @@ +commit 63e16feedea3639ef1f21fecbff9ed2ae256728b +Author: Michael Tremer +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()) + -- 2.39.2