#!/usr/bin/perl

#

# all right reserved by KCEJ 1999-2001

#

# Programmed by T.Morita

#



require "config.pl" ;



#Flush the buffer immeadiatly

$| = 1 ;



while( 1 )

{

    select( undef, undef, undef, 2.0 ) ;



    open( POOL, "ls -t $fixrundir |" ) ;

    foreach $files ( <POOL> )

    {

	chop( $files ) ;



	open( CHECK, "tail -1 '$fixrundir/$files' | grep -F 'EOF' |" ) ;

	if ( <CHECK> )

	{

	    print "start $files\n" ;

	    &main_start() ;



	    open( ENT, "$fixrundir/$files" ) ;

	    chop( $dest_dir=<ENT> ) ;

	    chop( $rest    =<ENT> ) ;

	    foreach $ent ( <ENT> )

	    {

		$ent =~ s/[\n\r]*$// ;

		if ( $ent ne "EOF" && $ent )

		{

		    &fork( "echo '$ent' > $err_tmpfile" ) ;

		    &main_convert( $ent ) ;

		    &main_error( $ent ) if ( $mode eq $MODE_ABORT ) ;

		    unlink( $err_tmpfile ) ;

		    &main_renew_bbs( $ent, $mode ) ;

		}

		$rest-- ;

	    }

	    close ENT ;



	    &main_end() ;



#	    unlink( "$fixrundir/$files" ) ;

	    print "end $files\n" ;

	}

	close( CHECK ) ;

    }

    close( POOL ) ;

}

exit( 0 ) ;









###############################################################################

#

# Main Subroutines 

#

#

sub main_start()

{

    $date = substr( localtime, 4) ;



    $logfile = $date ;

    $logfile =~ s/[ ]+[0-9]+ [0-9]+:[0-9]+:[0-9]+ // ;

    $logfile = $logdir."/Neofix".$logfile ;



    $errfile = $date ;

    $errfile =~ s/[0-9]+:[0-9]+:[0-9]+ // ;

    $errfile =~ s/[ ]+/_/g ;

    $errfile = $logdir."/err/".$errfile ;

    $errflag = 0 ;



    &append( $logfile   , substr( localtime, 4)." FixRun ȯư\n" ) ;

    &append( $reportfile, substr( localtime, 4)." FixRun ȯư\n" ) ;

}



sub main_convert

{

    local ( $file ) = @_ ;

    local $name, $cmd ;

    local $time ;



    $mode = $MODE_FIXED ;



    #Ĥ

    $time = substr( localtime, 4) ;

    &append( $reportfile, "$time FixRunϡ$ent $dest_dir ˹\n" ) ;

    &append( $reportfile, "̤եοϡߤΤޤ$restĤǤ\n");

    &append( $logfile   , "\t$time FixRunϡ$ent $dest_dir ˹\n" ) ;



    $dest_d = $file ;

    $dest_d =~ s/\/[^\/]*$//g ;

    &fork( "mkdir -p $dest_dir/$dest_d" ) if ( !-e "$dest_dir/$dest_d" ) ;



    #СȤݤ

    open( CMD, "fix_cmd $file |" ) ;

    foreach( split( ';', <CMD> ) )

    {

	if ( &fork( "$_ >> $err_tmpfile" ) )

	{

	    $mode = $MODE_ABORT ;

	}

    }

    close( CMD ) ;

#    &fork( "rm -rf $work_dir/*" ) ;

}



sub main_error()

