変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

CentOS6.2

VMPlayerのディスク圧縮が・・・

暫くVMディスクファイルの圧縮をサボっていた。
そろそろやっておかないと・・・

え!仮想マシンではshrinkできなくした訳?
困ったなぁ~
1/19の記事の時点ではできてたのに・・・
ext4未対応って情報もありますが・・・
仕方が無いので、
①手動で未使用領域をゼロで埋め、
# df

Filesystem 1K-ブロック  使用 使用可 使用% マウント位置
/dev/mapper/vg_ssiscirine-lv_root 20134384 6020096 13091520 32% /
tmpfs 255568 0 255568 0% /dev/shm
/dev/sda1 495844 110809 359435 24% /boot

ブロックサイズを4K(4096)にするなら、13091520/4=3272880だから
# dd if=/dev/zero of=/dummy bs=4096 count=3272880
3272880+0 records in
3272880+0 records out
13405716480 bytes (13 GB) copied, 143.134 s, 93.7 MB/s
# df

Filesystem 1K-ブロック  使用 使用可 使用% マウント位置
/dev/mapper/vg_ssiscirine-lv_root 20134384 19150240 0 100% /
tmpfs 255568 0 255568 0% /dev/shm
/dev/sda1 495844 110809 359435 24% /boo

# rm /dummy
rm: remove 通常ファイル `/dummy’? y
# poweroff
②VM-Workstationをインストしてあれば、
vmware-vdiskmanager.exe  -k   *.vmdk
とかすれば良いはずなんですが・・・
③VM Playerには入って無いのでVMPlayerの画面から圧縮機能を使うしかないかな。
1.5G減った。
まぁこんなものかもしれない。



鯖移行

AM4のパワータイムの状況。

さっぱり足りてないのでVMPlayerを諦め、
ATOM-PCを掘り起こしCentOS6.2をインスト中。
E-450は留守録画、放置露天用に。

No. 作業 内容 状況
1. CentOS6.2(32bit) インスト 完了
2. yum 全パッケージ更新 完了
3. yum-cron インスト 完了
4. rootkit検知ツール導入(chkrootkit) download.fedora.redhat.comが
Not found
中断
5.
6.
7.
8.
9.
10.
10.


BASIC認証にmysqlを使ってみた(サンプル)

元ネタはココです。
モジュールが入ってなかった。

# yum -y install mod_auth_mysql
# service httpd restart

データベースとテーブルは、phpmyadminで適当に設定してみた。
どんなSQL(Create Table)かは、テーブルのエクスポート画面でエクスポート方法詳細出力を出力をテキストで表示するにして実行ボタンを押すと判る。

CREATE TABLE IF NOT EXISTS `member_info` (
`member_id` varchar(64) COLLATE utf8_bin NOT NULL,
`member_password` varchar(40) COLLATE utf8_bin NOT NULL COMMENT ‘sha1’,
PRIMARY KEY (`member_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;

レコードに素でパスワードを入れるのは気味が悪くなるのでSHA1でデコードしておく。

INSERT INTO `member_info`( `member_id`, `member_password`) VALUES (‘abcdef’,SHA1(‘123456’))

サンプル画面のディレクトリィに.htaccessを作る

<Files ~ “^\.(htaccess|htpasswd)$”>
deny from all
</Files>

# MySQLによる認証を有効に
AuthMySQLEnable On

# mysqldへの接続Socket
AuthMySQLSocket /var/lib/mysql/mysql.sock

# mysqldの場所
AuthMySQLHost localhost

# mysqldへの接続ユーザ
AuthMySQLUser  <接続ユーザ>

# mysqldへの接続パスワード
AuthMySQLPassword  <接続パスワード>

# 認証を行う情報が格納されたデータベース名
AuthMySQLDB  <データベース名>

# 認証を行う情報が格納されたテーブル名
AuthMySQLUserTable <テーブル名>

# 認証を行うユーザ名が格納されているカラム名
AuthMySQLNameField <IDのカラム名>

# 認証を行うパスワードが格納されているカラム名
AuthMySQLPasswordField <パスワードのカラム名>

# 認証を行うパスワードが格納されているカラムの暗号方式
AuthMySQLPwEncryption sha1

# パスワード無しのユーザからの接続を許可するかどうか
AuthMySQLNoPasswd Off

