PEAR Auth で認証メモ

すごい簡単にできてしまう。
PHPのこういうところが大好きだ。

まずは、auth部分のスクリプト。

<html>
<body>
<?php

require_once("Auth/Auth.php");

$params = array(
    "dsn" => "mysql://db_user:db_user_pass@127.0.0.1/db_name",
    "table" => "db_tbl",
    "usernamecol" => "user_col",
    "passwordcol" => "pass_col"
);

$auth = new Auth("DB", $params);
$auth->start();

if ($auth->getAuth()) {
    print("認証成功\n");
    print("ユーザ名:".$auth->getUsername()."\n");
}
else{
    print("認証失敗\n");
}

?>
</body>
</html>

次に実際に認証したいページで上記PHPをrequire。

# cat index.php
<?php
require_once("./auth.php");
if (!$auth->getAuth()) {
    echo "ダメ";
    exit;
}
?>

<HTML>
<HEAD>
<TITLE>AUTH_TEST!!!</TITLE>
</HEAD>
<BODY>

認証したいページのコンテンツ

</BODY>
</HTML>

楽にできるなぁ。

db構成は以下みたいなもので。

> use auth_test
> select * from auth_tbl;
user                   pass
--------------------------------
matsumoto_r       パスワードのハッシュ

ちなみに忘れがちなテキストのハッシュのとり方は以下。

# echo -n "matsumoto_r" | md5sum

nオプションを忘れないように。

忘れがちなviの操作メモ

どうしてもメモっときたくて、忘れがちなviの操作をメモ。

Ctrl+d    半ページ下    fほど早く行きたくないときとか
Ctrl+u    半ページ上    bほど早く行きたくないときとか
/文字列後 shift+n    上向きに検索    ?でやるよりもnと対になってていい感じ
Shift+i    カーソルの行頭からInsertモードへ    コメントアウトしたいときとか
Shift+a    カーソルの行末からInsertモードへ    ;忘れとか
o    カーソルの下に1行改行してInsertモードへ     もう一行書きたいときとか
Shift+o    カーソルの上に1行改行してInsertモードへ    上に書き忘れたときとか
w    右の単語の先頭へ    なんとなくパッパと動きたいときとか
d    左の単語の先頭へ    なんとなくパッパと動きたいときとか
ZZ    変更があれば保存して終了    とりあえず保存して終了したいときとか
:sh    シェルに入る、exitでviに戻る    viは常に起動なのだ!的なときとか
:!シェルコマンド     シェルコマンドを実行    sh試したいけどそこまで本格的にしたくないときとか
!!シェルコマンド    シェルコマンドの実行結果を挿入    結果をそのまま流用したいときとか
:e ファイル名    ファイル名を読み込む    vi続けてつかいたいときとか
:r ファイル名    ファイル名の内容を下行に挿入    過去のスクリプトとか流用したくなったときとか
:w ファイル名    ファイル名のファイルに内容保存    cpし忘れたときとか

1分で試せるディスクI/Oチェック

うーむ、ディスクのエイジング的なことがしたいと思って、思いつく限りで1分でかけそうなエイジングスクリプトを書いてみた。
動けばいい適当スクリプトなので、スコープとかその辺はあえて適当で。

これ、意味あるのか・・・・
とりあえず、loadavgはかなり上がるな。

#!/usr/bin/perl

$a = 1;
$b = 1000;

print "test start!\n";

while ($a != $b) {
    print "create 100M file: $a\/$b\n";
    `dd if=/dev/zero of=$a bs=1M count=100`;
    $a++;
}

$a = 1;

while ($a != $b) {
    print "delete: $a\/$b\n";
    `rm -f $a`;
    $a++;
}

print "test finish!\n";

実行するとこんな感じ。

・・・・
create 100M file: 808/1000
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 4.6236 seconds, 22.7 MB/s
create 100M file: 809/1000
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.70688 seconds, 148 MB/s
create 100M file: 810/1000
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.544506 seconds, 193 MB/s
create 100M file: 811/1000
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.553215 seconds, 190 MB/s
create 100M file: 812/1000
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.985928 seconds, 106 MB/s
create 100M file: 813/1000
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 4.80139 seconds, 21.8 MB/s
create 100M file: 814/1000
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 3.33673 seconds, 31.4 MB/s
create 100M file: 815/1000
・・・・

topとかはこんな感じ。

top - 22:35:01 up  8:21, 12 users,  load average: 12.66, 11.31, 9.02
Tasks: 107 total,   2 running, 105 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.7%us,  9.9%sy,  0.0%ni,  0.0%id, 87.4%wa,  0.3%hi,  1.7%si,  0.0%st
Mem:   2059384k total,  2010732k used,    48652k free,     8552k buffers
Swap:        0k total,        0k used,        0k free,  1635688k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
14937 root      18   0  4892 1572 1500 D  2.3  0.1   0:00.07 dd
 5924 root      10  -5     0    0    0 D  1.3  0.0   0:24.13 kjournald

vmstatはこんな感じ。
やばいやばい、むしろCPUのエイジングみたいになってる。
まぁ、気にしない。

# vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1 11      0  52596   8668 1635680    0    0 18755 22377  558  599  3 20 34 43  0
 1 11      0  53084   8468 1635028    0    0    12 43928 1148  316  0 53  0 47  0
 1 11      0  52740   8476 1634096    0    0     8 46112 1166  395  1 51  0 48  0
 0 13      0  49024   8432 1635148    0    0     8 69484 1179  275  0 35  0 65  0
 0 13      0  48976   8388 1635080    0    0     0 67948 1133  184  0 10  0 90  0
 0 13      0  48952   8404 1635332    0    0     4 48124 1124  186  0  8  0 92  0
 0 12      0  53596   8420 1631152    0    0     0 63332 1119  177  0  8  0 92  0
 0 13      0  48856   8388 1636116    0    0     4 55344 1138  287  0 10  0 90  0
 0 13      0  49124   8424 1636172    0    0    16 48652 1120  159  0  5  0 95  0
 0 13      0  49144   8456 1636292    0    0     0 65400 1123  174  1 14  0 85  0
 0 13      0  48912   8472 1636480    0    0     0 48112 1127  193  0  7  0 93  0
 0 12      0  53660   8472 1632072    0    0     0 65548 1130  172  0  4  0 96  0
 0 12      0  52984   8432 1633632    0    0     0 54284 1112  169  1  9  0 90  0
 1  9      0  51792   8432 1635556    0    0     8 27924 1129  370  0 34  0 66  0

ふむふむ、やはりloadavgの上昇はディスクのI/Owaitに大きく依存しているように見える。

perlでforkするメモ

perlでforkする実験を色々してみた。
結構色々分かったのでメモ。

  • 親が子を作って、プログラムをコピーして渡して実行する
  • 親が子を作った時のグローバル変数はそのままコピー?ループカウント変数は保持したまま。
  • 子が最初からプログラムを純粋に実行するわけではない?
#!/usr/bin/perl

use strict;
use warnings;

$| = 1;

# 並行して生むことが出来る子の数
my $child_max = 3;
my $child_num = 0;

# 処理は30回
my $roop_max = 30;
my $roop_count = 0;

my ($pid, $wait_pid, $sleep_time);

while ($roop_count != $roop_max) {
    $pid = fork;
    # 親が子を生むときは子のPIDを返す
    # 子がforkするときは0を返す
    # 失敗したら未定義値を返す
    if ($pid ne 0) {
        # 親の処理
        $child_num++;
        print "roop[$roop_count] fork child: ]
            all_child_num[$child_num] child_pid[$pid]\n";
    } elsif (defined $pid) {
        # 子の処理
        $sleep_time = rand 10;
        print "roop[$roop_count] start child process task:
            all_child_num[$child_num] task[sleep $sleep_time]\n";
        sleep $sleep_time;
        exit 0;
    } else {
        exit 1;
    }

    # 親の子プロセス数管理
    if ($child_num == $child_max) {
        print "roop[$roop_count] start  wait child process: 
            all_child_num[$child_num]\n";
        $wait_pid = wait;
        $child_num--;
        print "roop[$roop_count] finish wait child process:
            all_child_num[$child_num] exit_child_pid[$wait_pid]\n";
    }

    $roop_count++;
}

# 子プロセスが全て終わるのを待つ
# wait()はどれかの子プロセスを待つ
# waitする子プロセスが無ければ-1を返す
while ($wait_pid ne "-1") {
    $wait_pid = wait;
    print "roop[$roop_count] wait all child process:
         all_child_num[$child_num] exit_child_pid[$wait_pid]\n";
}

簡易バックアップスクリプト

簡単に作ってみた。

#!/usr/bin/perl

use warnings;
use strict;

my $retval = "1";
my $master_dev = "/dev/sda1";
my $backup_dev = "/dev/hdc";
my $backup_dev1 = "/dev/hdc1";
my $master_dir = "/";
my $backup_dir = "/backup";
my $log = "/var/log/backup.log";


print "backup $master_dir ($master_dev) -> $backup_dir ($backup_dev1)\n";

my $mount_chk = `mount | grep $backup_dir | grep $backup_dev1`;
chomp($mount_chk);
print "mount_check: ";

if ($mount_chk ne "") {
    print "OK\n";

    print "tune2fs: ";
    $retval = system("tune2fs -c -1 -i 0 $master_dev > $log 2>&1");

    if ($retval eq "0") {
        $retval = system("tune2fs -c -1 -i 0 $backup_dev1 >> $log 2>&1");

        if ($retval eq "0") {
            print "OK\n";
        } else {
            print "NG\n";
            exit(1);
        }
    } else {
        print "NG\n";
        exit(1);
    }

    sleep 3;

    print "rsync: ";
    $retval = system("rsync -avx --delete $master_dir $backup_dir/ >> $log 2>&1");

    if ($retval eq "0") {
        print "OK\n";
    } else {
        print "NG\n";
        exit(1);
    }

    print "grub-install: ";
    $retval = system("grub-install --root-directory=$backup_dir $backup_dev >> $log 2>&1");

    if ($retval eq "0") {
        print "OK\n";
    } else {
        print "NG\n";
        exit(1);
    }

} else {
    print "NG\n";
    exit(1);
}

そろそろバックアップをした方が良い年になってきた。
昔は、DISK壊れても、1から作り直せる程度のものが多かったが、今は無理!
これでしばらくは大丈夫かな。

実行後

# ./backup.pl
backup / (/dev/sda1) -> /backup (/dev/hdc1)
mount_check: OK
tune2fs: OK
rsync: OK
grub-install: OK