2010/01/30

IEのpreタグのスクロールバー

参考したサイト: http://weblog.2-d.jp/pc/internet/000010.php

2010/01/29

LAVELOGでwikiのテスト

Subject: LAVELOGでwikiが使えた Content-type: html/text Tags: メモ Date: 2010/01/29 Public: yes

2010/01/17

FreeBSDでYoutube

FreeBSDでyoutubeを見ようとすると結構めんどくさい。
FreeBSD用のFlashは無いのでLinux用のプラグインを入れなくちゃいけない。
それ自体もめんどくさいのだがFlashはセキュリティ上のバグが多くて入れたくない。

で、「別にブラウザで見れなくても動画ファイルがDLできて見れれば良いんじゃね」
と思ってググったらYoutubeの仕組みが分かったのでちょろっとスクリプトを書いてみた。


#!/bin/sh

VID=$1
url="http://www.youtube.com/watch?v=${VID}"

swfArgs=`wget -q -O - $url | grep SWF_ARGS`
T=`echo $swfArgs|\
awk '{match($0,/"t": "[^"]*"/);print substr($0,RSTART+6,RLENGTH-7);}'`

mplayer -cache 8192 "http://youtube.com/get_video?video_id=${VID}&t=${T}"

#一旦、Downloadする場合はこっち。
#wget -O $VID.flv "http://youtube.com/get_video?video_id=${VID}&t=${T}"
#mplayer -fs -cache 8192 $VID.flv


おお、ちゃんと動画が再生できてます。
でも youtube-dl なんて ports が既に有ったのね...

2010.12.23 追記
このスクリプトはもう受け付け無いようです。
youtube-dl を使ってください。




2010/01/16

サーバ監視ツール 結局自作

Munin は入れてみたもののなんかいろいろ気に入らない。

- CPU使用率が取得した瞬間のもので前回取得からの平均値でない。
- 情報の取得処理でCPU使用率がちょっと上がっちゃう。
- HDD I/O レートが取れない。
- グラフに余計な情報が多くて見づらい。
- グラフがカスタマイズしずらい。
- ローカルでしか使わないのにデーモンなんか上げたくない。

と、不満たらたら。
基本的には「top コマンドの内容がグラフで見れたら十分」な分けだがそれがシンプルにできるツールが無い。

仕方が無いので作る!!
基本的な方針は、
(1) top や *stat 系コマンドの出力を awk で加工してログる。
(2) (1)のログを gnuplot でグラフ化する。
おお、とってもシンプル。

取得する情報は
- CPU, Memory の使用率 (top)
- CPU 温度 (mbmon)
- HDD I/O レート (iostat)
- Net I/O レート (netstat)
とする。


まずロガー起動スクリプト。
- 各コマンドとフィルタをバックグランドで起動する。
- 各コマンドは1時間後に自動終了するようにしておく。
- cron で1時間おき(*1)にロガー起動スクリプトを実行する。

logging.sh:

#!/bin/sh

BASE=`dirname $0`
MBMON=/usr/local/bin/mbmon
GAWK=/usr/local/bin/gawk

LOGDIR=/var/sysmonitor
LOGTIME=3600
INT=300
AWKPARAM="-v logdir=$LOGDIR -v timeout=$LOGTIME -v interval=$INT"

top -s $INT -d 100 -bu 0 | $GAWK $AWKPARAM -f $BASE/logging-top.awk &
$MBMON $INT | $GAWK $AWKPARAM -f $BASE/logging-mbmon.awk &
netstat -w $INT | $GAWK $AWKPARAM -f $BASE/logging-netstat.awk &
iostat -x -w $INT -d | $GAWK $AWKPARAM -f $BASE/logging-iostat.awk &



topコマンドのフィルタ。
- 日付,時間,CPU使用率,Memory使用率を CSV 形式で出力する。
- Memory使用率は inact+buf を分離する。(*2)
- 出力先は $LOGDIR/top-YYYY-MM-DD.log とする。
- FreeBSD/7.2 以外では未確認。多分 Linux では調整が必要。

