設定値を暗号化すること＆設定の重複を減らせる設定ファイルライブラリを作成した

## 概要
rubyで設定ファイル周りのgemライブラリをつくりました。
このライブラリでは、以下をサポートします。

* 設定値の暗号化
* 設定項目の一元管理（ファイル分割による繰り返し設定の低減）
* 設定値のコメント設定（ #(コメント)で満足しない方へ（＝私） ）
* コマンドメニュー（テンプレート作成、暗号化設定書き込み、一覧表示）

設定ファイル周りで色々ともやもやすることがありまして、それを一気に解決できるようなライブラリが欲しくて作成しました。
もやもやの内容は、上記のサポート内容の裏返しになるだけですが、設定値をテキストファイルに平文で書きたくない。本番用・開発用・その他でそれぞれ違う設定項目と全部共通の設定項目を一緒のファイルに書きたくない。
という様な思いを出発点として作成しております。

~~このライブラリはテストが足りてないので、仕様、信頼性を煮詰めきれていないので、
もしこれより良いライブラリがありましたら、コメント欄にてお知らせいただくと嬉しいです。、、、~~ 
げふんげふん。
これからは不満点やバグを見つけて、ゆっくりゆっくり自分のために更新していくと思います。（多分）

## 具体的にどの様に動くのか
### 設定ファイルの読込
#### 設定ファイルが一つの場合
以下のような設定ファイルがあったとします。

```yaml:project_config.yml
---
- :key_path: "/home/vagrant/.crypt_config/project_key.yml"
- :animal:
    :value: |-
      ?0thjXJj2wR4kzp3EidmJ+bgWtYXs7/DZpTlcDFiLjDbsSB2YWnZEB+ovMTNC
      37kx
    :desc: ''
  :fruit:
    :value: |-
      ?wIGrSC/bf5om/rlfIlz7hAIOjaZFjIgw4ulguIKI7YpBrx4JOcmUo3cLH1vC
      eDeW
    :desc: This fruit color is yellow.
```
これをプログラム中で利用する場合、以下の様に利用できます。

```ruby
require 'dinomischus'
 
# ex1 
hash = Dinomischus.load_file('config_project.yml')  
# => {:animal=>"owl", 
#     :fruit=>"Lemon"}
p hash[:animal]  # => owl  
p hash[:fruit]   # => Lemon 
```
説明（desc）の項目も併せて取得したい場合、引数に```true```を追加します。

```ruby
# ex2 
hash = Dinomischus.load_file('project_config.yml', true)
# => {:animal=>{:value=>"owl", :desc=>""},
#     :fruit=>{:value=>"Lemon", :desc=>"This fruit color is yellow."} }

p hash[:fruit][:value]  # => Lemon
p hash[:fruit][:desc]   # => This fruit color is yellow.

```

#### 設定ファイルが複数ある場合

設定ファイルが複数ある場合でも一括で読み込むことが可能です。
その場合、読み込む順番を定義したファイルが別途に必要になります。（例ではproject_config_index.yml)
また設定項目が重複した場合、後から読んだファイルの設定値を優先します。これを利用することによって、デフォルト値用の設定ファイルを用意しておき、開発環境用専用の設定ファイルと本番環境用専用の設定ファイルを分離することが可能です。

```yaml:project_config_index.yml 
---
- :conf_path: "/path/to/config/project_config_default.yml"
- :conf_path: "/path/to/config/project_config_product.yml"
```
```yaml:project_config_default.yml
---
- :key_path: "/home/vagrant/.crypt_config/project_key.yml"
- :animal:
    :value: |-
      ?0thjXJj2wR4kzp3EidmJ+bgWtYXs7/DZpTlcDFiLjDbsSB2YWnZEB+ovMTNC
      37kx
    :desc: ''
  :fruit:
    :value: |-
      ?wIGrSC/bf5om/rlfIlz7hAIOjaZFjIgw4ulguIKI7YpBrx4JOcmUo3cLH1vC
      eDeW
    :desc: This fruit color is yellow.
```
```yaml:project_config_product.yml 
---
- :key_path: "/home/vagrant/.crypt_config/project_key.yml"
- :fruit:
    :value: banana
    :desc: 黄色い果物
  :furniture:
    :value: chair
    :desc:  座る物
```

以上を読み込むと、以下のようになります。

```ruby
require 'dinomischus'
 
hash = Dinomischus.load_file('project_name_config_index.yml')
# => {:animal=>"owl", 
#     :fruit=>"banana",
#     :furniture=>"chair"}
```
:```fruit```の設定値が後から読み込まれたファイルによって```banana```に変わりました。

### 設定ファイルの作成・書き込み
特に初回は色々決まりごとがありますので、
シェルコマンドからメニューを呼び出して使用します。
* 慣れてくるとテキストファイルをコピー＆ペーストで複製しても問題ありません。
* 平文の設定値を変更する場合は、テキストエディタで十分編集可能です。

#### テンプレートファイルの作成
（後述のインストールは済んでいるしている前提です。）

```bash
$ cd /path/to/プロジェクトの設定ディレクトリ(config)の場所
$ dinomischus
****** Welcome Egoistic Config ******
  1. Make Template
  2. Add or Update Crypted Value
  3. List Configs Simple
  4. List Configs Specify
  c. Clear Screen
  h. Ruby Command List
  z. End 
-----------> Select Menu [1-4,c,h,z]: 
```
↑のメニューが出てきたら１を選択します。

