Feat: finish multi interface parser and make the cli app work

This commit is contained in:
kayos@tcp.direct 2023-12-01 23:25:44 -08:00
parent 707a82e2a6
commit 2e7b11999c
Signed by: kayos
GPG Key ID: 4B841471B4BEE979
2 changed files with 27 additions and 9 deletions

@ -11,7 +11,7 @@ import (
) )
func main() { func main() {
eth0 := &iface.NetworkInterface{} ifaces := iface.NewMultiParser()
switch { switch {
case len(os.Args) < 2: case len(os.Args) < 2:
buf := &bytes.Buffer{} buf := &bytes.Buffer{}
@ -31,7 +31,7 @@ func main() {
break break
} }
} }
n, err := eth0.Write(buf.Bytes()) n, err := ifaces.Write(buf.Bytes())
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -43,7 +43,7 @@ func main() {
if err != nil { if err != nil {
panic(err) panic(err)
} }
n, err := eth0.Write(dat) n, err := ifaces.Write(dat)
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -51,12 +51,22 @@ func main() {
panic("short write") panic("short write")
} }
} }
dat, err := json.MarshalIndent(eth0, "", "\t") imap, err := ifaces.Parse()
if err != nil { if err != nil {
panic(err)
}
if err = eth0.Validate(); err != nil {
println(err.Error()) println(err.Error())
return
} }
for _, netif := range imap {
if netif == nil {
continue
}
if err = netif.Validate(); err != nil {
println(netif.Name + " skip due to error: " + err.Error())
delete(imap, netif.Name)
continue
}
}
dat, err := json.MarshalIndent(imap, "", "\t")
_, _ = os.Stdout.Write(dat) _, _ = os.Stdout.Write(dat)
} }

@ -9,6 +9,8 @@ import (
"git.tcp.direct/kayos/common/pool" "git.tcp.direct/kayos/common/pool"
) )
type Interfaces map[string]*NetworkInterface
type poolGroup struct { type poolGroup struct {
Buffers pool.BufferFactory Buffers pool.BufferFactory
Strs pool.StringFactory Strs pool.StringFactory
@ -20,22 +22,28 @@ type MultiParser struct {
Interfaces map[string]*NetworkInterface Interfaces map[string]*NetworkInterface
Errs []error Errs []error
buf []byte buf []byte
mu *sync.Mutex
} }
func NewMultiParser() *MultiParser { func NewMultiParser() *MultiParser {
return &MultiParser{ return &MultiParser{
Interfaces: make(map[string]*NetworkInterface), Interfaces: make(Interfaces),
Errs: make([]error, 0), Errs: make([]error, 0),
buf: make([]byte, 0), buf: make([]byte, 0),
mu: &sync.Mutex{},
} }
} }
func (p *MultiParser) Write(data []byte) (int, error) { func (p *MultiParser) Write(data []byte) (int, error) {
p.mu.Lock()
p.buf = append(p.buf, data...) p.buf = append(p.buf, data...)
p.mu.Unlock()
return len(data), nil return len(data), nil
} }
func (p *MultiParser) Parse() error { func (p *MultiParser) Parse() (Interfaces, error) {
p.mu.Lock()
defer p.mu.Unlock()
scanner := bufio.NewScanner(strings.NewReader(string(p.buf))) scanner := bufio.NewScanner(strings.NewReader(string(p.buf)))
index := 0 index := 0