diff --git a/src/opnsense/scripts/filter/lib/alias.py b/src/opnsense/scripts/filter/lib/alias.py index 9e8341be4..b2b0596a0 100644 --- a/src/opnsense/scripts/filter/lib/alias.py +++ b/src/opnsense/scripts/filter/lib/alias.py @@ -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