FOSSologyでソースコードを解析してファイル毎のライセンスを把握する

# はじめに

近年システムを開発するときには、何らかのOSSを利用することが多くなっています。
そのような状況の中、どのようなOSSを使っているかを把握していないとライセンスに示された義務を履行できない可能性があり、最悪の場合、訴訟を引き起こされたり社会的信用を失う場合があります。
特に大規模な開発を複数の会社が連携して行う産業界ではOSSをどう取り扱うかが大きな課題となっていることから、OpenChain ProjectによってOSSサプライチェインの信頼を向上させる活動が行われています。
https://www.openchainproject.org/

この記事では、FOSSologyを利用してソースコードを解析し、SPDXファイルに基づきファイル毎のライセンスを把握する手順を示します。

なお、OpenChain ProjectやFOSSology、SPDXを含むOSSコンプライアンスに関するプロジェクトについては別の記事でまとめる予定です。

# 動作環境

本記事の手順の動作環境の情報を以下に示します。
ここに記載したコンポーネントとバージョン以外では動作確認を行っていません。

| コンポーネント | バージョン |
|---|---|
| license-coverage-grader | 41baaa4 |
| Python | 2.7.12 |
| FOSSology | 3.4.0 |
| SPDX | 2.1 |
| SPDX License List | 2.6 |
| Git | 2.17.1 |
| Google Chrome | 70.0.3538.77 |
| LibreOffice | 6.0.3.2 |
| Ubuntu Desktop 日本語 Remix | 18.04 |

# 手順

Ubuntu Desktop 日本語 Remixがインストールされており、基本的な環境設定が済んでいることを前提にします。

## license-coverage-graderのインストール

license-coverage-graderは、SPDXドキュメントによって提供される情報がファイル単位でライセンス情報がどの程度完全かを示す"グレード"スコアを決定するためのツールです。なお、本記事ではファイル単位でライセンス情報を抽出する機能のみを利用します。
さらに詳しく知りたい場合は下記のWebサイトをご覧ください。

まず、aptコマンドでgitとpipをインストールします。pipを最新の版数に更新しておきます。

```
$ sudo apt update
$ sudo apt install git python-pip
$ sudo -EH pip install --upgrade pip
```

GitHubのリポジトリからlicense-coverage-grader.gitをgit cloneし、pythonのモジュールをインストールします。

```
$ git clone https://github.com/spdx/license-coverage-grader.git
$ cd license-coverage-grader/
$ sudo -EH pip install --editable .
```

## ソースコードを解析してSPDXファイルを入手する

FOSSologyを利用し、ソースコードを解析してSPDXファイルを入手します。

FOSSologyを自分の環境にインストールする必要がなくちょっと試しに使ってみたい場合は、デモ サーバーを利用することができます。
今回はこのデモ サーバーを利用します。
http://83.169.21.23/fossology
※2023年2月時点で以下のURLに変更されたようです
https://fossology.osuosl.org/

例として、findutils 4.2.31のソースコードを解析してみます。
ソースコードを以下のURLから入手できます。
https://ftp.gnu.org/pub/gnu/findutils/findutils-4.2.31.tar.gz

まずはWebブラウザからデモ サーバーのURLにアクセスしログインします。
Usernameはtestuser、Passwordはtestです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/204754/4e31fa74-87f2-0acb-8ce9-285d467af75a.png" width=50%>

ログインできると下記の画面のようになります。
※ただし、Uploads in test-incomingに列挙されているファイル名は違う場合があります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/204754/2b9fff93-d0bf-2b40-15ba-b0f450c9a631.png" width=50%>
次にアップロードするファイルを指定します。

ダウンロードURLが分かっているため、上部のメニューから「Upload」->「From URL」を選択します。
選択すると下記の画面の通りになります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/204754/07dc5b1b-ec91-c160-389a-4b8887c14c57.png" width=50%>
※ローカルにダウンロードしたソースコードのアーカイブをアップロードする場合には「Upload」->「From URL」を選択し、「2. Select the file to upload」でファイルを指定します

「Enter the URL to the file or directory: 」にソースコードが入手できるURLを指定します。
記入できたら左下の「Upload」を押下します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/204754/edd46156-4546-6258-0cce-c27319edb59e.png" width=50%>
ソースコードをアップロードすると解析が行われます。

次にSPDXファイルを入手します。
上部のメニューから「Browse」を選択します。
「Upload Name and Description」から先ほどアップロードしたソースコードを見つけ、「-- select action --」から「Export SPDX tag value」を選択します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/204754/db3feaa1-17e5-6579-5479-6030f364d8bd.png" width=50%>

