#!/usr/bin/perl

# Copyright (C) 2001-2002 NEC Corporation
# All Rights Reserved.

#
#kernelのメモリ使用領域を計算し、roma.confへ書き込む
#

#
#ARGV[0]に値があったらurl_smartfilterにはARGV[0]の値を入れる
#

require "/opt/nec/wbmc/lib/wbmc.pl";
require "/opt/nec/wbmc/adm/proxy/common_roma.pl";
require "/opt/nec/wbmc/adm/proxy/common_filter.pl";
require "/opt/nec/wbmc/adm/system/array.pl";

#SmartFilterの動さ状況を格納
$smartfilter_state = "";

#Interscanの動さ状況を格納
$interscan_state = "";

#kernel_objnumの値を格納
$kernel_objnum = 0;

#kernel_metanumの値を格納
$kernel_metanum = 0;

#kernel_metasizeの値を格納
$kernel_metasize = 0;

$defalut_num = 0;

#N-codeファイルを格納
@file=();

#N-codeを格納
$N_code = "";


#
# CONFファイル読込み(roma.conf)
#
@file = ();
if (!&readFile($roma_conf, $roma_conf_lock, *file) ) {
        system("echo cannot read $roma_conf");
	exit(1);
}

#
# interscan.conf読み込み
#
@ifile = ();
if (!&readFile($InterscanFilePath, $InterscanFilePath_lock, *ifile) ) {
        system("echo cannot read $InterscanFilePath");
        exit(1);
}

#/etc/opt/nec/N-codeファイルを読み込む
if (!&readFile($N_code_path , $N_code_path_lock, *Nfile) ) {
	system("echo cannot read $N_code_path");
        exit(1);
}


#
#kernel_metasizeを読み込む
#

for($i=0;$i<@file;$i++){
	$tmp =&removeSpace($file[$i]);
	if($tmp =~ /^kernel_metasize\s+(.*)/){
		$kernel_metasize = $1;
	}
}

#
#N-codeの取得
#

for(@Nfile){
        if(/^\s*(N[\d\-]+)/){
                $N_code = $1;
                last;
        }
}

#
# tuningセクションを取出す。
#
@tuning = ();
if (!&romaGetWbMCSection(*file, "tuning", *tuning)){
	system("echo cannot read tuning session");
	exit(1);
}

#
#urlセクションを取り出す
#
@url = ();
if (!&romaGetWbMCSection(*file, "url", *url)){
        system("echo cannot read url session");
        exit(1);
}

#
#SmartFilterが動いているか確認する
#
for($i=0;$i<@url;$i++){
	$tmp = &removeSpace($url[$i]);
	if($tmp =~ /^url_smartfilterstate\s+(.*)/){
		if($1 eq "on"){
			$smartfilter_state = "on";
		}
		else{
			$smartfilter_state = "off";
		}
		last;
	}

}

#
#Interscanが動いているか確認する
#
for($i=0;$i<@ifile;$i++){
	$tmp = &removeSpace($ifile[$i]);
	if($tmp =~ /^Interscan_state\s+(.*)/){
		if($1 eq "off"){
			$interscan_state = "off";
		}
		else{
			$interscan_state = "on";
		}
		last;
	}
}


#
#/proc/meminfoよりメモリ搭載量を調べる
#

if(!open(FH,"/proc/meminfo")){
	system("echo cannot get meminfo");
	exit(1);
}
@out = <FH>;
close(FH);


for($i=0;$i < @out;$i++){
	$out[$i] =~ s/\s*$//;
	@tmp = split(/\s+/,$out[$i]);

	#メモリのトータル量
	if($tmp[0] =~ /^MemTotal/i){
                $memtotal = $tmp[1];
		last;
	}
}

#
#kernel_metanum,defalut_valueの値を設定
#

if($N_code eq "N8100-803"){
	#N_code = N8100-803
        $kernel_metanum = 2500000;
	$init_value = 10000000;
}
elsif($N_code eq "N8100-806"){
        $kernel_metanum = 7900000;
	$init_value = 50000000;
}
else{
	#N8100-804
        $kernel_metanum = 1000000;
	$init_value = 10000000;
}



#
#kernel_objnumの値を計算
#

#smartfilterの動作設定を行ったときの処理
if($ARGV[0] ne ""){
	$smartfilter_state = $ARGV[0];
}

#$default_numの設定

if($interscan_state eq "on"){
	$default_num = 295*1024*1024;
}
elsif($smartfilter_state eq "on"){
	$default_num = 287*1024*1024;
}
else{
	$default_num = 189*1024*1024;
}

#ハイエンドなら$default_numに値を追加
if($N_code eq "N8100-806"){
	$default_num += 102195904;
}

#メモリ使用量をKBからByteへ
$meminfo = $memtotal * 1024;

#filter_numの設定

$filter_num = $default_num - ( $meminfo/2);
if($filter_num < 0){
	$filter_num = 0;
}

#メモリ使用量の計算
$mem = ( $meminfo/2 ) - ($kernel_metasize * $kernel_metanum) - $init_value - $filter_num;

if($mem < 0){
	$kernel_objnum = 10240;
	$kernel_metanum = 250000;
}
else{
	$kernel_objnum = $mem / 4096;

}

$kernel_objnum = int($kernel_objnum);


#
#tuningセッションの設定を変更
#
for($i=0;$i<@file;$i++){
	$tmp = &removeSpace($file[$i]);
	if($tmp =~ /kernel_objnum/){
		$file[$i] = "kernel_objnum $kernel_objnum\n";
	}
	if($tmp =~ /kernel_metanum/){
		$file[$i] = "kernel_metanum $kernel_metanum\n";
	}
}


#
#ファイル書き込み
#

if (!&writeFile($roma_conf, $roma_conf_lock, @file)) {
        system("echo cannot write $roma_conf");
	exit(1);
}


