func confRead() map[govpn.PeerId]*govpn.PeerConf { data, err := ioutil.ReadFile(*confPath) if err != nil { log.Fatalln("Unable to read configuration:", err) } confsRaw := new(map[string]govpn.PeerConf) err = json.Unmarshal(data, confsRaw) if err != nil { log.Fatalln("Unable to parse configuration:", err) } confs := make(map[govpn.PeerId]*govpn.PeerConf, len(*confsRaw)) for name, pc := range *confsRaw { verifier, err := govpn.VerifierFromString(pc.VerifierRaw) if err != nil { log.Fatalln("Unable to decode the key:", err.Error(), pc.VerifierRaw) } conf := govpn.PeerConf{ Verifier: verifier, Id: verifier.Id, Name: name, Up: pc.Up, Down: pc.Down, Noise: pc.Noise, CPR: pc.CPR, } if pc.TimeoutInt <= 0 { pc.TimeoutInt = govpn.TimeoutDefault } conf.Timeout = time.Second * time.Duration(pc.TimeoutInt) confs[*verifier.Id] = &conf } return confs }
func main() { flag.Parse() timeout = *timeoutP var err error log.SetFlags(log.Ldate | log.Lmicroseconds | log.Lshortfile) govpn.MTU = *mtu if *egdPath != "" { log.Println("Using", *egdPath, "EGD") govpn.EGDInit(*egdPath) } verifier, err := govpn.VerifierFromString(*verifierRaw) if err != nil { log.Fatalln(err) } priv := verifier.PasswordApply(govpn.StringFromFile(*keyPath)) conf = &govpn.PeerConf{ Id: verifier.Id, Timeout: time.Second * time.Duration(timeout), Noise: *noisy, CPR: *cpr, Verifier: verifier, DSAPriv: priv, } idsCache = govpn.NewCipherCache([]govpn.PeerId{*verifier.Id}) log.Println(govpn.VersionGet()) tap, err = govpn.TAPListen(*ifaceName) if err != nil { log.Fatalln("Can not listen on TAP interface:", err) } log.Println("Max MTU on TAP interface:", govpn.TAPMaxMTU()) if *stats != "" { log.Println("Stats are going to listen on", *stats) statsPort, err := net.Listen("tcp", *stats) if err != nil { log.Fatalln("Can not listen on stats port:", err) } go govpn.StatsProcessor(statsPort, &knownPeers) } termSignal := make(chan os.Signal, 1) signal.Notify(termSignal, os.Interrupt, os.Kill) MainCycle: for { timeouted := make(chan struct{}) rehandshaking := make(chan struct{}) termination := make(chan struct{}) if *proxyAddr != "" { *proto = "tcp" } switch *proto { case "udp": go startUDP(timeouted, rehandshaking, termination) case "tcp": if *proxyAddr != "" { go proxyTCP(timeouted, rehandshaking, termination) } else { go startTCP(timeouted, rehandshaking, termination) } default: log.Fatalln("Unknown protocol specified") } select { case <-termSignal: log.Fatalln("Finishing") termination <- struct{}{} break MainCycle case <-timeouted: break MainCycle case <-rehandshaking: } close(timeouted) close(rehandshaking) close(termination) } govpn.ScriptCall(*downPath, *ifaceName) }