package reseed import ( "fmt" "io/ioutil" "log" "net/http" "net/url" "os" "path/filepath" "strings" "time" ) // Ping requests an ".su3" from another reseed server and return true if // the reseed server is alive If the reseed server is not alive, returns // false and the status of the request as an error func Ping(urlInput string) (bool, error) { if !strings.HasSuffix(urlInput, "i2pseeds.su3") { urlInput = fmt.Sprintf("%s%s", urlInput, "i2pseeds.su3") } log.Println("Pinging:", urlInput) req, err := http.NewRequest("GET", urlInput, nil) if err != nil { return false, err } req.Header.Set("User-Agent", I2pUserAgent) resp, err := http.DefaultClient.Do(req) if err != nil { return false, err } defer resp.Body.Close() if resp.StatusCode != 200 { return false, fmt.Errorf("%s", resp.Status) } return true, nil } func trimPath(s string) string { tmp := strings.ReplaceAll(s, "https://", "") tmp = strings.ReplaceAll(s, "http://", "") tmp = strings.ReplaceAll(s, "/", "") return tmp } func PingWriteContent(urlInput string) error { log.Println("Calling PWC", urlInput) date := time.Now().Format("2006-01-02") u, err := url.Parse(urlInput) if err != nil { log.Println("PWC", err) return fmt.Errorf("PingWriteContent:%s", err) } path := trimPath(u.Host) log.Println("Calling PWC path", path) BaseContentPath, _ := StableContentPath() path = filepath.Join(BaseContentPath, path+"-"+date+".ping") if _, err := os.Stat(path); err != nil { result, err := Ping(urlInput) if result { log.Printf("Ping: %s OK", urlInput) err := ioutil.WriteFile(path, []byte("Alive: Status OK"), 0o644) return err } else { log.Printf("Ping: %s %s", urlInput, err) err := ioutil.WriteFile(path, []byte("Dead: "+err.Error()), 0o644) return err } } return nil } // TODO: make this a configuration option /*var AllReseeds = []string{ "https://banana.incognet.io/", "https://i2p.novg.net/", "https://i2pseed.creativecowpat.net:8443/", "https://reseed.diva.exchange/", "https://reseed.i2pgit.org/", "https://reseed.memcpy.io/", "https://reseed.onion.im/", "https://reseed2.i2p.net/", }*/ var AllReseeds = []string{ "https://banana.incognet.io/", "https://i2p.novg.net/", "https://i2pseed.creativecowpat.net:8443/", "https://reseed-fr.i2pd.xyz/", "https://reseed-pl.i2pd.xyz/", "https://reseed.diva.exchange/", "https://reseed.i2pgit.org/", "https://reseed.memcpy.io/", "https://reseed.onion.im/", "https://reseed2.i2p.net/", "https://www2.mk16.de/", } func yday() time.Time { today := time.Now() yesterday := today.Add(-24 * time.Hour) return yesterday } var lastPing = yday() func PingEverybody() []string { if lastPing.After(yday()) { log.Println("Your ping was rate-limited") return nil } lastPing = time.Now() var nonerrs []string for _, urlInput := range AllReseeds { err := PingWriteContent(urlInput) if err == nil { nonerrs = append(nonerrs, urlInput) } else { nonerrs = append(nonerrs, err.Error()+"-"+urlInput) } } return nonerrs } // Get a list of all files ending in ping in the BaseContentPath func GetPingFiles() ([]string, error) { var files []string date := time.Now().Format("2006-01-02") BaseContentPath, _ := StableContentPath() err := filepath.Walk(BaseContentPath, func(path string, info os.FileInfo, err error) error { if err != nil { return err } if strings.HasSuffix(path, ".ping") && strings.Contains(path, date) { files = append(files, path) } return nil }) if len(files) == 0 { return nil, fmt.Errorf("No ping files found") } return files, err } func ReadOut(w http.ResponseWriter) { pinglist, err := GetPingFiles() if err == nil { fmt.Fprintf(w, "