47 lines
1.6 KiB
Python
47 lines
1.6 KiB
Python
|
#!/usr/bin/env python3
|
||
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
import os
|
||
|
import shutil
|
||
|
|
||
|
from io import BytesIO
|
||
|
from pathlib import Path
|
||
|
from zipfile import ZipFile
|
||
|
|
||
|
from .exceptions import PyMISPWarningListsError
|
||
|
|
||
|
try:
|
||
|
import requests
|
||
|
HAS_REQUESTS = True
|
||
|
except ImportError:
|
||
|
HAS_REQUESTS = False
|
||
|
|
||
|
|
||
|
def get_xdg_home_dir() -> Path:
|
||
|
if os.getenv('XDG_MISP_HOME'):
|
||
|
xdg_home_dir = Path(os.environ['XDG_MISP_HOME'])
|
||
|
if not xdg_home_dir.exists():
|
||
|
xdg_home_dir.mkdir(parents=True)
|
||
|
return xdg_home_dir / 'misp-warninglists'
|
||
|
if os.name != 'posix':
|
||
|
raise PyMISPWarningListsError('Cannot initialize XDG variable for OS {os.name}. Must be posix.')
|
||
|
shared_data_dir = Path(os.environ['XDG_DATA_HOME']) if os.environ.get('XDG_DATA_HOME') else Path.home() / '.local' / 'share'
|
||
|
xdg_home_dir = shared_data_dir / 'misp'
|
||
|
if not xdg_home_dir.exists():
|
||
|
xdg_home_dir.mkdir(parents=True)
|
||
|
os.putenv('XDG_MISP_HOME', str(xdg_home_dir))
|
||
|
return xdg_home_dir / 'misp-warninglists'
|
||
|
|
||
|
|
||
|
def update_warninglists():
|
||
|
if not HAS_REQUESTS:
|
||
|
raise PyMISPWarningListsError('Cannot update local warning lists, please install pymispwarninglists this way: pip install -E fetch_lists pymispwarninglists ')
|
||
|
storage_dir = get_xdg_home_dir()
|
||
|
if storage_dir.exists():
|
||
|
shutil.rmtree(storage_dir)
|
||
|
r = requests.get('https://github.com/MISP/misp-warninglists/archive/refs/heads/main.zip')
|
||
|
r.raise_for_status()
|
||
|
with ZipFile(BytesIO(r.content)) as zipfile:
|
||
|
zipfile.extractall(storage_dir.parent)
|
||
|
os.rename(storage_dir.parent / 'misp-warninglists-main', storage_dir)
|