doveadmとjqコマンドを組み合わせて既定パーセントを超えているユーザを一覧化する、というスクリプトを考えた
前提として、LDAP連携時、1000件を超えるアドレスがある場合、doveadm quota get -A での一括取得ができない、という制約がある。
このため、ldapserchコマンドを使ってユーザ一覧を出力した上で個別に処理を行っていく必要がある。
doveadm quota get -u ユーザ名の通常出力は以下となる
[root@mail ~]# doveadm quota get -u testuser2
Quota name Type Value Limit %
User quota STORAGE 6 50 12
User quota MESSAGE 8 - 0
[root@mail ~]#
doveadmコマンドには-fオプションがあってフォーマットを変えられ、例えばdoveadm -f tab quota get -u ユーザ名を実行するとタブ区切りで処理するためタブが1個だけで表示される
[root@mail ~]# doveadm -f tab quota get -u testuser2
Quota name Type Value Limit %
User quota STORAGE 6 50 12
User quota MESSAGE 8 - 0
[root@mail ~]#
最近のLinuxならjqコマンドがインストールされているのでJSONで形式で出力することにする
[root@mail ~]# doveadm -f json quota get -u testuser2
[{"root":"User quota","type":"STORAGE","value":"6","limit":"50","percent":"12"},{"root":"User quota","type":"MESSAGE","value":"8","limit":"-","percent":"0"}][root@mail ~]#
これを単純にjqコマンドに通す
[root@mail ~]# doveadm -f json quota get -u testuser2 | jq -r
[
{
"root": "User quota",
"type": "STORAGE",
"value": "6",
"limit": "50",
"percent": "12"
},
{
"root": "User quota",
"type": "MESSAGE",
"value": "8",
"limit": "-",
"percent": "0"
}
]
[root@mail ~]#
今回は 容量のみ見るので「STORAGE」に関してだけ取得したい。この場合は「.[]」で1段階掘り下げた上で「|」でその下に対する処理を行い、「select」で条件にあうものを選択する、という処理を行う
[root@mail ~]# doveadm -f json quota get -u testuser2 | jq -r '.[] | select(.type =="STORAGE") '
{
"root": "User quota",
"type": "STORAGE",
"value": "6",
"limit": "50",
"percent": "12"
}
[root@mail ~]#
selectは複数つなげられる、というのでpercentについても追加するも、90以上なら表示のところ、12なのに表示されている
[root@mail ~]# doveadm -f json quota get -u testuser2 | jq -r '.[] | select(.type =="STORAGE" and .percent>90 ) '
{
"root": "User quota",
"type": "STORAGE",
"value": "6",
"limit": "50",
"percent": "12"
}
[root@mail ~]#
じゃあ、percentが12なら表示に変更してみるが、何も表示されない。
[root@mail ~]# doveadm -f json quota get -u testuser2 | jq -r '.[] | select( .percent == 12 ) '
[root@mail ~]#
文字列問題か?ということで、数値を「””」でくくってみると表示される
[root@mail ~]# doveadm -f json quota get -u testuser2 | jq -r '.[] | select( .percent == "12" ) '
{
"root": "User quota",
"type": "STORAGE",
"value": "6",
"limit": "50",
"percent": "12"
}
[root@mail ~]#
jqコマンド処理内で、文字列として認識されているものを数値として認識させるのは「tonumber」を通す
[root@mail ~]# doveadm -f json quota get -u testuser2 | jq -r '.[] | select(.type =="STORAGE" and (.percent|tonumber) > 90 ) '
[root@mail ~]#
10より上なら表示に変更
[root@mail ~]# doveadm -f json quota get -u testuser2 | jq -r '.[] | select(.type =="STORAGE" and (.percent|tonumber) > 10 ) '
{
"root": "User quota",
"type": "STORAGE",
"value": "6",
"limit": "50",
"percent": "12"
}
[root@mail ~]#
で、percentの数値だけを出力させるには以下となる
[root@mail ~]# doveadm -f json quota get -u testuser2 | jq -r '(.[] | select(.type =="STORAGE" and (.percent|tonumber) > 10 ) ).percent'
12
[root@mail ~]# doveadm -f json quota get -u testuser2 | jq -r '(.[] | select(.type =="STORAGE" and (.percent|tonumber) > 90 ) ).percent'
[root@mail ~]#
これを環境変数で実行できるように修正を試みるがエラーとなる
[root@mail ~]# limitpercent=10
[root@mail ~]# username=testuser2
[root@mail ~]# doveadm -f json quota get -u $username | jq -r '(.[] | select(.type =="STORAGE" and (.percent|tonumber) > $limitpercent ) ).percent'
jq: error: $limitpercent is not defined at <top-level>, line 1:
(.[] | select(.type =="STORAGE" and (.percent|tonumber) > $limitpercent ) ).percent
jq: 1 compile error
[root@mail ~]#
jqコマンドの–argオプションを使って jqコマンド内部用の$limitpercentを設定する必要があった
[root@mail ~]# doveadm -f json quota get -u $username | jq --arg limitpercent 10 -r '(.[] | select(.type =="STORAGE" and (.percent|tonumber) > $limitper
cent ) ).percent'
[root@mail ~]#
今回も文字列数値問題があるようなのでtonumberを追加
[root@mail ~]# doveadm -f json quota get -u $username | jq --arg limitpercent $limitpercent -r '(.[] | select(.type =="STORAGE" and (.percent|tonumber) > ($limitpercent|tonumber) ) ).percent'
12
[root@mail ~]#
これで、使用率の値だけの取り出しが出来た。