```text
-----------> Select Menu [1-4,c,h,z]: 1
  
****** Make Template ******
  
Input Your Config Prefix Name : ____

```
1を選択すると設定ファイルの識別用先頭文字列を聞いてきます。任意の文字を入れてください。（ここではprj）
（一度設定した識別文字で、既に存在するファイルがあった場合は、ファイル作成処理をスキップします。）

```text
Input Your Config Prefix Name : prj
Make File Default Value is ... 
  Key    File Place [/path/to/ホームディレクトリ/.crypt_config/prj_key.yml]
  Config File Place [/path/to/カレントディレクトリ/config/prj_config.yml]
  Define File Place [/path/to/カレントディレクトリ/config/prj_config_index.yml]
 
Press Enter Key to Next Step... 
```
作成されるファイルを確認してエンターキーを押します。
* ```.crypt_config```、および```config```ディレクトリは存在しない場合、作成します。

```text
Done! 
Next Step is Add Crypt Config|Plain Config to /path/to/カレントディレクトリ/config/prj_config.yml .  
Add Config Value then You Select Menu No.2 .
-----------> Select Menu [1-4,c,h,z]: 
```

以上でテンプレートの作成を終わります。
あとは出来上がったファイルを適宜コピーするなり、保存先を変更するなりして自分が望む構成に変えます。
ディレクトリを変更した場合、各ファイルのパスが設定ファイルの先頭に記述してありますので、
そちらも併せて変更してください。

#### 設定値(暗号化)の追加
先述と同様に```dinomischus```コマンドからメニューを呼び出します。

```bash
$ cd /path/to/プロジェクトの設定ディレクトリ(config)の場所
$ dinomischus
****** Welcome Egoistic Config ******
  1. Make Template
  2. Add or Update Crypted Value
  3. List Configs Simple
  4. List Configs Specify
  c. Clear Screen
  h. Ruby Command List
  z. End 
-----------> Select Menu [1-4,c,h,z]: 
```
↑のメニューが出てきたら2を選択します。

```text
-----------> Select Menu [1-4,c,h,z]: 2
 
****** Crypted Value Setting ******"
  Input Your Config Path : config/prj_config.yml
  Input Your Key   : email
  Input Your Value : myValue1@example.com
  Input Your Description : 設定用サンプルE-mail Address。実在しない。
 
Done! 
```

編集したい設定ファイルパスを入力後、
出てくる項目に対してそれぞれ設定したい値を入力します。
設定値の暗号化は以上です。
ここまで上手くいくと以下の様な設定ファイルが出来上がっているはずです。

```yaml:config/prj_config_index.yml
---
- :conf_path: "/home/vagrant/project/config/prj_config.yml"
```
```yaml:/path/to/project/config/prj_config.yml
---
- :key_path: "~/.crypt_config/prj_key.yml"
- :dummy:
    :value: ''
    :desc: ''
  :email:
    :value: |-
      ?Afo3Ccn307HZgQgBRwmyUQtCqDus3063wz1h9CIpRMIWdpRC07yfd2TG5jKa
      OrQiDDMfySjQIhWfL1Gt0UJ8tngSiUJT4gfgvjN7/+LHpdk=
    :desc: 設定用サンプルE-mail Address。実在しない。
```
※ ```{:dummy => {:value: '', :desc:''}}``` が気になる場合テキストエディタで削除してください。

```yaml:~/.crypt_config/prj_key.yml
---
:key:
  :type: sha256
  :value: eUIZzgKKnsJCoLcRX5pXXg
```

## インストール方法
インストールはrubygemに登録しましたので、gem install で可能です。

```bash
$ gem install dinomischus
```

## 各ファイルの説明
### 各ファイル間の関係図
![ConfigFileRelation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14800/e89e1199-afb4-a19c-45c5-5802eaf297af.png)

### 定義ファイル（```*_config_index.yml```)
設定ファイルの読み込む順番を定義します。

* 読み込む順番は上から下へ順に読み込みます。
* 設定項目が重複した場合は、後に読み込んだ値で上書きします。
* ２つ以上のファイルの定義が可能です。

### 設定ファイル(```*_config.yml```)
鍵ファイルへのリンク（key_path）と設定値のテキストを保存しています。

* { 設定項目=> { value:"設定値", desc:"説明"} }　の形で１セットです。
* 設定値の先頭文字が「?」の場合、key_pathに記載されているパスワードで復号を試みます。
* 暗号化された設定値は２回暗号化処理をしております。（１回目は設定値の暗号化文字列とソルト、２回目は暗号化文字列とソルトを一緒にして一つの暗号化文字列へ。この効果により同じ設定値でも暗号化するたびに全く異なる一つの設定値になります。）
* 設定値を平文で設定する場合、テキストエディタを使って直接編集してください。

### 鍵ファイル（```*_key.yml```）
暗号化/復号化に使うパスワードを保存しています。

* 暗号化方式はsha256です。
* テンプレートの作成時に自動で作成しますが、**暗号化する前であれば**テキストエディタで任意の文字列に変えても構いません。（暗号化してしまった後にパスワードを変えた場合、復号時に失敗します。）
* ```type:```は将来の仕様拡張に向けての予備項目です。現在は「sha256」一択です。

## ソース
[KurokoSin/Dinomischus (Github)](https://github.com/kurokoSin/Dinomischus)にて公開しております。

## 開発環境
Ubuntu 20.04LTS　
ruby 2.6.3
です。rails 用ではなくruby用に作っています。rails上でも動けばいいのですが。。。。