Ubuntu

Kopano Z-Pushでカレンダー共有

Z-PushでKopanoのカレンダーを公有していたのだけれど、過去の記事のやり方では「全員から見えるカレンダー」ができていた。
当時としては気を遣ってアクセス権を設定をしていたつもりで、その通りに動いているものと思っていたら、甘かった…。



広告


アクセス権の設定

[接続してきているユーザー+デバイス]に対して、[カレンダー]へのアクセス権を追加する、という考え方。
z-push-adminコマンドで管理する。
Kopano Knowledge Base / Tools:z-push-admin

情報収集

接続してきているユーザーとデバイスは、以下で表示ができる。

$ sudo z-push-admin -a list

All synchronized devices

Device id                           Synchronized users
-----------------------------------------------------
7SSSSSSSSSSSSSSSSSSSSSSSSS          hogechild1
uSSSSSSSSSSSSSSSSSSSSSSSSS          hogemother
androidcNNNNNNNNN1                  hogewife
androidcNNNNNNNNN2                  hogechild2
androidcNNNNNNNNN                   hogeuser

※数字をN、文字をSでマスクしている。

カレンダーの情報は、以下で表示ができる。

$ sudo /usr/share/z-push/backend/kopano/listfolders.php -l hogeuser
Available folders in store 'hogeuser':
--------------------------------------------------
Folder name:    Suggested Contacts
Folder ID:      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX370000000000
Type:           SYNC_FOLDER_TYPE_USER_CONTACT

Folder name:    Junk E-mail
Folder ID:      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX300000000000
Type:           SYNC_FOLDER_TYPE_USER_MAIL

Folder name:    Tasks
Folder ID:      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2f0000000000
Type:           SYNC_FOLDER_TYPE_USER_TASK

Folder name:    Notes
Folder ID:      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2e0000000000
Type:           SYNC_FOLDER_TYPE_USER_NOTE

Folder name:    Drafts
Folder ID:      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2c0000000000
Type:           SYNC_FOLDER_TYPE_USER_MAIL

Folder name:    Calendar
Folder ID:      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2b0000000000
Type:           SYNC_FOLDER_TYPE_USER_APPOINTMENT

Folder name:    Contacts
Folder ID:      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2a0000000000
Type:           SYNC_FOLDER_TYPE_USER_CONTACT

Folder name:    Sent Items
Folder ID:      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX290000000000
Type:           SYNC_FOLDER_TYPE_USER_MAIL

Folder name:    Deleted Items
Folder ID:      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX280000000000
Type:           SYNC_FOLDER_TYPE_USER_MAIL

Folder name:    Inbox
Folder ID:      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX260000000000
Type:           SYNC_FOLDER_TYPE_USER_MAIL

※16進数部分をXでマスク、同じ値だった。

アクセス権の設定

集めた情報を使って、アクセス権を設定する。
例えば、hogewifeにhogeuserのカレンダーを見せる(HOGEUSERとして見せる)場合は以下。

$ sudo z-push-admin -a addshared -u hogewife -n HOGEUSER -o hogeuser -t calendar -f XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2b0000000000 -g 1

このパラメーターでは、デバイスを設定していないので、hogewifeが使用しているすべての端末にアクセス権が付けられる。
デバイスを指定して、もっと細かく制御することも可能。

hogeuserのカレンダーが誰から見えているのか確認する場合は以下。

$ sudo z-push-admin -a listshares -f XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2b0000000000

Displaying opened shares for folderid XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2b0000000000.
Shares of user yoshihiro

-------------------------------------------------------------------------------------------------------------------------------------------------
Foldername                     Folder id                                        Username                       Device id
-------------------------------------------------------------------------------------------------------------------------------------------------
HOGEUSER                       XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2b0000000000     hogechild1                     7SSSSSSSSSSSSSSSSSSSSSSSSS
HOGEUSER                       XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2b0000000000     hogemother                     uSSSSSSSSSSSSSSSSSSSSSSSSS
HOGEUSER                       XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2b0000000000     hogewife                       androidcNNNNNNNNN1
HOGEUSER                       XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2b0000000000     hogechild2                     androidcNNNNNNNNN2
-------------------------------------------------------------------------------------------------------------------------------------------------

この方法で1つ1つアクセス権を付けていくことになる。

定期的にアクセス権を設定

カレンダーへのアクセス権は、[接続してきているユーザー+デバイス]に付与するので、新しいデバイスを使い始めたら、再度設定をする。
「新しいデバイスを買ったので設定よろしく」→「了解」…設定…「設定終わったよ」→「サンキュー」というやりとりが若干面倒なので、cronで定期実行することにした。

年がら年中「空振り」しているけれども、数年に一度「当たる」コマンド羅列したスクリプトを作成。

/path/to/script/z-push-entry.sh

#!/bin/bash
z-push-admin -a addshared -u hogewife   -n HOGEUSER -o hogeuser -t calendar -f XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2b0000000000 -g 1
z-push-admin -a addshared -u hogechild1 -n HOGEUSER -o hogeuser -t calendar -f XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2b0000000000 -g 1
z-push-admin -a addshared -u hogechild2 -n HOGEUSER -o hogeuser -t calendar -f XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2b0000000000 -g 1
z-push-admin -a addshared -u hogemother -n HOGEUSER -o hogeuser -t calendar -f XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2b0000000000 -g 1

