in pkg/skoop/netstack/ipvs.go [43:127]
func parseOneLine(ipvs *IPVS, line string) error {
var (
addService bool
tcpService string
udpService string
scheduler string
addServer bool
realServer string
masquerading bool
weight string
persistent string
)
ipvsFlags := flag.NewFlagSet("ipvs", flag.ContinueOnError)
ipvsFlags.BoolVar(&addService, "A", false, "")
ipvsFlags.StringVar(&tcpService, "t", "", "")
ipvsFlags.StringVar(&udpService, "u", "", "")
ipvsFlags.StringVar(&scheduler, "s", "", "")
ipvsFlags.BoolVar(&addServer, "a", false, "")
ipvsFlags.StringVar(&realServer, "r", "", "")
ipvsFlags.BoolVar(&masquerading, "m", false, "")
ipvsFlags.StringVar(&weight, "w", "", "")
ipvsFlags.StringVar(&persistent, "p", "", "")
if err := ipvsFlags.Parse(strings.Fields(line)); err != nil {
return errors.Wrapf(err, "error parse ipvs rule %s", line)
}
if !addServer && !addService {
return fmt.Errorf("unknown ipvs action")
}
var protocol model.Protocol
var service string
if udpService != "" {
protocol = model.UDP
service = udpService
} else {
protocol = model.TCP
service = tcpService
}
arr := strings.Split(service, ":")
serviceIP := arr[0]
servicePort, err := strconv.Atoi(arr[1])
if err != nil {
return err
}
if addService {
svc := &IPVSService{
Protocol: protocol,
IP: serviceIP,
Port: uint16(servicePort),
Scheduler: scheduler,
}
ipvs.services[svc.Service()] = svc
return nil
}
if addServer {
weightInt, _ := strconv.Atoi(weight)
arr := strings.Split(realServer, ":")
serverIP := arr[0]
serverPort, err := strconv.Atoi(arr[1])
if err != nil {
return err
}
backend := RealServer{
IP: serverIP,
Port: uint16(serverPort),
Masquerade: masquerading,
Weight: weightInt,
}
serviceName := fmt.Sprintf("%s:%s", protocol, service)
svc, ok := ipvs.services[serviceName]
if !ok {
return fmt.Errorf("service not exists")
}
svc.RS = append(svc.RS, backend)
return nil
}
return nil
}