func (m *systemdUnitManager) GetUnitStates(filter pkg.Set) (map[string]*unit.UnitState, error) { // Unfortunately we need to lock for the entire operation to ensure we // have a consistent view of the hashes. Otherwise, Load/Unload // operations could mutate the hashes before we've retrieved the state // for every unit in the filter, since they won't necessarily all be // present in the initial ListUnits() call. fallback := false m.mutex.Lock() defer m.mutex.Unlock() dbusStatuses, err := m.systemd.ListUnitsByNames(filter.Values()) if err != nil { fallback = true log.Debugf("ListUnitsByNames is not implemented in your systemd version (requires at least systemd 230), fallback to ListUnits: %v", err) dbusStatuses, err = m.systemd.ListUnits() if err != nil { return nil, err } } states := make(map[string]*unit.UnitState) for _, dus := range dbusStatuses { if fallback && !filter.Contains(dus.Name) { // If filter could not be applied on DBus side, we will filter unit files here continue } us := &unit.UnitState{ LoadState: dus.LoadState, ActiveState: dus.ActiveState, SubState: dus.SubState, } if h, ok := m.hashes[dus.Name]; ok { us.UnitHash = h.String() } states[dus.Name] = us } // grab data on subscribed units that didn't show up in ListUnits in fallback mode, most // likely due to being inactive if fallback { for _, name := range filter.Values() { if _, ok := states[name]; ok { continue } us, err := m.getUnitState(name) if err != nil { return nil, err } if h, ok := m.hashes[name]; ok { us.UnitHash = h.String() } states[name] = us } } return states, nil }
func (fum *FakeUnitManager) GetUnitStates(filter pkg.Set) (map[string]*UnitState, error) { fum.RLock() defer fum.RUnlock() states := make(map[string]*UnitState) for _, name := range filter.Values() { if _, ok := fum.u[name]; ok { states[name] = &UnitState{"loaded", "active", "running", "", "", name} } } return states, nil }
func (m *systemdUnitManager) GetUnitStates(filter pkg.Set) (map[string]*unit.UnitState, error) { // Unfortunately we need to lock for the entire operation to ensure we // have a consistent view of the hashes. Otherwise, Load/Unload // operations could mutate the hashes before we've retrieved the state // for every unit in the filter, since they won't necessarily all be // present in the initial ListUnits() call. m.mutex.Lock() defer m.mutex.Unlock() dbusStatuses, err := m.systemd.ListUnits() if err != nil { return nil, err } states := make(map[string]*unit.UnitState) for _, dus := range dbusStatuses { if !filter.Contains(dus.Name) { continue } us := &unit.UnitState{ LoadState: dus.LoadState, ActiveState: dus.ActiveState, SubState: dus.SubState, } if h, ok := m.hashes[dus.Name]; ok { us.UnitHash = h.String() } states[dus.Name] = us } // grab data on subscribed units that didn't show up in ListUnits, most // likely due to being inactive for _, name := range filter.Values() { if _, ok := states[name]; ok { continue } us, err := m.getUnitState(name) if err != nil { return nil, err } if h, ok := m.hashes[name]; ok { us.UnitHash = h.String() } states[name] = us } return states, nil }