Beispiel #1
0
    def refresh(self, ci: ClamavItem) -> bool:
        """Refresh a single ClamAV item.

        :param ci: Item to refresh.
        :return: True if new payload data was written, False otherwise.
        """
        try:
            if self.args.force:
                log.debug(f'{ci.url} refresh forced')
            elif not RefreshLog.is_outdated(ci.url, ci.interval):
                log.debug(f'{ci.url} below max age')
                return False
            digest = get_digest(ci)
            if not digest.ok:
                return False
            if digest.data and RefreshLog.digest_matches(ci.url, digest.data):
                log.debug(f'{ci.url} unchanged')
                RefreshLog.update(ci.url, digest.data)  # Update timestamp
                return False
            payload = get_payload(ci)
            if not payload.ok:
                return False
            integrity = check_integrity(payload.data, ci.check, digest.data)
            if not integrity.ok:
                log.warning(f'{ci.url} {integrity.data}')
                return False
            with open(ci.path, 'wb') as f:
                size = f.write(payload.data)
                log.info(f'{ci.path} updated ({size} bytes)')
                RefreshLog.update(ci.url, digest.data)  # Update digest and timestamp
        except OSError as e:  # pragma: no cover
            log.exception(e)
        return True
Beispiel #2
0
 def test_unknown(self):
     with self.assertRaises(ValueError):
         i = check_integrity(SAMPLE_DATA, 'UNKNOWN_ALGO', '')
         self.assertFalse(i.ok)
Beispiel #3
0
 def test_sha256_ok(self):
     i = check_integrity(SAMPLE_DATA, 'sha256', SAMPLE_SHA256)
     self.assertTrue(i.ok)
Beispiel #4
0
 def test_sha256_fail(self):
     i = check_integrity(SAMPLE_DATA, 'sha256', 'b c')
     self.assertFalse(i.ok)
Beispiel #5
0
 def test_md5_ok(self):
     i = check_integrity(SAMPLE_DATA, 'md5', SAMPLE_MD5)
     self.assertTrue(i.ok)
     self.assertIsNone(i.data)
Beispiel #6
0
 def test_md5_fail(self):
     i = check_integrity(SAMPLE_DATA, 'md5', 'a b')
     self.assertFalse(i.ok)
     self.assertIsNotNone(i.data)