code: func requestHostName(cl *gpgchallenge.Client) error {
  	if err := cl.Challenge(camliNetDNS); err != nil {
  		return err
  	}
  
  	if env.OnGCE() {
  		if err := gce.SetInstanceHostname(camliNetHostName); err != nil {
  			return fmt.Errorf("error setting instance camlistore-hostname: %v", err)
  		}
  	}
  
  	var repeatChallengeFn func()
  	repeatChallengeFn = func() {
  		if err := cl.Challenge(camliNetDNS); err != nil {
  			log.Printf("error with hourly DNS challenge: %v", err)
  		}
  		time.AfterFunc(time.Hour, repeatChallengeFn)
  	}
  	time.AfterFunc(time.Hour, repeatChallengeFn)
  	return nil
  }
docs: // requestHostName performs the GPG challenge to register/obtain a name in the
  // camlistore.net domain. The acquired name should be "<gpgKeyId>.camlistore.net",
  // where <gpgKeyId> is the short form (8 trailing chars) of Perkeep's keyId.
  // It also starts a goroutine that will rerun the challenge every hour, to keep
  // the camlistore.net DNS server up to date.