※実行権を付けておく。

このスクリプトをcronで1時間おきに実行するように設定。

/etc/crontab

59 *    * * *   root    /path/to/script/z-push-entry.sh

※例えば、毎時59分に実行。

これで、新しいデバイスを買ったら、設定してから最大1時間経過すると、カレンダーにアクセスができるようになる。

空振りを知らせるメールが毎時飛んでくることになるが、その対処は別途考えることにした。

その他

空振り処理を実行するとして、ユーザーや端末が多い場合には相応の時間が掛かるはず。
その場合は、一定期間ごとに差分を出して、変化しているところだけに設定を適用するような処理だといいかもしれない。

また、マニュアルには

Many other cases are possible, e.g. periodically remove all devices that have not connected in the last 3 months.

例えば、過去3ヶ月間に接続されなかったすべてのデバイスを定期的に削除する。
※DeepL先生の翻訳

といったことも書かれており、無駄が発生しないように上手く頑張るスクリプトを作れば、効率的な管理ができるようになると思われる。

ワイプするとどうなるか

元々、全員に見える形でスケジュールを共有していたこともあり、アクセス権を追加しようとしても「そのデバイスには既に見せているよ」というメッセージが表示され、エラーになって設定ができなかった。

これをやりたいときには、

  • /etc/z-push/z-push.conf.phpで全員に見える形で共有していたカレンダーを削除。
  • デバイスを remove して消す。
  • デバイス側でアカウント設定 → 何も変更せずに完了させる。

という手順を踏むと、リセットされることは分かった。

とはいえ、遠隔地に住んでいる人に「はい、今から消すので、デバイス側でアカウント設定をやり直してね」→「りょ」→「設定」というのもだいぶ億劫だったので、ワイプしたらどうなるのかを試してみた。

ワイプの実行

以下のコマンドでワイプすることができた。

$ sudo z-push-admin -a wipe -u webmaster

Are you sure you want to REMOTE WIPE all devices of user 'webmaster' [y/N]: y
Mark devices of user 'webmaster' to be wiped: OK
Synchronized devices of user: webmaster
-----------------------------------------------------
DeviceId:               androidcNNNNNNNNN
Device type:            Android
UserAgent:              Android-Mail/2023.07.23.550728859.Release
Device Model:           HOGEANDROID
Device friendly name:   HOGEANDROID
Device OS:              Android 11
ActiveSync version:     14.1
First sync:             2023-08-05 14:44
Last sync:              2023-08-05 19:39
Sync Period:            unlimited (0)
Total folders:          18
Short folder Ids:       Yes
Synchronized folders:   7
Synchronized data:      Calendars(3) Emails(2) Contacts Tasks
Additional Folders:     2
        Folder name                    Store          Type     Origin     Synched
        ほげ                         hoge           Calendar Configured Active
        ぴよ                         piyo           Calendar Configured Active
Status:                 Pending wipe
WipeRequest on:         2023-08-05 19:40
WipeRequest by:         www-data
Wiped on:               not set
Policy name:            default
Attention needed:       No errors known
-----------------------------------------------------
DeviceId:               aSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
Device type:            WindowsOutlook
UserAgent:              Outlook/16.0 (16.0.16626.20086; x64)
ActiveSync version:     14.0
First sync:             2023-08-05 18:15
Last sync:              2023-08-05 19:38
Sync Period:            unlimited (0)
Total folders:          18
Short folder Ids:       Yes
Synchronized folders:   10
Synchronized data:      Calendars(3) Emails(4) Contacts Notes Tasks
Additional Folders:     2
        Folder name                    Store          Type     Origin     Synched
        ほげ                         hoge           Calendar Configured Active
        ぴよ                         piyo           Calendar Configured Active
Status:                 Pending wipe
WipeRequest on:         2023-08-05 19:40
WipeRequest by:         www-data
Wiped on:               not set
Policy name:            default
Kopano Outlook Extension:
        Version:        2.1.37
        Build:          cfca54dcb4b196c6530eecad519977d3dc62ed9e
        Build Date:     2021-04-23 05:20
        Capabilities:   receiveflags,sendflags,bcc,oof,ooftime,sharedfolders,impersonate,webapp,freebusy,gab,notes,secondarycontacts,sendas,signatures,debugsupport,syncstate,deliveryreceipts
        Last access:    2023-08-05
Attention needed:       No errors known

成功したようだ。

Z-Pushからデバイスにワイプの依頼を出すのだけれども、それがどのような動作をするのかは、デバイス側のソフトウェアに任されているそうだ。
今回試したところでは、以下の通りとなった。

  • Android端末では、アカウントが消えた。webmasterと一緒に使っていたhogeuserのアカウントも消えた。
  • OutlookのOLExtensionでは、アカウントもメールも残されていたが、同期ができなくなった。

