Garbera P1.11.0で音楽ファイルがインポートされない場合の対処法

Gerbera on GentooをP1.11.0にバージョンアップしてからだと思いますが、音楽ファイルがインポートされなくなりました。
当初、インポートされなかったのは1アルバム分だったので、「後で対処しよう。」と、思っていたのですが、音楽ファイルを大量に保存したHDDを交換ついでに、保存ディレクトリを1階層下げたため、dbを消去し、全ての音楽ファイルをインポートしようとしたところで気づきました。

Gerbera 1.11.0 import option.

上記はインポート画面のオプション指定。
ごくごく普通のinotifyオプションです。
ですが、イメージファイルもビデオファイルもプレイリストファイルもインポート出来るのに、音楽ファイルだけがインポートできません。

インポート方法を指定するjsファイルである、import.jsやcommon.jsを疑ったのですが、インポート途中にprint命令を入れて、ログに何か残るかと見てみても、イメージファイルとビデオファイルはupnpmimetypes属性がしっかりと表示され、ファイルスキャン順に与えられるIDもログに表示されましたが、音楽ファイルはいっこうに表示されません。
試しに、config.xlm内のインポート方法をbuiltinに変え、jsファイルを使わずにインポートをしてみても、さっぱりです。この場合、ログにも一切表示されません。
mapがおかしいのかとにらめっこしても、保存されているFLAC、mp3、m4aは全てaudio/*というmipe typesが指定されています。
万事休す・・・。

ところで、と思ってインポートオプションを変更してみたらどうなるか? と、思い、All Audioだけでなく、Musicにもチェックを入れてインポートしてみたところビンゴ!
しっかりと全ての音楽ファイルがインポートされました。
All Audioって一体・・・。

Gerbera 1.11.0 Check Music for import music files.

上記のMusicにチェックすることが大事です。

困っている人のために、英語でも書いておきます。

In "Gerbera 1.11.0", if you can not import only music files, FLAC,MP3,M4A and so on, you can import music files by checking not only "All Audio" but also "Music" in the import settings.
Refer to the image above.

clamav-unofficial-sigsからfangfrischへ

Gentoo WiKiによると、clamav-unofficial-sigsはセキュアじゃないとのこと。

wiki.gentoo.org

上記によると、ClamAVでUnofficial Signaturesを扱う方法は2つ。
ひとつめはfangfrischを使う方法。
もうひとつはfreshclamにDatabaseCustomURLを追加する方法。

簡単なのはfreshclamだけど、この場合sanesecurityのシグネチャーしか使えなさそうで、しかも、シグネチャーの名称変更などには追従できないそうです。
そうすると、fangfrischを使うほうが良さげ。

では、clamav-unofficial-sigsをアンインストールしましょうか。

# emerge -C clamav-unofficial-sigs
(進行ログ省略)
# rm -r /etc/clamav-unofficial-sigs
# rm -r /var/lib/clamav-unofficial-sigs
<||

でもって、fangfrischをインストール
>|sh|
# emerge fangfrisch

最初にディレクトリを作成するそうです。

# mkdir -m 0770 /var/lib/fangfrisch
# chgrp clamav /var/lib/fangfrisch

んで、コンフィグ/etc/fangfrisch.confをチェック。

# See https://rseichter.github.io/fangfrisch/ for detailed documentation

[DEFAULT]
db_url = sqlite:////var/lib/fangfrisch/db.sqlite
local_directory = /var/lib/clamav
log_method = syslog
log_target = /dev/log
on_update_exec = clamdscan --reload

[malwarepatrol]
enabled = no
# Replace with your personal Malwarepatrol receipt
#receipt = abcd1234

[sanesecurity]
enabled = yes

[securiteinfo]
enabled = yes
# Replace with your personal SecuriteInfo customer ID
customer_id = abcd1234

[urlhaus]
enabled = yes

malwarepatrolはフリーだと商用利用不可とのことだったので、実家のサーバーには使わないことにしました。
securiteinfoはBasicで登録したので、1日遅れのシグネチャーでダウンロードが300kbpsに制限されるそうです。
もちろんcustomer_idはabcd1234ではありません。

で、データベースファイルを作ります。

# sudo -u clamav -- fangfrisch -c /etc/fangfrisch.conf initdb

あとは、cronで自動的にアップデートさせます。
/etc/cron.d/fangfrischの先頭コメントアウトを外して待つだけです。

HOME=/var/lib/fangfrisch
LOG_LEVEL=WARNING
# minute hour day-of-month month day-of-week user command
*/10 * * * * clamav fangfrisch -c /etc/fangfrisch.conf refresh

