func (pm *PrinterManager) syncPrinters(ignorePrivet bool) error { glog.Info("Synchronizing printers, stand by") // Get current snapshot of CUPS printers. cupsPrinters, err := pm.cups.GetPrinters() if err != nil { return fmt.Errorf("Sync failed while calling GetPrinters(): %s", err) } if pm.ignoreRawPrinters { cupsPrinters, _ = lib.FilterRawPrinters(cupsPrinters) } // Augment CUPS printers with extra information from SNMP. if pm.snmp != nil { err = pm.snmp.AugmentPrinters(cupsPrinters) if err != nil { glog.Warningf("Failed to augment printers with SNMP data: %s", err) } } // Set CapsHash on all printers. for i := range cupsPrinters { h := md5.New() lib.DeepHash(cupsPrinters[i].Tags, h) cupsPrinters[i].Tags["tagshash"] = fmt.Sprintf("%x", h.Sum(nil)) h = md5.New() lib.DeepHash(cupsPrinters[i].Description, h) cupsPrinters[i].CapsHash = fmt.Sprintf("%x", h.Sum(nil)) } // Compare the snapshot to what we know currently. diffs := lib.DiffPrinters(cupsPrinters, pm.printers.GetAll()) if diffs == nil { glog.Infof("Printers are already in sync; there are %d", len(cupsPrinters)) return nil } // Update GCP. ch := make(chan lib.Printer, len(diffs)) for i := range diffs { go pm.applyDiff(&diffs[i], ch, ignorePrivet) } currentPrinters := make([]lib.Printer, 0, len(diffs)) for _ = range diffs { p := <-ch if p.Name != "" { currentPrinters = append(currentPrinters, p) } } // Update what we know. pm.printers.Refresh(currentPrinters) glog.Infof("Finished synchronizing %d printers", len(currentPrinters)) return nil }
func (pm *PrinterManager) syncPrinters() error { glog.Info("Synchronizing printers, stand by") cupsPrinters, err := pm.cups.GetPrinters() if err != nil { return fmt.Errorf("Sync failed while calling GetPrinters(): %s", err) } if pm.ignoreRawPrinters { cupsPrinters, _ = lib.FilterRawPrinters(cupsPrinters) } if pm.snmp != nil { pm.snmp.AugmentPrinters(cupsPrinters) if err != nil { glog.Warningf("Failed to augment printers with SNMP data: %s", err) } } diffs := lib.DiffPrinters(cupsPrinters, pm.gcpPrintersByGCPID.GetAll()) if diffs == nil { glog.Infof("Printers are already in sync; there are %d", len(cupsPrinters)) return nil } ch := make(chan lib.Printer, len(diffs)) for i := range diffs { go pm.applyDiff(&diffs[i], ch) } currentPrinters := make([]lib.Printer, 0, len(diffs)) for _ = range diffs { p := <-ch if p.Name != "" { currentPrinters = append(currentPrinters, p) } } pm.gcpPrintersByGCPID.Refresh(currentPrinters) glog.Infof("Finished synchronizing %d printers", len(currentPrinters)) return nil }