package main
import (
"fmt"
"os/exec"
"log"
"io"
"time"
"math/rand"
"os"
"errors"
"sync"
"lcthw.dev/go/ozai/config"
)
func LaunchLogger ( in io . Reader , out io . Writer , err error ) {
if err != nil { log . Fatal ( err ) }
go func ( ) {
if _ , err := io . Copy ( out , in )
err != nil { log . Printf ( "LOGGER: %v" , err ) }
} ( )
}
func LaunchProcess ( proc * config . Process , wg sync . WaitGroup ) {
defer wg . Done ( )
for {
proc . ExecCmd = exec . Command ( proc . Command , proc . Args ... )
if errors . Is ( proc . ExecCmd . Err , exec . ErrDot ) {
proc . ExecCmd . Err = nil
}
fmt . Println ( "STARTING" , proc . Name )
stderr , err := proc . ExecCmd . StderrPipe ( ) ;
LaunchLogger ( stderr , os . Stdout , err )
stdout , err := proc . ExecCmd . StdoutPipe ( ) ;
LaunchLogger ( stdout , os . Stdout , err )
proc . ExecCmd . Start ( )
fmt . Println ( "WAITING for" , proc . Name )
fmt . Println ( "SENDING READY on channel" )
proc . Ready <- "ready"
proc . ExecCmd . Wait ( )
fmt . Println ( "PROCESS" , proc . Name , "EXITED" )
}
}
func main ( ) {
config . Load ( )
fmt . Println ( "CONFIG:" , config . Settings . ConfigPath )
fmt . Println ( "COMMANDs:" , config . Settings . Processes )
var wg sync . WaitGroup
for name , proc := range config . Settings . Processes {
fmt . Println ( "PROCESS:" , name )
wg . Add ( 1 )
proc . Ready = make ( chan string )
go LaunchProcess ( & proc , wg )
go func ( ) {
for {
fmt . Println ( "!!!!!!!!!!!!!!!!!!!!!!!!!! killer runs" )
is_ready := <- proc . Ready
fmt . Println ( "is_ready returned" , is_ready )
sleep_for := rand . Int ( ) % 10 + 1
time . Sleep ( time . Duration ( sleep_for ) * time . Second )
fmt . Println ( "!!!!!!!!!!!!!!!!!!! TIME TO DIE!!!!!" )
err := proc . ExecCmd . Process . Kill ( )
if err != nil { log . Printf ( "killer says: %v" , err ) }
}
} ( )
}
wg . Wait ( )
}