func Start() { log.Infof("Starting client on Node: %s", config.Serial()) conn, err := ninja.Connect("client") if err != nil { log.Fatalf("Failed to connect to sphere: %s", err) } client := &client{ conn: conn, led: conn.GetServiceClient("$home/led-controller"), foundMaster: make(chan bool), } if !config.IsPaired() { err = UpdateSphereAvahiService(false, false) if err != nil { log.Fatalf("Failed to update avahi service: %s", err) } } client.updatePairingLight("black", false) conn.SubscribeRaw("$sphere/bridge/status", client.onBridgeStatus) client.start() log.Infof("Client started.") err = UpdateSphereAvahiService(true, client.master) if err != nil { log.Fatalf("Failed to update avahi service: %s", err) } if runtime.GOOS == "linux" { go func() { err := client.ensureTimezoneIsSet() if err != nil { log.Warningf("Could not save timezone: %s", err) } }() } listenToSiteUpdates(conn) }
func (c *client) start() { if !config.IsPaired() { log.Infof("Client is unpaired. Attempting to pair.") if err := c.pair(); err != nil { log.Fatalf("An error occurred while pairing. Restarting. error: %s", err) } log.Infof("Pairing was successful.") // We reload the config so the creds can be picked up config.MustRefresh() if !config.IsPaired() { log.Fatalf("Pairing appeared successful, but I did not get the credentials. Restarting.") } } log.Infof("Client is paired. User: %s", config.MustString("userId")) if !config.NoCloud() { mesh, err := refreshMeshInfo() if err == errorUnauthorised { log.Warningf("UNAUTHORISED! Unpairing.") c.unpair() return } if err != nil { log.Warningf("Failed to refresh mesh info: %s", err) } else { log.Debugf("Got mesh info: %+v", mesh) } config.MustRefresh() if !config.HasString("masterNodeId") { log.Warningf("We don't have any mesh information. Which is unlikely. But we can't do anything without it, so restarting client.") time.Sleep(time.Second * 10) os.Exit(0) } } if config.MustString("masterNodeId") == config.Serial() { log.Infof("I am the master, starting HomeCloud.") cmd := exec.Command("start", "sphere-homecloud") cmd.Output() go c.exportNodeDevice() c.master = true } else { log.Infof("I am a slave. The master is %s", config.MustString("masterNodeId")) // TODO: Remove this when we are running drivers on slaves cmd := exec.Command("stop", "sphere-director") cmd.Output() c.masterReceiveTimeout = time.AfterFunc(orphanTimeout, func() { c.setOrphaned() }) } go func() { log.Infof("Starting search for peers") for { c.findPeers() time.Sleep(time.Second * 30) } }() }