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 }