initial commit
This commit is contained in:
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
tracker/keys.i2pkeys
|
||||
tracker/tracker
|
||||
|
13
go.mod
Normal file
13
go.mod
Normal file
@ -0,0 +1,13 @@
|
||||
module github.com/eyedeekay/tracker
|
||||
|
||||
go 1.14
|
||||
|
||||
require (
|
||||
github.com/eyedeekay/sam3 v0.32.3
|
||||
github.com/gorilla/websocket v1.4.2
|
||||
github.com/justinas/alice v1.2.0
|
||||
github.com/vvampirius/retracker v0.0.0-20171226134001-fdbec17ad537
|
||||
github.com/zeebo/bencode v1.0.0 // indirect
|
||||
)
|
||||
|
||||
replace github.com/vvampirius/retracker v0.0.0-20171226134001-fdbec17ad537 => github.com/eyedeekay/retracker v0.0.0-20191208024817-1068d9dccb6d
|
13
go.sum
Normal file
13
go.sum
Normal file
@ -0,0 +1,13 @@
|
||||
github.com/eyedeekay/retracker v0.0.0-20191208024817-1068d9dccb6d h1:OrYEqYkav2QZdBSwXQ8iqsnbZv0KQkWXbnCl7WZsH4c=
|
||||
github.com/eyedeekay/retracker v0.0.0-20191208024817-1068d9dccb6d/go.mod h1:YCuBD/+cyrDyP54x/snTfObZgpjJ61TVRG1r5mEov+w=
|
||||
github.com/eyedeekay/sam3 v0.32.3 h1:PW1vQoo2H7c3Q4l2DngJqpSdsdJprMCk9NOkUHtcdmM=
|
||||
github.com/eyedeekay/sam3 v0.32.3/go.mod h1:qRA9KIIVxbrHlkj+ZB+OoxFGFgdKeGp1vSgPw26eOVU=
|
||||
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
|
||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/justinas/alice v1.2.0 h1:+MHSA/vccVCF4Uq37S42jwlkvI2Xzl7zTPCN5BnZNVo=
|
||||
github.com/justinas/alice v1.2.0/go.mod h1:fN5HRH/reO/zrUflLfTN43t3vXvKzvZIENsNEe7i7qA=
|
||||
github.com/vvampirius/retracker v0.0.0-20171226134001-fdbec17ad537 h1:tzwfH/icuZbxYWB2YL94pB+TsgYDtV++E5OAtVok//k=
|
||||
github.com/vvampirius/retracker v0.0.0-20171226134001-fdbec17ad537/go.mod h1:dleUEOn/BmkTNbOn5w6w3XXg8pL4OaOCMH066oaL7cE=
|
||||
github.com/zeebo/bencode v0.0.0-20171107213702-3bb23f1b4385/go.mod h1:Ct7CkrWIQuLWAy9M3atFHYq4kG9Ao/SsY5cdtCXmp9Y=
|
||||
github.com/zeebo/bencode v1.0.0 h1:zgop0Wu1nu4IexAZeCZ5qbsjU4O1vMrfCrVgUjbHVuA=
|
||||
github.com/zeebo/bencode v1.0.0/go.mod h1:Ct7CkrWIQuLWAy9M3atFHYq4kG9Ao/SsY5cdtCXmp9Y=
|
115
serve.go
Normal file
115
serve.go
Normal file
@ -0,0 +1,115 @@
|
||||
package samcore
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
//"fmt"
|
||||
"log"
|
||||
|
||||
"github.com/gorilla/websocket"
|
||||
"github.com/justinas/alice"
|
||||
"github.com/vvampirius/retracker/core/common"
|
||||
Receiver "github.com/vvampirius/retracker/core/receiver"
|
||||
Storage "github.com/vvampirius/retracker/core/storage"
|
||||
)
|
||||
|
||||
import (
|
||||
"github.com/eyedeekay/sam3"
|
||||
"github.com/eyedeekay/sam3/i2pkeys"
|
||||
"os"
|
||||
)
|
||||
|
||||
var upgrader = websocket.Upgrader{
|
||||
ReadBufferSize: 4096,
|
||||
WriteBufferSize: 4096,
|
||||
EnableCompression: true,
|
||||
CheckOrigin: func(r *http.Request) bool {
|
||||
return true
|
||||
},
|
||||
}
|
||||
|
||||
func Sammy() (*sam3.StreamListener, error) {
|
||||
if sam, err := sam3.NewSAM("127.0.0.1:7656"); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
if file, err := os.Open("./keys.i2pkeys"); err == nil {
|
||||
if keys, err := i2pkeys.LoadKeysIncompat(file); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
if stream, err := sam.NewStreamSession("serverTun", keys, sam3.Options_Fat); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return stream.Listen()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if keys, err := sam.NewKeys(); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
if file, err := os.Create("./keys.i2pkeys"); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
if err := i2pkeys.StoreKeysIncompat(keys, file); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if stream, err := sam.NewStreamSession("serverTun", keys, sam3.Options_Fat); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return stream.Listen()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
type Core struct {
|
||||
Config *common.Config
|
||||
Storage *Storage.Storage
|
||||
Receiver *Receiver.Receiver
|
||||
}
|
||||
|
||||
func wsMiddleware(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
conn, err := upgrader.Upgrade(w, r, nil)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
for {
|
||||
messageType, p, err := conn.ReadMessage()
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
if err := conn.WriteMessage(messageType, p); err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func New(config *common.Config) (*Core, error) {
|
||||
storage := Storage.New(config)
|
||||
core := Core{
|
||||
Config: config,
|
||||
Storage: storage,
|
||||
Receiver: Receiver.New(config, storage),
|
||||
}
|
||||
ln, err := Sammy()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ws := alice.New(wsMiddleware)
|
||||
http.Handle("/announce", ws.Then(http.HandlerFunc(core.Receiver.Announce.HttpHandler)))
|
||||
http.Handle("/a", ws.Then(http.HandlerFunc(core.Receiver.Announce.HttpHandler)))
|
||||
http.Handle("/ws/announce", ws.Then(http.HandlerFunc(core.Receiver.Announce.HttpHandler)))
|
||||
http.Handle("/ws/a", ws.Then(http.HandlerFunc(core.Receiver.Announce.HttpHandler)))
|
||||
http.Handle("/announce/ws", ws.Then(http.HandlerFunc(core.Receiver.Announce.HttpHandler)))
|
||||
http.Handle("/a/ws", ws.Then(http.HandlerFunc(core.Receiver.Announce.HttpHandler)))
|
||||
if err := http.Serve(ln, nil); err != nil { // set listen port
|
||||
return nil, err
|
||||
}
|
||||
//TODO: do it with context
|
||||
return &core, nil
|
||||
}
|
45
tracker/main.go
Normal file
45
tracker/main.go
Normal file
@ -0,0 +1,45 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
Core "github.com/eyedeekay/tracker"
|
||||
"github.com/vvampirius/retracker/core/common"
|
||||
"os"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
const VERSION = 0.2
|
||||
|
||||
func PrintRepo() {
|
||||
fmt.Fprintln(os.Stderr, "\n# https://github.com/vvampirius/retracker")
|
||||
}
|
||||
|
||||
func main() {
|
||||
flag.Usage = func() {
|
||||
fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
|
||||
flag.PrintDefaults()
|
||||
PrintRepo()
|
||||
}
|
||||
listen := flag.String("l", ":80", "Listen address:port")
|
||||
age := flag.Float64("a", 180, "Keep 'n' minutes peer in memory")
|
||||
debug := flag.Bool("d", false, "Debug mode")
|
||||
xrealip := flag.Bool("x", false, "Get RemoteAddr from X-Real-IP header")
|
||||
ver := flag.Bool("v", false, "Show version")
|
||||
flag.Parse()
|
||||
|
||||
if *ver {
|
||||
fmt.Println(VERSION)
|
||||
PrintRepo()
|
||||
syscall.Exit(0)
|
||||
}
|
||||
|
||||
config := common.Config{
|
||||
Listen: *listen,
|
||||
Debug: *debug,
|
||||
Age: *age,
|
||||
XRealIP: *xrealip,
|
||||
}
|
||||
|
||||
Core.New(&config)
|
||||
}
|
Reference in New Issue
Block a user