CentOS の Zoom レポジトリを作る

RedHat 系で Zoom をインストールするには、rpm のパッケージが用意されていますが、手動でダウンロードしてからインストールする必要があるので、最新状態を維持するには手間がかかります。
> VSCode や slack であればレポジトリが用意されているので、dnf コマンドでの OS アップデートに一体化されていて手間がかかりません。

そこで Zoom のレポジトリを自分で作って、更新作業を dnf に一元化しましょう。（最終的には完成したレポジトリを公開しています。）
- クライアントは RedHat 系で、マシンは複数台ある。
- 作ったファイル（レポジトリ）を Web サーバ (Apache) で公開する（あるいはローカルで共有する）。
- レポジトリを作るOSは、RedHat 系はもちろん、Debian 系でもよい。

以下では、RedHat 系 = CentOS Stream 9 と Debian 系 = Ubuntu 18.04.6 LTS で試しました。

# Zoom の最新 RPM を自動ダウンロード
[ダウンロードセンター](https://zoom.us/download?os=linux) のページは、JavaScript で作られるのか、Web ブラウザで操作した時と wget でダウンロードした時では、内容が随分と違います。自動ダウンロードには都合が悪いです。
ところで、ダウンロードするファイルはいつも `https://zoom.us/client/($ver).($rev)/zoom_x86_64.rpm` になっているようですので、バージョンとリビジョンを別のページから取得することを考えます。[Release notes for the Zoom Workplace app](https://support.zoom.com/hc/en/article?id=zm_kb&sysparm_article=KB0061222) には、table の中に各アーキテクチャのバージョンとリビジョンが書き込まれているので、これを利用するのが簡単そうです。

<details><summary>コード</summary>

``` perl
#!/usr/bin/perl -w

chomp(my $DIR=`dirname $0`);
chdir $DIR || die;

my $URL = "https://support.zoom.com/hc/en/article?id=zm_kb&sysparm_article=KB0061222";
my @table = ();
my $full_versions = 0;

open(IN, "wget -O - '$URL' |") || die;
while (<IN>) {
    for (split(/\\n/)) { # 本当にHTMLに'\n'と書いてある
        $full_versions = 1 if />Full versions</;
        if ($full_versions && /<table/) {
            push @table, split(/<\/t[hd]>/);
            last; # 最初の table で十分
        }
    }
    last if scalar(@table) > 0; # 最初の table で十分
}
close(IN);

my @th = grep(/<th/, @table);
my @td = grep(/<td/, @table);

# "Linux"を含む要素が @th に１個だけと信じて、その要素番号を得る
my ($index) = grep { $th[$_] =~ /Linux/ } 0..$#th;

unless ($td[$index] =~ /<td>([\d\.]+)\s*\((\d+)\)/) {
    print "Failed to analyze version and revision.\n";
    exit 1;
}
my ($ver, $rev) = ($1, $2);
print "ver=$ver, rev=$rev\n";

my $rpm = "zoom-$ver.$rev-1.x86_64.rpm";
if (-e $rpm) {
    print "Already downloaded.\n";
    exit;
}
system("wget -c https://zoom.us/client/$ver.$rev/zoom_x86_64.rpm -O $rpm");
```
</details>

公開されているファイル名は、常に `zoom_x86_64.rpm`（ディレクトリは違う）ですが、ダウンロード先を共通のディレクトリにしたいので、名前を変更して RPM 上のバージョンを含めています。

# レポジトリ作成
公開する Web サーバ上で、`createrepo_c`（RedHat系）あるいは `createrepo`（Debian系）パッケージを用意します。

    sudo dnf install createrepo_c   （CentOS Stream 9）
    sudo apt-get install createrepo （Debian系）

`zoom-*.rpm` の存在するディレクトリ（仮に `~/public_html/my-zoom/` とする）で、以下を実行します。

    createrepo .

`~/public_html/my-zoom/repodata/` 以下に `repomd.xml` などのファイルが作られます。これでレポジトリの完成です。`zoom-*.rpm` をダウンロードするスクリプトと共に、cron で定期的に実行します。
> Apache の `Options` の `Indexes` はオフ（ディレクトリが指定された時にファイル名の一覧を表示しない）でも大丈夫です。

# クライアントから使う
以下のファイルを作ります。
``` /etc/yum.repos.d/my-zoom.repo
[my-zoom]
name=my-zoom
baseurl=https://my.server/~my-id/my-zoom/
enabled=1
gpgcheck=1
gpgkey=https://zoom.us/linux/download/pubkey?version=6-3-10
```
これで `sudo dnf update` で更新されるようになりました。

- `baseurl=file:///path/to/repo` と `file://` プロトコルでローカルファイルを指定できるので、NASでファイル共有する場合でも大丈夫です。
- `gpgkey=` には、配布ページに書いてあるパブリックキーの URI を書き写しました。

# レポジトリを公開する
せっかく作ったレポジトリなので、一般に公開することを考えました。ところが Zoom の RPM の再配布が許されるのか、記述を見つけきれませんでした。そこで Apache の設定で、rpm はダウンロード元サイトにリダイレクトしてみます。これなら「配布してない」と言い張れます。
``` ~/public_html/my-zoom/.htaccess
RewriteEngine on
RewriteRule ^zoom-([0-9\.\-]+)-1.x86_64.rpm$ https://zoom.us/client/$1/zoom_x86_64.rpm
```

これでレポジトリを公開できるので、CentOS なら以下の記述で利用できます。（Fedora, RedHat などは未確認です。）自宅サーバなので、信頼性は期待しないでください。

``` /etc/yum.repos.d/my-zoom.repo
[my-zoom]
name=my-zoom
baseurl=https://tutimura.ath.cx/~nob/my-zoom/
enabled=1
gpgcheck=1
gpgkey=https://zoom.us/linux/download/pubkey?version=6-3-10
```