# 以下はBasic認証を行う場合のお約束事らしい。メッセージに日本語使うと文字化けするからやめといた方がいい。
AuthGroupFile /dev/null
AuthName “Enter your ID and password”
AuthType Basic
require valid-user

order deny,allow

後はサンプル画面を作ってアクセスしてみる。
多分、何か失敗している。apacheのエラーログを見ると
データベースやテーブルが無いとか色々出るだろう(多分.htaccessの設定ミス)
ついついaccessログも見てしまうが・・・botウゼーになってしまうので見ないほうがマシだ。
Safariユーザが意外に多いな・・・って、iPhone OS 5?画像多いのに。そうか画像を多くすればいいんだな。
もし、ベーシック認証の画面がポップしないでサンプルが開くなら、.htaccess自体を読んでいない証拠だ。
初期設定のhttpd.confで/var/www/html設定箇所でAllowOverride ALLに直すか
サンプルを作ったディレクトリィ用の設定を/etc/httpd/conf.dに追加、
<test.conf>

<Directory /var/www/sample/>
Order Deny,Allow
Deny from All Allow from 127.0.0.1
Allow from ::1
# テスト用だからLAN内だけアクセス化
Allow from 192.168.1
# .htaccessを読むようにする
AllowOverride ALL
</Directory>

そしてapacheに設定を読み込ませて

# service httpd reload

みるしかないだろう。
ああ、勿論ここで作ったサンプルは外から見れないようになっている。



PHPでSNMP監視

phpでsnmp監視できるらしい。
元ネタはSNMPの活用(4) – ホスト情報をMySQLに自動蓄積~グラフの生成
CentOS6.2ではどうなるのかな。
まずphp-pearとphp-snmpを入れた方がいいらしい。

# pear -V

でコマンドがありませんと出たら、

# yum list php-*

で見るとphp用のモジュールはいっぱいあるのが判る。@が無いのはインストールしていないモジュールだ。

# yum list php-pear php-snmp

Available Packages
php-pear.noarch                        1:1.9.4-4.el6                        base
php-snmp.i686                       5.3.3-3.el6_2.5                      updates

と出たら、

# yum -y install php-pear

で、pearをインストする必要がある。
# pear -V
再度確認すると

Installed Packages
php-pear.noarch                       1:1.9.4-4.el6                        @base
php-snmp.i686                       5.3.3-3.el6_2.5                     @updates

と出るはずだ。
次にDB.phpもインストしないと使えないので

# pear install DB

WARNING: “pear/DB” is deprecated in favor of “pear/MDB2”
downloading DB-1.7.14.tgz …
Starting to download DB-1.7.14.tgz (133,103 bytes)
………………………..done: 133,103 bytes
install ok: channel://pear.php.net/DB-1.7.14

# find / -name DB.php -print

/usr/share/pear/DB.php

でやっと入ったようだ。
1.phpmyadminでSNMP専用のデータベースを作る。
2.phpmyadminでそのデータベースにテーブルを作る。

snmpで調べる対象を登録するテーブルを作る。

create table snmp_object (
code int PRIMARY KEY,
object_id_1m   varchar(255),
object_id_5m   varchar(255),
title   varchar(255),
sub_title_1m   varchar(255),
sub_title_5m   varchar(255)
);

snmpで調べる対象をテーブルに登録する。

insert into snmp_object(code,object_id_1m,object_id_5m,title,sub_title_1m,sub_title_5m)
values(0,’.1.3.6.1.2.1.2.2.1.10.2′,’.1.3.6.1.4.1.2021.9.1.9.1′,’.1.3.6.1.2.1.2.2.1.16.2′,’In’,’Out’);

insert into snmp_object(code,object_id_1m,object_id_5m,title,sub_title_1m,sub_title_5m)
values(1,’.1.3.6.1.4.1.2021.10.1.5.1′,’.1.3.6.1.4.1.2021.10.1.5.2′,’CPU使用率’,’1分間平均’,’5分間平均’);

insert into snmp_object(code,object_id_1m,object_id_5m,title,sub_title_1m,sub_title_5m)
values(2,’.1.3.6.1.4.1.2021.4.6.0′,’.1.3.6.1.4.1.2021.4.4.0′,’空きメモリ量’,’空き物理メモリ’,’空きスワップメモリ’);

