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>&nbsp;&nbsp;
 登録済みキーワード数 : <font color="#CC3300"><!-- KEY --> {$key_all} <!-- KEY --></font>&nbsp;&nbsp;
 インデックス最終更新日 : <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();
 ?>