mirror of
https://github.com/postmannen/ctrl.git
synced 2025-03-05 06:46:48 +00:00
checking file for updates and reading content
This commit is contained in:
parent
ec76bd36cd
commit
c8886121b9
6 changed files with 145 additions and 0 deletions
0
file.txt
Normal file
0
file.txt
Normal file
107
getmessagefromfile.go
Normal file
107
getmessagefromfile.go
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
package steward
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/fsnotify/fsnotify"
|
||||||
|
)
|
||||||
|
|
||||||
|
// getMessagesFromFile will start a file watcher for the given directory
|
||||||
|
// and filename. It will take a channel of []byte as input, and it is
|
||||||
|
// in this channel the content of a file that has changed is returned.
|
||||||
|
func getMessagesFromFile(directoryToCheck string, fileName string, fileContentCh chan []byte) {
|
||||||
|
fileUpdated := make(chan bool)
|
||||||
|
go fileWatcherStart(directoryToCheck, fileUpdated)
|
||||||
|
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-fileUpdated:
|
||||||
|
//load file, read it's content
|
||||||
|
b, err := readTruncateMessageFile(fileName)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("error: reading file: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fileContentCh <- b
|
||||||
|
fmt.Printf("File content read: %s\n", b)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// readTruncateMessageFile, will read all the messages in the given
|
||||||
|
// file, and truncate the file after read.
|
||||||
|
// A []byte will be returned with the content read.
|
||||||
|
func readTruncateMessageFile(fileName string) ([]byte, error) {
|
||||||
|
|
||||||
|
f, err := os.OpenFile(fileName, os.O_APPEND|os.O_RDWR, os.ModeAppend)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Failed to open file %v\n", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(f)
|
||||||
|
|
||||||
|
lines := []byte{}
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
lines = append(lines, scanner.Bytes()...)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("*** DEBUG : %s\n", lines)
|
||||||
|
|
||||||
|
fmt.Printf("read: %s\n", lines)
|
||||||
|
|
||||||
|
// empty the file after all is read
|
||||||
|
ret, err := f.Seek(0, io.SeekStart)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("f.Seek failed: %v", err)
|
||||||
|
}
|
||||||
|
fmt.Printf("** ret=%v\n", ret)
|
||||||
|
|
||||||
|
err = f.Truncate(0)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("******* %#v\n", err)
|
||||||
|
return nil, fmt.Errorf("f.Truncate failed: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return lines, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func fileWatcherStart(directoryToCheck string, fileUpdated chan bool) {
|
||||||
|
watcher, err := fsnotify.NewWatcher()
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Failed fsnotify.NewWatcher")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer watcher.Close()
|
||||||
|
|
||||||
|
done := make(chan bool)
|
||||||
|
go func() {
|
||||||
|
//Give a true value to updated so it reads the file the first time.
|
||||||
|
fileUpdated <- true
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case event := <-watcher.Events:
|
||||||
|
if event.Op&fsnotify.Write == fsnotify.Write {
|
||||||
|
log.Println("modified file:", event.Name)
|
||||||
|
//testing with an update chan to get updates
|
||||||
|
fileUpdated <- true
|
||||||
|
}
|
||||||
|
case err := <-watcher.Errors:
|
||||||
|
log.Println("error:", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
err = watcher.Add(directoryToCheck)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("error: watcher add: %v\n", err)
|
||||||
|
}
|
||||||
|
<-done
|
||||||
|
}
|
1
go.mod
1
go.mod
|
@ -3,6 +3,7 @@ module github.com/RaaLabs/steward
|
||||||
go 1.15
|
go 1.15
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/fsnotify/fsnotify v1.4.9
|
||||||
github.com/golang/protobuf v1.4.3 // indirect
|
github.com/golang/protobuf v1.4.3 // indirect
|
||||||
github.com/nats-io/nats-server/v2 v2.1.9 // indirect
|
github.com/nats-io/nats-server/v2 v2.1.9 // indirect
|
||||||
github.com/nats-io/nats.go v1.10.0
|
github.com/nats-io/nats.go v1.10.0
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -4,6 +4,8 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
|
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
||||||
|
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
@ -58,6 +60,8 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e h1:D5TXcfTk7xF7hvieo4QErS3qqCB4teTffacDWr7CI+0=
|
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e h1:D5TXcfTk7xF7hvieo4QErS3qqCB4teTffacDWr7CI+0=
|
||||||
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9 h1:L2auWcuQIvxz9xSEqzESnV/QN/gNRXNApHi3fYwl2w0=
|
||||||
|
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
|
|
0
inmsg.txt
Normal file
0
inmsg.txt
Normal file
33
publisher.go
33
publisher.go
|
@ -92,6 +92,21 @@ func NewServer(brokerAddress string, nodeName string) (*server, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *server) RunPublisher() {
|
func (s *server) RunPublisher() {
|
||||||
|
// start the checking of files for input messages
|
||||||
|
fileReadCh := make((chan []byte))
|
||||||
|
go getMessagesFromFile("./", "inmsg.txt", fileReadCh)
|
||||||
|
|
||||||
|
// TODO: For now we just print content of the files read.
|
||||||
|
// Replace this whit a broker function that will know how
|
||||||
|
// send it on to the correct publisher.
|
||||||
|
go func() {
|
||||||
|
for b := range fileReadCh {
|
||||||
|
// Check if there are new content read from file input
|
||||||
|
fmt.Printf("received: %s\n", b)
|
||||||
|
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
proc := s.prepareNewProcess("btship1")
|
proc := s.prepareNewProcess("btship1")
|
||||||
// fmt.Printf("*** %#v\n", proc)
|
// fmt.Printf("*** %#v\n", proc)
|
||||||
go s.spawnProcess(proc)
|
go s.spawnProcess(proc)
|
||||||
|
@ -118,6 +133,18 @@ type process struct {
|
||||||
// errorCh is used to report errors from a process
|
// errorCh is used to report errors from a process
|
||||||
// NB: Implementing this as an int to report for testing
|
// NB: Implementing this as an int to report for testing
|
||||||
errorCh chan string
|
errorCh chan string
|
||||||
|
// subject
|
||||||
|
}
|
||||||
|
|
||||||
|
type subject struct {
|
||||||
|
// node, the name of the node
|
||||||
|
node string
|
||||||
|
// messageType, command/event
|
||||||
|
messageType string
|
||||||
|
// method, what is this message doing, etc. shellcommand, syslog, etc.
|
||||||
|
method string
|
||||||
|
// description, usefu
|
||||||
|
description string
|
||||||
}
|
}
|
||||||
|
|
||||||
// prepareNewProcess will set the the provided values and the default
|
// prepareNewProcess will set the the provided values and the default
|
||||||
|
@ -145,6 +172,12 @@ func (s *server) spawnProcess(proc process) {
|
||||||
|
|
||||||
// Loop creating one new message every second to simulate getting new
|
// Loop creating one new message every second to simulate getting new
|
||||||
// messages to deliver.
|
// messages to deliver.
|
||||||
|
//
|
||||||
|
// TODO: I think it makes most sense that the messages would come to
|
||||||
|
// here from some other message-pickup-process, and that process will
|
||||||
|
// give the message to the correct publisher process. A channel that
|
||||||
|
// is listened on in the for loop below could be used to receive the
|
||||||
|
// messages from the message-pickup-process.
|
||||||
for {
|
for {
|
||||||
m := getMessageToDeliver()
|
m := getMessageToDeliver()
|
||||||
m.ID = s.processes[proc.node].messageID
|
m.ID = s.processes[proc.node].messageID
|
||||||
|
|
Loading…
Add table
Reference in a new issue