insert into snmp_object(code,object_id_1m,object_id_5m,title,sub_title_1m,sub_title_5m)
values(3,’.1.3.6.1.4.1.2021.9.1.9.1′,’.1.3.6.1.4.1.2021.9.1.9.1′,’ディスク使用率’,’/ Disk used’,’/ Disk used’);

データを格納するテーブルを作る。

create table log (
snmp_time   timestamp    PRIMARY KEY,
code int,
snmp_val_1m    varchar(255),
snmp_val_5m    varchar(255)
);

ALTER TABLE `log`
DROP PRIMARY KEY,
ADD PRIMARY KEY(
`code`,
`snmp_time`);

phpはコマンドラインからも使えるようになっているので、
3.こんなスクリプトを作る。

#!/usr/bin/php
<?php
/**************
**snmpget.php**
**************/
require_once(“DB.php”);
snmp_set_quick_print(1);
$dsn = “mysql://<database-username>:<database-passward>@<host-name>/<database-name>;
$ipaddr =<ip-address>;
$community = “public”;
// MySQLに接続
$db = DB::connect($dsn);
// 文字セットを指定
$db->query(” SET NAMES ‘utf8’ “);
// 設定を読み出す
$sql = “SELECT code, object_id_1m, object_id_5m, title from snmp_object”;
$code_res = $db->query($sql);
if ($code_res !== false){
while ($row =& $code_res->fetchRow()) {
$code =         $row[0];
$object_id_1m = $row[1];
$object_id_5m = $row[2];
$title =        $row[3];
// snmpからデータ収集
$snmp_val_1m = (float)snmpget($ipaddr, $community, $object_id_1m);
$snmp_val_5m = (float)snmpget($ipaddr, $community, $object_id_5m);
if ($snmp_val_1m !== false && $snmp_val_5m !== false) {
// データベースへ書き込み
$sql = sprintf(“insert into log(snmp_time,code,snmp_val_1m,snmp_val_5m) values(CURRENT_TIMESTAMP,%s,’%s’,’%s’);”,
$code,$snmp_val_1m,$snmp_val_5m);
$res = $db->query($sql);
if (PEAR::isError($res)) {
// print $sql . ” fail.\n”;
} else {
// print “success.\n”;
}
}
}
} else {
// print “fail. no object.^n”;
}

$db->disconnect();
?>

これを実行するとデータが格納される。

select * from log;

とりあえず、MRTGのクローン設定に

*/5 * * * * root /root/snmpget.php

を居候させて様子を見てみよう。
あとはグラフ化すれば良いのだけれど、
データが充分溜まったらやろうかな。
出来上がったCPU負荷率グラフはコレ。
※Highcharts-2.1.9のサンプルのseries: 部分に、PHPコードを組み込んだだけもの。

series: [
<?php
require_once(“DB.php”);
snmp_set_quick_print(1);

$dsn = “mysql://<database-username>:<database-passward>@<host-name>/<database-name>;

// MySQLに接続
$db = DB::connect($dsn);
// 文字セットを指定
$db->query(” SET NAMES ‘utf8’);

$sql = “SELECT code, title, sub_title_1m, sub_title_5m from snmp_object where code=1;”;
$code_res = $db->query($sql);
if ($code_res !== false){
  while ($row =& $code_res->fetchRow()) {
  $code =         $row[0];
  $title =        $row[1];
  $sub_title_1m = $row[2];
  $sub_title_5m = $row[3];
  }

  $sql = “SELECT snmp_time, code, snmp_val_1m, snmp_val_5m from log where code=1 order by snmp_time;”;
  $res = $db->query($sql);
  $d1 = array();
  $d5 = array();
  $cnt=0;
  $start_time = new DateTime();
  while ($row =& $res->fetchRow()) {
    // PHPでmysqlでtimestamp型をうまく扱えない様なので
    $snmp_time =   . $row[0];       // 一旦文字列に変換して
    $start_time0 = new DateTime($snmp_time, new DateTimeZone(JST));  // DateTime型に取り込んでみた。
    if( $start_time > $start_time0 ) {
      $start_time = $start_time0;
    }
    $code =        $row[1];
    $snmp_val_1m = $row[2];
    $snmp_val_5m = $row[3];
    $d1[$cnt] = $snmp_val_1m;
    $d5[$cnt] = $snmp_val_5m;
    $cnt = $cnt +1;
  }
  $d1_text = join(“,”,$d1);
  $d5_text = join(“,”,$d5);
  echo “{\n”;
  echo “type: ‘area’,\n”;
  echo “name: ‘” . $sub_title_1m . “‘,\n”;
  echo “pointInterval: 5 * 60 * 1000,\n”;
  echo “pointStart: Date.UTC(“ . date_format($start_time,‘Y’) . “,” . (0+date_format($start_time,‘m’)-1) . “,” . date_format($start_time,‘d’) . “,” . date_format($start_time,‘H’) . “,” . date_format($start_time,‘i’) . “,” . date_format($start_time,‘s’) . “,0),\n”;
  echo “data: [” . $d1_text . ” ]\n”;
  echo “},{\n”;
  echo “name: ‘” . $sub_title_5m . “‘,\n”;
  echo “pointInterval: 5 * 60 * 1000,\n”;
  echo “pointStart: Date.UTC(“ . date_format($start_time,‘Y’) . “,” . (0+date_format($start_time,‘m’)-1) . “,” . date_format($start_time,‘d’) . “,” . date_format($start_time,‘H’) . “,” . date_format($start_time,‘i’) . “,” . date_format($start_time,‘s’) . “,0),\n”;
  echo “data: [” . $d5_text . ” ]\n”;
  echo “}\n”;
}
$db->disconnect();
?>
]

