[Fedora23][Dropbox]dnfコマンドでrepomd.xmlダウンロードエラーが表示されるときの対処


DropboxをrpmでインストールしたFedora23の環境で、dnfコマンドを実行すると、以下のようなエラーが表示されました。

$ dnf check-update
Failed to synchronize cache for repo 'Dropbox' from 'http://linux.dropbox.com/fedora/23/': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried, 無効化。

エラーメッセージで検索するとfedoraprojectのQAフォーラム がhitして、baseurlを書き換えろということでした。

直接の原因は https://linux.dropbox.com/fedora/23/repodata/repomd.xml が404 not foundで、https://linux.dropbox.com/fedora/22/repodata/repomd.xml が200 OK...というか、 https://linux.dropbox.com/fedora/23 ディレクトリがないというオチなので、いつかDropbox側がリポジトリ作ってくれれば解決、かなぁ・・・と。

放っといても実害はない(というか、自分じゃどうしようもない)けど生理的に嫌だし、FedoraのバージョンをアップグレードするたびにDropbox側が対応するのを毎回確認するのも嫌なので、Dropboxのリポジトリ監視スクリプトを書きました。

#!/bin/bash
set -uex
LANG=C
LC_ALL=C

RELEASEFILE=/etc/redhat-release
NOWRELEASENUM=$(cat ${RELEASEFILE} | egrep -o . | egrep ^[0-9] | xargs | sed -e "s/[[:space:]]//g")
OLDRELEASENUM=$(expr ${NOWRELEASENUM} - 1)
NOWSITEURI=http://linux.dropbox.com/fedora/${NOWRELEASENUM}/
OLDSITEURI=http://linux.dropbox.com/fedora/${OLDRELEASENUM}/
REPOFILE=/etc/yum.repos.d/dropbox.repo
NOWCURLSTAT=$(curl -LIs ${NOWSITEURI} -o /dev/null -w '%{http_code}\n')
OLDCURLSTAT=$(curl -LIs ${OLDSITEURI} -o /dev/null -w '%{http_code}\n')

echo ${NOWRELEASENUM}
echo ${OLDRELEASENUM}

if [ -f ${REPOFILE} ];
then
  # リポジトリファイルのオリジナルをバックアップする
  [ ! -f ${REPOFILE}.orig ] && sudo cp -p ${REPOFILE}{,.orig}

  # リポジトリファイルのbaseurl行に「$releasever」を含んでいるかどうかをチェックする
  GREPCHECK0=$(cat ${REPOFILE} | egrep ^baseurl | egrep '\$releasever' > /dev/null ; echo $?)

  # リポジトリファイルのbaseurl行に1つ手前のFedoraのバージョン番号を含んでいるかどうかをチェックする
  GREPCHECK1=$(cat ${REPOFILE} | egrep ^baseurl | egrep "/${OLDRELEASENUM}/" > /dev/null ; echo $?)

  # もしFedora最新バージョン向けURIが200じゃなく(条件1)、かつbaseurlの行に$releaseverを含んでおり(条件2)、
  # さらに、1つ手前のFedoraのバージョン向けURIが200であれば(条件3)、 $releasever をFedoraの1つ手前のバージョン番号に置換する
  if [ ! 200 = ${NOWCURLSTAT} -a 0 = ${GREPCHECK0} -a 200 = ${OLDCURLSTAT} ]
  then
    sudo sed -i "/^baseurl/s/\$releasever/${OLDRELEASENUM}/" ${REPOFILE}
  fi

  # もしFedora最新バージョン向けURIが200であり(条件1)、かつbaseurlの行にFedoraの1つ手前のバージョン番号を含んでいれば(条件2)、
  # バージョン番号を最新にする
  if [ ! 200 = ${NOWCURLSTAT} -a 0 = ${GREPCHECK1} ]
  then
    sudo sed -i "/^baseurl/s/${OLDRELEASENUM}/\$releasever/" ${REPOFILE}
  fi

fi

あとは、cronでスクリプトを実行する際にsudoを使えるように設定した上でcron実行してあげれば、メンテナンスフリーになるはずです。

しかし、Fedoraのバージョン番号を抜き出すのに /etc/redhat-release を awk で抜き出さずに egrep -o と xargs で抜き出すあたりがシェル芸勉強会の影響を強く受けてますね。はい。