logging-top.awk:

BEGIN {
endtime = systime() + timeout;
dropHeaderCount = -1;
}

/^last pid/ {
load1m = substr($6, 0, length($6)-1) * 100;
load5m = substr($7, 0, length($7)-1) * 100;
}

/^CPU:/{
cpuUsed = 100 - substr($10, 0, length($10)-1);
}

/^Mem:/{
act = kbytes($2);
inact = kbytes($4);
wired = kbytes($6);
cache = kbytes($8);
buf = kbytes($10);
free = kbytes($12);

memTotal = act+inact+wired+cache+buf+free;
memUsed1 = (act+wired+cache) * 100 / memTotal;
memUsed2 = (inact+buf) * 100 / memTotal;

if (dropHeaderCount++ >= 0) {
curtime = systime();
logFile = logdir "/" strftime("top-%Y-%m-%d.log", curtime);
datetime = strftime("%Y/%m/%d,%H:%M:%S", curtime);

printf("%s,%d,%d,%d\n",
datetime,cpuUsed,memUsed1,memUsed2) >> logFile;
fflush(logFile);

if (curtime > endtime) exit;
}
}

func kbytes(size) {
if (size ~ /M$/) {
return substr(size, 0, length(size)-1) * 1048576;
} else if (size ~ /K$/) {
return substr(size, 0, length(size)-1) * 1024;
}
return size;
}



グラフ化スクリプト。
- ログをgnuplotのコマンド列に変換して gnuplot に食わせる。
- 実行タイミングは適当に。
mkgraph.sh

#!/bin/sh

BASE=`dirname $0`
LOGDIR=/var/sysmonitor
OUTDIR=出力先ディレクトリ
DATE=`date -v -1H +%Y-%m-%d`
GNUPLOT=/usr/local/bin/gnuplot

$BASE/plot-top.awk $LOGDIR/top-$DATE.log | $GNUPLOT > $OUTDIR/top-$DATE.png
$BASE/plot-mbmon.awk $LOGDIR/mbmon-$DATE.log | $GNUPLOT > $OUTDIR/mbmon-$DATE.png
$BASE/plot-disk.awk $LOGDIR/disk-$DATE.log | $GNUPLOT > $OUTDIR/disk-$DATE.png
$BASE/plot-net.awk $LOGDIR/net-$DATE.log | $GNUPLOT > $OUTDIR/net-$DATE.png

cd $OUTDIR
rm -f *-current.png
ln -s top-$DATE.png top-current.png
ln -s mbmon-$DATE.png mbmon-current.png
ln -s disk-$DATE.png disk-current.png
ln -s net-$DATE.png net-current.png



logging-top.awkのログをgnuplotのコマンド列に置き換えるツール。
- 横軸に時間、縦軸に使用率とする。
- CPU使用率を折れ線で Memory使用率を棒グラフにする。
plot-top.awk:

#!/usr/local/bin/gawk -f

BEGIN {
FS = ","

print "set term png";
print "set size 1,0.38";

#printf("set output '%s'\n",outfile);

print "set multiplot";
print "set xrange [0:24]";
print "set xtics 00,1,24";

print "set title 'CPU & Memory'";
print "set ylabel 'ratio'";
print "set yrange [0:105]";

cnt = 0 ;
}


!/^#/{
split($2,t,":");
time[cnt] = sprintf("%02d.%02d",t[1],int(t[2]*100/60));
cpu[cnt] = $3 ;
mem1[cnt] = $4 ;
mem2[cnt] = $4+$5 ;
cnt++;
}

END{
print "plot '-' title 'mem-buf' lc rgb '#aaffe0' with impulses\\";
print ", '-' title 'mem-act' lc rgb '#aae0ff' with impulses\\";
print ", '-' title 'cpu' lc rgb '#ff4400' with line";

for( i=0 ; i<cnt ; i++ ) print time[i],mem2[i];
print "end, ";

for( i=0 ; i<cnt ; i++ ) print time[i],mem1[i];
print "end";

for( i=0 ; i<cnt ; i++ ) print time[i],cpu[i]+1;
print "end";
}