実行結果はこんな感じ

series: [
{
type: ‘area’,
name: ‘1分間平均’,
pointInterval: 5 * 60 * 1000,
pointStart: Date.UTC(2012,1,02,04,20,02,0),
data: [169,154,138,125,104,40,1,0,0,0,0,1,0,2,0,0,0,0,5,0,0,0,1,0,1,5,1,0,0,0,4,0,5,0,0,0,0,0,1,0,1,1,0,19,0,0,1,2,0,0,0,7,0,2,0,0,0,0,2,0,1,0,0,0,0,0,0,0,11,4 ]
},{
name: ‘5分間平均’,
pointInterval: 5 * 60 * 1000,
pointStart: Date.UTC(2012,1,02,04,20,02,0),
data: [132,129,135,130,116,93,34,11,2,1,1,2,2,2,1,1,0,0,1,0,0,0,1,0,1,1,0,0,0,0,2,0,2,0,0,0,0,0,1,0,1,0,0,4,1,0,1,2,0,0,0,2,1,1,0,0,0,0,1,1,1,0,0,0,0,0,1,0,8,8 ]
}
]

グラグの見た目はこんな感じに。

100%制限を無くすと、

MRTGと比べるとどうだろう。

1分と5分が逆になっている様だな。



MRTGの文字化け

ブログの下にMRTGのHTMLファイルを置くと
HTMLに
<meta http-equiv=”content-type” content=”text/html; charset=euc-jp” >
と書いてあってもutf8と見なされるらしい。

cp /var/www/mrtg/cpu.html > /var/www/mrtg/temp

nkf -Ew /var/www/mrtg/temp > /var/www/mrtg/cpu.html

でutf8にすると文字化けは直る。
しかし、
<meta http-equiv=”content-type” content=”text/html; charset=euc-jp” >
のままなのは変なので

 #CPU

cp /var/www/mrtg/cpu.html /var/www/mrtg/temp

ed /var/www/mrtg/temp >& /dev/null << EOF

1,\$s/euc-jp/utf8/g

wq

EOF

nkf -Ew /var/www/mrtg/temp > /var/www/mrtg/cpu.html

と強引に変えておくといいのかもしれない。
ただ

<!– Begin Head –>

<head>

<title>CPU使用率</title>

<meta http-equiv=”refresh” content=”300″ />

<meta http-equiv=”pragma” content=”no-cache” />

<meta http-equiv=”cache-control” content=”no-cache” />

<meta http-equiv=”expires” content=”Wed, 25 Jan 2012 21:20:07 GMT” />

<meta http-equiv=”generator” content=”MRTG 2.16.2″ />

<meta http-equiv=”date” content=”Wed, 25 Jan 2012 21:20:07 GMT” />

<meta http-equiv=”content-type” content=”text/html; charset=utf8″ /> ←タイトルの後に書いてどうする?

とHTMLがあからさまに間違っているのを

<!– Begin Head –>

<head>

<meta http-equiv=”content-type” content=”text/html; charset=utf8″ /> ← ここが正解

