func parseOneLine()

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
}