From: Michael Tremer Date: Mon, 1 Jun 2020 13:47:44 +0000 (+0000) Subject: location-downloader: Do not change content of open database files X-Git-Tag: 0.9.2~37 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=679e5ae2e45b98e254c651cb3102a4331c2c22eb;p=location%2Flibloc.git location-downloader: Do not change content of open database files The database might be opened by another process. When modified, it will return random results. Fixes: #12420 Signed-off-by: Michael Tremer --- diff --git a/src/python/location-downloader.in b/src/python/location-downloader.in index 7d06030..bf0d682 100644 --- a/src/python/location-downloader.in +++ b/src/python/location-downloader.in @@ -24,6 +24,7 @@ import lzma import os import random import shutil +import stat import sys import tempfile import time @@ -116,7 +117,7 @@ class Downloader(object): return res - def download(self, url, public_key, timestamp=None, **kwargs): + def download(self, url, public_key, timestamp=None, tmpdir=None, **kwargs): headers = {} if timestamp: @@ -124,7 +125,7 @@ class Downloader(object): "%a, %d %b %Y %H:%M:%S GMT", ) - t = tempfile.NamedTemporaryFile(delete=False) + t = tempfile.NamedTemporaryFile(dir=tmpdir, delete=False) with t: # Try all mirrors for mirror in self.mirrors: @@ -175,6 +176,9 @@ class Downloader(object): t.truncate() continue + # Make the file readable for everyone + os.chmod(t.name, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH) + # Return temporary file return t @@ -296,10 +300,13 @@ class CLI(object): except FileNotFoundError as e: db = None + # Download the database into the correct directory + tmpdir = os.path.dirname(ns.database) + # Try downloading a new database try: t = self.downloader.download("%s/%s" % (self.version, DATABASE_FILENAME), - public_key=ns.public_key, timestamp=timestamp) + public_key=ns.public_key, timestamp=timestamp, tmpdir=tmpdir) # If no file could be downloaded, log a message except FileNotFoundError as e: @@ -310,11 +317,8 @@ class CLI(object): if not t: return 3 - # Write temporary file to destination - shutil.copyfile(t.name, ns.database) - - # Remove temporary file - os.unlink(t.name) + # Move temporary file to destination + shutil.move(t.name, ns.database) return 0