dnf-post-transaction-actionsの不満?

自宅鯖を冗長化したはなしで少し書いたけれど、非対称、つまりプライマリとセカンダリになっている拙宅の場合、プライマリでRPMパッケージをインストール、削除した場合、自動的にセカンダリでも同じ状態になって欲しい。この目的のためにはdnfpost-transaction-actions (パッケージはpython3-dnf-plugin-post-transaction-actions)を使えば良いのだけれど、.actionファイルの書式は以下のようになっている。

package_filter:transaction_state:command

んで、2台のRPMパッケージを同期させる、つまり192.168.1.2でdnfを実行したら192.168.1.3でも同じinstall/update/removeを実行するには

*:any:if [ "${state}" = "install" -o "${state}" = "update" -o "${state}" = "remove" ]; then ssh 192.168.1.3 'dnf -y ${state} ${name}' >> /var/log/rpmstore/rpmsync.log; fi

という風に書かないとならない。これを/etc/dnf/plugins/post-transaction-actions.d/rpmsync.actionとして放り込んでおけば、動くことは動く。

dnf install、上がプライマリ、下がセカンダリ
dnf remove、上がプライマリ、下がセカンダリ

/usr/lib/python3.6/site-packages/dnf-plugins/post-transaction-actions.pyを見れば分かることだけれど、単に設定ファイルを”:”でsplit()しているだけだし、transaction_stateはin/out/anyしかとれずstateによって動作を分けることが出来ないため、汚いif文を書かざるを得ない。”command”部分は単にsubprocess.Popen(shell=True)してるだけなのでこれで動くことは動くのだけれど。

“transaction_state”を以下のように書ければもっと便利なんだが、コードを見るとあくまで”transaction_state”という位置づけっぽく、PRしても機能追加にはならなそう。

*:install,remove,update:command