Archive for the ‘gentoo’ Category

前から使ってたけど今はあまり使ってないデスクトップ、最近主力のMacBook、たまに使うLet’s NoteとうちにはPCが3台ある。あとGentooサーバー。全部の環境からmp3を共有したかったので、GentooでiTunesサーバーをたてて共有することにした。

まずはデスクトップからごっそり外付けHDDにmp3をコピー。1万曲超、60GBくらいあった。これをGentooにぶっさして、とりあえず放置。Gentooで環境構築。

$ wget http://www.porchdogsoft.com/download/howl-1.0.0.tar.gz
$ tar zxf howl-1.0.0.tar.gz
$ cd howl-1.0.0
$ ./configure && make && sudo make install && cd
$ sudo emerge libogg
$ sudo emerge libvorbis
$ sudo emerge mt-daapd
$ sudo cp /etc/mt-daapd.conf.example /etc/mt-daapd.conf

confは適当にmp3の入った外付けHDDのmount先を指定したりweb_rootのパスワード指定したりする程度。これであっさり行くと思ったら、まずこのままではmt-daapdが起動しない。なぜか知らないが/etc/init.d/mt-daapdで、depend()部分が間違ってるのが原因。mDNSResponderをmDNSResponderPosixに修正、mDNSResponderPosixを起動してから再度動かすと動いた。

これでとりあえず動いたものの、MacのiTunes上からは文字化けの嵐。WindowsのiTunesでは問題ない。つまり文字コードの問題だな。ここは先人の知恵を借り、ググってみるとwindows上で変換しるとよいことが判明。HDDを一旦デスクトップにつないで、iTunesで曲を全部選択して「ID3タグを変換」→「Unicodeを元に戻す」。何故かうまく行かないで化けちゃうのがあるので、個々に探して同様に変換したら直った。とりあえずこれでタグは問題なくUnicodeになったので、再度Gentooにつないでmountしてmt-daapdのキャッシュをクリアしたらok。ちなみにmountするときには、mount -o noauto,users,umask=000,iocharset=utf8とか言ってやらないと正しくGentoo上で日本語が読めない。

これでokかと思いきや、やっぱり文字化けは解消せず。色々調べてみたら、パッチを当てれば解決することが判明。

$ sudo emerge -C mt-daapd
$ wget http://nchc.dl.sourceforge.net/sourceforge/mt-daapd/mt-daapd-0.2.4.2.tar.gz
$ tar zxf mt-daapd-0.2.4.2.tar.gz
$ cd mt-daapd-0.2.4.2
$ wget http://www.kzsoft.to/~kazu/mt-daapd/patch/mt-daapd-0.2.4-cp932.patch
$ patch < mt-daapd-0.2.4.2.tar.gz

parser.cのパッチでこけるので、手動でパッチした。とりあえずdiffを残しておく。

--- src/parser.c.orig   2008-04-20 04:44:54.000000000 +0900
+++ src/parser.c        2008-09-23 17:16:15.000000000 +0900
@@ -132,8 +132,18 @@
 #define AGO 287
 #define INTERVAL 288

+#define USE_CP932

-
+#ifdef USE_CP932
+  #define UNKNOWN_STR    "UNKNOWN"
+  #ifndef FILESYSTEM_CES
+    #define FILESYSTEM_CES "CP932"
+  /*
+    #define FILESYSTEM_CES "UTF-8"
+    #define FILESYSTEM_CES "EUC-JP"
+  */
+  #endif
+#endif

 /* Copy the first part of user declarations.  */
 #line 1 "parser.y"
@@ -167,6 +177,11 @@
 #include 
 #include "playlist.h"

+#ifdef USE_CP932
+ #include 
+ #include 
+#endif
+
 #define YYERROR_VERBOSE 1

 extern int yyerror(char *msg);
@@ -1828,6 +1843,43 @@

 #line 174 "parser.y"
+#ifdef USE_CP932
+#define MAX_ICONV_BUF 1024
+
+typedef enum {
+  ICONV_OK,
+  ICONV_TRYNEXT,
+  ICONV_FATAL
+} iconv_result;
+
+static iconv_result do_convert(const char* to_ces, const char* from_ces,
+                              char *inbuf,  size_t inbytesleft,
+                              char *outbuf_orig, size_t outbytesleft_orig) {
+  size_t rc;
+  iconv_result ret = ICONV_OK;
+
+  size_t outbytesleft = outbytesleft_orig - 1;
+  char* outbuf = outbuf_orig;
+
+  iconv_t cd  = iconv_open(to_ces, from_ces);
+  if (cd == (iconv_t)-1) {
+    return ICONV_FATAL;
+  }
+  rc = iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
+  if (rc == (size_t)-1) {
+    if (errno == E2BIG) {
+      ret = ICONV_FATAL;
+    } else {
+      ret = ICONV_TRYNEXT;
+      memset(outbuf_orig, '\0', outbytesleft_orig);
+    }
+  }
+  iconv_close(cd);
+
+  return ret;
+}
+#endif
+

 PL_NODE *pl_newintpredicate(int tag, int op, int value) {
     PL_NODE *pnew;
@@ -1867,7 +1919,25 @@
     pnew->op=op;
     pnew->type=T_STR;
     pnew->arg1.ival=tag;
+#ifdef USE_CP932
+    if (!strcasecmp(FILESYSTEM_CES, "UTF-8")) {
     pnew->arg2.cval=value;
+      } else {
+       char* iconv_buf = (char*)calloc(MAX_ICONV_BUF, sizeof(char));
+       if (iconv_buf) {
+         iconv_result rc = do_convert("UTF-8", FILESYSTEM_CES, value, strlen(value),
+                                      iconv_buf, MAX_ICONV_BUF);
+         if(rc == ICONV_OK) {
+           pnew->arg2.cval = iconv_buf;
+         } else {
+           pnew->arg2.cval = strdup(UNKNOWN_STR);
+           free(iconv_buf);
+         }
+       }
+      } // if utf-8
+#else
+    pnew->arg2.cval=value;
+#endif
     return pnew;
 }

