自分の管理下にある Tasking Manager でログインできなくなった話
OpenStreetMap でそれなりに広いエリアを編集したい時は HOT の Tasking Manager を利用しています。
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_role
と requires_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
これでやっと動くようになりました。ながかった…。