FreeBSD/Namazu自動インデックス生成シェル の変更点
*Namazuのインデックス自動生成シェル [#e6a5df21]
◆使用方法~
Cronに設定しておく。
# シェルでNaamzuのインデックス作成
# Namazu
*/30 * * * * root /home/namazu/bin/namazu_index.sh >> /home/namazu/logs/namazu_index.log 2>&1
*/1 * * * * root /usr/local/bin/php /home/namazu/bin/sub.php >> /home/namazu/logs/namazu_sub.log 2>&1
◆ファイル配置
/home/namazu/bin/namazu_index.sh
namazu_index.cfg
namazu_index.list
sub.cfg.php
sub.php
/home/namazu/index/index_A
index_B
index_C
/home/namazu/logs/namazu_index.log
**namazu_index.sh [#u686e69e]
#!/bin/bash
###############################
# インデックス作成スクリプト
# namazu_index.sh
##############################
. /home/namazu/bin/namazu_index.cfg
# 二重起動防止処理
w_check
# lockファイル作成
echo `ps auxw|grep namazu_index.sh|grep -v grep|awk '{print $2}'`> $LOCK
# インデックスリスト読み込み
i=0
for index in `grep -v ^# $CNF |awk '{print $1}'`
do
INDEX[$i]=$index
i=`expr $i + 1`
done
i=0
for mnt in `grep -v ^# $CNF |awk '{print $2}'`
do
MOUNT[$i]=$mnt
i=`expr $i + 1`
done
# オプション格納
if [ $# -gt 0 ];
then
OP=$1
fi
# インデックスとマウントポイントに差異があるとexit
if [ ${#INDEX[*]} -ne ${#MOUNT[*]} ];
then
quit
fi
# LANG関係をエクスポート
export LANG=ja_JP.eucJP
export LC_ALL=ja_JP.eucJP
echo
# -nm オプションが付いていればマウントしない
for (( i=0 ; i<${#INDEX[*]} ; i++ ))
do
# マウントされてなければ、再マウント
# if [ -z `df|grep "${MOUNT[$i]}"|awk '{print $6}'` ];
# then
# echo `df|grep "${MOUNT[$i]}"|awk '{print $6}'`
# sudo /sbin/mount ${MOUNT[$i]}
# echo "${MOUNT[$i]}はマウントされてません。マウントし直しました。"
# fi
# インデックスフォルダが作成されてない場合は、フォルダ作成
if [ -e ${INDEX_ALL}${INDEX[$i]} ];
then
printf ""
else
echo "インデックスフォルダが存在しません。作成しました。"
mkdir ${INDEX_ALL}${INDEX[$i]}
fi
# インデックスの作成処理
echo "$i.######## インデックス${INDEX[$i]} 作成処理開始 ########"
echo "コマンド:"$CMD $CMD_FLAGS ${INDEX_ALL}${INDEX[$i]} ${MOUNT[$i]}
$CMD $CMD_FLAGS ${INDEX_ALL}${INDEX[$i]} ${MOUNT[$i]}
echo "$i.######## インデックス${INDEX[$i]} 作成処理終了 ########"
echo
#sudo /sbin/umount ${MOUNT[$i]}
# -r オプションが付いていればrsync実行
if [ $OP = "-r" ];
then
$RSYNC_SCRIPT ${INDEX[$i]} $i
fi
echo
done
# 処理時間を取得
END=`date +%s`
SS=`expr ${END} - ${START}`
DD=`expr ${SS} / 86400`
SS=`expr ${SS} % 86400`
HH=`expr ${SS} / 3600`
SS=`expr ${SS} % 3600`
MM=`expr ${SS} / 60`
SS=`expr ${SS} % 60`
echo
echo `date +"%Y-%m-%d %H:%M:%S"`
printf "処理時間: %d日 %02d時間%02d分%02d秒\n" ${DD} ${HH} ${MM} ${SS}
echo "----------------------------------- "
echo
# lockファイルを削除
rm $LOCK
exit 0;
**namazu_index.cfg [#gb09fea5]
# namazu_index.cfg
BIN="/home/namazu/bin/" # PATH
CNF=$BIN"namazu_index.list" # インデックスリストのPATH
CMD="/usr/local/bin/mknmz" # mknmzのパス
CMD_FLAGS="-U -O" # mknmzのオプション
OP=0 # インデックスリストの引数格納
INDEX_ALL="/home/namazu/index/" # インデックス親フォルダ
LOCK=$BIN"namazu_index.lock" # lockファイルのPATH
RSYNC="/usr/local/bin/rsync" # rsyncコマンドのPATH
OPTION="-av --delete" # rsyncオプション
RSYNC_TO="172.16.8.55" # rsync先のサーバIP
RSYNC_SCRIPT=$BIN"namazu_rsync.sh" # rsyncスクリプトのPATH
START=`date +%s`
export PATH=/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/matsui/bin
function quit {
echo
echo "インデックスフォルダの数と、マウントポイントの数に違いがあります。";
echo
echo "イデックスフォルダ:${#INDEX[*]}"
echo ${INDEX[@]}
echo "マウントポイント:${#MOUNT[*]}"
echo ${MOUNT[@]}
echo
exit 1;
}
function w_check {
if [ -e ${LOCK} ];
then
DATE=`date +"%Y-%m-%d %H:%M:%S"`
echo "${DATE} 二重起動を防止しました。lockfile(${LOCK})"
exit 1;
fi
}
**namazu_index.list [#h39708bc]
####################################
# 書式: インデックスフォルダ名 マウントポイント
# namazu_index.list
####################################
test1 /home/samba/test1
test2 /home/samba/test2
test3 /home/samba/test3
**namazu_rsync.sh [#n24761ea]
rysncでインデックスを同期する場合は必要
#!/usr/local/bin/bash
# namazu_rsync.sh
. /home/namazu/bin/namazu_index.cfg
if [ $# -gt 0 ];
# 引数が指定されていれば、引数のフォルダだけ実行
# namazu_index.shから呼び出されて実行する場合。
then
INDEX[0]=$1
NUMBER[0]=$2
# 引数が指定されていなければ、インデックスリストを読み込んで実行
else
i=0
for index in `grep -v ^# $CNF |awk '{print $1}'`
do
INDEX[$i]=$index
NUMBER[$i]=$i
i=`expr $i + 1`
done
fi
for (( i=0 ; i<${#INDEX[*]} ; i++ ))
do
echo
echo "${NUMBER[$i]}.======== インデックス${INDEX[$i]} 同期処理開始 ========"
echo "${RSYNC} $OPTION $INDEX_ALL${INDEX[$i]}/ $RSYNC_TO:$INDEX_ALL${INDEX[$i]}/"
$RSYNC $OPTION ${INDEX_ALL}${INDEX[$i]}/ $RSYNC_TO:$INDEX_ALL${INDEX[$i]}/
echo "${NUMBER[$i]}.======== インデックス${INDEX[$i]} 同期処理終了 ========"
echo
done
exit 0;
**sub.cfg.php [#x8122213]
<?php
# cub.cfg.php
$index_all = "/home/namazu/index/"; # インデックスすべてが入る親フォルダ
$conf = "/home/namazu/bin/sub.cfg"; # このファイルのPATH
$index_head = "/NMZ.head.ja"; # Namazuのヘッダファイル名
$index_main = $index_all.$index_head; # メインのインデックスファイル名(作成されるインデックス)
$index_master = $index_all."NMZ.master"; # マスターファイル
$yoko = 2; # インデックス名を横にいくつまで並べるか
$file_all = 0; # ファイル合計数
$key_all = 0; # キーワード合計数
$tmp = 0;
$index_list = array();
/*-----------------------------------------------*/
# $index_list[インデックス表示名] = array(name=>インデックスフォルダ名, check=>0 or 1 )
# checkは1ならcheckedを付加
# コメントアウトすれば、トップページから消えます。
/*-----------------------------------------------*/
$index_list['test1'] = array(name=>test1, check=>0);
$index_list['test2'] = array(name=>test2, check=>1);
$index_list['test3'] = array(name=>test3, check=>1);
?>
**sub.php [#qbd820c9]
#!/usr/local/bin/php
<?php
#----------------------------------------------
# Namazuのメインインデックスの更新スクリプト
# sub.php
# インデックスを複数に分ける場合
# 各インデックスから、数値を取得し
# メインインデックスに
# ファイル数・キーワード数・更新日時を入れるスクリプト
#----------------------------------------------
include_once("/home/namazu/bin/sub.cfg.php");
if(ereg("help",$argv[1])){
help($index_master);
exit();
}
#--- 各インデックスのNMZ.head.jaのPATHを作成 ---#
#--- 各インデックスから数値を取得 ---#
foreach($index_list as $k => $v){
$name = $v["name"];
$index_file = $index_all.$name.$index_head;
if(file_exists($index_file)){
exec("grep '<!-- DATE -->' ".$index_file." |awk '{print $5}'",$arr[date]);
exec("grep '<!-- FILE -->' ".$index_file." |awk '{print $4}'",$arr[file]);
exec("grep '<!-- KEY -->' ".$index_file." |awk '{print $4}'",$arr[key]);
$index_date[date][$name] = $arr[date][0];
$index_date[file][$name] = $arr[file][0];
$index_date[key][$name] = $arr[key][0];
unset($arr);
#--- 各インデックスの数値の合計を出す ---#
$file_all += ereg_replace('\,','',$index_date[file][$name]);
$key_all += ereg_replace('\,','',$index_date[key][$name]);
if($index_date[date][$name] > $tmp){
$date_last = $index_date[date][$name];
$tmp = $index_date[date][$name];
}
}
}
$file_all = number_format(trim($file_all));
$key_all = number_format(trim($key_all));
#--- 本文作成 ---#
$sum = <<< EOM
インデックス対象の文書数 : <font color="#CC3300"><!-- FILE --> {$file_all} <!-- FILE --></font>
登録済みキーワード数 : <font color="#CC3300"><!-- KEY --> {$key_all} <!-- KEY --></font>
インデックス最終更新日 : <font color="#CC3300"><!-- DATE --> {$date_last} <!-- DATE --></font>
EOM;
$form = "<table>\n";
$i=0;
foreach($index_list as $k => $v){
$checked = ($v["check"]) ? "checked" : "" ;
$name = $v["name"];
$file=$index_date[file][$name];
$key=$index_date[key][$name];
$date=$index_date[date][$name];
if($i%$yoko == 0){
$form .= ($i==0)? " <tr>\n" : "\n </tr>\n <tr>\n";
}
$form .= <<< EOM
<td align=left>
<input type="checkbox" name="idxname" value="{$name}" {$checked}>{$k}
文書:<!-- FILE --><font color="#CC3300"> {$file} </font><!-- FILE -->
キー:<!-- KEY --><font color="#CC3300"> {$key} </font><!-- KEY -->
更新:<!-- DATE --><font color="#CC3300"> {$date} </font><!-- DATE -->
</td>
EOM;
$i++;
}
$form .= "\n </tr>\n</table>\n";
$form .= '<input type="hidden" name="reference" value="off">';
#--- マスターファイルから、メインインデックスを作成 ---#
$file=file($index_master);
$fp = fopen($index_main, "w+");
foreach($file as $val){
if(ereg('<!-- INDEXES -->',$val))
$val = ereg_replace('<!-- INDEXES -->',$form,$val);
if(ereg('<!-- INDEXES_SUM -->',$val))
$val = ereg_replace('<!-- INDEXES_SUM -->',$sum,$val);
fwrite($fp,$val);
}
fclose($fp);
echo date("Y-m-d H:i:s")." メインインデックス更新完了\n";
echo "------------------------------------------------\n";
exit();
?>