// Lookup returns the list of addresses where the given device is available; // direct, and via relays. func (c *globalClient) Lookup(device protocol.DeviceID) (direct []string, relays []Relay, err error) { qURL, err := url.Parse(c.server) if err != nil { return nil, nil, err } q := qURL.Query() q.Set("device", device.String()) qURL.RawQuery = q.Encode() resp, err := c.queryClient.Get(qURL.String()) if err != nil { l.Debugln("globalClient.Lookup", qURL, err) return nil, nil, err } if resp.StatusCode != 200 { resp.Body.Close() l.Debugln("globalClient.Lookup", qURL, resp.Status) err := errors.New(resp.Status) if secs, atoiErr := strconv.Atoi(resp.Header.Get("Retry-After")); atoiErr == nil && secs > 0 { err = lookupError{ error: err, cacheFor: time.Duration(secs) * time.Second, } } return nil, nil, err } var ann announcement err = json.NewDecoder(resp.Body).Decode(&ann) resp.Body.Close() return ann.Direct, ann.Relays, err }
func withDetailsMiddleware(id protocol.DeviceID, h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("X-Syncthing-Version", Version) w.Header().Set("X-Syncthing-ID", id.String()) h.ServeHTTP(w, r) }) }
func (c *localClient) registerDevice(src net.Addr, device Device) bool { var id protocol.DeviceID copy(id[:], device.ID) // Remember whether we already had a valid cache entry for this device. ce, existsAlready := c.Get(id) isNewDevice := !existsAlready || time.Since(ce.when) > CacheLifeTime // Any empty or unspecified addresses should be set to the source address // of the announcement. We also skip any addresses we can't parse. l.Debugln("discover: Registering addresses for", id) var validAddresses []string for _, addr := range device.Addresses { u, err := url.Parse(addr.URL) if err != nil { continue } tcpAddr, err := net.ResolveTCPAddr("tcp", u.Host) if err != nil { continue } if len(tcpAddr.IP) == 0 || tcpAddr.IP.IsUnspecified() { host, _, err := net.SplitHostPort(src.String()) if err != nil { continue } u.Host = net.JoinHostPort(host, strconv.Itoa(tcpAddr.Port)) l.Debugf("discover: Reconstructed URL is %#v", u) validAddresses = append(validAddresses, u.String()) l.Debugf("discover: Replaced address %v in %s to get %s", tcpAddr.IP, addr.URL, u.String()) } else { validAddresses = append(validAddresses, addr.URL) l.Debugf("discover: Accepted address %s verbatim", addr.URL) } } c.Set(id, CacheEntry{ Direct: validAddresses, Relays: device.Relays, when: time.Now(), found: true, }) if isNewDevice { events.Default.Log(events.DeviceDiscovered, map[string]interface{}{ "device": id.String(), "addrs": validAddresses, "relays": device.Relays, }) } return isNewDevice }
func (p *Process) ResumeDevice(dev protocol.DeviceID) error { _, err := p.Post("/rest/system/resume?device="+dev.String(), nil) return err }