さて、うまく動作するでしょうか?

Raspberry piのgmediarenderをgmrender-resurrectに入れ替え

今までRaspberry piDLNA (UPnP)のrendererをgmediarenderにしてきました。

gentoolinux.hatenablog.com

しかし、gmediarenderは古くてメンテナンスされていないせいか、Raspberry piには荷が重く、挙動がおかしくなります。
挙動がおかしくなる一例として
・再生後、停止や一時停止ができない。
・次の曲に行かない。
DMCのシークバーも再生時間も動かない。
・曲が停止してもALSAを占有し続ける。
4項目はPulseAudioにでもすればよいのでしょうが、そでも1~3は解決しません。
(PluseAudioは今、悪戦苦闘中)

で、これを解決する軽量レンダラーとしてgmrender-resurrectがgitに上がっています。

github.com

一般的なインストール方法が書かれていますが、Raspberry pi向けに参考にしたのがコチラ

blog.scphillips.com

英語で書かれているのですが、わかりやすいです。
Raspberry piでmakeするので、だいぶ時間かかるかと思いましたが、ものの数分でした。(離席している間に終わってました。)

まず、古いgmediarenderとその時入れた関連パッケージをpurgeします。

apt purge gstreamer1.0-alsa gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-plugins-bad gmediarender

そして、事前に必要なパッケージをインストールします。

apt install libupnp-dev libgstreamer1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-alsa gstreamer1.0-pulseaudio

んでgitからgmrender-resurrectのソースを拾ってきてmakeします。
あ、途中でautoconfもインストールしますが、先にインストールしても構いません。

git clone https://github.com/hzeller/gmrender-resurrect.git
cd gmrender-resurrect
apt install autoconf
./autogen.sh
./configure
make
make install

続いて、systemd用の起動スクリプトをコピーします。
(OpenRC派なんですけど、最近の主流はsystemdですね・・・。)

cp dist-scripts/debian/gmrender-resurrect.service /etc/systemd/system
chmod 775 /etc/systemd/system/gmrender-resurrect.service

設定ファイルはないようなので、etc/systemd/system/gmrender-resurrect.serviceのファイルを直接編集する必要があるようです。
デフォルトでは、

ExecStart=/usr/local/bin/gmediarender -f "$UPNP_DEVICE_NAME" -u "$UPNP_UUID" \
                                      --gstout-audiosink=alsasink --gstout-audiodevice=sysdefault \
                                      --logfile=/tmp/gmediarenderer.log --gstout-initial-volume-db=-10

というふうになってますので、ボリュームを0.0にしたり、アウトプットを変えたりしましょう。

また、pluseaudioを出力にする際は、pulsesinkに変更し、デバイスはpulseaudioで検出されたデバイス番号を指定します。

ExecStart=/usr/local/bin/gmediarender -f "$UPNP_DEVICE_NAME" -u "$UPNP_UUID" \
                                      --gstout-audiosink=pulsesink --gstout-audiodevice=0 \
                                      --logfile=/tmp/gmediarenderer.log --gstout-initial-volume-db=0.0

PulseAudioのデバイス番号の調べ方は

pactl list sinks

で、ずらーっと出てきますので、先頭のSink #0とかSink #1とかがデバイス番号のようです。

Home Assistantが動かないとき

Home Assistantが動かない!
特に、Androidアプリはエラー画面が出て前に進みません。

f:id:naoyukinagano:20220104203743j:plain
Android Home Assistantアプリエラー画面

Python環境をアップデートして動かなくなったのかしら?
と、思いましたが、PCのブラウザからアクセスすると、単に証明書の期限切れでアクセスできなかったようです。

そこで、証明書をコピーしてからhomeassistantデーモンが起動するように、起動スクリプトを変更するとともに、cronで週1回再起動するように仕込みます。

