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

これで安心して眠れます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です