実行結果:

※10:30くらいからカーネルのコンパイルを走らせてみました。

gnuplot のコマンドは分かりづらいですがカスタマイズはそんなに難しく無いと思います。
(ググればいくらでも情報はあります。)

その他のスクリプトはこちらから落して下さい。
sysmonitor.zip


(*1)1時間おきにしているのは万が一スクリプトが死んでしまった場合に翌朝までログが取れないと言う状態を回避する為です。
(*2)inactとbufは無くても動作するが合った方がより効率的に動作できるメモリ領域です。



2010/01/15

サーバ監視ツール Munin

回線の開通までもうちょっとあるのでシステムモニタを入れて見ることにした。
システムモニタというと MRTG が有名だが調べて行くと Munin と言うのが設定が簡単で使い易いらしい。

と言うわけで Munin を入れてみる。
FreeBSD なのでインストールは Ports から。

# cd /usr/ports/sysutils/munin-node
# make install clean
# cd /usr/ports/sysutils/munin-main
# make install clean

途中、聞かれる質問は全部「y」で良い。

※依存ライブラリでX11関係が大量にインストールされた。
OSにX11をインストールしなかったのが原因と思われる。orz
今度から使わなくてもX11はインストールしとこう。

各種設定ファイルの変更。
/etc/rc.conf:
munin_node_enable="YES"


/usr/local/etc/munin.conf:
htmldir 出力先ディレクトリ/


# a simple host tree
[localhost]
address 127.0.0.1
use_node_name yes



初期状態だと余計な物まで大量に入っているので必要な物だけにする。
- /usr/local/etc/munin/plugins 配下のファイルを削除するだけ。

# cd /usr/local/etc/munin/plugins
# ls

cpu if_errcoll_plip0 if_vr0 open_files swap
df if_errcoll_vr0 load processes vmstat
df_inode if_fwe0 memory sendmail_mailqueue
if_errcoll_fwe0 if_fwip0 netstat sendmail_mailstats
if_errcoll_fwip0 if_plip0 ntp_offset sendmail_mailtraffic

# rm いらないもの
# ls

cpu if_vr0 memory netstat


とりあえずグラフを作成してみる。

# munin-cron --force-root

HTMLとカラッポのグラフが生成される。なぜかグラフが不等幅フォントになっていて汚い。
調査したがどうやら内部で使用している rrdtool が指定されたフォントを無視しているらしい。
しょうが無いので力技で修正。

# vi /usr/local/share/munin/munin-graph

'--font' ,'LEGEND:7:/usr/local/share/munin/VeraMono.ttf',

'--font-render-mode','light',
'--font' ,'LEGEND:7:Monospace',



参考にしたサイト:
http://kota.oue.me/2009/08/freebsdmunin.html



2010/01/05

自宅サーバの構築、その4(Postgre on jail)

Postgre を jail 上で動かす設定。
今回の環境では親ホストの Postgre を使用するので jail に pgsql ユーザの作成と起動スクリプトのコピーをしておく必要が有る。
jail 上に直接インストールすれば必要無いはず。

- jail環境に postgre のユーザ/グループを追加
jail# vi /etc/group
pgsql:*:70:

jail# vipw
pgsql:*:70:70::0:0:PostgreSQL Daemon:/usr/local/pgsql:/bin/sh

- 起動スクリプトのコピー。
host# cp -p /usr/local/etc/rc.d/postgresql /jail/local_etc/rc.d/
-- ※/jail/local_etc は jail:/usr/local/etc にマウントされている。


- jail 上で共有メモリを有効にする。
-- 親ホストの /etc/rc.conf に追加
jail_sysvipc_allow="YES"

-- セキュリティ上は無い方が良いが動かないものはしょうがない。

- postgre のネットワーク設定の調整
-- initdb でDBを作成後。
-- $PGDATA/postgresql.conf に追加
listen_addresses = 'jail-IP'