まず、Gentooなので、/etc/local.d配下にスクリプトを配置していますので、そこを書き換えます。
また、コピー元フォルダはLet's Encryptを利用している前提で記載しています。
(hogehoge.netがドメイン名ですね。)

/etc/local.d/homeassistant.start

#!/bin/sh

/bin/cp -Lf /etc/letsencrypt/live/hogehoge.net/privkey.pem /home/homeassistant/.homeassistant
/bin/cp -Lf /etc/letsencrypt/live/hogehoge.net/fullchain.pem /home/homeassistant/.homeassistant
/bin/chown homeassistant:homeassistant /home/homeassistant/.homeassistant/privkey.pem
/bin/chown homeassistant:homeassistant /home/homeassistant/.homeassistant/fullchain.pem

/bin/chmod 600 /home/homeassistant/.homeassistant/privkey.pem
/bin/chmod 600 /home/homeassistant/.homeassistant/fullchain.pem

sudo -u homeassistant -H /home/homeassistant/bin/hass --pid-file /home/homeassistant/hass.pid  --daemon > /var/log/home-assistant.log 2>&1

echo "Homeassistant Started"

さらに、週に1回homeassistantを再起動させます。

/etc/cron.weekly/homeassistant.sh

#!/bin/sh

/etc/local.d/homeassistant.stop
sleep 1
/etc/local.d/homeassistant.start

これで、証明書問題でHome Assistantアプリが起動しない! なんてことがなくなるハズです。

DovecotのSSLエラー

2021/9/30になって、iPadで自宅のメールサーバーからメールを取り出せなくなりました。
Dovecotのログを見ると、

Oct  2 15:23:18 gentoo dovecot[24406]: pop3-login: Disconnected (no auth attempts in 0 secs): user=<>, rip=0.0.0.0, lip=192.168.0.0, TLS handshaking: SSL_accept() failed: error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown: SSL alert number 46, session=<xxxxxxxxxxxxx>

というようなエラーログが残っていました。

iPadメーラーを強制終了し、再度メーラーを起動すると、

「サーバーの識別情報を検証できません」と表示され、有効期限が「2021/9/30」のようになっています。
詳細を確認しても、サーバ証明書の有効期限は2021/11/18とまだ先です。
どうやらこれは、古いルート証明書「DST Root CA X3」の期限が2021/9/30までだからのようです。
古いOSで問題になるようですが、しかし、iPadは先日iOS15にしたばかり。
iOSの問題かと思ったのですが・・・。

なんと、Galaxy S20にあっては、7月からエラーでメールが取得できていなかった模様。
Galaxy S20はセキュリティタイプを「SSL(すべての証明書を許可)」という設定にすると、メールを取得し始めました。

Let's Encryptで「DST Root CA X3」ではなく、新しいルート証明書「ISRG Root X1」を使うように、強制的に更新してみました。

gentoo # certbot renew --force-renewal --preferred-chain "ISRG Root X1"
gentoo # /etc/init.d/dovecot restart

これをやっても、iPadメーラーは取得しに行かず、エラーログも変わりません。

いろいろと試してみましたが、Dovecotのconfが間違っているのかなぁ、と思い、初心に帰ってLet's Encryptを使った10-ssl.confを書いている人のサイトを見てみると、間違いを発見!!

ssl = yes
ssl_cert = </etc/letsencrypt/live/nns-fact.2y.net/cert.pem
ssl_key = </etc/letsencrypt/live/nns-fact.2y.net/privkey.pem

このssl_certに、中間証明書を含めないサーバー証明書「cert.pem」を指定していたため、iPadもGalaxy S20もルート証明書が「DST Root CA X3」だと思い、エラーが出ていたようです。
中間証明書を含む証明書に変更します。

ssl = yes
ssl_cert = </etc/letsencrypt/live/nns-fact.2y.net/fullchain.pem
ssl_key = </etc/letsencrypt/live/nns-fact.2y.net/privkey.pem

これで、iPadから無事にメールを取得でき、Galaxy S20もセキュリティタイプを「SSL(すべての証明書を許可)」から「SSL」に戻してもエラーが出なくなりました。

めでたしめでたし。

ruby2.5のせいでslot conflict

またもやemerge -uDN @worldでコンフリクトです。

