pkgsrc/audio/squeezeboxserver (2)

Amazon.com で注文した Squeezebox Touch が届いたので、早速つなげてみると、動いていたと思っていた squeezebox server が実は全然といってもいいほど動いていなかったので、がっくり。

いろいろ調べたり試したりしてなんとか動くようになったので、そのまとめを記す。

まず、起動時のエラー。ロケールの設定に失敗して、UTF-8 であるべきところが C にフォールバックしている。

Your locale was detected as C, you may have problems with non-Latin filenames. Consider changing your LANG variable to the correct locale, i.e. en_US.utf8

エラーメッセージでは環境変数 LANG に en_US.utf8 を設定すれば良いかのように見えるが、LANG ではなく LC_CTYPE に、そして、NetBSD 上で有効な en_US.UTF-8 を設定する必要がある。

対策は、下のように /etc/rc.conf に squeezeboxserver_env を追加して、squeezeboxserver の実行時に環境変数 LC_CTYPE が en_US.UTF-8 にセットされるようにする。

squeezeboxserver=YES    squeezeboxserver_env="LC_CTYPE=en_US.UTF-8"

次は /var/lib/squeezeboxserver/cache/mysql-error-log.txt 内のエラー。
テーブル mysql.servers がないと言っている。

[ERROR] Can’t open and lock privilege tables: Table ‘mysql.servers’ doesn’t exist

エラーメッセージのとおり、MySQL のテーブル mysql.servers が定義されていない為に生じる。通常は始めから存在するもののようなので、何らかの理由で初期化が不十分だったのだろう。

対策は、テーブル mysql.servers を手動で作成する。squuezeboxserver の MySQL 設定ファイルを明示的に指定して
mysql に接続し…

$ sudo mysql --defaults-file=/var/lib/squeezeboxserver/cache/my.cnf mysql

…下のように、テーブル作成のコマンドを発行する。

CREATE TABLE `servers` (
-> `Server_name` char(64) NOT NULL,
-> `Host` char(64) NOT NULL,
-> `Db` char(64) NOT NULL,
-> `Username` char(64) NOT NULL,
-> `Password` char(64) NOT NULL,
-> `Port` int(4) DEFAULT NULL,
-> `Socket` char(64) DEFAULT NULL,
-> `Wrapper` char(64) NOT NULL,
-> `Owner` char(64) NOT NULL,
-> PRIMARY KEY (`Server_name`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='MySQL Foreign Servers table';

最後は、フォルダのスキャン時に、下のようなエラーが出て、スキャンが途中で止まってしまう、というものである。ログは /var/log/squeezeboxserver/scanner.log に記録されている。

DBI Exception: DBD::mysql::db begin_work failed: Already in a transaction at /usr/pkg/lib/squeezeboxserver/Slim/Schema/Storage.pm line 86

これは DBIx::Class の仕様が変更されたために生じるらしく、少なくとも DBIx::Class の 0.08123 で障害が発生する。

ソースと対策は FreeBSD の ports/148318 より、squeezeboxserver のファイルを以下のように修正し、スキャン時の AutoCommit を無効にする。

--- /usr/pkg/lib/squeezeboxserver/Slim/Schema.pm.orig
+++ /usr/pkg/lib/squeezeboxserver/Slim/Schema.pm
@@ -274,11 +274,15 @@
# For custom exceptions
$class->storage_type('Slim::Schema::Storage');
+       # Don't use autocommit mode for the scanner.
+       # Needs to be set here as setting dbh->{'AutoCommit'} = 0 later
+       # confusing the transaction nesting logic.
+       my $AutoCommit = (main::SCANNER ? 0 : 1);
my $on_connect_do = $sqlHelperClass->on_connect_do();
$class->connection( $dsn || $source, $username, $password, {
RaiseError    => 1,
-               AutoCommit    => 1,
+               AutoCommit    => $AutoCommit,
PrintError    => 0,
Taint         => 1,
on_connect_do => [
--- /usr/pkg/lib/squeezeboxserver/scanner.pl.orig
+++ /usr/pkg/lib/squeezeboxserver/scanner.pl
@@ -236,9 +236,6 @@
main::INFOLOG && $log->info("Squeezebox Server Scanner done init...\n");
-       # Take the db out of autocommit mode - this makes for a much faster scan.
-       Slim::Schema->storage->dbh->{'AutoCommit'} = 0;
-
my $scanType = 'SETUP_STANDARDRESCAN';
if ($wipe) {

以上。

(追記) この話は pkgsrc-2011Q1 によるものである。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です