package main import ( "flag" "html/template" "io/ioutil" "log" "net/http" ) import ( "github.com/prologic/go-gopher" "github.com/prologic/gopherproxy" "github.com/temoto/robotstxt" ) import ( "github.com/eyedeekay/goSam" "github.com/eyedeekay/sam3/helper" "github.com/eyedeekay/i2pkeys" ) var ( samaddr = flag.String("sam", "127.0.0.1:7656", "SAM API address to use") ) var ( // TODO: Allow config file and environment vars // (opt -> env -> config -> default) shareme = flag.Bool("share", false, "Share the gateway as an I2P service") bind = flag.String("bind", "0.0.0.0:8000", "[int]:port to bind to") robotsfile = flag.String("robots-file", "robots.txt", "robots.txt file") uri = flag.String("uri", "oitxogoyvogvzmm3f7fri7t7fyhy5lv32bio6xosjnt2eugij24q.b32.i2p", ":[port] to proxy to") appname = flag.String("name", "gophertunnel", "nickname to git the application tunnel") ) var ready bool func share() { listener, err := sam.I2PListener(*appname, *samaddr, *appname) if err != nil { log.Fatal(err) } name := listener.Addr().(i2pkeys.I2PAddr).Base32() var tpl *template.Template tpldata, err := ioutil.ReadFile(".template") var tpltext string if err == nil { tpltext = string(tpldata) } tpl, err = template.New("gophermenu").Parse(tpltext) if err != nil { log.Fatal(err) } robotstxtdata, err := ioutil.ReadFile(*robotsfile) var robotsdata *robotstxt.RobotsData if err != nil { log.Printf("error reading robots.txt: %s", err) robotstxtdata = nil } else { robotsdata, err = robotstxt.FromBytes(robotstxtdata) if err != nil { log.Printf("error reading robots.txt: %s", err) robotstxtdata = nil } } server := http.Server{ Addr: name, Handler: gopherproxy.GopherHandler(tpl, robotsdata, *uri), } err = server.Serve(listener) if err != nil { log.Fatal(err) } } func main() { flag.Parse() if *shareme { go share() } gsc, err := goSam.NewClientFromOptions(goSam.SetAddr(*samaddr), goSam.SetDebug(true)) if err != nil { log.Fatal(err) } gopher.Dial = gsc.Dial // Use a config struct log.Fatal(gopherproxy.ListenAndServe(*bind, *robotsfile, *uri)) }