IIJ DNSアウトサービスのDO-APIをつかったサンプルプログラム

IIJ DNSアウトサービスを使っていて、DO-APIを触る機会があったのですが、マニュアルの[サンプルプログラム](http://manual.iij.jp/dns/doapi/754453.html)をそのまま流用するにはちょっと悩んだところがあったので、コピペで使えそうなものを残しておきます。

#署名作成関数
```signature.sh
### StringToSignを作成しKeyから署名を作成する
### http://manual.iij.jp/dns/doapi/754437.html
function signature
{
  IIJAPI_EXPIRE=$1
  METHOD=$2
  REQUEST_PATH=$3
  CONTENTMD5=$4
  CONTENTTYPE=$5

  ### URLエンコードは呼び手側で実施済みとする
  URL_ENC_PATH=${REQUEST_PATH}

  {
    echo    $METHOD
    echo    $CONTENTMD5
    echo    $CONTENTTYPE
    echo    "x-iijapi-expire:${IIJAPI_EXPIRE}"
    echo    "x-iijapi-signaturemethod:HmacSHA256"
    echo    "x-iijapi-signatureversion:2"
    echo -n "${URL_ENC_PATH}"
  } | openssl dgst -sha256 -binary -hmac $IIJAPI_SECRET_KEY $STRING_TO_SIGN | base64

  return 0
}
```

#ECHO
```echo.sh
### API:GET echo
### http://manual.iij.jp/dns/doapi/754637.html
function check_echo
{
  REQUEST_PATH="/r/${APIVERSION}/echo/qwerty12345.json"

  SIGNATURE=`signature ${IIJAPI_EXPIRE} "GET" ${REQUEST_PATH} "" ""`

  curl -s -H "x-iijapi-Expire:${IIJAPI_EXPIRE}" \
          -H "x-iijapi-SignatureMethod:HmacSHA256" \
          -H "x-iijapi-SignatureVersion:2" \
          -H "Authorization: IIJAPI ${IIJAPI_ACCESS_KEY}:${SIGNATURE}" \
           https://${HOST}${REQUEST_PATH}

  return 0
}
```

#GET zones
```get_zones.sh
### API:GET zones
### http://manual.iij.jp/dns/doapi/754466.html
function get_zones
{
  REQUEST_PATH="/r/${APIVERSION}/${DOSERVICECODE}/zones.json"

  SIGNATURE=`signature ${IIJAPI_EXPIRE} "GET" ${REQUEST_PATH} "" ""`

  curl -s -H "x-iijapi-Expire:${IIJAPI_EXPIRE}" \
          -H "x-iijapi-SignatureMethod:HmacSHA256" \
          -H "x-iijapi-SignatureVersion:2" \
          -H "Authorization: IIJAPI ${IIJAPI_ACCESS_KEY}:${SIGNATURE}" \
           https://${HOST}${REQUEST_PATH}

  return 0
}
```

#GET records
```get_records.sh
### API:GET records
### http://manual.iij.jp/dns/doapi/754619.html
function get_records
{
  REQUEST_PATH="/r/${APIVERSION}/${DOSERVICECODE}/${ZONE}/records/DETAIL.json"

  SIGNATURE=`signature ${IIJAPI_EXPIRE} "GET" ${REQUEST_PATH} "" ""`

  curl -s -H "x-iijapi-Expire:${IIJAPI_EXPIRE}" \
          -H "x-iijapi-SignatureMethod:HmacSHA256" \
          -H "x-iijapi-SignatureVersion:2" \
          -H "Authorization: IIJAPI ${IIJAPI_ACCESS_KEY}:${SIGNATURE}" \
           https://${HOST}${REQUEST_PATH}

  return 0
}
```


#使い方
上記に記載したシェルの関数を使って、あとはサービスコードとアクセスキー、シークレットキーを与えて実行すればきっと動くと思います。
下記のサンプルは、ECHOで認証情報をチェックしたあと、ZONE情報を取得して、その先頭のZONEのレコード一覧を整形したjsonでダンプする例です。
エラー処理とか全く考慮していないので、適宜工夫してくださいね～。

```sample.sh
### main ###
HOST="do.api.iij.jp"
APIVERSION="20140601"

IIJAPI_EXPIRE=`date -d '15 mins' +'%Y-%m-%dT%H:%M:%SZ'`

DOSERVICECODE=""
IIJAPI_ACCESS_KEY=""
IIJAPI_SECRET_KEY=""

check_echo > /dev/null
ZONE=`get_zones | jq -r '.ZoneList[0]'`
get_records | jq '.'
```

#PUTの例
ここまでの例だとGETしか呼んでなかったのでPUTの例としてCOMMIT/RESETのコードも貼っておきます。
個人的にはリクエストボディが空の時に署名で使うCONTENTMD5文字列ってどうするのか試行錯誤したのですが、結局、空文字でいけました。
リクエストボディが必要なAPIを使う場合はリクエストボディの文字列をmd5sum関数に食わせて作成したハッシュ文字列を入れてくださいね。もちろんcurl呼ぶ時は ```-H "Content-MD5:{ハッシュ文字列}"``` を加えるのを忘れずに。

```commit_reset.sh
### API:PUT commit
### http://manual.iij.jp/dns/doapi/754632.html
function commit
{
  REQUEST_PATH="/r/${APIVERSION}/${DOSERVICECODE}/commit.json"
  METHOD="PUT"
  CONTENTMD5=""
  CONTENTTYPE="application/json"

  SIGNATURE=`signature ${IIJAPI_EXPIRE} ${METHOD} ${REQUEST_PATH} "${CONTENTMD5}" "${CONTENTTYPE}"`

  curl -s -H "Content-Type:application/json" \
          -H "x-iijapi-Expire:${IIJAPI_EXPIRE}" \
          -H "x-iijapi-SignatureMethod:HmacSHA256" \
          -H "x-iijapi-SignatureVersion:2" \
          -H "Authorization: IIJAPI ${IIJAPI_ACCESS_KEY}:${SIGNATURE}" \
          -X ${METHOD} \
           https://${HOST}${REQUEST_PATH}

  return 0
}

### API:PUT reset
### http://manual.iij.jp/dns/doapi/754610.html
function reset
{
  REQUEST_PATH="/r/${APIVERSION}/${DOSERVICECODE}/${ZONE}/reset.json"
  METHOD="PUT"
  CONTENTMD5=""
  CONTENTTYPE="application/json"

  SIGNATURE=`signature ${IIJAPI_EXPIRE} ${METHOD} ${REQUEST_PATH} "${CONTENTMD5}" "${CONTENTTYPE}"`

  curl -s -H "Content-Type:application/json" \
          -H "x-iijapi-Expire:${IIJAPI_EXPIRE}" \
          -H "x-iijapi-SignatureMethod:HmacSHA256" \
          -H "x-iijapi-SignatureVersion:2" \
          -H "Authorization: IIJAPI ${IIJAPI_ACCESS_KEY}:${SIGNATURE}" \
          -X ${METHOD} \
           https://${HOST}${REQUEST_PATH}

  return 0
}
```