Files
gophertunnel/main.go
2023-03-07 02:11:07 +00:00

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))
}