自分の管理下にある Tasking Manager でログインできなくなった話

OpenStreetMap でそれなりに広いエリアを編集したい時は HOT の Tasking Manager を利用しています。

http://osmtm.pgw.jp/

OSC 2017 Tokyo Spring で出展中にこの自分の管理下にある Tasking Manager を使って編集をしようと思いましたが、ログインしようとするとエラーになるので使うのを一時的にあきらめました。

原因の調査

落ち着いて作業できる状況になったところで動作のログを確認すると次のようなものが表示されていました。

SSLHandshakeError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)

SSL の証明書関係でエラーが出ているようです。
そういえば先月あたりに OpenStreetMap Foundation が管理する Web サイトの証明書が Let’s Encrypt のものになったというニュースがありました。きっとこれです。

問題の修正

Tasking Manager のリポジトリでも同じエラーによる issue が上がっていて解決法も示されていました。
virtualenv の環境で pip パッケージの更新をすればよいようです。

$ ./env/bin/pip install --upgrade httplib2
$ ./env/bin/pip install --upgrade urllib3[secure]

さらに起こった悲劇(?)

これで無事にログインできるようになったのですが、ここで「Tasking Manager も更新しちゃえ」と git pull したのが運の尽き、今度は Tasking Manager 自体が動かなくなってしまいました。
git pull 以後のログを確認すると「project テーブルに requires_validator_role カラムなんてねーよ」という感じのエラーが出ていました。

解決方法の模索

カラムがないならカラムを追加すればいいじゃないと思ったのですが、カラムの型がわからないので手の出し様がありません。
仕方なく docker で一時的な Tasking Manager を立ち上げてデータベースを比較します。構造の比較方法なんて知らないので手動で確認しました。

ざっくり次のような形で新しい Tasking Manager で使われている project テーブルを確認しました。

new$ sudo -u postgres psql -d newosmtm
newosmtm=# \d project;
<snip>
 id                               | integer                     | not null default nextval('project_id_seq'::regclass)
 status                           | integer                     |
 area_id                          | integer                     |
 created                          | timestamp without time zone | 
 author_id                        | bigint                      | 
 last_update                      | timestamp without time zone | 
 license_id                       | integer                     | 
 zoom                             | integer                     | 
 imagery                          | character varying           | 
 priority                         | integer                     | 
 done                             | double precision            | 
 validated                        | double precision            | 
 entities_to_map                  | character varying           | 
 changeset_comment                | character varying           | 
 private                          | boolean                     | 
 josm_preset                      | character varying           | 
 due_date                         | timestamp without time zone | 
 requires_validator_role          | boolean                     | not null default false  
 requires_experienced_mapper_role | boolean                     | not null default false
<snip>

既存の Tasking Manager には requires_validator_rolerequires_experienced_mapper_role のカラムがありません、これを boolean で false を持った状態で追加させればなんとかなりそうです。

current$ sudo -u postgres psql -d osmtm
osmtm=# ALTER TABLE project ADD requires_validator_role boolean DEFAULT false NOT NULL, ADD requires_experienced_mapper_role boolean DEFAULT false NOT NULL;

\dt; を実行したところ新しい方の Tasking Manager ではテーブルも3つ増えていました。
プロジェクトへラベルを付与できるようになったのかそんな感じの名前のテーブルがありました。これらのテーブルスキーマを取り出してやればよさそうです。

new$ sudo -u postgres pg_dump -d osmtm -s -t project_labels > project_labels.sql
new$ sudo -u postgres pg_dump -d osmtm -s -t labels > labels.sql
new$ sudo -u postgres pg_dump -d osmtm -s -t labels_translation > labels_translation.sql

3つのファイルをどうにかして既存のサーバーにコピーして取り込みます。

current$ sudo -u postgres psql -d osmtm < project_labels.sql
current$ sudo -u postgres psql -d osmtm < labels.sql
current$ sudo -u postgres psql -d osmtm < labels_translation.sql

これでやっと動くようになりました。ながかった…。