{

    local ( $ent ) = @_ ;

    local $file, $err_time ;



    if ( $ent =~ "." )

    {

#˥ե뤬оä

	open( DUP, "grep -H '$ent<' $entrydir/*  | sed -e 's/:.*\$//' |" ) ;

	foreach( <DUP> ) { s/[\n\r]*$// ; unlink }

	close( DUP ) ;



#ȥ꡼ɲäʤ

	$file = "$entrydir/entry" ;

	for ( $num=0 ; -e $file.sprintf( ".%04d", $num ) ; $num++ ){}

	$file .= sprintf( ".%04d", $num ) ;

	$err_time = localtime ;

	open( ENT, "> $file" ) ;

	print ENT "<OPTION>[Err][$err_time]$ent</OPTION>" ;

	close( ENT ) ;

    }



#˥顼Ĥ

    &fork( "echo '-----------------------------------------------------------' >> $errfile" ) ;

    &fork( "echo '---------Error occur on $date Start---------' >> $errfile" ) ;

    &fork( "cat $err_tmpfile >> $errfile" ) ;

    &fork( "echo '---------Error occur on $date End  ---------' >> $errfile" ) ;

    &fork( "echo '-----------------------------------------------------------' >> $errfile" ) ;

}





sub make_bbstime()

{

    local ( $fname, $content ) = @_ ;

    local $file, $num ;



#ŤΤä()ߤ

    open( LS, "ls -t $bbstime/* | sed -e 's/:.*\$//' |" ) ;

    for( $num=0 ; $file=<LS> ; $num++ )

    {

	$file =~ s/[\n\r]*$// ;

	open( DUP, "grep -H 'file=$fname>' $file |" ) ;

	unlink( $file ) if ( <DUP> || $num>=100 ) ;

        close( DUP ) ;

    }

    close( LS ) ;



#Τ

    $file = "$bbstime/bbs" ;

    for ( $num=0 ; -e $file.sprintf( ".%04d", $num ) ; $num++ ){}

    $file .= sprintf( ".%04d", $num ) ;



    #&send_ipmsg( $from, "", $to, "󥿥˾夬äƤΤǤFIXƤʤ" ) ;



    open( BBT, "> $file" ) ;

    print BBT $content ;

    close( BBT ) ;

}



sub main_renew_bbs()

{

    local ( $fname, $gif ) = @_ ;

    local $bbs_time, $bbs_file ;

    local $num, $msg ;

    local $tim1, $tim2 ;



    $bbs_file = "$bbsdir/$fname" ;



#BBSե뤬ʤΤǺ

    if ( !-e $bbs_file )

    {

    }



#BBSFIXե뤬ʤΤǺ

    if ( !-e "$bbs_file.fix" )

    {

	$date = substr( localtime, 4) ;

	$msg  = "<TR><TD></TD>" ;

	$msg .= "<TD><IMG SRC=".$where{'gifFix'}."></TD>" ;

	$msg .= "<TD></TD>" ;

	$msg .= "<TD>&lt; /Fix &gt;</TD>" ;

	$msg .= "<TD>[Name: ƥ]</TD>" ;

	$msg .= "<TD>$date</TD></TR>" ;

	$date =~ s/ /+/g ; 



	open( BBS_IN, "$bbs_file" ) ;

	if ( $_ = <BBS_IN> )

	{

	    open( BBS_OUT, ">$bbs_file.fix" ) ;

	    s/&fname=[^&]*&/&fname=FIXUP&/ ;

	    s/&fcnmt=[^&]*&/&fcnmt=&/ ;

	    s/&fdate=[^&]*&/&fdate=$date&/ ;

	    s/&fhost=[^&]*&/&fhost=mutsu.konami&/ ;

	    s/&tmp_fix=[^&]*&/&tmp_fix=Fix&/ ;

	    s/&fix=submit/&fix=hidden/ ;

	    s/&icmnt=text/&icmnt=hidden/ ;

	    #FIXФξȤ

	    s/<TR><TD><\/TD><TD><IMG SRC=.*gif><\/TD><TD><\/TD><TD>&lt;.*&gt;<\/TD><TD>.+[0-9: ]+<\/TD><\/TR>// ;

	    s/<TR><TD><\/TD><TD><IMG SRC=.*gif>.+[0-9: ]+<\/TD><\/TR>//      if ( !/fix.gif/ || /fxd.gif/ || /err.gif/ || /tmp.gif/ ) ;

	    s/<TR><TD><\/TD><TD><\/TD><TD>/$msg<TR><TD><\/TD><TD><\/TD><TD>/ if ( !/fix.gif/ || /fxd.gif/ || /err.gif/ || /tmp.gif/ ) ;

	    s/fxd\.gif/fix.gif/ if ( /fxd.gif/ ) ;

	    s/err\.gif/fix.gif/ if ( /err.gif/ ) ;

	    print BBS_OUT ;

	    close( BBS_OUT ) ;

	    

	    &make_bbstime( $fname, $_ ) ;

	}

	close( BBS_IN ) ;

    }



#BBS

    open( DUP, "grep -H 'file=$fname>' $bbstime/* | sed -e 's/:.*\$//' |" ) ;

    if ( $bbs_time=<DUP> )

    {

	chop $bbs_time ;



	open( BBS_TIM, "+<$bbs_time" ) ;

	open( BBS_FIX, "+<$bbs_file.fix" ) ;

	if ( $_ = <BBS_FIX> )

	{

	    #ӥåȥޥåפ񤭴

	    s/fix\./$gif./ ;

	    seek( BBS_TIM, 0, 0 ) ;

	    seek( BBS_FIX, 0, 0 ) ;

	    print BBS_TIM ;

	    print BBS_FIX ;

	    close BBS_TIM ;

	    close BBS_FIX ;



	    #͡ह뤫?(ӤƸƤ)

	    $tim1 = (stat( "$bbs_file.fix" ))[8] ;

	    $tim2 = (stat(  $bbs_file      ))[8] ;

	    print STDERR "Time NOT matched on BBS-File($tim1<=$tim2)\n" if ( $tim1 <= $tim2 ) ;

	    rename( "$bbs_file.fix", $bbs_file ) if ( $tim1 > $tim2 ) ;

	}

    }

    else

    {

	open( BBS_FIX, "+<$bbs_file.fix" ) ;

	if ( $_ = <BBS_FIX> )

	{

	    #ӥåȥޥåפ񤭴

	    s/fix\./$gif./ ;

	    seek( BBS_FIX, 0, 0 ) ;

	    print BBS_FIX ;

	    close BBS_FIX ;



	    #͡ह뤫?(ӤƸƤ)

	    $tim1 = (stat( "$bbs_file.fix" ))[8] ;

	    $tim2 = (stat(  $bbs_file      ))[8] ;

	    print STDERR "Time NOT matched on BBS-File($tim1<=$tim2)\n" if ( $tim1 <= $tim2 ) ;

	    rename( "$bbs_file.fix", $bbs_file ) if ( $tim1 > $tim2 ) ;

	}



	print STDERR "BBS-File not found, searching('file=$fname>')\n" ;

    }

    close( DUP ) ;

}



sub main_end()

{

    unlink( $reportfile ) ;

    &append( $logfile, substr( localtime, 4)." FixRun \n" ) ;

}





#######################################################################################

#

# Subroutines

#

#

sub append

{

    local ($in,$literal) = @_ ;



    open( INOUT, ">>$in" ) ;

    print INOUT $literal ;

    close INOUT ;

}



sub fork

{

    local $pid ;



#    if ( $mode = $MODE_ABORT )

#	return 0 ;



    #ޥɤեƼ¹Ԥ

    unless ( $pid = fork )

    {

        exec( $_[0] ) ;

        exit 0 ;

    }

    waitpid( $pid, 0 ) ;



    #۾ä礽ΥޥɤǤ

    $_[0] =~ s/\/u\/develop\/mj001b\/bin\/linux\/// ;

    print STDERR (localtime)." com($_[0])" ;

    print STDERR "==>$? [$mode]" if ( $? ) ;

    print STDERR "\n" ;



    return $? ;

}



