97 lines
2.1 KiB
Go
97 lines
2.1 KiB
Go
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", "<host>:[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))
|
|
}
|