dmarc-visualizer を起動後 ModuleNotFoundError: No module named 'msgraph' が出て動かない時にすること


## はじめに

[dmarc-visualizer] を利用し DMARC レポートの集計を試みた。
諸々の設定が完了し起動してみたが `ModuleNotFoundError: No module named 'msgraph'` が発生し、[dmarc-visualizer] を起動できなかった。原因が分かったので回避策と理由を書き残しておきます。

https://github.com/debricked/dmarc-visualizer

## 出力されたエラー

[dmarc-visualizer] を起動すると下記エラーで終了してしまう。

```zsh
Traceback (most recent call last):
  File "/usr/local/bin/parsedmarc", line 5, in <module>
    from parsedmarc.cli import _main
  File "/usr/local/lib/python3.9/site-packages/parsedmarc/__init__.py", line 31, in <module>
    from parsedmarc.mail import MailboxConnection
  File "/usr/local/lib/python3.9/site-packages/parsedmarc/mail/__init__.py", line 2, in <module>
    from parsedmarc.mail.graph import MSGraphConnection
  File "/usr/local/lib/python3.9/site-packages/parsedmarc/mail/graph.py", line 10, in <module>
    from msgraph.core import GraphClient
ModuleNotFoundError: No module named 'msgraph'
```

## 変更箇所

:::note warn
この修正方法は、[dmarc-visualizer] の [671b16a](https://github.com/debricked/dmarc-visualizer/commit/671b16ae1c0eb5c3b30e7340ce751ea62ad20b31) に有効であった。その他バージョン? コミットでは検証していない。
:::

```diff:parsedmarc/Dockerfile
diff --git a/parsedmarc/Dockerfile b/parsedmarc/Dockerfile
index c2ea0cd..bfb5391 100644
--- a/parsedmarc/Dockerfile
+++ b/parsedmarc/Dockerfile
@@ -2,7 +2,7 @@ FROM python:3.9-alpine3.16

 RUN apk add --update --no-cache libxml2-dev libxslt-dev
 RUN apk add --update --no-cache --virtual .build_deps build-base libffi-dev \
-    && pip install parsedmarc \
+    && pip install parsedmarc msgraph-core==0.2.2 \
     && apk del .build_deps

 COPY parsedmarc.ini
```

### 変更の理由・背景

[dmarc-visualizer] は、 [parsedmarc]、[Elasticsearch]、[Grafana] を利用している。
今回出ていたエラーは [parsedmarc] で発生している。 [parsedmarc] のレポジトリを確認したところすでに Issue が作成されていた。

https://github.com/domainaware/parsedmarc/issues/464

> I looked up the module name msgraph and found that it refers to the dependent package msgraph-core,
> The latest version of msgraph-core, 1.0.0, was released on 2024-01-23, the first major release since 2021-07-27.
>
> - [msgraph-core · PyPI](https://pypi.org/project/msgraph-core/#history)
> - [Release v1.0.0 · microsoftgraph/msgraph-sdk-python-core](https://github.com/microsoftgraph/msgraph-sdk-python-core/releases/tag/v1.0.0)
>
> On the other hand, if you look at [project.toml](https://github.com/domainaware/parsedmarc/blob/7d2b431e5f20bdcdb330c4fbb23ce7df5fb0642f/pyproject.toml), you will see that `>= 0.2.2`.
>
> ```toml:parsedmarc/pyproject.toml
> # Line 50 in 7d2b431
> "msgraph-core>=0.2.2",
> ```
>
> Therefore, it is assumed that a new installation of parsedmarc installs msgraph-core 1.0.0, and that it no longer works.

簡単に書くと .... 原因は module 'msgraph' の依存元である msgraph-core のメジャーリリースが2024年1月に行われた。[parsedmarc] の project.toml の定義では v0.2 ではなく、新しい v1 が取得されてしまい起動に失敗した。
ただ、原因はわかりましたが [dmarc-visualizer] に存在しない project.toml を編集することが不可能だったため `parsedmarc/Dockerfile` を編集することとした。

## References

- [debricked/dmarc-visualizer: Analyse and visualize DMARC results using open-source tools](https://github.com/debricked/dmarc-visualizer)
- [fix: msgraph-core version by laughk · Pull Request #466 · domainaware/parsedmarc](https://github.com/domainaware/parsedmarc/pull/466)
- [ModuleNotFoundError: No module named 'msgraph' · Issue #464 · domainaware/parsedmarc](https://github.com/domainaware/parsedmarc/issues/464)

[dmarc-visualizer]: https://github.com/debricked/dmarc-visualizer
[parsedmarc]: https://github.com/domainaware/parsedmarc
[Elasticsearch]: https://www.elastic.co/
[Grafana]: https://grafana.com/