lang-ruby/rakeやlang-ruby/rdoc、そしてrubygems(dev-ruby/rubygemsとvirtual/rubygems)がコンフリクトしているそうです。
(すみません。ログを確保し忘れました。)

emergeのメッセージやpackage.gentoo.orgによると、
"Mask ruby25 for removal. This version is no longer supported upstream. Use a newer ruby version, e.g ruby26. Masked for removal in 30 days."
とのことで、どうやらruby25が、もうサポートされなくなったようです。
Gentoo WikiのRubyには、「rubyのアップデートはemerge -uDN @worldで万事解決だぜ!」みたいなことが書いてますが、そのemerge -uDN @worldがrubyのせいで通らないんだっつーの。

というわけで、ググると自分の備忘録が!

gentoolinux.hatenablog.com

では、ruby:25を削除するとどうなるか、-pで見てみます。
(その前に、eselect ruby listでruby26がsetされていることを確認しましょう。
セットはeselect ruby set ruby26で。)

gentoo ~ $ emerge --depclean -pv dev-lang/ruby:2.5

Calculating dependencies... done!
  dev-lang/ruby-2.5.8 pulled in by:
    dev-ruby/did_you_mean-1.2.1 requires dev-lang/ruby:2.5
    dev-ruby/htmlentities-4.3.4 requires dev-lang/ruby:2.5
    dev-ruby/json-2.3.0 requires dev-lang/ruby:2.5
    dev-ruby/minitest-5.11.3 requires dev-lang/ruby:2.5
    dev-ruby/net-telnet-0.2.0 requires dev-lang/ruby:2.5
    dev-ruby/power_assert-1.1.5 requires dev-lang/ruby:2.5
    dev-ruby/rake-12.3.3 requires dev-lang/ruby:2.5
    dev-ruby/rdoc-6.1.2 requires dev-lang/ruby:2.5
    dev-ruby/rubygems-3.0.9 requires dev-lang/ruby:2.5
    dev-ruby/test-unit-3.3.3 requires dev-lang/ruby:2.5
    dev-ruby/xmlrpc-0.3.0 requires dev-lang/ruby:2.5
    virtual/rubygems-15 requires dev-lang/ruby:2.5

>>> No packages selected for removal by depclean
Packages installed:   717
Packages in world:    180
Packages in system:   44
Required packages:    717
Number to remove:     0

なかなかのパッケージ数ですね。
これを削除しましょう。

gentoo ~ $ emerge -C =dev-ruby/did_you_mean-1.2.1 =dev-ruby/htmlentities-4.3.4 =dev-ruby/json-2.3.0 =dev-ruby/minitest-5.11.3 =dev-ruby/net-telnet-0.2.0 =dev-ruby/power_assert-1.1.5 =dev-ruby/rake-12.3.3 =dev-ruby/rdoc-6.1.2 =dev-ruby/rubygems-3.0.9 =dev-ruby/test-unit-3.3.3 =dev-ruby/xmlrpc-0.3.0 =virtual/rubygems-15

(中略)

All selected packages: =virtual/rubygems-15 =dev-ruby/json-2.3.0 =dev-ruby/power_assert-1.1.5 =dev-ruby/htmlentities-4.3.4 =dev-ruby/rdoc-6.1.2 =dev-ruby/net-telnet-0.2.0 =dev-ruby/did_you_mean-1.2.1 =dev-ruby/test-unit-3.3.3 =dev-ruby/xmlrpc-0.3.0 =dev-ruby/rubygems-3.0.9 =dev-ruby/minitest-5.11.3 =dev-ruby/rake-12.3.3

>>> 'Selected' packages are slated for removal.
>>> 'Protected' and 'omitted' packages will not be removed.

>>> Waiting 5 seconds before starting...
>>> (Control-C to abort)...
>>> Unmerging in: 5 4 3 2 1
>>> Unmerging (1 of 12) dev-ruby/did_you_mean-1.2.1...
>>> Unmerging (2 of 12) dev-ruby/htmlentities-4.3.4...
>>> Unmerging (3 of 12) dev-ruby/json-2.3.0...
>>> Unmerging (4 of 12) dev-ruby/minitest-5.11.3...
>>> Unmerging (5 of 12) dev-ruby/net-telnet-0.2.0...
>>> Unmerging (6 of 12) dev-ruby/power_assert-1.1.5...
>>> Unmerging (7 of 12) dev-ruby/rake-12.3.3...
>>> Unmerging (8 of 12) dev-ruby/rdoc-6.1.2...
>>> Unmerging (9 of 12) dev-ruby/rubygems-3.0.9...
>>> Unmerging (10 of 12) dev-ruby/test-unit-3.3.3...
>>> Unmerging (11 of 12) dev-ruby/xmlrpc-0.3.0...
>>> Unmerging (12 of 12) virtual/rubygems-15...