-- $PGDATA/pg_hba.conf に追加
host    all         all         jail-IP/32          trust

-- jail では localhost が使えない為。


- jail環境の /etc/rc.conf に Prestgre の起動設定を追加。

# Postgreの起動
postgresql_enable="YES"
postgresql_data="PGDATAディレクトリ"


この設定で公開中の自宅サーバ:http://wsjs.dip.jp:8008/


2010/01/04

自宅サーバの構築、その3(jetty on jail)

OSがセットアップできたので jetty の環境を構築する。

- JDKのインストール
host# cd /usr/ports/java/diablo-jdk16
host# make install
-- 手動ダウンロードの指示がされるので従う。

- Jetty
-- 導入はzipを落して来て展開するだけなので割愛。
-- 自動起動スクリプト jail:/usr/local/etc/rc.d/wsjs.sh

#!/bin/bash

export JETTY_HOME=/Jettyのホーム
export JETTY_USER=実行ユーザ
export JETTY_PORT=公開ポート番号

export XVAR=/一時ファイル用ディレクトリ
export TMP=$XVAR/tmp
export JETTY_RUN=$XVAR/run
export JETTY_LOGS=$XVAR/logs

export JAVA_HOME=JDKのホーム
export JAVA_POLICY="-Djava.security.manager -Djava.security.policy=$JETTY_HOME/etc/java.policy"
export JAVA_OPTIONS="-Xmx700M -Xss2M $JAVA_POLICY"

$JETTY_HOME/bin/jetty.sh $*

-- Jettyのログ出力がJettyのホームに固定になっているので補正。
JETTY_HOME/etc/jetty-logging.xml:

16c16
< <Arg><SystemProperty name="jetty.home" default="."/>/logs/yyyy_mm_dd.stderrout.log</Arg>
---
> <Arg><SystemProperty name="jetty.logs" default="./logs"/>/yyyy_mm_dd.stderrout.log</Arg>




- java の policy ファイル
-- 空から始めて要求されたパーミッションを1つづつ追加していった。
-- RuntimePermission で強い権限が許可されてしまっているが仕方が無い。
-- FilePermission は必要最低限で問題なさそう。
-- SocketPermission は緩めだがパケットフィルタでなんとかしてもらう。

$JETTY_HOME/etc/java.policy:

grant CodeBase "file:/Jettyホーム/-" {
permission java.io.FilePermission "/WSJSリポジトリ/-", "read,write";
permission java.io.FilePermission "/ログディレクトリ/-", "read,write";
permission java.io.FilePermission "/tmp/-", "read,write,delete";

permission java.io.FilePermission "/Jettyホーム/-", "read";
permission java.io.FilePermission "/usr/share/java/-", "read";

permission java.net.SocketPermission "localhost:公開ポート", "listen,accept";
permission java.net.SocketPermission "*", "connect,accept,resolve";

permission java.util.PropertyPermission "*", "read";
permission java.util.PropertyPermission "jetty.home", "read,write";
permission java.util.PropertyPermission "java.class.path", "read,write";

permission java.lang.RuntimePermission "createClassLoader";
permission java.lang.RuntimePermission "setContextClassLoader";
permission java.lang.RuntimePermission "accessDeclaredMembers";
permission java.lang.RuntimePermission "exitVM";
permission java.lang.RuntimePermission "setIO";
permission java.lang.RuntimePermission "getClassLoader";
permission java.lang.RuntimePermission "accessClassInPackage.sun.reflect";

permission java.security.SecurityPermission "getPolicy";
};
grant CodeBase "file:/一時ファイル用ディレクトリ/tmp/-" {
permission java.io.FilePermission "/WSJSリポジトリ/-", "read,write";
permission java.io.FilePermission "/ログディレクトリ/-", "read,write";
permission java.io.FilePermission "/tmp/-", "read,write,delete";
permission java.io.FilePermission "/Jettyホーム/lib/-", "read";

permission java.net.SocketPermission "*", "connect,accept,resolve";

permission java.lang.RuntimePermission "createClassLoader";
permission java.lang.RuntimePermission "getProtectionDomain";
permission java.lang.RuntimePermission "accessClassInPackage.sun.reflect";

permission java.util.PropertyPermission "user.home", "read";
};