すると、SPDXファイルが出力され、ダウンロードが始まります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/204754/032055e1-34ce-d7c8-ac57-62613aabe397.png" width=50%>

ダウンロードしたSPDXファイルの名前はSPDX2TV_findutils-4.2.31.tar.gz_1541999637.spdxですが、簡潔に表すためにfindutils-4.2.31.spdxに変更します。

## ファイル毎のライセンス一覧を生成する

license-coverage-graderを使用して、SPDXファイルをCSVファイルに変換します。

下記のコマンドを実行して、findutils 4.2.3のSPDXファイルをCSVファイルに変換します。

```
$ python -s <license-coverage-graderのインストール先>/license-coverage-grader/spdx_scanner.py findutils-4.2.31.spdx > findutils-4.2.31.csv
```

LibreOfficeでfindutils-4.2.31.csvを開きます。
どのようにCSVファイルを取り込むか聞かれます。
基本的にデフォルトの設定で良いため、そのまま「OK」を押下します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/204754/5215dff2-66af-db9c-77df-3bd079b1235f.png" width=50%>

## ファイル毎のライセンスを確認する

CSVファイルでフィルタ処理を使うため、1行目を選択しLibreOfficeの上部メニューの「データ」->「オートフィルター」を押下して、オートフィルターを適用します。
その際、下記の警告が表示されますが、そのまま「OK」を押下してください。
<img src="https://qiita-image-store.s3.amazonaws.com/0/204754/3e4c1417-8157-d1ee-7aa9-a42bfe5abf2e.png" width=50%>

findutils 4.2.31に含まれるCOPYINGファイルのライセンスを確認します。
A列の「▼」を押下し、「標準フィルター」の「検索アイテム」の欄に「COPYING」と入力するとCOPYINGファイルのみをフィルタし表示することができます。
B列を見るとGPL-2.0であることが分かります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/204754/e0bc3508-1fba-fb05-842f-afa32bac085e.png" width=50%>

今度はfind.cのライセンスを確認します。
同じくA列の「▼」を押下し、「標準フィルター」の「検索アイテム」の欄に「find.c」と入力します。
するとGPL-2.0+であることがわかります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/204754/bd41039e-96cb-22ce-f97a-f232b0a5051a.png)

B列はSPDX 2.1の仕様書の4.6 License Information in Fileにあたる項目です。
この項目では、ファイル中に見つかったライセンスを表現します。
https://spdx.org/spdx-specification-21-web-version#h.111kx3o
見つかったライセンスがSPDXライセンスリスト (SPDX License List) に含まれている場合、SPDX簡易形式識別子 (SPDX short identifiers) で表します。
上記のGPL-2.0, GPL-2.0+というのはSPDX簡易識別子です。
https://spdx.org/licenses/GPL-2.0.html
https://spdx.org/licenses/GPL-2.0+.html
※GPL-2.0, GPL-2.0+という表現はSPDXライセンスリストの2.0rc2以降で非推奨となっています

SPDX 2.1の仕様、またはSPDXライセンスリストについて詳しく知りたい方は下記のURLを参照してください。
https://spdx.org/sites/cpstandard/files/pages/files/spdxversion2.1.pdf
https://spdx.org/licenses/

# 注意事項

FOSSologyのデモ サーバーの利用については、各個人が責任をもって利用してください。
大規模または大量のソースコード、または外部のサーバーに公開したくないソースコードの解析につきましては、DockerやVagrantを用いてFOSSologyのローカル環境を構築することをお勧めします。
環境構築につきましては、本記事の対象外とします。
下記のURLを参照ください。
https://github.com/fossology/fossology/blob/master/README.md

# 最後に

本記事では、FOSSologyでソースコードを解析してファイル毎のライセンスを把握する手順を示しました。
どのようなOSSを使用しているか把握することで、ライセンスに示す義務を果たすことができます。
本記事で示した手順によって多くの方がOSSの取り扱い方についての知見を得て、OpenChain Projectの目的であるOSSサプライチェーンの信頼の向上に寄与できれば幸いです。

# 参考情報

本記事に関連のある情報を下記に列挙します。

- OpenChain Project
 - https://www.openchainproject.org/
- SPDX
  - https://spdx.org/
- FOSSology
  - https://www.fossology.org/
- GitHub - license-coverage-grader
  - https://github.com/spdx/license-coverage-grader
- SPDX 2.1 Specification
  - https://spdx.org/sites/cpstandard/files/pages/files/spdxversion2.1.pdf
- SPDX License List
  - https://spdx.org/licenses/

『各種製品名は、各社の製品名称、商標または登録商標です。本記事に記載されているシステム名、製品名には、必ずしも商標表示（(R)、TM）を付記していません。』