107 lines
2.1 KiB
Go
Executable File
107 lines
2.1 KiB
Go
Executable File
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"local/jbtserve/jbt"
|
|
"local/natsc"
|
|
"local/system/sysconf"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"os/signal"
|
|
"regexp"
|
|
"syscall"
|
|
"time"
|
|
)
|
|
|
|
func main() {
|
|
exit := make(chan bool)
|
|
config := sysconf.Get("vpntorfeed")
|
|
go jbt.RegisterDeregister(config.Name, config.Port, exit)
|
|
log.Print("Register attempted")
|
|
|
|
// get from nats
|
|
go func() {
|
|
client := &http.Client{Timeout: time.Second * 30}
|
|
sub, err := natsc.NewSubscriber(config.DB)
|
|
if err != nil {
|
|
<-exit
|
|
panic(err)
|
|
}
|
|
defer sub.Close()
|
|
ch, err := sub.Subscription()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
for msg := range ch {
|
|
log.Printf("Topic %s received: %s\n", config.DB, msg)
|
|
err := doReq(client, msg)
|
|
if err != nil {
|
|
log.Print(err)
|
|
}
|
|
}
|
|
}()
|
|
//magnets <- "magnet:?xt=urn:btih:64b2b05f61d2b9ef3213fce9860fb45c844d77fb&dn=checkmyiptorrent&tr=http%3A%2F%2F34.204.227.31%2Fcheckmytorrentipaddress.php"
|
|
|
|
sigc := make(chan os.Signal)
|
|
signal.Notify(sigc,
|
|
syscall.SIGINT,
|
|
)
|
|
<-sigc
|
|
<-exit
|
|
select {
|
|
case <-exit:
|
|
case <-time.After(time.Second * 10):
|
|
}
|
|
log.Print("Exit received")
|
|
}
|
|
|
|
func getSessionID() string {
|
|
config := sysconf.Get("vpntorfeed")
|
|
body, err := http.Get(config.IP2)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return fmt.Sprintf("%v", body.Header.Get(config.Pub))
|
|
}
|
|
|
|
func buildReq(sessionID string) *http.Request {
|
|
config := sysconf.Get("vpntorfeed")
|
|
req, _ := http.NewRequest("POST", config.IP2, nil)
|
|
req.Header.Add(config.Pub, sessionID)
|
|
return req
|
|
}
|
|
|
|
type noopCloser struct {
|
|
io.Reader
|
|
}
|
|
|
|
func (noopCloser) Close() error { return nil }
|
|
|
|
func doReq(client *http.Client, magnet string) error {
|
|
assert := regexp.MustCompile("^magnet:.xt")
|
|
if !assert.MatchString(magnet) {
|
|
return errors.New("not a magnet")
|
|
}
|
|
|
|
sessionID := getSessionID()
|
|
request := buildReq(sessionID)
|
|
buf := bytes.NewBufferString("{\"method\":\"torrent-add\", \"arguments\":{\"filename\":\"" + magnet + "\"}}")
|
|
request.Body = noopCloser{buf}
|
|
|
|
resp, err := client.Do(request)
|
|
defer resp.Body.Close()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
log.Print(resp.StatusCode, magnet)
|
|
if resp.StatusCode != 200 {
|
|
return errors.New("err failed request")
|
|
}
|
|
return nil
|
|
}
|