Pndpd/config.go

172 lines
3.9 KiB
Go
Raw Permalink Normal View History

2021-12-21 06:42:30 -05:00
package main
import (
"bufio"
"fmt"
2021-12-21 06:42:30 -05:00
"log"
"os"
2021-12-25 09:28:59 -05:00
"pndpd/modules"
2021-12-22 07:01:30 -05:00
"pndpd/pndp"
2021-12-21 06:42:30 -05:00
"strings"
)
type configResponder struct {
Iface string
Filter string
autosense string
instance *pndp.ResponderObj
2021-12-21 06:42:30 -05:00
}
type configProxy struct {
Iface1 string
Iface2 string
Filter string
autosense string
instance *pndp.ProxyObj
2021-12-21 06:42:30 -05:00
}
var allResponders []*configResponder
var allProxies []*configProxy
2021-12-21 06:42:30 -05:00
func readConfig(dest string) {
file, err := os.Open(dest)
if err != nil {
log.Fatal(err)
}
2021-12-25 08:21:07 -05:00
defer func(file *os.File) {
_ = file.Close()
}(file)
2021-12-21 06:42:30 -05:00
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
2021-12-25 09:28:59 -05:00
if strings.HasPrefix(line, "//") || strings.TrimSpace(line) == "" {
2021-12-21 06:42:30 -05:00
continue
}
if strings.HasPrefix(line, "debug") {
if strings.Contains(line, "on") {
pndp.GlobalDebug = true
fmt.Println("DEBUG ON")
2021-12-21 06:42:30 -05:00
}
continue
}
2021-12-25 09:28:59 -05:00
if strings.HasPrefix(line, "responder") && strings.Contains(line, "{") {
2021-12-21 06:42:30 -05:00
obj := configResponder{}
2021-12-22 06:04:00 -05:00
filter := ""
2021-12-21 06:42:30 -05:00
for {
2021-12-25 13:03:11 -05:00
if !scanner.Scan() {
break
}
line = strings.TrimSpace(scanner.Text())
2021-12-21 06:42:30 -05:00
if strings.HasPrefix(line, "iface") {
obj.Iface = strings.TrimSpace(strings.TrimPrefix(line, "iface"))
}
if strings.HasPrefix(line, "filter") {
2021-12-22 06:04:00 -05:00
filter += strings.TrimSpace(strings.TrimPrefix(line, "filter")) + ";"
if strings.Contains(line, ";") {
panic("Invalid config file syntax")
}
}
if strings.HasPrefix(line, "autosense") {
obj.autosense = strings.TrimSpace(strings.TrimPrefix(line, "autosense"))
2021-12-21 06:42:30 -05:00
}
if strings.HasPrefix(line, "}") {
obj.Filter = strings.TrimSuffix(filter, ";")
2021-12-21 06:42:30 -05:00
break
}
}
allResponders = append(allResponders, &obj)
2021-12-25 09:28:59 -05:00
} else if strings.HasPrefix(line, "proxy") && strings.Contains(line, "{") {
2021-12-21 06:42:30 -05:00
obj := configProxy{}
filter := ""
2021-12-21 06:42:30 -05:00
for {
2021-12-25 13:03:11 -05:00
if !scanner.Scan() {
break
}
line = strings.TrimSpace(scanner.Text())
2021-12-21 06:42:30 -05:00
if strings.HasPrefix(line, "iface1") {
obj.Iface1 = strings.TrimSpace(strings.TrimPrefix(line, "iface1"))
}
if strings.HasPrefix(line, "iface2") {
obj.Iface2 = strings.TrimSpace(strings.TrimPrefix(line, "iface2"))
}
if strings.HasPrefix(line, "filter") {
filter += strings.TrimSpace(strings.TrimPrefix(line, "filter")) + ";"
if strings.Contains(line, ";") {
panic("Invalid config file syntax")
}
}
if strings.HasPrefix(line, "autosense") {
obj.autosense = strings.TrimSpace(strings.TrimPrefix(line, "autosense"))
}
if strings.HasPrefix(line, "}") {
obj.Filter = strings.TrimSuffix(filter, ";")
break
}
2021-12-21 06:42:30 -05:00
if strings.HasPrefix(line, "}") {
break
}
}
allProxies = append(allProxies, &obj)
2021-12-25 09:28:59 -05:00
} else if strings.Contains(line, "{") {
option := strings.TrimSuffix(strings.TrimSpace(line), "{")
option = strings.TrimSpace(option)
if modules.ModuleList != nil {
for i := range modules.ModuleList {
2021-12-25 13:03:11 -05:00
for d := range (*modules.ModuleList[i]).Option {
if (*modules.ModuleList[i]).Option[d].Option == option {
var lines []string
for {
if !scanner.Scan() {
break
}
line = strings.TrimSpace(scanner.Text())
if strings.HasPrefix(line, "}") {
break
}
lines = append(lines, line)
2021-12-25 09:28:59 -05:00
}
2021-12-25 13:03:11 -05:00
(*modules.ModuleList[i]).Callback(modules.Callback{
CallbackType: modules.Config,
Option: option,
Arguments: lines,
})
return
2021-12-25 09:28:59 -05:00
}
}
}
}
2021-12-21 06:42:30 -05:00
}
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
for _, n := range allProxies {
o := pndp.NewProxy(n.Iface1, n.Iface2, pndp.ParseFilter(n.Filter), n.autosense)
n.instance = o
o.Start()
}
for _, n := range allResponders {
o := pndp.NewResponder(n.Iface, pndp.ParseFilter(n.Filter), n.autosense)
n.instance = o
o.Start()
}
WaitForSignal()
for _, n := range allProxies {
n.instance.Stop()
}
for _, n := range allResponders {
n.instance.Stop()
}
2021-12-21 06:42:30 -05:00
}