こけるのは#ifdef USE_CP932から#endifまでなので、まぁ手動で当てても特別問題はないだろう。あとは普通にconfigureしてmake && make installなんだが。このままだと/etc/init.d/mt-daapdが使えないので、適当に以下のように編集する。

PIDFILE="/var/run/mt-daapd.pid"
CONFFILE="/etc/mt-daapd.conf"

depend() {
    need net
    need mDNSResponderPosix
}

start() {
    ebegin "Starting mt-daapd DAAP server"
    /usr/sbin/mt-daapd -c ${CONFFILE} &
    eend $?
}

stop() {
    ebegin "Stopping mt-daapd DAAP server"
    kill `cat ${PIDFILE}`
    eend $?

    rm -f ${PIDFILE}
}

とりあえず今あるものを共有する、という意味ではこれで万事よいのだが、俺の環境ではまだ問題があった。実は外付けHDDは元々Windowsで使っていたものなので、当然フォーマットはNTFS。でもmountしてるのはGentooなわけなので、普通にmountしたのではどうがんばってもリードオンリーになってしまう。これでは新しく曲を追加したり出来ない訳で、これは困る。メインはMacBookなので、samba経由で書き込めないと困ってしまう訳だ。色々試行錯誤したんだけど、ntfs-3gとかいうのを使ったらすげーあっさりと書き込みできるようになった。

$ sudo emerge ntfs3g
$ sudo update-modules
$ sudo su -
# echo "/dev/sdb5   /mnt/usbhdd ntfs-3g    noauto,users,umask=000,iocharset=utf8 0 0" >> /etc/fstab
# logout
$ sudo mount  /dev/sdb5 /mnt/usbhdd

あとは/etc/mt-daapd.confで、rescan_intervalを適当な値に設定しておいてやればok。

, , ,

mixiにそのまま投稿しちゃうと、本来リンクじゃないと困るものが、ただのテキストになってしまうわけで。どっちみち携帯から見てる人には無用なエントリになっちゃうし、いっそのことmixiには投稿しないようにしようと。一番てっとり早いのはP::P::MixiDiary.pm内で、単純にif文でほげほげすることなんだけど。ちょっと気が向いたのでplugin初挑戦してみた。

package Plagger::Plugin::Filter::StripDeliciousDailyPost;
use strict;
use base qw( Plagger::Plugin );

sub register {
    my($self, $context) = @_;
    $context->register_hook(
        $self,
        'update.entry.fixup' => \&filter,
    );
}

sub filter {
    my($self, $context, $args) = @_;

    my $title = $args->{entry}->title;
    for my $entry ($args->{feed}->entries) {
        if ($entry->title =~ /^links for \d{4}-\d{2}-\d{2}$/i) {
            $context->log(info => "Delete Delicious daily post entry " . $entry->link);
            $args->{feed}->delete_entry($entry);
        }
    }
}

1;
__END__

やはりperlは書き慣れんな。yamlを以下のようにして動作確認。

plugins:
  - module: Subscription::Config
    config:
      feed:
        - url: http://nobu666.com/rss?feed=rss2
  - module: Filter::Rule
    rule:
      module: Deduped
      path: /tmp/blog2mixi.tmp
      compare_body: 1
  - module: Filter::Reverse
  - module: Filter::FindEnclosures
  - module: Filter::FetchEnclosure
    config:
      dir: /tmp/fetch-image
  - module: Filter::FormatText
  - module: Filter::EntryFullText
  - module: Filter::StripDeliciousDailyPost
  - module: Publish::MixiDiary
    config:
      username: メールアドレス
      password: パスワード
      interval: 10
      originally_link: 1

,

dmesg|grep eth してみたら、eth0からeth1にrenameしたよとか書いてあったorz ので、単純に

ln -sf /etc/init.d/net.lo /etc/init.d/net.eth1
sed -i 's/eth0/eth1/g' /etc/conf.d/net
/etc/init.d/net.eth1 start