削除できたようです。
では、肝心のruby25を削除しましょう。

gentoo ~ $ emerge --depclean -v dev-lang/ruby:2.5

Calculating dependencies... done!
>>> Calculating removal order...

 dev-lang/ruby
    selected: 2.5.8
   protected: none
     omitted: 2.6.8

All selected packages: =dev-lang/ruby-2.5.8

>>> 'Selected' packages are slated for removal.
>>> 'Protected' and 'omitted' packages will not be removed.

>>> Waiting 5 seconds before starting...
>>> (Control-C to abort)...
>>> Unmerging in: 5 4 3 2 1
>>> Unmerging (1 of 1) dev-lang/ruby-2.5.8...
No package files given... Grabbing a set.

(以下略)

これで、ruby25が削除されました。
あ、make.confのRUBY_TARGETSは
RUBY_TARGETS="ruby26"
など、ruby25を削除するのをお忘れなく。

めでたくemerge-uDN @worldが通りそうです。

sys-libs/glibc-2.33-r1 emerge エラー CONFIG_IA32_EMULATION

emerge -uDN @worldをしようとすると、またもやハマりました。
sys-libs/glibcがアップデートできません。

 * ERROR: sys-libs/glibc-2.33-r1::gentoo failed (pretend phase):
 *   CONFIG_IA32_EMULATION must be enabled in the kernel to compile a multilib glibc.

そうですか。
で、調べてみました。

gentoo ~ # grep CONFIG_IA32_EMULATION /usr/src/linux/.config
CONFIG_IA32_EMULATION=y

あら? セットされてますね。
binutilsが古いからという話もあり、過去記事を参考にbinutilsをアップデート。

gentoolinux.hatenablog.com

最新にアップデートしても同じようにコケます。
同じような方がGentoo's Bugzillaにいらっしゃいました。

bugs.gentoo.org

この方は、ebuildのCONFIG_IA32_EMULATIONチェックをコメントアウトしてglibcコンパイル
さらにコメントアウトをもとに戻して再コンパイルし、動作したそうです。

では、私もebuildを改変してみます。

/usr/portage/sys-libs/glibc/glibc-2.33-r1.ebuildの653行目から674行目あたりをすべてコントアウトします。
(↓コメントアウト前ですが、このあたり。)

# ABI-specific checks follow here. Hey, we have a lot more specific conditions that
# we test for...
if ! is_crosscompile ; then
	if use amd64 && use multilib && [[ ${MERGE_TYPE} != "binary" ]] ; then
		ebegin "Checking that IA32 emulation is enabled in the running kernel"
		echo 'int main(){return 0;}' > "${T}/check-ia32-emulation.c"
		local STAT
		if "${CC-${CHOST}-gcc}" ${CFLAGS_x86} "${T}/check-ia32-emulation.c" -o "${T}/check-ia32-emulation.elf32"; then
			"${T}/check-ia32-emulation.elf32"
			STAT=$?
		else
			# Don't fail here to allow single->multi ABI switch
			# or recover from breakage like bug #646424
			ewarn "Failed to compile the ABI test. Broken host glibc?"
			STAT=0
		fi
		rm -f "${T}/check-ia32-emulation.elf32"
		eend $STAT
		[[ $STAT -eq 0 ]] || die "CONFIG_IA32_EMULATION must be enabled in the kernel to compile a multilib glibc."
	fi

fi

このままemergeするとダイジェストでサイズが違うと怒られるので、ebuildコマンドでdigestを改変します。

gentoo ~ # ebuild /usr/portage/sys-libs/glibc/glibc-2.33-r1.ebuild digest

これで、glibcのemergeが走ります。
glibcアップデート後にコメントアウトをもとに戻してもemergeできるのかどうかは、この後実施します。