この設定で公開中の自宅サーバ:http://wsjs.dip.jp:8008/


2010/01/03

自宅サーバの構築、その2(パケットフィルタ)

公開する jail 環境はホームネットの環境に有るわけだがクラックされた場合の事を考えると他のPCにはアクセスさせたくない。
しかし、メンテを考えると作業用PCからログインして操作したい。

この辺の制御を jail 環境の親ホストの ipfw を使ってやることにした。
ipfw は FreeBSD 用のパケットフィルタだが jail のパケットもこのフィルタにちゃんと引っかかる。

- ipfw を使うには kernel の再コンパイルが必要。
# cd /sys/i386/conf
# vi GENERIC
options IPFIREWALL

options IPFIREWALL_VERBOSE

# config GENERIC
# cd ../compile/GENERIC
# make depend ; make ; make install
- /etc/rc.conf に設定追加
firewall_enable="YES"



自宅内のネット構成は大体こんな感じ。

(inter-net)
|
[Router]
|
----+--------------+-----------+----- (local-net)
| |
[MYPC] [Server-PC] <-ここでフィルタリング
|
[Jail-VM]

これにこういう制限をかけたい。

○ (inter-net) <-> [Jail-VM]
○ [MYPC] --> [Jail-VM]
× (inter-net) --> [MYPC],[Server-PC] // これは Router の設定。
× [Jail-VM] --> [MYPC],[Server-PC]


その初期化用スクリプトがこうなります。
- /usr/local/etc/rc.d/ipfw-init.sh

#!/bin/sh
IPFW=/sbin/ipfw
ME=親サーバIP
JAIL=jail-JIP
ROUTER=ルータ-IP
MYHOME=ホームNET(例:192.168.0.0/24)
MYPC=作業PC-IP
PUBPORT=公開ポート番号

${IPFW} -f flush

${IPFW} add 90 deny all from ${JAIL} to ${ME}
${IPFW} add 100 allow all from any to any via lo0
${IPFW} add 200 deny all from any to 127.0.0.0/8
${IPFW} add 300 deny all from 127.0.0.0/8 to any

${IPFW} add 1000 allow tcp from any to ${JAIL} dst-port ${PUBPORT}
${IPFW} add 1100 allow all from ${MYHOME} to ${JAIL}
${IPFW} add 1200 allow all from ${JAIL} to ${ROUTER} dst-port domain
${IPFW} add 1300 allow tcp from ${JAIL} to ${MYHOME} established
${IPFW} add 1400 deny tcp from ${JAIL} to ${MYHOME} setup
${IPFW} add 1500 deny all from ${JAIL} to ${MYHOME}
${IPFW} add 1600 allow all from ${JAIL} to any

${IPFW} add 9100 allow all from ${MYPC} to ${ME}
${IPFW} add 9200 allow all from ${ME} to any


肝になるのは 1300 と 1400 の設定です。
- 1300: jailから他PCに向かう確立しているセッションのパケットは通します。
- 1400: jailから他PCに向かうセッション開始のパケットは破棄します。

作業PCから jail に向かうパケットは制限されていないのでセッションは開始できます。
jailから他PCへはセッションが開始できないので一方通行が成立します。
受動的にセッションハイジャックしてクライアントアプリをクラックすれば突破できますが相当難しいでしょう。
そこまでしてこのサイトをクラックするメリットも無いですし。

この設定で公開中の自宅サーバ:http://wsjs.dip.jp:8008/


プロフィール
20年勤めた会社がリーマンショックで消滅、紆余曲折を経て現在はフリーランスのSE。 失業をきっかけにこのブログを始める。

サイト内検索

登録
RSS/2.0

カテゴリ

最近の投稿【メモ】

リンク

アーカイブ