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>&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();
?>