FreeBSD/Namazu自動インデックス生成シェル
Namazuのインデックス自動生成シェル †
◆使用方法
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 †
#!/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 †
# 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 †
#################################### # 書式: インデックスフォルダ名 マウントポイント # namazu_index.list #################################### test1 /home/samba/test1 test2 /home/samba/test2 test3 /home/samba/test3
namazu_rsync.sh †
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 †
<?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 †
#!/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(); ?>