Site Kit by Google のランゲージパックを自動更新
Site Kit by Google の日本語ランゲージパックを入れても、Site Kit 本体が更新されると英語表記に戻ってしまいます。ランゲージパックをダウンロードしてインストールしてあげれば日本語に戻るのですが、いちいちやってられないので自動化することにしました。
Windows の PowerShell スクリプトを公開しているページはあったのですが、WordPress の稼働しているサーバーで完結したかったので、シェルスクリプトを作成しました。
仕様:
- 毎日1回 cron で呼び出される
- cron を実行するのは自分のアカウント
- ランゲージパックの更新があればインストール
ランゲージパックのインストール方法は「【サイトキット】プラグイン Site Kitを日本語に戻す方法」などを参照してください。
簡単に説明すると、WordPress をインストールしたディレクトリ(以下「$WPDIR」と表記)の wp-content/languages/plugins/ に日本語ランゲージパックのファイルをコピーすればOKです。
補助グループ設定
サーバーにログインしたアカウント(mit)では cd $WPDIR
すらできません。
# cd $WPDIR
# ls -ld
drwxr-x--- 5 www-data www-data 4096 9月 29 02:33 ./
ls とかするためにわざわざ root に su するのも煩わしいので、mit の補助グループ(supplementary groups)に www-data を加えてしまいます。
$ sudo usermod -aG www-data mit
ちなみに、man usermod
しても -a オプションがありませんでした。バグなのかな?ヘルプには出ます。
$ usermod --help
使い方: usermod [オプション] LOGIN
オプション:
-a, --append ユーザを (-G で指定された) 補助グループ群
GROUPS に追加する。他のグループからの削除は
行わない。
-b, --badname allow bad names
-c, --comment COMMENT GECOS フィールドの値を再設定する
-d, --home HOME_DIR ユーザアカウントのホームディレクトリを
再設定する
-e, --expiredate EXPIRE_DATE アカウント期限切れの日を EXPIRE_DATE にする
-f, --inactive INACTIVE パスワードを期限切れ後に無効化する日数を
INACTIVEにする
-g, --gid GROUP 主グループを GROUP に変更する
-G, --groups GROUPS 新たな補助グループのリストを与える
:
-a を追加しないと -G で指定した補助グループのみになって、以前に設定した補助グループが削除されてしまいますので要注意です。
でも、-a を付け忘れても焦る必要はありません。
usermod しても、設定前にログインしたシェル、つまり usermod を実行したシェルでは正しく設定できたかどうかを確認できないので、新しいシェルを起動して確認する必要があります。
$ id
uid=1000(mit) gid=1000(mit) groups=1000(mit),4(adm),24(cdrom),27(sudo),30(dip),33(www-data),46(plugdev),101(lxd)
こんな風になっていればOKなんですが、他の sudo など必要な補助グループがなくなっていたら、usermod を実行したシェルで usermod 前の状態を確認できます。
$ id
uid=1000(mit) gid=1000(mit) groups=1000(mit),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),101(lxd)
あとは usermod -aG でこれらのGIDを追加してあげれば元に戻ります。
sudoers 設定
これでログインアカウントでも $WPDIR 以下のディレクトリに cd したり ls したりできるようになりましたが、書き込みはできません。
ディレクトリのパーミッションをグループに対して書き込み許可することで解決できるのですが、たかだかファイルコピーのためだけに安全性を低下させるのもいかがなものかと思いますので、コピーするときは sudo でコピーできるようにします。
バッチから起動するのでパスワードなしで sudo できるようにします。
sudo の許可を管理するのが /etc/sudoers ですが、このファイルを直接編集しないほうが賢明です。このファイルの最後に @includedir ディレクティブがありますので、そこに新しいファイルを作成します。
$ head -1 /etc/os-release
PRETTY_NAME="Ubuntu 24.04.3 LTS"
$ sudo tail -1 /etc/sudoers
@includedir /etc/sudoers.d
$ sudo visudo /etc/sudoers.d/mit
sudoers ファイルのフォーマットは man 5 sudoers
の「SUDOERS FILE FORMAT」で確認できます。EBNF で書式が記載されていてクイックガイドまでついているから親切ですなー。w
『mit アカウントは www-data 権限で rm と unzip を実行することができ、その際パスワードは必要ない』、というのがこれ↓。
mit ALL=(www-data) NOPASSWD: /usr/bin/rm,/usr/bin/unzip
sudo -l
で以下のような順番で表示されればOKなはず。
$ sudo -l
既定値のエントリと照合中 (ユーザー名 mit) (ホスト名
server):
:
ユーザー mit は server 上で コマンドを実行できます
(ALL : ALL) ALL
(www-data) NOPASSWD: /usr/bin/rm, /usr/bin/unzip
バッチ
これで準備できたのでバッチを作ります。
#!/bin/sh
: ${LANGPACKDIR:=/var/www/tyd4.com/wp-content/languages/plugins}
eval $(wget -qO- "https://translate.wordpress.org/projects/wp-plugins/google-site-kit/language-packs/" | perl -ne 'print("ja_zip_url=\"$1\"\nja_zip_ver=\"$2\"\n") if ($_ =~ /"(https:\/\/[^"]*\/([0-9.]+)\/ja.zip)"/);')
. $HOME/.pre_sitekit_ja_ver
if [ x$pre_sitekit_ja_ver != x$ja_zip_ver ]
then
JA_ZIP_PATH="$HOME/tmp/google-site-kit-${ja_zip_ver}-ja.zip"
wget -qO${JA_ZIP_PATH} ${ja_zip_url}
sudo -u www-data /usr/bin/rm -f ${LANGPACKDIR}/google-site-kit-ja*
sudo -u www-data /usr/bin/unzip -qd ${LANGPACKDIR} ${JA_ZIP_PATH}
cat <<EOF > $HOME/.pre_sitekit_ja_ver
pre_sitekit_ja_ver='$ja_zip_ver'
EOF
fi
動かす前に準備が必要です。
$ mkdir ~/tmp
$ touch ~/.pre_sitekit_ja_ver
cron に設定
毎日3:15に起動することにしました。
15 3 * * * $HOME/update_sitekit_langpack.sh
これで安心して眠れます。