<title>CPU使用率</title>

<meta http-equiv=”refresh” content=”300″ />

<meta http-equiv=”pragma” content=”no-cache” />

<meta http-equiv=”cache-control” content=”no-cache” />

<meta http-equiv=”expires” content=”Wed, 25 Jan 2012 21:20:07 GMT” />

<meta http-equiv=”generator” content=”MRTG 2.16.2″ />

<meta http-equiv=”date” content=”Wed, 25 Jan 2012 21:20:07 GMT” />

 と直すには
/usr/bin/mrtgの1388行あたりで

print HTML “<!– Begin Head –>\n”;
print HTML <<“TEXT”;
<head>
TEXT
print HTML “\t\t” . ‘<meta http-equiv=”content-type” content=”text/html; charset=utf8″ />’ . “\n”;
print HTML <<“TEXT”; 
<title>$$rcfg{‘title’}{$router}</title>
<meta http-equiv=”refresh” content=”$refresh” />
<meta http-equiv=”pragma” content=”no-cache” />
<meta http-equiv=”cache-control” content=”no-cache” />
<meta http-equiv=”expires” content=”$expiration” />
<meta http-equiv=”generator” content=”MRTG $VERSION” />
<meta http-equiv=”date” content=”$expiration” />
TEXT
#    print HTML “\t\t” . ‘<meta http-equiv=”content-type” content=”text/html; charset=’.&$LOC(‘iso-8859-1’) . “\” />\n”;

にすればいいので

 #CPU

cp /var/www/mrtg/cpu.html /var/www/mrtg/temp

ed /var/www/mrtg/temp >& /dev/null << EOF

1,\$s/euc-jp/utf8/g

wq

EOF

nkf -Ew /var/www/mrtg/temp > /var/www/mrtg/cpu.html


#CPU

cp /var/www/mrtg/cpu.html /var/www/mrtg/temp

nkf -Ew /var/www/mrtg/temp > /var/www/mrtg/cpu.html

と短くなる。
だが良く考えてみると、
Perl自体、既に5.8でutf8対応済みなので、/usr/bin/mrtgのコードが旧体質のままだったのだ。
実は元ネタですべきことは、
上のmrtg(Perlソース)の古式ゆかしく嗚呼懐かしやなiso-8859-1(ラテン系コードページ)ごまかしコードを書き換え、
/etc/mrtg/mrtg.cnfを手直しするだけでよく
nfkでの変換までやるのは既に藪蛇。
ただ、

charset=’.&$LOC(‘iso-8859-1’) . “\” />\n”;

content=”text/html; charset=utf8″ />’ . “\n”;

に書き直すのはチョットかっこ悪いし、maxも日本語化されない。
それよりもMRTGの各国語版の翻訳が1ファイルになってて
普通のエディタで修正不能なんだな。
ああ、だからiso-8859-1使ってた訳か。
ええと翻訳直すんならソース一式からやり直してください???
えええ???
 



PHPタイムゾーン未指定エラー

MOE人ガシェットの画像サムネイルでエラー連発。

[error] [client 192.168.***.***] PHP Warning: date(): It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected ‘Asia/Tokyo’ for ‘JST/9.0/no DST’ instead in /var/www/*****/*****/*****/*****/****.php on line ***, referer: http://******/******/*******

タイムゾーンを設定。

php.ini

date.timezone = Asia/Tokyo



MRTG

元ネタはここ。
MRTGをインストして、
# cfgmaker –ifref=descr –ifdesc=descr public@192.168.***.***  > /etc/mrtg/mrtg.cfg
で、設定が大体でき、
# indexmaker –columns=1 \
> –addhead=”<META HTTP-EQUIV=\”Content-Type\” CONTENT=\”text/html; charset=euc-jp\”>” \
> /etc/mrtg/mrtg.cfg > /var/www/mrtg/index.html
で、index.htmlを作る。
 
 



snmpd

snmpdをインストして起動したら、
/var/log/messagesに

/etc/snmp/snmpd.conf: line 60: Error: invalid MASK

net-snmp: 1 error(s) in config file(s)

NET-SNMP version 5.5

その60行目は

view     all           included   .1 80               # ← 追加

だったので

view     all           included   .1 80

に変えたら

NET-SNMP version 5.5

だけになった。
怪しいので追加行のコメントを全部削除。
 




top