これだけでした。あとはルータ側でポート開けたり、スタティックルーティングしたりして、EM-ONE使って外から繋がることを確認。が、今度はメールが送れなくてしばし嵌った。プロバイダが変わったから、単純に/etc/postfix/main.cfのrelayhostを書き換えて、smtp_sasl_password_mapsで指定したファイルにSMTPホスト名とユーザ名とパスワード書いて、そいつをpostmapして/etc/init.d/postfix restartで終了だと思っていたのだが。

色々見直してmain.cfのrelayhostと、postmapするファイルの書き方を example.com:587 やら、[example.com]:587 やら試すもダメ。master.cf見直したりしても結局わからず。しかたないのでmain.cfの smtp* を全部虱潰しに調べるも特に以上は見あたらず。半ば諦めつつWebを検索してたらVine3.2のPostfixでSMTP認証ってエントリで

→main.cf へ smtp_sasl の設定を追加。 smtpd_sasl じゃないので、要注意。

……もしやと思って見てみたら、smtpd_sasl_auth_enable = yes という記述はあったけども、 smtp_sasl_auth_enable = yes がなかったのが原因でしたとさ…。疲れたわ。

, ,

前提条件

基本的にはGentoo distcc ドキュメントDistCC クロスコンパイルガイド、この2つのドキュメントの通り行う。気をつけなきゃいけないのは、「資源を借りる側」と「資源を貸す側」で若干設定が異なる点。ここでは借りる側はi686(192.168.0.4)、貸す側はamd64(192.168.0.3)とする。

貸す側と借りる側で、gccのバージョンは同じであること。3.3.x同時はOKだが、3.3.xと3.2.xは混ぜないこと。

また、資源を借りる側は一方的に借りるだけで、相互に助け合わない設定とした。これは、貸す側はサーバなので24時間稼働しているが、借りる側はノートなのでそうした。

資源を貸す側の設定

# emerge distcc crossdev
# vi /etc/make.conf
MAKEOPTS="-j8" #(CPUの数+1)*2 ここは全体じゃなくてサーバ単体で計算すべきなのかも。詳細不明…もしかしたら-j6が当たりなのかも?
FEATURES="distcc"
DISTCC_DIR="/var/tmp/.distcc"
PORTDIR_OVERLAY="/usr/local/portage"
# distcc-config --set-hosts "localhost 192.168.0.4"
# vi /etc/conf.d/distccd
DISTCCD_OPTS="${DISTCCD_OPTS} --allow localhost --allow 192.168.0.4" #--allow 192.168.0.0/24でも可
# /etc/init.d/distcc start
# rc-update add distcc default
# crossdev -t i686

資源を借りる側の設定

# emerge distcc
# vi /etc/make.conf
MAKEOPTS="-j8" #(CPUの数+1)*2
FEATURES="distcc"
DISTCC_DIR="/var/tmp/.distcc"
# vi /etc/conf.d/distccd
DISTCCD_OPTS="${DISTCCD_OPTS} --allow localhost" #相互に助け合いたい場合は--allow 192.168.0.3を足すか--allow 192.168.0.0/24にする
# cd /usr/lib/distcc/bin
# rm c++ g++ gcc cc
# echo '#!/bin/bash' > i686-pc-linux-gnu-wrapper
# echo 'exec /usr/lib/distcc/bin/sparc-unknown-linux-gnu-${0##*/} "$@"' >> i686-pc-linux-gnu-wrapper
# chmod a+x i686-pc-linux-gnu-wrapper
# ln -s i686-pc-linux-gnu-wrapper cc
# ln -s i686-pc-linux-gnu-wrapper gcc
# ln -s i686-pc-linux-gnu-wrapper g++
# ln -s i686-pc-linux-gnu-wrapper c++
# /etc/init.d/distcc start
# rc-update add distcc default
# export CC="i686-pc-linux-gnu-gcc"

実際に試す

借りる側から何か(それなりに時間のかかりそうなものを)emergeし、貸す側でtopコマンドで見てみる。distccというUSERでdistccやcc1というプロセスが見えれば成功している。当たり前だがコンパイルは速くなるが、configureやアーカイブのunpackは速くならないのであしからず。また、貸す側ではデフォルトでnice -15で実行されている。これは /etc/conf.d/distccdのDISTCCD_NICEで設定されているので、貸す側が暇なマシンなら変更してもいい。

, ,

インストールまでは上手くいったけど設定に嵌って酷い目にあった。

必要なものをインストールする

以下のものが必要。

  • net-snmp
  • apache
  • php
  • mysql
  • rrdtool
  • cacti

さくっとemergeするわけだが、USEフラグに注意。cactiにはapache2/snmp、phpにはapache2/snmp/sockets/mysqlあたりが必要(gdとかxmlも必須なのか?よくわらかんがこの辺は/etc/make.confでデフォルトで付けている)。

初期設定

cacti用のデータベースとユーザを作成し、付属のスクリプトでテーブルを作成する。

# mysqladmin -u root create cacti -p
# mysql cacti -u root -p < /var/www/localhost/htdocs/cacti/cacti.sql
# mysql -u root mysql -p -e"GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY 'p4ssw0rd'"
# mysql -u root mysql -p -e"flush privileges"

次にphpのconfigファイルを、今設定したものに合わせて書き換える。