これを遠隔の端末にやったらトラブルになるな、と思った。

ワイプからの復旧

じゃあ、他の方法を考えるか…と、Android端末にアカウント設定して復旧させようとしたところ、以下のメッセージが表示され、アカウントを追加することができなかった。

Can't add account

Gmail's security settings are more secure than those set by your IT admin.
Contact your IT admin for help.

アカウントを追加できません

Gmailのセキュリティ設定が、IT管理者が設定したセキュリティよりも強化されています。
IT管理者にお問い合わせください。

情報を探そうにも、日本語では見つからなかったので、端末を英語に切り替えてメッセージを表示させた。
英語のメッセージでは幾つかの情報が見つかったが、Z-Pushに関わるところでは、PHPのバージョンが上がったのに対応するような話だけだった。

だいぶ時間を溶かした後に、本家のマニュアルを見直したところ、そのものズバリの情報が書かれていた。

If a wiped device is to be used with Z-Push again, the device needs to be removed (action remove) from z-push, else it will wipe again.

ワイプされたデバイスを再びZ-Pushで使用する場合は、デバイスをz-pushから削除(アクションremove)する必要があります。
※DeepL先生の翻訳

Kopano Knowledge Base / Tools: z-push-admin / Action: wipe

今回はユーザーwebmasterが扱うデバイスをワイプしたのだから、ユーザー単位の状態を確認してみよう。

# z-push-admin -a list -u webmaster

Synchronized devices of user: webmaster
-----------------------------------------------------
DeviceId:               aSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
Device type:            WindowsOutlook
UserAgent:              Outlook/16.0 (16.0.16626.20086; x64)
...
Status:                 Pending wipe
...
Attention needed:       No errors known
-----------------------------------------------------
DeviceId:               androidcNNNNNNNNN
Device type:            Android
UserAgent:              Android-Mail/2023.07.23.553967039.Release
...
Status:                 Wiped
...
Attention needed:       No errors known

先程書いた、Outlookは切断、Androidはワイプ、という状態が把握できている。凄いな。

これらのデバイスをいったんリムーブする必要があるということだったから、以下のコマンドを実行。

# z-push-admin -a remove -d androidcNNNNNNNNN
# z-push-admin -a remove -d aSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

これでアカウントを再度登録することができるようになった。

さいごに

記事を整理しながら調べていて、Kopanoコミュニティエディションの終了情報を確認。
Statement regarding the closure of the Kopano community forum and the end of the community edition

コミュニティエディションがあまり更新されなくなったと感じてはいたが、2022年11月4日がその発表の日だった。

Zarafa/Kopanoというと…

GoogleがExchangeサービスを有料化、月600円というので、自前で運用できるサーバーを考えはじめ、2013年6月にZarafaを発見して環境を構築
2017年4月30日にZarafaが終わりを告げ、Kopanoが事業を引き継いだときには、びっくりしたけど凄いな、こういう世界もあるんだなと感じた。この時、ZaradaからKopanoに雑にアップグレードをして、幾つかのデーターを吹き飛ばした
また、この頃からSSLで運用するためにCAを立てたり、情報を守らねばとクライアント証明書で保護したり、なんてこともした。

Samba ad dcを立てて、ユーザー管理を任せるようにしたのが2019年8月。この時には、データーをちゃんと移行するために、スキーマを追加し、ユーザーの作成とフックの考え方を調べつつ、Zarafa時代のスクリプトに改造を入れたりして、なんとか移行させた。

そして、DockerでKopanoを無理矢理動かすことができるようになったのが2022年7月31日。
それから1年後に本番環境に載せて、ようやく移行完了したところで、コミュニティエディション終了の発表を知ったのだった。

少しずつ理解を深めていって、ようやく基本機能がまともに使えるようになったかなと思っているが、それまでに10年掛かっていた。

この間に一番変わったことはというと、Google先生とDeepL先生の翻訳が物凄く使いやすくなっていることだと思う。
単語を調べながら半分当てずっぽうでやっていくのと比べて、だいぶまっすぐ進めるようになっている。
おかげで、新しいシステムに挑戦しようという気持ちもわいてくるというもの。たとえば、Dockerは本当に便利なんだと分かってきて、動かすことができるシステムも格段に増えてきた。

さてさて、今回の発表にどのように対応するのが良いのだろうか。

Basicな機能しか使っていないので、ライセンスを購入するとして15ユーロ/人年なので、そちらに移行するのがいいかもしれない。
Googleのアカウントを使ってメールのやりとりと、カレンダーの共有をするのでもいいかもしれない。
Nextcloudでもメールやカレンダーが使えるようになっているようだから、それを調べてみるのもいいかもしれない。

選択肢が増えていて、凄い時代になっているなと思う。

どうするにしても、このZarafa/Kopanoの運用で得た経験は大きく、このシステムを提供してくれていることに心から感謝している。
この経験を活かして、安心で使いやすいIT環境を家族に提供して、快適に暮らしていきたい。
そして、会社の業務にもそれ還元して、少しでも生産性が上げられればいいと思うのだった。

広告

コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他