diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 318315b81..f0ca11789 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -3,80 +3,146 @@ # SPDX-FileCopyrightText: 2021 Sebastian Waldbauer # SPDX-License-Identifier: AGPL-3.0-or-later # -name: "Build and upload docker image" +#name: "Build and upload docker image" +# +#on: +# push: +# branches: ['develop'] +# paths-ignore: +# - '.github/**' +# +#jobs: +# docker: +# name: Building Docker image +# runs-on: ubuntu-latest +# +# steps: +# - name: Check if environment is ACT +# run: sudo chown runner:docker /var/run/docker.sock +# if: ${{ env.ACT }} +# +# - name: Checkout IntelMQ-Docker +# uses: actions/checkout@v3 +# with: +# ref: 'main' +# repository: certat/intelmq-docker +# path: ./work +# +# - name: Checkout IntelMQ-Manager +# uses: actions/checkout@v3 +# with: +# ref: 'develop' +# repository: certtools/intelmq-manager +# path: ./work/intelmq-manager +# +# - name: Checkout IntelMQ-API +# uses: actions/checkout@v3 +# with: +# ref: 'develop' +# repository: certtools/intelmq-api +# path: ./work/intelmq-api +# +# - name: Checkout IntelMQ +# uses: actions/checkout@v3 +# with: +# ref: 'develop' +# path: ./work/intelmq +# +# - name: Setup QEMU +# uses: docker/setup-qemu-action@v2 +# +# - name: Setup Docker Buildx +# uses: docker/setup-buildx-action@v2 +# +# - name: Login to DockerHub +# uses: docker/login-action@v2 +# if: github.repository == 'certtools/intelmq' && !${{ env.ACT }} +# with: +# username: ${{ secrets.DOCKERHUB_USERNAME }} +# password: ${{ secrets.DOCKERHUB_TOKEN }} +# +# - name: Install python build requirements +# run: | +# pip3 install mako +# +# - name: Build +# run: | +# cd work +# ./build.sh +# +# - name: Test +# run: | +# cd work +# ./test.sh +# +# - name: Publish develop version to dockerhub +# if: github.repository == 'certtools/intelmq' && !${{ env.ACT }} +# run: | +# docker tag intelmq-full:latest certat/intelmq-full:develop +# docker push certat/intelmq-full:develop + + +name: "Build and upload Docker image" on: push: - branches: ['develop'] - paths-ignore: - - '.github/**' + branches: + - develop + - merge-projects + tags: + - "*.*.*" + pull_request: + branches: + - develop jobs: docker: - name: Building Docker image runs-on: ubuntu-latest - steps: - - name: Check if environment is ACT - run: sudo chown runner:docker /var/run/docker.sock - if: ${{ env.ACT }} + - name: Checkout repository + uses: actions/checkout@v4 - - name: Checkout IntelMQ-Docker - uses: actions/checkout@v3 + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 with: - ref: 'main' - repository: certat/intelmq-docker - path: ./work + images: | + ${{ secrets.DOCKERHUB_USERNAME }}/intelmq + # ghcr.io/username/app + # generate Docker tags based on the following events/attributes + tags: | + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + type=sha - - name: Checkout IntelMQ-Manager - uses: actions/checkout@v3 - with: - ref: 'develop' - repository: certtools/intelmq-manager - path: ./work/intelmq-manager + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 - - name: Checkout IntelMQ-API - uses: actions/checkout@v3 - with: - ref: 'develop' - repository: certtools/intelmq-api - path: ./work/intelmq-api + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 - - name: Checkout IntelMQ - uses: actions/checkout@v3 - with: - ref: 'develop' - path: ./work/intelmq - - - name: Setup QEMU - uses: docker/setup-qemu-action@v2 - - - name: Setup Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Login to DockerHub - uses: docker/login-action@v2 - if: github.repository == 'certtools/intelmq' && !${{ env.ACT }} + - name: Login to Docker Hub + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Install python build requirements - run: | - pip3 install mako +# - name: Login to GHCR +# if: github.event_name != 'pull_request' +# uses: docker/login-action@v3 +# with: +# registry: ghcr.io +# username: ${{ github.repository_owner }} +# password: ${{ secrets.GITHUB_TOKEN }} - - name: Build - run: | - cd work - ./build.sh - - - name: Test - run: | - cd work - ./test.sh - - - name: Publish develop version to dockerhub - if: github.repository == 'certtools/intelmq' && !${{ env.ACT }} - run: | - docker tag intelmq-full:latest certat/intelmq-full:develop - docker push certat/intelmq-full:develop + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..2e52078c2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,53 @@ +FROM python:3.9-bullseye + +ENV LANG=C.UTF-8 +ENV PATH=/opt/venv/bin:${PATH} +ENV INTELMQ_PATHS_NO_OPT=1 + +ARG DEBIAN_FRONTEND=noninteractive + +# Install dependencides +RUN apt-get update -y && \ + apt-get upgrade -y && \ + apt-get install -y --no-install-recommends python3 \ + python3-pip \ + git \ + build-essential \ + python3-dev \ + libcurl4-gnutls-dev \ + libgnutls28-dev \ + libffi-dev \ + curl \ + sudo \ + vim \ + jq \ + cron \ + libpq-dev \ + logrotate && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /var/www/html && \ + python3 -m venv --upgrade-deps /opt/venv + +# Copy IntelMQ complete requirements +COPY requirements.txt /tmp/requirements.txt + +# Install IntelMQ dependencies (before copying the sources -> makes for faster repeated build times) +RUN pip install -r /tmp/requirements.txt + +# Copy IntelMQ sources +COPY . /tmp/intelmq + +# Install IntelMQ +RUN pip3 install /tmp/intelmq + +# Add intelmq user +RUN useradd --system --uid 995 --create-home --home-dir /var/lib/intelmq --shell /bin/bash intelmq + +# Setup IntelMQ and clean +RUN intelmqsetup && \ + rm -rf /tmp/intelmq /tmp/requirements.txt + +# Switch to intelmq user +USER intelmq + +CMD ["intelmq", "server", "start"] \ No newline at end of file diff --git a/docker/runtime.yaml b/docker/runtime.yaml new file mode 100644 index 000000000..294eaeea9 --- /dev/null +++ b/docker/runtime.yaml @@ -0,0 +1,180 @@ +global: + destination_pipeline_broker: redis + destination_pipeline_host: redis + process_manager: intelmq + server: + enable_webgui: true + host: 0.0.0.0 + intelmq_ctl_cmd: [intelmqctl] + port: 8080 + source_pipeline_broker: redis + source_pipeline_host: redis + ssl_ca_certificate: null + statistics_database: 3 + statistics_host: redis + statistics_password: null + statistics_port: 6379 + +cymru-whois-expert: + bot_id: cymru-whois-expert + description: Cymru Whois (IP to ASN) is the bot responsible to add network information + to the events (BGP, ASN, AS Name, Country, etc..). + enabled: true + group: Expert + groupname: experts + module: intelmq.bots.experts.cymru_whois.expert + name: Cymru Whois + parameters: + destination_queues: + _default: [file-output-queue] + overwrite: true + redis_cache_db: 5 + redis_cache_host: redis + redis_cache_password: null + redis_cache_port: 6379 + redis_cache_ttl: 86400 + run_mode: continuous +deduplicator-expert: + bot_id: deduplicator-expert + description: Deduplicator is the bot responsible for detection and removal of duplicate + messages. Messages get cached for seconds. If found in the cache, + it is assumed to be a duplicate. + enabled: true + group: Expert + groupname: experts + module: intelmq.bots.experts.deduplicator.expert + name: Deduplicator + parameters: + destination_queues: + _default: [taxonomy-expert-queue] + filter_keys: raw,time.observation + filter_type: blacklist + redis_cache_db: 6 + redis_cache_host: redis + redis_cache_port: 6379 + redis_cache_ttl: 86400 + run_mode: continuous +feodo-tracker-collector: + description: Generic URL Fetcher is the bot responsible to get the report from an + URL. + enabled: true + group: Collector + module: intelmq.bots.collectors.http.collector_http + name: URL Fetcher + parameters: + destination_queues: + _default: [feodo-tracker-parser-queue] + extract_files: false + http_password: null + http_url: https://feodotracker.abuse.ch/downloads/ipblocklist.json + http_url_formatting: false + http_username: null + name: Feodo Tracker + provider: Abuse.ch + rate_limit: 86400 + ssl_client_certificate: null + run_mode: continuous +feodo-tracker-parser: + description: Parser for Feodo Tracker collector. + enabled: true + group: Parser + module: intelmq.bots.parsers.abusech.parser_feodotracker + name: Feodo Tracker Parser + parameters: + destination_queues: + _default: [deduplicator-expert-queue] + run_mode: continuous +file-output: + bot_id: file-output + description: File is the bot responsible to send events to a file. + enabled: true + group: Output + groupname: outputs + module: intelmq.bots.outputs.file.output + name: File + parameters: {file: /var/lib/intelmq/bots/file-output/events.txt, hierarchical_output: false, + single_key: null} + run_mode: continuous +gethostbyname-1-expert: + bot_id: gethostbyname-1-expert + description: fqdn2ip is the bot responsible to parsing the ip from the fqdn. + enabled: true + group: Expert + groupname: experts + module: intelmq.bots.experts.gethostbyname.expert + name: Gethostbyname + parameters: + destination_queues: + _default: [cymru-whois-expert-queue] + run_mode: continuous +gethostbyname-2-expert: + bot_id: gethostbyname-2-expert + description: fqdn2ip is the bot responsible to parsing the ip from the fqdn. + enabled: true + group: Expert + groupname: experts + module: intelmq.bots.experts.gethostbyname.expert + name: Gethostbyname + parameters: + destination_queues: + _default: [cymru-whois-expert-queue] + run_mode: continuous +spamhaus-drop-collector: + bot_id: spamhaus-drop-collector + description: '' + enabled: true + group: Collector + groupname: collectors + module: intelmq.bots.collectors.http.collector_http + name: Spamhaus Drop + parameters: + destination_queues: + _default: [spamhaus-drop-parser-queue] + http_password: null + http_url: https://www.spamhaus.org/drop/drop.txt + http_username: null + name: Drop + provider: Spamhaus + rate_limit: 3600 + ssl_client_certificate: null + run_mode: continuous +spamhaus-drop-parser: + bot_id: spamhaus-drop-parser + description: Spamhaus Drop Parser is the bot responsible to parse the DROP, EDROP, + DROPv6, and ASN-DROP reports and sanitize the information. + enabled: true + group: Parser + groupname: parsers + module: intelmq.bots.parsers.spamhaus.parser_drop + name: Spamhaus Drop + parameters: + destination_queues: + _default: [deduplicator-expert-queue] + run_mode: continuous +taxonomy-expert: + bot_id: taxonomy-expert + description: Taxonomy is the bot responsible to apply the eCSIRT Taxonomy to all + events. + enabled: true + group: Expert + groupname: experts + module: intelmq.bots.experts.taxonomy.expert + name: Taxonomy + parameters: + destination_queues: + _default: [url-expert-queue] + run_mode: continuous +url-expert: + bot_id: url-expert + description: Extract additional information for the URL + enabled: true + group: Expert + groupname: experts + module: intelmq.bots.experts.url.expert + name: url + parameters: + destination_queues: + _default: [gethostbyname-1-expert-queue, gethostbyname-2-expert-queue] + load_balance: true + overwrite: false + run_mode: continuous diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..5c6f7cc72 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,387 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --output-file=requirements-all.txt intelmq/bots/collectors/alienvault_otx/REQUIREMENTS.txt intelmq/bots/collectors/amqp/REQUIREMENTS.txt intelmq/bots/collectors/api/REQUIREMENTS.txt intelmq/bots/collectors/calidog/REQUIREMENTS.txt intelmq/bots/collectors/eset/REQUIREMENTS.txt intelmq/bots/collectors/fireeye/REQUIREMENTS.txt intelmq/bots/collectors/http/REQUIREMENTS.txt intelmq/bots/collectors/kafka/REQUIREMENTS.txt intelmq/bots/collectors/mail/REQUIREMENTS.txt intelmq/bots/collectors/microsoft/REQUIREMENTS.txt intelmq/bots/collectors/misp/REQUIREMENTS.txt intelmq/bots/collectors/opendxl/REQUIREMENTS.txt intelmq/bots/collectors/rt/REQUIREMENTS.txt intelmq/bots/collectors/shodan/REQUIREMENTS.txt intelmq/bots/collectors/stomp/REQUIREMENTS.txt intelmq/bots/collectors/twitter/REQUIREMENTS.txt intelmq/bots/experts/abusix/REQUIREMENTS.txt intelmq/bots/experts/asn_lookup/REQUIREMENTS.txt intelmq/bots/experts/domain_suffix/REQUIREMENTS.txt intelmq/bots/experts/domain_valid/REQUIREMENTS.txt intelmq/bots/experts/generic_db_lookup/REQUIREMENTS.txt intelmq/bots/experts/geohash/REQUIREMENTS.txt intelmq/bots/experts/jinja/REQUIREMENTS.txt intelmq/bots/experts/lookyloo/REQUIREMENTS.txt intelmq/bots/experts/maxmind_geoip/REQUIREMENTS.txt intelmq/bots/experts/mcafee/REQUIREMENTS.txt intelmq/bots/experts/misp/REQUIREMENTS.txt intelmq/bots/experts/sieve/REQUIREMENTS.txt intelmq/bots/outputs/amqptopic/REQUIREMENTS.txt intelmq/bots/outputs/cif3/REQUIREMENTS.txt intelmq/bots/outputs/elasticsearch/REQUIREMENTS.txt intelmq/bots/outputs/mcafee/REQUIREMENTS.txt intelmq/bots/outputs/misp/REQUIREMENTS.txt intelmq/bots/outputs/mongodb/REQUIREMENTS.txt intelmq/bots/outputs/rt/REQUIREMENTS.txt intelmq/bots/outputs/smtp_batch/REQUIREMENTS.txt intelmq/bots/outputs/sql/REQUIREMENTS.txt intelmq/bots/outputs/stomp/REQUIREMENTS.txt intelmq/bots/outputs/templated_smtp/REQUIREMENTS.txt intelmq/bots/parsers/fireeye/REQUIREMENTS.txt intelmq/bots/parsers/github_feed/REQUIREMENTS.txt intelmq/bots/parsers/html_table/REQUIREMENTS.txt intelmq/bots/parsers/twitter/REQUIREMENTS.txt setup.py +# +aiohttp==3.9.1 + # via geoip2 +aiosignal==1.3.1 + # via aiohttp +annotated-types==0.6.0 + # via pydantic +anyio==3.7.1 + # via + # fastapi + # starlette + # watchfiles +arpeggio==2.0.2 + # via textx +arrow==1.3.0 + # via csirtg-indicator +asn1crypto==1.5.1 + # via + # dxlclient + # oscrypto +async-timeout==4.0.3 + # via redis +attrs==23.1.0 + # via + # aiohttp + # jsonschema + # referencing +azure-core==1.29.5 + # via azure-storage-blob +azure-storage-blob==12.19.0 + # via -r intelmq/bots/collectors/microsoft/REQUIREMENTS.txt +beautifulsoup4==4.12.2 + # via -r intelmq/bots/parsers/html_table/REQUIREMENTS.txt +cabby==0.1.23 + # via -r intelmq/bots/collectors/eset/REQUIREMENTS.txt +certifi==2023.11.17 + # via + # elasticsearch + # requests +certstream==1.12 + # via -r intelmq/bots/collectors/calidog/REQUIREMENTS.txt +cffi==1.16.0 + # via cryptography +chardet==5.2.0 + # via imbox +charset-normalizer==3.3.2 + # via requests +cifsdk==3.0.8 + # via -r intelmq/bots/outputs/cif3/REQUIREMENTS.txt +click==8.1.7 + # via + # click-plugins + # shodan + # uvicorn +click-plugins==1.1.1 + # via shodan +colorama==0.4.6 + # via shodan +colorlog==6.8.0 + # via cabby +configobj==5.0.8 + # via dxlclient +cryptography==41.0.7 + # via azure-storage-blob +csirtg-indicator==1.0.13 + # via cifsdk +deprecated==1.2.14 + # via pymisp +dnspython==2.4.2 + # via + # intelmq (setup.py) + # py3-validate-email + # pymongo + # querycontacts +docopt==0.6.2 + # via stomp-py +dxlbootstrap==0.2.2 + # via dxlmarclient +dxlclient==5.6.0.4 + # via + # -r intelmq/bots/collectors/opendxl/REQUIREMENTS.txt + # -r intelmq/bots/experts/mcafee/REQUIREMENTS.txt + # dxlbootstrap + # dxlmarclient +dxlmarclient==0.2.1 + # via -r intelmq/bots/experts/mcafee/REQUIREMENTS.txt +elasticsearch==7.17.9 + # via -r intelmq/bots/outputs/elasticsearch/REQUIREMENTS.txt +envelope==2.0.2 + # via -r intelmq/bots/outputs/smtp_batch/REQUIREMENTS.txt +faker==0.7.10 + # via csirtg-indicator +fastapi==0.105.0 + # via intelmq (setup.py) +filelock==3.13.1 + # via + # py3-validate-email + # tldextract +frozenlist==1.4.0 + # via + # aiohttp + # aiosignal +furl==2.1.3 + # via cabby +future==0.18.3 + # via + # geolib + # python-twitter +geoip2==4.8.0 ; python_version >= "3.6" + # via -r intelmq/bots/experts/maxmind_geoip/REQUIREMENTS.txt +geolib==1.0.7 + # via -r intelmq/bots/experts/geohash/REQUIREMENTS.txt +h11==0.14.0 + # via uvicorn +httptools==0.6.1 + # via uvicorn +idna==3.6 + # via + # anyio + # py3-validate-email + # requests + # tldextract + # yarl +imbox==0.9.8 + # via -r intelmq/bots/collectors/mail/REQUIREMENTS.txt +ipaddress==1.0.23 + # via csirtg-indicator +isodate==0.6.1 + # via azure-storage-blob +jinja2==3.1.2 + # via + # -r intelmq/bots/experts/jinja/REQUIREMENTS.txt + # -r intelmq/bots/outputs/templated_smtp/REQUIREMENTS.txt + # intelmq (setup.py) +jsonpickle==3.0.2 + # via envelope +jsonschema==4.20.0 + # via pymisp +jsonschema-specifications==2023.11.2 + # via jsonschema +kafka-python==2.0.2 + # via -r intelmq/bots/collectors/kafka/REQUIREMENTS.txt +libtaxii==1.1.119 + # via cabby +lxml==4.9.3 + # via + # -r intelmq/bots/parsers/html_table/REQUIREMENTS.txt + # libtaxii +markupsafe==2.1.3 + # via jinja2 +maxminddb==2.5.1 + # via geoip2 +mfe-saw==0.0.8 + # via -r intelmq/bots/outputs/mcafee/REQUIREMENTS.txt +msgpack==0.6.2 + # via dxlclient +msgpack-python==0.4.8 + # via cifsdk +multidict==6.0.4 + # via + # aiohttp + # yarl +oauthlib==3.2.2 + # via requests-oauthlib +orderedmultidict==1.0.1 + # via furl +oscrypto==1.3.0 + # via dxlclient +otxv2==1.5.12 + # via -r intelmq/bots/collectors/alienvault_otx/REQUIREMENTS.txt +pendulum==2.0.5 + # via + # -r intelmq/bots/experts/sieve/REQUIREMENTS.txt + # csirtg-indicator +pika==1.3.2 + # via + # -r intelmq/bots/collectors/amqp/REQUIREMENTS.txt + # -r intelmq/bots/outputs/amqptopic/REQUIREMENTS.txt +prettytable==3.9.0 + # via + # cifsdk + # csirtg-indicator + # mfe-saw +psutil==5.9.6 + # via intelmq (setup.py) +psycopg2-binary==2.9.9 + # via + # -r intelmq/bots/experts/generic_db_lookup/REQUIREMENTS.txt + # -r intelmq/bots/outputs/sql/REQUIREMENTS.txt +publicsuffixlist==0.10.0.20231207 + # via + # -r intelmq/bots/experts/domain_suffix/REQUIREMENTS.txt + # pymisp +py3-validate-email==1.0.5.post1 + # via envelope +pyaml==23.9.7 + # via cifsdk +pyasn==1.6.0b1 + # via -r intelmq/bots/experts/asn_lookup/REQUIREMENTS.txt +pycparser==2.21 + # via cffi +pydantic==2.5.2 + # via fastapi +pydantic-core==2.14.5 + # via pydantic +pylookyloo==1.22.2 + # via -r intelmq/bots/experts/lookyloo/REQUIREMENTS.txt +pymisp==2.4.179 ; python_version >= "3.6" + # via + # -r intelmq/bots/collectors/misp/REQUIREMENTS.txt + # -r intelmq/bots/experts/misp/REQUIREMENTS.txt + # -r intelmq/bots/outputs/misp/REQUIREMENTS.txt +pymongo==4.6.1 + # via -r intelmq/bots/outputs/mongodb/REQUIREMENTS.txt +pymssql==2.2.11 + # via -r intelmq/bots/outputs/sql/REQUIREMENTS.txt +pysocks==1.6.8 + # via dxlclient +python-dateutil==2.8.2 + # via + # arrow + # faker + # intelmq (setup.py) + # libtaxii + # otxv2 + # pendulum + # pymisp +python-dotenv==1.0.0 + # via uvicorn +python-gnupg==0.5.2 + # via + # -r intelmq/bots/collectors/http/REQUIREMENTS.txt + # envelope +python-magic==0.4.27 + # via envelope +python-multipart==0.0.6 + # via intelmq (setup.py) +python-termstyle==0.1.10 + # via intelmq (setup.py) +python-twitter==3.5 + # via -r intelmq/bots/collectors/twitter/REQUIREMENTS.txt +pytricia==1.0.2 + # via csirtg-indicator +pytz==2023.3.post1 + # via + # cabby + # otxv2 +pytzdata==2020.1 + # via pendulum +pyyaml==6.0.1 + # via + # cifsdk + # pyaml + # uvicorn +pyzmq==25.1.2 + # via cifsdk +querycontacts==2.0.0 + # via -r intelmq/bots/experts/abusix/REQUIREMENTS.txt +redis==5.0.1 + # via intelmq (setup.py) +referencing==0.32.0 + # via + # jsonschema + # jsonschema-specifications +requests==2.31.0 + # via + # azure-core + # cabby + # cifsdk + # dxlclient + # geoip2 + # intelmq (setup.py) + # mfe-saw + # otxv2 + # pylookyloo + # pymisp + # python-twitter + # requests-file + # requests-oauthlib + # rt + # shodan + # tldextract +requests-file==1.5.1 + # via tldextract +requests-oauthlib==1.3.1 + # via python-twitter +rpds-py==0.13.2 + # via + # jsonschema + # referencing +rt==2.2.2 + # via + # -r intelmq/bots/collectors/rt/REQUIREMENTS.txt + # -r intelmq/bots/outputs/rt/REQUIREMENTS.txt +ruamel-yaml==0.18.5 + # via intelmq (setup.py) +ruamel-yaml-clib==0.2.8 + # via ruamel-yaml +shodan==1.30.1 + # via -r intelmq/bots/collectors/shodan/REQUIREMENTS.txt +six==1.16.0 + # via + # azure-core + # cabby + # configobj + # faker + # furl + # isodate + # libtaxii + # orderedmultidict + # python-dateutil + # requests-file + # url-normalize +sniffio==1.3.0 + # via anyio +soupsieve==2.5 + # via beautifulsoup4 +starlette==0.27.0 + # via fastapi +stomp-py==8.1.0 + # via + # -r intelmq/bots/collectors/stomp/REQUIREMENTS.txt + # -r intelmq/bots/outputs/stomp/REQUIREMENTS.txt +termcolor==2.4.0 + # via certstream +textx==4.0.1 + # via -r intelmq/bots/experts/sieve/REQUIREMENTS.txt +tld==0.13 + # via -r intelmq/bots/parsers/twitter/REQUIREMENTS.txt +tldextract==5.1.1 + # via shodan +tornado==6.4 + # via -r intelmq/bots/collectors/api/REQUIREMENTS.txt +types-python-dateutil==2.8.19.14 + # via arrow +typing-extensions==4.9.0 + # via + # azure-core + # azure-storage-blob + # fastapi + # intelmq (setup.py) + # pydantic + # pydantic-core +ujson==5.9.0 + # via cifsdk +url-normalize==1.4.3 + # via -r intelmq/bots/parsers/twitter/REQUIREMENTS.txt +urllib3==1.26.18 + # via + # cifsdk + # elasticsearch + # requests +uvicorn[standard]==0.24.0.post1 + # via + # intelmq (setup.py) + # uvicorn +uvloop==0.19.0 + # via uvicorn +validators==0.22.0 + # via + # -r intelmq/bots/experts/domain_valid/REQUIREMENTS.txt + # -r intelmq/bots/parsers/github_feed/REQUIREMENTS.txt +watchfiles==0.21.0 + # via uvicorn +wcwidth==0.2.12 + # via prettytable +websocket-client==1.7.0 + # via + # certstream + # stomp-py +websockets==12.0 + # via uvicorn +wrapt==1.16.0 + # via deprecated +xlsxwriter==3.1.9 + # via shodan +xmltodict==0.13.0 + # via + # -r intelmq/bots/collectors/fireeye/REQUIREMENTS.txt + # -r intelmq/bots/parsers/fireeye/REQUIREMENTS.txt +yarl==1.9.4 + # via aiohttp