# /var/www/localhost/htdocs/cacti/include/config.php
$database_username = "cactiuser";
$database_password = "p4ssw0rd";

cron実行用のシステムアカウント作成とパーミッション変更

# useradd -g apache -d /dev/null -s /bin/false -c cacti cacti

ホームディレクトリを/dev/null、ログインシェルを/bin/falseにすることで、cactiというユーザでログインできないようにする。この辺は適当に手を抜いてrootでやったりすると怖いので忘れずに。次にcactiユーザでデータの読み書きするためにパーミションを変える。

# chown -R cacti:apache /var/www/localhost/htdocs/cacti

全部変えちゃったけどrraとlogディレクトリだけでいいかも。未検証。

cronの設定

適当なタイミングでスクリプトをブン回す。とりあえず5分間隔に設定。

# vi /etc/crontab
*/5 * * * * cacti /usr/bin/php /var/www/localhost/htdocs/cacti/cmd.php > /dev/null 2>&1

cactiの設定

ブラウザから http://hostname/cacti/ にアクセス。デフォルトのユーザとパスワードはadmin/admin。ウィザードが始まるがNext押していけばいい。adminのパスワードは適当なものに変更する。

色々設定するところがあるが、一番下にある参考URLらへんを参照。

ここでrrdtoolからACCESS DENIEDと言われてグラフが上手く表示されなかった。よくわからんがcactiでadminじゃなくてcactiというユーザを作り、User Management→cacti→Graph PermissionsでDenyをAllowにお変更してSave。Graph Managementからなんかグラフを選んで、右上の*Turn On Graph Debug Mode.をクリックするとログが見えるようになるので押してみる。今度は’rra/localhost_load_1min_5.rrd’: No such file or directoryとか怒られる。

見てみると確かにrraの下が空っぽなのでダメらしい。/var/www/localhost/htdocs/cacti/cmd.phpを実行してもエラーらしきものは出ておらず。しばらくココで嵌ったが、/var/www/localhost/htdocs/cacti/poller.phpを実行すればOKだった。1回目は前のデータがないので怒られるが、もう1度やると問題なく実行された。そのあとcactiからはちゃんと見えるようになった。

参考URL

, ,

Gentooにはg-cpanという素晴らしいものがあるのだが、そこはあえて使わずにいく。というかなんか知らないけど上手くいかなかったので、仕方なく手動で入れたとも言う。とりあえず自宅サーバと言うことで、サックリrootになって入れることにする。そのほうが簡単。以前レンタルサーバで悩んだのがウソのようだ。ちゃんとログを取ってないので曖昧な記憶でメモ。

準備

別段何もない。

# perl -MCPAN -e shell

基本全部デフォルトのままENTER押してりゃよし。Gentooの場合、cpanでガンガン入れる前にまず
# emerge expat

これをやっておく。次にCPANのConfigを弄る。

