Firewall/alias, keep previous content for url alias type on fetch error. closes https://github.com/opnsense/core/issues/2793

This commit is contained in:
Ad Schellevis 2018-10-05 22:59:33 +02:00
parent a00e646ca2
commit 8d08b67d28

View File

@ -147,8 +147,12 @@ class Alias(object):
if raw_address and not raw_address.startswith('//'):
for address in self._parse_address(raw_address):
yield address
else:
syslog.syslog(syslog.LOG_ERR, 'error fetching alias url %s [http_code:%s]' % (url, req.status_code))
raise IOError('error fetching alias url %s' % (url))
except:
syslog.syslog(syslog.LOG_ERR, 'error fetching alias url %s' % (url))
raise IOError('error fetching alias url %s' % (url))
def _fetch_geo(self, geoitem):
""" fetch geoip addresses, if not downloaded or outdated force an update
@ -218,20 +222,30 @@ class Alias(object):
"""
if not self._resolve_content:
if self.expired() or self.changed() or force:
with open(self._filename_alias_content, 'w') as f_out:
for item in self.items():
address_parser = self.get_parser()
if address_parser:
for address in address_parser(item):
if address not in self._resolve_content:
# flush new alias content (without dependencies) to disk, so progress can easliy
# be followed, large lists of domain names can take quite some resolve time.
f_out.write('%s\n' % address)
f_out.flush()
# preserve addresses
self._resolve_content.append(address)
# flush md5 hash to disk
open(self._filename_alias_hash, 'w').write(self.uniqueid())
if os.path.isfile(self._filename_alias_content):
undo_content = open(self._filename_alias_content, 'r').read()
else:
undo_content = ""
try:
with open(self._filename_alias_content, 'w') as f_out:
for item in self.items():
address_parser = self.get_parser()
if address_parser:
for address in address_parser(item):
if address not in self._resolve_content:
# flush new alias content (without dependencies) to disk, so progress can easliy
# be followed, large lists of domain names can take quite some resolve time.
f_out.write('%s\n' % address)
f_out.flush()
# preserve addresses
self._resolve_content.append(address)
except IOError:
# parse issue, keep data as-is, flush previous content to disk
with open(self._filename_alias_content, 'w') as f_out:
f_out.write(undo_content)
self._resolve_content = undo_content.split("\n")
# flush md5 hash to disk
open(self._filename_alias_hash, 'w').write(self.uniqueid())
else:
self._resolve_content = open(self._filename_alias_content).read().split()
# return the addresses and networks of this alias