RawGitからjsDelivrに移行した

今月末以後にサービス終了とのことなのでjsDelivrに移行した。
アナウンスから終了まで割と短いが、jsDelivrに専用のガイドページが用意されている。jsDelivrはRawGitのようにGitHubの参照もできるが、npmパッケージがある場合はそちらの方が利用率は高くなる傾向があるとか。

続きを読む

Subversion 1.10で認可され(authorize)ない

1.9から1.10にサーバをバージョンアップしたら問題が発生した。
svn up なり svn list なりを行うと、

svn: E175013: Access to '/path/to/hoge/trunk' forbidden

と出てアクセスできない。HTTP(S)経由なので、LogLevel debug としてログを追ってみると最後に

Access denied: 'admin' OPTIONS hoge:/trunk

となっていて、認証(authentication)まではうまくいっている。

認可用ファイルは以下の通り

[/]
admin = rw

[hoge:/]
user = rw

こうしておくと、今までは admin ユーザは全リポジトリにアクセスできていた。
どうも1.10から一番詳しく一致するレコードのみ見るようになった風に思える。確かにその方がより細かくアクセス制御はできるのだろうが、リリースノートには認可周りの修正と強化をしたとあるだけで、そのような非互換の変更があったとは書いていない(か、気付かなかった)。

対策1 新機能の :glob:を使う

[/][:glob:/*] としたらアクセスできるようになった。
より深いパスの指定が他にある場合は、それより優先させるために [:glob:/**] とする必要があるはず。
一番単純で admin としての意図に近いのでこの方法にした。大量にファイルを舐める時にパフォーマンス的には悪いかもしれない。

対策2 各レコードにいちいち権限を付ける

[hoge:/] 以下にも admin = rw を加えても、アクセスできるようになった。
これはリポジトリが多い場合、記述が冗長になりすぎる。

対策2.1 グループを使う

ユーザをすべてグループ定義に変えて、各グループに admin を加えれば、それなりにコンパクトになる

[groups]
user = user, admin

[hoge:/]
@user = rw

ただ、グループ名にユーザ名を使うにしろリポジトリ名を使うにしろ、本来のグループの使い方とずれているので、後で混乱しそうだ。

CentOS 7でgeoipupdateが動かなくなった

GeoIP-update-1.5.0-11.el7 が4月からエラーを吐くようになった。

/etc/cron.weekly/geoipupdate:
Received Error -21 (Sanity check database_info string failed) when attempting to update GeoIP Database
Received Error -21 (Sanity check database_info string failed) when attempting to update GeoIP Database

サイトを確認してみると、ライセンス購入をしていないとLegacy Databaseは更新できなくなり、ダウンロードできるのも3月版のみ、しかも2019年1月2日からはウェブからも削除されるらしい。
GeoLite2は使える風なので、別途GeoIP2をインストールしてみる。

データベースのダウンロード

本来であればデータベースをダウンロードするのだが、後述の通り2019年12月下旬より直接のデータのダウンロードはできなくなった。geoipupdateというアップデータで全データをダウンロードすることになる。バージョン2系のアップデータは全データのダウンロードがとても遅かったが、現在のバージョンでは解消されている。

geoipupdate のインストール

更新のためgeoipupdateを入れる。
リリースページにバイナリリリースのtarballがあるのでこれを使用した。
rpmもあるが、これを入れるにはGeoIP1系を消しておく必要がある。

curl -O https://github.com/maxmind/geoipupdate/releases/download/v4.1.5/geoipupdate_4.1.5_linux_386.tar.gz
tar xaf geoipupdate_4.1.5_linux_386.tar.gz
cd geoipupdate_4.1.5_linux_386
mkdir -p /opt/geoip/{bin,etc}
mv geoipupdate /opt/geoip/bin/
mv GeoIP.conf /opt/geoip/etc/

GeoIP.conf の DatabaseDirectory も設定する。

# The directory to store the database files. Defaults to /usr/local/share/GeoIP
DatabaseDirectory /opt/geoip/share/GeoIP
geoipupdate をソースからビルドする場合

以下はソースからビルドする場合だが、バージョン2.5の時の例なので現在(4.1)とは手順が異なる可能性が高い。

sudo yum install libcurl-devel
git clone --depth=1 https://github.com/maxmind/geoipupdate
cd geoipupdate
./bootstrap
./configure --prefix=/opt/geoip
make
sudo make install

ASN databaseも更新するならばGeoIP.confのEditionIDsにGeoLite2-ASNを追加する必要がある。

ライセンスキーを取得する

2019年12月下旬より、カリフォルニアのプライバシー法(CCPA)準拠のために無料利用でもアカウントが必要になったらしい。
GeoIPの利用者もCCPAに準拠する必要があるが、その辺りはここでは割愛する。

  1. 登録ページでユーザ登録する。
  2. メールが届くので、メールのURLからパスワード設定(リセット)ページにアクセスしてパスワードを設定する。
  3. ライセンスキー作成ページで鍵を作る。鍵の説明(メモ欄)を入力し、GeoIP Updateに使うか = Yes、geoipupdate 3.1.1以降かを選ぶ。バージョンは geoipupdate -V で確認できる。
  4. 鍵が表示されるので、confファイルのAccountIDとLicenseKeyに設定する。鍵はこの画面でしか表示されないのでバックアップを安全な場所に保存しておく。

更新をテストする

/opt/geoip/bin/geoipupdate -f /opt/geoip/etc/GeoIP.conf -v | less

rpmインストールや自前でビルドした場合など、デフォルトのパスを使っている場合は-fでconfファイルの場所を指定する必要はない。

ASN databaseは毎週火曜、他は毎月最初の火曜に更新されるらしい。
タイムゾーンが不明なので木曜頃に更新するようにcrontabに書いた。

23 9 1-8 * Thu /opt/geoip/bin/geoipupdate -f /opt/geoip/etc/GeoIP.conf

以上だが…

あとは各アプリケーションでGeoIPではなくGeoIP2を使うようにする必要があり、これが多いと面倒かもしれない。
またDBパスがデフォルトではないので /opt/geoip/share/GeoIP 以下をクライアントでも指定する必要がある。

cURL 7.56.0で大きなデータをPOSTするとデータが壊れる

curl_setopt()CURLOPT_POSTFIELDSでデータを設定し送信するときに、16KBあたり以降のデータが先頭からの繰り返しになる。
PHP 7.1.11以降、最新のPHP 7.2.1でも起きる。
cURLのバグのようで、公式WindowsビルドのcURLPHP 7.1.11から7.56.0にアップデートしたためのようだ。
cURL 7.56.1で修正されているのだが、WindowsPHPのリンクしているcURLが古いままなのでなんともしがたい。

GNU screenで行の折り返しが変になる

GNU screen内のbashvimで画面幅に収まらない長い行を表示しても折り返されず、右端の文字が上書きされるだけになってしまう。
症状として、bashで上下キーなどでhistoryを表示していると長い行を表示した後でその分だけカーソルが上に行ってしまう。vimでは長い行の後で階段状に表示され、しかも改行されない分だけ以降の行が実際より上に表示される。


line-wrapが切れているのが原因なので直すには^arや、^a^r、^a:wrap (:wrap on)で+wrap状態にすればよい。何かのはずみにミスタイプして-wrap状態になったのだろう。
これが起きた環境ではscreenの中のあるウインドウでsshしてさらにscreenを起動しており、外側のscreenで-wrapとなっていた。
内側のscreenが原因かと思いそちらで試行錯誤していてなかなか気づかなかった。

そもそも:wrap offを使ったことがないので.screenrcに

bind r
bind ^r

としてキーを無効化してみた。