# vi /usr/lib/perl5/5.8.8/CPAN/Config.pm
$CPAN::Config = {
'build_cache' => q[100],
'build_dir' => q[/root/.cpan/build],
'bzip2' => q[/bin/bzip2],
'cache_metadata' => q[1],
'check_sigs' => q[0],
'colorize_output' => q[0],
'commandnumber_in_prompt' => q[1],
'cpan_home' => q[/root/.cpan],
'curl' => q[/usr/bin/curl],
'ftp' => q[/usr/bin/ftp],
'ftp_passive' => q[1],
'ftp_proxy' => q[],
'getcwd' => q[cwd],
'gpg' => q[],
'gzip' => q[/bin/gzip],
'histfile' => q[/root/.cpan/histfile],
'histsize' => q[100],
'http_proxy' => q[],
'inactivity_timeout' => q[0],
'index_expire' => q[1],
'inhibit_startup_message' => q[0],
'keep_source_where' => q[/root/.cpan/sources],
'lynx' => q[],
'make' => q[/usr/bin/make],
'make_arg' => q[],
'make_install_arg' => q[],
'make_install_make_command' => q[/usr/bin/make],
'makepl_arg' => q[],
'mbuild_arg' => q[],
'mbuild_install_arg' => q[],
'mbuild_install_build_command' => q[./Build],
'mbuildpl_arg' => q[],
'ncftp' => q[],
'ncftpget' => q[],
'no_proxy' => q[],
'pager' => q[lv -Ou8 -c],
'prefer_installer' => q[EUMM],
'prerequisites_policy' => q[ask],
'scan_cache' => q[atstart],
'shell' => q[/bin/zsh],
'show_upload_date' => q[1],
'tar' => q[/usr/bin/tar],
'term_is_latin' => q[1],
'term_ornaments' => q[1],
'test_report' => q[0],
'unzip' => q[/usr/bin/unzip],
'urllist' => [q[ftp://ftp.kddilabs.jp/CPAN/]],
'wget' => q[/usr/bin/wget],
};
1;
__END__

# cpan -i Bundle::CPAN

CPANモジュールのインストール

Bundle::CPANとPlaggerに依存するモジュール(メモ)に従って進める。書いてあるとおり、TemplateとEncode::Detectはまともには入らないっぽいので諦めてforce installで。別段不都合はないので。

なんかRDF::Coreが上手く入らなくて困った記憶がある。emerge expatしてないせいだった、という記憶もあるが…ちょっと覚えてない。でもコマンドの履歴に以下のものが残っていた。

# wget http://ftp.yz.yamagata-u.ac.jp/pub/lang/cpan/modules/by-module/RDF/DPOKORNY/RDF-Core-0.50.tar.gz
# tar -zxvf RDF-Core-0.50.tar.gz
# cd RDF-Core-0.50
# perl Makefile.PL
# make

手動で入れたっぽい。若年アルツで覚えてない。まぁとりあえず頑張って入れて、cpanシェルでtest Plaggerが通るまで頑張る。通ったらinstall Plagger。

リポジトリから最新取得

subversionを使ってリポジトリから最新版を持ってきてmakeする。

# svn co http://svn.bulknews.net/repos/plagger/trunk/plagger
# cd plagger
# perl Makefile.PL
# make

ここまで行ったら出来たも同然。Plagger3大罠の1つである、assetsのコピーを忘れないうちにやっておく。svnで最新版を入れたディレクトリのassets以下に、 .cpan/build/Plagger-x.x.xx/assets/plugins/Publish-Gmail/gmail_notify.tt をコピっておく。yamlのglobalでassets_pathを指定するのも忘れずに。ちなみにyamlのサンプルは .cpan/build/Plagger-x.x.xx/examples 以下に入っているので、適当な場所にコピって編集すべし。

まぁ何が言いたいかって言うとレン鯖だと非常に苦労したインストールも、自宅鯖なら超簡単だぜってことです。gmailのメール送信量制限も、自宅鯖なら無関係。cacheもレン鯖だと、HDDが1Gくらいしかないので気にしなきゃいけないけど自宅鯖にはほぼ無関係。足りなくなったら増やせばイイだけだし。Plagger自体それなりに負荷があるので、レン鯖の場合は30分単位くらいで回さないと怒られそうなのだが、それを気にしなくていいのが一番でかい。もう5分とかで回してる。

, , ,

通勤時の電車の中では本を読んでいるか、暇つぶしに2ch見てるわけだが。どうせ携帯で見るなら自宅サーバのリソースも余ってることだし有効活用したい。そんなわけでrep2を使うことにした。

インストール

とりあえずダウンロードして、/var/www/localhost/rep2とかに置く。apacheは当然SSL有効でコンパイルしておくこと。phpはやたらに使用可能なフラグが多いのでメモっておく。

# emerge -pv php

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild R ] dev-lang/php-5.1.6-r6 USE="apache2 bzip2 cjk cli crypt curl curlwrappers gd iconv mysql ncurses nls pcre readline sasl session spell ssl threads unicode xml xmlrpc zlib (-adabas) -apache -bcmath -berkdb (-birdstep) -calendar -cdb -cgi -concurrentmodphp -ctype -db2 -dbase (-dbmaker) -debug -discard-path -doc (-empress) (-empress-bcs) (-esoob) -exif -fastbuild (-fdftk) (-filepro) (-firebird) -flatfile -force-cgi-redirect (-frontbase) -ftp -gd-external -gdbm -gmp -hardenedphp -hash -hyperwave-api -imap (-informix) -inifile -interbase -iodbc -ipv6 -java-external -kerberos -ldap -libedit -mcve -memlimit -mhash -ming -msql -mssql -mysqli -oci8 (-oci8-instant-client) -odbc -pcntl -pdo -pdo-external -pic -posix -postgres -qdbm -recode -reflection -sapdb -sharedext -sharedmem -simplexml -snmp -soap -sockets (-solid) -spl -sqlite (-sybase) (-sybase-ct) -sysvipc -tidy -tokenizer -truetype -vm-goto -vm-switch -wddx -xmlreader -xmlwriter -xpm -xsl -yaz -zip" 0 kB

rep2はPEARモジュールのいくつかが必須なので、PEARもと必須モジュールを入れる。eixで見つからなかったものはpearコマンドで入れ、見つかったものはemergeで入れた。

# emerge PEAR-PEAR
# pear install Net_UserAgent_Mobile-beta
# pear install PHP_Compat
# emerge PEAR-HTTP_Request
# emerge PEAR-Pager
# emerge PEAR-File

phpの設定

/etc/php/apache2-php5/php.iniの次のコメントアウトを外す。

[mbstring]
mbstring.internal_encoding = EUC-JP
mbstring.http_input = auto
mbstring.http_output = EUC-JP
mbstring.detect_order = auto
mbstring.substitute_character = none;

apacheの設定

SSLを使うため、認証局と証明書が必要。[修正版][memo] postfix + dovecotでSMTP AUTH & IMAPなメールサーバを立ち上げるで作成したものがあるのでそれを流用する。

# cp -p /etc/ssl/postfix/server.crt /etc/apache2/ssl/
# cp -p /etc/ssl/postfix/server.key /etc/apache2/ssl/

次にBasic認証に使う.htaccessをフォルダで上書きできるようにしておくため、/etc/apache2/modules.d/41_mod_ssl.default-vhost.confと/etc/apache2/vhosts.d/00_default_vhost.confの<directory “/var/www/localhost/htdocs”>部分を以下のように設定する。

<directory "/var/www/localhost/htdocs">
Options FollowSymLinks
AllowOverride AuthConfig
</directory>

.htaccessの設定

/var/www/localhost/htdocs/rep2に.htaccessを作成(サイト全体に認証をかけたいならhtdocsの下でも可)。

# vi /var/www/localhost/htdocs/rep2/.htaccess
AuthName "User Authentication Required"
AuthType Basic
Require valid-user
AuthUserFile /etc/apache2/.htpasswd
# htpasswd2 -c /etc/apache2/.htpasswd ユーザ名

apacheの起動パラメータ

gentooのapacheは、有効にしたいモジュールを明示しないといけないので、/etc/conf.d/apache2を修正。

# vi /etc/conf.d/apache2
APACHE2_OPTS="-D SSL -D PHP5 -D DEFAULT_VHOST -D SSL_DEFAULT_VHOST"
# /etc/init.d/apache2 restart

これで https://ホスト名:443/rep2/ に行けばユーザ名とパスワードが聞かれるはず。念のため携帯からもアクセスして問題なく認証できれば万事OK。ただ携帯でパスワードを入力するのは面倒なので、どうにか携帯の固有IDでパスできないか調べ中。auだとHTTP_X_UP_SUBNOで取れるみたいなんだが…

, ,

APC ES 500

Amazonで\7,000ちょっとという値段だったので、購入したのが届いた。流石に24時間稼働だとUPSがないと怖い。今年の雷で瞬断も多くあったので。付属のPowerCuteはWindowsとMacOS Xと商用Linuxにしか対応していないので自力でどうにかする方法をメモ。

準備と接続、認識確認

# emerge apcupsd

なにはなくともコレがないと始まらない。とりあえずインストールしたら一旦シャットダウンしてコンセントをUPSにつなぎ変え、付属のUSB通信ケーブルでUPSとサーバを接続して再起動。再起動したらdmesgを見てサーバがES500を認識しているか確認。

usbcore: registered new driver hiddev
hiddev0: USB HID v1.10 Device [APC APC ES 500 FW:803.p6.A USB FW:p6] on usb-0000:00:10.2-2

上記のようなメッセージがあれば問題ない。が、

es500 hid device not claimed

とか出てたら認識していない。俺の場合は思い切り認識していなかった。要するにまたカーネル再構築。だがもう手慣れたモンなのでサクサクと再構築する。こういうときはマシンパワーがあると非常に楽だ。お約束の以下の呪文を唱える。

# cd /usr/src/linux
# make menuconfig

そして今の設定をLOADして、以下のところにチェックを付けて保存。

Device Drivers --->
USB Support --->
/dev/hiddev raw HID device support

またお約束の呪文。

# make && make modules_install
# cp arch/x86_64/boot/bzImage /boot/なんか適当な名前

そしたら/boot/grub/grub.confを編集して再起動すればいい。今度はちゃんと認識されているはず。念のためapcaccess statusとやってエラーが出ないことを確認する。

設定と動作確認

次はapcupsdの設定を行う。

# vi /etc/apcupsd/apcupsd.conf
UPSCABLE usb
UPSTYPE usb
DEVICE
LOCKFILE /var/lock
ONBATTERYDELAY 6
BATTERYLEVEL 5
MINUTES 3
TIMEOUT 10
ANNOY 300
ANNOYDELAY 60
NOLOGON disable
KILLDELAY 0
NETSERVER on
NISIP 0.0.0.0
NISPORT 3551
EVENTSFILE /var/log/apcupsd.events
EVENTSFILEMAX 10
UPSCLASS standalone
UPSMODE disable
STATTIME 0
STATFILE /var/log/apcupsd.status
LOGSTATS off
DATATIME 0

殆どデフォルト。TIMEOUTに関しては動作確認のため10にした。これは10だと電源断から10秒でシャットダウンするということ。実際にapcupsdを動かして試してみる。

# /etc/init.d/apcupsd start
# rc-update add apcupsd default

思い切ってUPSのコンセントをぶっこ抜いてみる。ピーピーピーと警告音が鳴り、10秒後にシャットダウン処理が走れば成功。忘れないようにTIMEOUTは0にしておくこと。ここを0にしておくとUPS側のバッテリーで頑張ってくれるようになる。どのくらい頑張るかはBATTERYLEVELとMINUTESで決まる。BATTERYLEVELはバッテリ残量が残り何%になったらシャットダウンするかで、MINUTESは残り時間何分でシャットダウンするか。どちらかの条件を満たすとシャットダウンされる。お好みで変える。

, ,

[memo] postfix + dovecotでSMTP AUTH & IMAPなメールサーバを立ち上げるがあまり正しくないので修正版。

ssmtpの削除

Gentooではいきなりpostfixを入れようとしても、デフォルトでssmtpが入っていてblockされるのでssmtpを消すのが先決。

# emerge -C ssmtp

postfixとdovecotのインストール

Gentooの基本だけど、emergeするときはemerge -pvでどんなフラグが有効になるか必ず確認。必要ないならpackage.useで外す。あとsaslが必要なのでこれは付けておく。あとなんでかわからないけどpostfixにsaslを付けるとついてくるcyrus-saslで、gdbmやcryptをUSEするとコンパイルに失敗したので外した。

# emerge -pv postfix dovecot
# echo "mmail-mta/postfix -mysql sasl" >> /etc/portage/package.use
# echo "dev-libs/cyrus-sasl -mysql -java -gdbm -crypt" >> /etc/portage/package.use
# emerge postfix dovecot

オレオレ認証局の作成

Gentooでの方法なので他のディストリではパスが違うようなので注意。

# mkdir /etc/certs
# chmod 700 /etc/certs
# cd /etc/certs
# cp /etc/ssl/misc/CA.pl .
# perl ./CA.pl -newca
CA certificate filename (or enter to create)
(ENTER)
Making CA certificate ...
Generating a 1024 bit RSA private key
..................................++++++
.......................++++++
writing new private key to './demoCA/private/cakey.pem'
Enter PEM pass phrase:(パスフレーズを入力)
Verifying - Enter PEM pass phrase:(同じパスフレーズをもう一度入力)
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Kanagawa
Locality Name (eg, city) []:Yokohama
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Private
Organizational Unit Name (eg, section) []:Private
Common Name (eg, YOUR name) []:nobu666.fam.cx
Email Address []:root@nobu666.fam.cx

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:(ENTER)
An optional company name []:(ENTER)
Using configuration from /etc/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
(略)
Certificate is to be certified until Oct 28 06:15:58 2009 GMT (1095 days)

Write out database with 1 new entries
Data Base Updated

クライアント用CA証明書とサーバ用CA証明書を作成

# cd /etc/certs/demoCA
# openssl x509 -inform pem -in cacert.pem -outform der -out cacert.der
# openssl x509 -in ./cacert.pem -out ./cacert.crt

デジタル証明書のリクエストファイルを作成

# cd /etc/certs
# perl ./CA.pl -newreq-nodes
Generating a 1024 bit RSA private key
...++++++
...............................................................................................................++++++
writing new private key to 'newkey.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Kanagawa
Locality Name (eg, city) []:Yokohama
Organization Name (eg, company) [Internet Widgits Pty Ltd]:nobu666.fam.cx
Organizational Unit Name (eg, section) []:Admin
Common Name (eg, YOUR name) []:nobu666.fam.cx
Email Address []:root@nobu666.fam.cx

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:(ENTER)
An optional company name []:(ENTER)
Request is in newreq.pem, private key is in newkey.pem

リクエストファイルからX.509サーバ証明書の作成と署名

# perl ./CA.pl -sign
Using configuration from /etc/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number:
ce:db:05:2a:6a:dc:75:17
Validity
Not Before: Oct 29 06:51:11 2006 GMT
Not After : Oct 29 06:51:11 2007 GMT
Subject:
countryName = JP
stateOrProvinceName = Kanagawa
localityName = Yokohama
organizationName = nobu666.fam.cx
organizationalUnitName = Admin
commonName = nobu666.fam.cx
emailAddress = root@nobu666.fam.cx
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
7B:0E:46:62:02:FB:B6:A6:05:DC:DE:75:2E:2D:5A:29:5D:31:79:F8
X509v3 Authority Key Identifier:
keyid:A7:51:EC:0A:BD:B6:70:68:A5:01:ED:8E:76:1F:FE:0C:4D:B2:A0:19

Certificate is to be certified until Oct 29 06:51:11 2007 GMT (365 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Signed certificate is in newcert.pem
# openssl x509 -in newcert.pem -out server.crt

postfix用にシンボリックリンクを張る

# ln -sf /etc/certs/server.crt /etc/ssl/postfix/server.crt
# ln -sf /etc/certs/newkey.pem /etc/ssl/postfix/server.key

postfixの設定

# vi /etc/postfix/main.cf
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix
mail_owner = postfix
myhostname = nobu666.fam.cx
mydomain = nobu666.fam.cx
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, $mydomain, mail.$mydomain, localhost
unknown_local_recipient_reject_code = 550
mynetworks_style = subnet
mynetworks = 192.168.0.0/24, 127.0.0.0/8
relay_domains = $mydestination
alias_maps = hash:/etc/mail/aliases
alias_database = hash:/etc/mail/aliases
home_mailbox = .Maildir/

header_checks = regexp:/etc/postfix/header_checks
smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
mydestination = $myhostname, localhost.$mydomain, $myhostname.$mydomain, mail.$mydomain, localhost
debug_peer_level = 2
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
xxgdb $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail
mailq_path = /usr/bin/mailq
setgid_group = postdrop
html_directory = /usr/share/doc/postfix-2.2.10/html
manpage_directory = /usr/share/man
sample_directory = /etc/postfix
readme_directory = /usr/share/doc/postfix-2.2.10/readme
smtpd_use_tls = yes
smtpd_tls_loglevel = 1
smtpd_tls_cert_file = /etc/ssl/postfix/server.crt
smtpd_tls_key_file = /etc/ssl/postfix/server.key
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtp_sasl_security_options = noanonymous
allow_mail_to_commands = alias,forward,include
message_size_limit = 1024000
smtpd_client_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
permit_auth_destination,
reject
# vi /etc/postfix/master.cf
< コメントアウトを外す >
submission inet n - n - - smtpd
-o smtpd_etrn_restrictions=reject
-o smtpd_client_restrictions=permit_sasl_authenticated,reject

saslの設定

# vi /etc/sasl2/smtpd.conf
pwcheck_method: saslauthd
# mkdir /var/state/saslauthd
# chmod 700 /var/state/saslauthd
# chown postfix /var/state/saslauthd

dovecotの設定

vi /etc/dovecot.conf
protocols = pop3 imap
ssl_disable = no
ssl_cert_file = /etc/ssl/postfix/server.crt
ssl_key_file = /etc/ssl/postfix/server.key
default_mail_env = maildir:%h/.Maildir
# chmod 755 /var/run/dovecot
# chmod 750 /var/run/dovecot/login

あとはデフォルトのまま。

クライアントの設定

まずはオレオレ認証局の証明書をクライアントに入れる必要がある(やらなくてもいいが警告が出るので…)。別にどうやってクライアントに渡してもOK。FTPとかSCPとかで適当に。メーラによって操作が違うがThunderbirdの場合は、ツール→オプション→プライバシー→セキュリティ→証明書を表示→認証局証明書→インポートと進んで、cacert.derを選択すればOK。あとはIMAPでアカウントを作って、受信は143番ポートでTLSを使うようにし、送信は587番ポートで同じくTLSを使うように設定する。送信テストするとユーザ名とパスワードが聞かれるので「パスワード無しで送信できないこと」「間違ったパスワードを入れて送信できないこと」「正しいパスワードを入れて送信できること」の3つを確認して終了。

, , ,

なんつーかね、某krからのsshdへのBrute force attacksが酷すぎる。auth.logを埋め尽くすほどのアタックを食らったので対策することに。だが普通にインストールするとiptablesが動いてくれないので、カーネル再構築に挑戦する。

別に今回はkernelのバージョンを上げたいわけではなく、単純にカーネルのオプションを変えたいだけなので、emerge gentoo-sourcesはやらない。以下、rootになって作業を行う。あとmenuconfigはscreenの中でやると表示が乱れて酷いことになるので、screenをデタッチするなり抜けるなりしてからやったほうがいい。

# cd /usr/src/linux
# make menuconfig

Confgurationが立ち上がったら、まずLoad an Alternate Configuration Fileを選ぶ。”.config”が入力されているはずなので、そのままOKすると現在の設定が読み込まれる。そしたら

Networking --->
Networking options --->
Network packet filtering (replaces ipchains) --->
Core Netfilter Configuration --->
Netfilter Xtables support (required for ip_tables)

を選択。その下に色々あるが、よくわからないならMにしといてあとでModuleとして読めるようにしておくと吉。必要なのに何もチェックしないでおくと、再度カーネル再構築が必要になって面倒なので。チェックしたら1つ戻ってIP: Netfilter Configurationの中に入る。とりあえず必須なのはIP tables support (required for filtering/masq/NAT)と、IP range match support、Packet filtering、REJECT target support、address type match support、Full NAT、MASQUERADE target supportとかそのへん。終わったらTOPまで戻って、念のため設定ファイルをなんか名前付けて保存しておいたほうがいい。

あとはその辺のサイトに書いてあるとおり、お約束でOK。

# make && make modules_install
# cp arch/x86_64/boot/bzImage /boot/なんか適当な名前
# vi /boot/grub/grub.conf

grub.confの設定では、元々書いてあるものを絶対に消さないこと。消しちゃうと万が一再構築したカーネルで起動できなかったときに面倒。

title=Gentoo Linux 2.6.17-r8
root (hd0,0)
kernel /さっきbootの下にcpしたファイル名 root=/dev/sda3 vga=ask

とかで問題なし。vga=askの部分はまぁお好みで。/usr/src/linux/Documentation/fb/vesafb.txtとかを参考に。基本的にはこれでrebootして、上のtitleでつけた名前を選択して起動してやればとりあえずOKなはずだ。失敗したら残しておいた方で起動して修正すべし。消してしまったお馬鹿さんはinstall cdから起動して/dev/sda1とかをmountして編集すれば戻せる。あとvgaとかvideoのオプションは、間違うと画面に何も表示されなくなるので注意。まぁリモート操作がメインならそれでもいいのかも知れないけど、何かあったときにアレなんで…心配ならaskにしておいて選択するのが間違いない。

そこまで出来たらDebian GNU/Linux 3.1(sarge)運用ノートのSSH Brute force attacksの通りに設定してから

# /etc/init.d/iptables save
# /etc/init.d/iptables start
# rc-update add iptables default

以上で終了。エラーが出てiptablesが動かない場合は必要なモジュールが選択漏れでコンパイルされていないとか、Mを選択したのにmodprobeなりinsmodしてない。てか俺もこの手順にたどり着くまで5回くらい再構築してこんな時間に…もう寝る!

, , , ,