mirror of
https://github.com/dragonheim/gagent.git
synced 2025-01-18 09:36:28 -08:00
refactor: converted int64 to int32 where appropriate.
refactor: reduced usage of fmt in favor of logs and string concatication. refactor: minor re-ordering of the data structures to reduce storage space required.
This commit is contained in:
parent
8640d42132
commit
1bcc682b7c
9 changed files with 53 additions and 48 deletions
|
@ -1,5 +1,5 @@
|
||||||
FROM nikatjef/golang:1.20 as builder
|
FROM nikatjef/golang:1.20 as builder
|
||||||
ARG SEMVER=${SEMVER:-0.0.7}
|
ARG SEMVER=${SEMVER:-0.0.8}
|
||||||
|
|
||||||
WORKDIR /gagent
|
WORKDIR /gagent
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
|
@ -56,7 +56,7 @@ var environment struct {
|
||||||
* This is the application version number. It can be overridden at build time
|
* This is the application version number. It can be overridden at build time
|
||||||
* using the -ldflags "-X main.semVER=0.0.1" option.
|
* using the -ldflags "-X main.semVER=0.0.1" option.
|
||||||
*/
|
*/
|
||||||
var semVER = "0.0.6"
|
var semVER = "0.0.8"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is the application configuration. It is populated from the configuration
|
* This is the application configuration. It is populated from the configuration
|
||||||
|
@ -290,7 +290,7 @@ func init() {
|
||||||
if config.MonitorPort != 0 {
|
if config.MonitorPort != 0 {
|
||||||
go func() {
|
go func() {
|
||||||
log.Printf("[INFO] Starting Prometheus metrics exporter on port %d\n", config.MonitorPort)
|
log.Printf("[INFO] Starting Prometheus metrics exporter on port %d\n", config.MonitorPort)
|
||||||
log.Fatal(http.ListenAndServe(string(config.ListenAddr)+strconv.FormatInt(config.MonitorPort, 10), nil))
|
log.Fatal(http.ListenAndServe(string(config.ListenAddr)+strconv.Itoa(config.MonitorPort), nil))
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,11 +8,11 @@ type GagentConfig struct {
|
||||||
Mode string `hcl:"mode,attr"`
|
Mode string `hcl:"mode,attr"`
|
||||||
UUID string `hcl:"uuid,optional"`
|
UUID string `hcl:"uuid,optional"`
|
||||||
ListenAddr string `hcl:"listenaddr,optional"`
|
ListenAddr string `hcl:"listenaddr,optional"`
|
||||||
MonitorPort int64 `hcl:"monitorport,optional"`
|
|
||||||
ClientPort int64 `hcl:"clientport,optional"`
|
|
||||||
RouterPort int64 `hcl:"routerport,optional"`
|
|
||||||
WorkerPort int64 `hcl:"workerport,optional"`
|
|
||||||
ChainDBPath string `hcl:"chaindbpath,optional"`
|
ChainDBPath string `hcl:"chaindbpath,optional"`
|
||||||
|
MonitorPort int `hcl:"monitorport,optional"`
|
||||||
|
ClientPort int `hcl:"clientport,optional"`
|
||||||
|
RouterPort int `hcl:"routerport,optional"`
|
||||||
|
WorkerPort int `hcl:"workerport,optional"`
|
||||||
Clients []*ClientDetails `hcl:"client,block"`
|
Clients []*ClientDetails `hcl:"client,block"`
|
||||||
Routers []*RouterDetails `hcl:"router,block"`
|
Routers []*RouterDetails `hcl:"router,block"`
|
||||||
Workers []*WorkerDetails `hcl:"worker,block"`
|
Workers []*WorkerDetails `hcl:"worker,block"`
|
||||||
|
@ -62,27 +62,27 @@ type RouterDetails struct {
|
||||||
*/
|
*/
|
||||||
RouterAddr string `hcl:"address,attr"`
|
RouterAddr string `hcl:"address,attr"`
|
||||||
|
|
||||||
/*
|
|
||||||
* G'Agent client will use this port to communicate with the routers.
|
|
||||||
*/
|
|
||||||
ClientPort int64 `hcl:"clientport,optional"`
|
|
||||||
|
|
||||||
/*
|
|
||||||
* G'Agent router will use this port to communicate with other routers.
|
|
||||||
*/
|
|
||||||
RouterPort int64 `hcl:"routerport,optional"`
|
|
||||||
|
|
||||||
/*
|
|
||||||
* G'Agent worker will use this port to communicate with the routers.
|
|
||||||
*/
|
|
||||||
WorkerPort int64 `hcl:"workerport,optional"`
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These tags will be passed to the router upon connection. The router
|
* These tags will be passed to the router upon connection. The router
|
||||||
* will then use these tags to help determine which worker / client to
|
* will then use these tags to help determine which worker / client to
|
||||||
* send the client's requests and results to.
|
* send the client's requests and results to.
|
||||||
*/
|
*/
|
||||||
RouterTags []string `hcl:"tags,optional"`
|
RouterTags []string `hcl:"tags,optional"`
|
||||||
|
|
||||||
|
/*
|
||||||
|
* G'Agent client will use this port to communicate with the routers.
|
||||||
|
*/
|
||||||
|
ClientPort int `hcl:"clientport,optional"`
|
||||||
|
|
||||||
|
/*
|
||||||
|
* G'Agent router will use this port to communicate with other routers.
|
||||||
|
*/
|
||||||
|
RouterPort int `hcl:"routerport,optional"`
|
||||||
|
|
||||||
|
/*
|
||||||
|
* G'Agent worker will use this port to communicate with the routers.
|
||||||
|
*/
|
||||||
|
WorkerPort int `hcl:"workerport,optional"`
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -111,8 +111,8 @@ type WorkerDetails struct {
|
||||||
|
|
||||||
type AgentDetails struct {
|
type AgentDetails struct {
|
||||||
Client string `hcl:"client"`
|
Client string `hcl:"client"`
|
||||||
Status int64 `hcl:"status"`
|
|
||||||
Shasum string `hcl:"shasum"`
|
Shasum string `hcl:"shasum"`
|
||||||
|
Status int `hcl:"status"`
|
||||||
Hints []string
|
Hints []string
|
||||||
ScriptCode []byte
|
ScriptCode []byte
|
||||||
Answer []byte
|
Answer []byte
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
fmt "fmt"
|
fmt "fmt"
|
||||||
log "log"
|
log "log"
|
||||||
http "net/http"
|
http "net/http"
|
||||||
|
strconv "strconv"
|
||||||
sync "sync"
|
sync "sync"
|
||||||
|
|
||||||
gcdb "github.com/dragonheim/gagent/internal/chaindb"
|
gcdb "github.com/dragonheim/gagent/internal/chaindb"
|
||||||
|
@ -44,7 +45,7 @@ func Main(wg *sync.WaitGroup, config gstructs.GagentConfig) {
|
||||||
|
|
||||||
db.Init()
|
db.Init()
|
||||||
|
|
||||||
workerListener := fmt.Sprintf("tcp://%s:%d", config.ListenAddr, config.WorkerPort)
|
workerListener := "tcp://" + config.ListenAddr + ":" + strconv.Itoa(config.WorkerPort)
|
||||||
_ = workerSock.Bind(workerListener)
|
_ = workerSock.Bind(workerListener)
|
||||||
|
|
||||||
workers := make([]string, 0)
|
workers := make([]string, 0)
|
||||||
|
@ -112,7 +113,7 @@ func createClientListener(wg *sync.WaitGroup, config gstructs.GagentConfig) {
|
||||||
clientSock, _ := zmq.NewSocket(zmq.ROUTER)
|
clientSock, _ := zmq.NewSocket(zmq.ROUTER)
|
||||||
defer clientSock.Close()
|
defer clientSock.Close()
|
||||||
|
|
||||||
clientListener := fmt.Sprintf("tcp://%s:%d", config.ListenAddr, config.ClientPort)
|
clientListener := "tcp://" + config.ListenAddr + ":" + strconv.Itoa(config.ClientPort)
|
||||||
log.Printf("[DEBUG] Binding to: %s", clientListener)
|
log.Printf("[DEBUG] Binding to: %s", clientListener)
|
||||||
_ = clientSock.Bind(clientListener)
|
_ = clientSock.Bind(clientListener)
|
||||||
|
|
||||||
|
|
|
@ -24,9 +24,9 @@ func Main(wg *sync.WaitGroup, config gs.GagentConfig) {
|
||||||
rootBody.SetAttributeValue("mode", cty.StringVal(config.Mode))
|
rootBody.SetAttributeValue("mode", cty.StringVal(config.Mode))
|
||||||
rootBody.SetAttributeValue("uuid", cty.StringVal(config.UUID))
|
rootBody.SetAttributeValue("uuid", cty.StringVal(config.UUID))
|
||||||
rootBody.SetAttributeValue("listenaddr", cty.StringVal("0.0.0.0"))
|
rootBody.SetAttributeValue("listenaddr", cty.StringVal("0.0.0.0"))
|
||||||
rootBody.SetAttributeValue("clientport", cty.NumberIntVal(config.ClientPort))
|
rootBody.SetAttributeValue("clientport", cty.NumberIntVal(int64(config.ClientPort)))
|
||||||
rootBody.SetAttributeValue("routerport", cty.NumberIntVal(config.RouterPort))
|
rootBody.SetAttributeValue("routerport", cty.NumberIntVal(int64(config.RouterPort)))
|
||||||
rootBody.SetAttributeValue("workerport", cty.NumberIntVal(config.WorkerPort))
|
rootBody.SetAttributeValue("workerport", cty.NumberIntVal(int64(config.WorkerPort)))
|
||||||
rootBody.AppendNewline()
|
rootBody.AppendNewline()
|
||||||
|
|
||||||
clientBlock1 := rootBody.AppendNewBlock("client", []string{config.Name})
|
clientBlock1 := rootBody.AppendNewBlock("client", []string{config.Name})
|
||||||
|
@ -47,9 +47,9 @@ func Main(wg *sync.WaitGroup, config gs.GagentConfig) {
|
||||||
routerBody1 := routerBlock1.Body()
|
routerBody1 := routerBlock1.Body()
|
||||||
routerBody1.SetAttributeValue("routerid", cty.StringVal(config.UUID))
|
routerBody1.SetAttributeValue("routerid", cty.StringVal(config.UUID))
|
||||||
routerBody1.SetAttributeValue("address", cty.StringVal("127.0.0.1"))
|
routerBody1.SetAttributeValue("address", cty.StringVal("127.0.0.1"))
|
||||||
routerBody1.SetAttributeValue("clientport", cty.NumberIntVal(config.ClientPort))
|
routerBody1.SetAttributeValue("clientport", cty.NumberIntVal(int64(config.ClientPort)))
|
||||||
routerBody1.SetAttributeValue("routerport", cty.NumberIntVal(config.RouterPort))
|
routerBody1.SetAttributeValue("routerport", cty.NumberIntVal(int64(config.RouterPort)))
|
||||||
routerBody1.SetAttributeValue("workerport", cty.NumberIntVal(config.WorkerPort))
|
routerBody1.SetAttributeValue("workerport", cty.NumberIntVal(int64(config.WorkerPort)))
|
||||||
rootBody.AppendNewline()
|
rootBody.AppendNewline()
|
||||||
|
|
||||||
workerBlock1 := rootBody.AppendNewBlock("worker", []string{config.Name})
|
workerBlock1 := rootBody.AppendNewBlock("worker", []string{config.Name})
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
gstructs "github.com/dragonheim/gagent/internal/gstructs"
|
gstructs "github.com/dragonheim/gagent/internal/gstructs"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* picol "github.com/dragonheim/gagent/src/picol"
|
* picol "github.com/dragonheim/gagent/pkg/picol"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
prometheus "github.com/prometheus/client_golang/prometheus"
|
prometheus "github.com/prometheus/client_golang/prometheus"
|
||||||
|
@ -43,13 +43,13 @@ func Main(wg *sync.WaitGroup, config gstructs.GagentConfig) {
|
||||||
/*
|
/*
|
||||||
* Generate connect string for this router.
|
* Generate connect string for this router.
|
||||||
*/
|
*/
|
||||||
connectString := "tcp://" + config.Routers[key].RouterAddr + ":" + strconv.FormatInt(rport, 10)
|
connectString := "tcp://" + config.Routers[key].RouterAddr + ":" + strconv.Itoa(rport)
|
||||||
|
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
go getAgent(wg, config.UUID, connectString)
|
go getAgent(wg, config.UUID, connectString)
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* workerListener := "tcp://" + config.ListenAddr + ":" + strconv.FormatInt(config.WorkerPort, 10)
|
* workerListener := "tcp://" + config.ListenAddr + ":" + strconv.Itoa(config.WorkerPort)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package picol
|
package picol
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -92,8 +93,8 @@ func CommandMath(i *Interpreter, argv []string, pd interface{}) (string, error)
|
||||||
if a != b {
|
if a != b {
|
||||||
c = 1
|
c = 1
|
||||||
}
|
}
|
||||||
default: // FIXME I hate warnings
|
default:
|
||||||
c = 0
|
return "0", errors.New("invalid operator " + argv[0])
|
||||||
}
|
}
|
||||||
return fmt.Sprintf("%d", c), nil
|
return fmt.Sprintf("%d", c), nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Define parser token types
|
||||||
const (
|
const (
|
||||||
ptESC = iota
|
ptESC = iota
|
||||||
ptSTR
|
ptSTR
|
||||||
|
@ -15,6 +16,7 @@ const (
|
||||||
ptEOF
|
ptEOF
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// parserStruct represents the parser state
|
||||||
type parserStruct struct {
|
type parserStruct struct {
|
||||||
text string
|
text string
|
||||||
p, start, end, ln int
|
p, start, end, ln int
|
||||||
|
@ -22,26 +24,31 @@ type parserStruct struct {
|
||||||
Type int
|
Type int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// initParser initializes a new parserStruct instance
|
||||||
func initParser(text string) *parserStruct {
|
func initParser(text string) *parserStruct {
|
||||||
return &parserStruct{text, 0, 0, 0, len(text), 0, ptEOL}
|
return &parserStruct{text: text, ln: len(text), Type: ptEOL}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// next advances the parser position by one rune
|
||||||
func (p *parserStruct) next() {
|
func (p *parserStruct) next() {
|
||||||
_, w := utf8.DecodeRuneInString(p.text[p.p:])
|
_, w := utf8.DecodeRuneInString(p.text[p.p:])
|
||||||
p.p += w
|
p.p += w
|
||||||
p.ln -= w
|
p.ln -= w
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// current returns the current rune at the parser position
|
||||||
func (p *parserStruct) current() rune {
|
func (p *parserStruct) current() rune {
|
||||||
r, _ := utf8.DecodeRuneInString(p.text[p.p:])
|
r, _ := utf8.DecodeRuneInString(p.text[p.p:])
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// token returns the current token text between start and end positions
|
||||||
func (p *parserStruct) token() (t string) {
|
func (p *parserStruct) token() (t string) {
|
||||||
defer recover()
|
defer recover()
|
||||||
return p.text[p.start:p.end]
|
return p.text[p.start:p.end]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parseSep parses whitespace separators
|
||||||
func (p *parserStruct) parseSep() string {
|
func (p *parserStruct) parseSep() string {
|
||||||
p.start = p.p
|
p.start = p.p
|
||||||
for ; p.p < len(p.text); p.next() {
|
for ; p.p < len(p.text); p.next() {
|
||||||
|
@ -54,6 +61,7 @@ func (p *parserStruct) parseSep() string {
|
||||||
return p.token()
|
return p.token()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parseEol parses end of line and comments
|
||||||
func (p *parserStruct) parseEol() string {
|
func (p *parserStruct) parseEol() string {
|
||||||
p.start = p.p
|
p.start = p.p
|
||||||
|
|
||||||
|
@ -70,6 +78,7 @@ func (p *parserStruct) parseEol() string {
|
||||||
return p.token()
|
return p.token()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parseCommand parses a command within brackets
|
||||||
func (p *parserStruct) parseCommand() string {
|
func (p *parserStruct) parseCommand() string {
|
||||||
level, blevel := 1, 0
|
level, blevel := 1, 0
|
||||||
p.next() // skip
|
p.next() // skip
|
||||||
|
@ -103,6 +112,7 @@ Loop:
|
||||||
return p.token()
|
return p.token()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parseVar parses a variable reference
|
||||||
func (p *parserStruct) parseVar() string {
|
func (p *parserStruct) parseVar() string {
|
||||||
p.next() // skip the $
|
p.next() // skip the $
|
||||||
p.start = p.p
|
p.start = p.p
|
||||||
|
@ -132,6 +142,7 @@ func (p *parserStruct) parseVar() string {
|
||||||
return p.token()
|
return p.token()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parseBrace parses a brace-enclosed string
|
||||||
func (p *parserStruct) parseBrace() string {
|
func (p *parserStruct) parseBrace() string {
|
||||||
level := 1
|
level := 1
|
||||||
p.next() // skip
|
p.next() // skip
|
||||||
|
@ -160,6 +171,7 @@ Loop:
|
||||||
return p.token()
|
return p.token()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parseString parses a string with or without quotes
|
||||||
func (p *parserStruct) parseString() string {
|
func (p *parserStruct) parseString() string {
|
||||||
newword := p.Type == ptSEP || p.Type == ptEOL || p.Type == ptSTR
|
newword := p.Type == ptSEP || p.Type == ptEOL || p.Type == ptSTR
|
||||||
|
|
||||||
|
@ -203,6 +215,7 @@ Loop:
|
||||||
return p.token()
|
return p.token()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parseComment skips over comment text
|
||||||
func (p *parserStruct) parseComment() string {
|
func (p *parserStruct) parseComment() string {
|
||||||
for p.ln != 0 && p.current() != '\n' {
|
for p.ln != 0 && p.current() != '\n' {
|
||||||
p.next()
|
p.next()
|
||||||
|
@ -210,6 +223,7 @@ func (p *parserStruct) parseComment() string {
|
||||||
return p.token()
|
return p.token()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetToken returns the next token from the parser
|
||||||
func (p *parserStruct) GetToken() string {
|
func (p *parserStruct) GetToken() string {
|
||||||
for {
|
for {
|
||||||
if p.ln == 0 {
|
if p.ln == 0 {
|
||||||
|
@ -246,5 +260,4 @@ func (p *parserStruct) GetToken() string {
|
||||||
return p.parseString()
|
return p.parseString()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* return p.token() /* unreached */
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,20 +12,10 @@ import (
|
||||||
|
|
||||||
var fname = flag.String("f", "", "file name")
|
var fname = flag.String("f", "", "file name")
|
||||||
|
|
||||||
// CommandPuts is a simple version of the TCL puts function.
|
|
||||||
func CommandPuts(i *picol.Interpreter, argv []string, pd interface{}) (string, error) {
|
|
||||||
if len(argv) != 2 {
|
|
||||||
return "", fmt.Errorf("wrong number of args for %s %s", argv[0], argv)
|
|
||||||
}
|
|
||||||
fmt.Println(argv[1])
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
interp := picol.NewInterpreter()
|
interp := picol.NewInterpreter()
|
||||||
interp.RegisterCoreCommands()
|
interp.RegisterCoreCommands()
|
||||||
interp.RegisterCommand("puts", CommandPuts, nil)
|
|
||||||
|
|
||||||
buf, err := ioutil.ReadFile(*fname)
|
buf, err := ioutil.ReadFile(*fname)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
|
Loading…
Add table
Reference in a new issue