144 lines
4.2 KiB
Go
144 lines
4.2 KiB
Go
|
|
// enabledHosts provides functions to retrieve and refresh a list of all enabled hosts
|
|
// An enabled host is a host whose profile is not disabled
|
|
|
|
package enabledHosts
|
|
|
|
import "seekia/internal/badgerDatabase"
|
|
import "seekia/internal/helpers"
|
|
import "seekia/internal/profiles/profileStorage"
|
|
import "seekia/internal/profiles/readProfiles"
|
|
|
|
import "errors"
|
|
import "sync"
|
|
import "slices"
|
|
|
|
var enabledHostsListMutex sync.RWMutex
|
|
|
|
// This list stores all enabled hosts
|
|
// It will not necessarily be up to date
|
|
var enabledHostsList [][16]byte
|
|
|
|
// This variable stores the network type that the enabledHostsList belongs to
|
|
var enabledHostsListNetworkType byte
|
|
|
|
// This function must be called upon application startup, and then again on a regular automatic interval
|
|
// It is also used when refreshing viewedHosts
|
|
// It should also be called whenever the application network type is changed
|
|
func UpdateEnabledHostsList(networkType byte)error{
|
|
|
|
isValid := helpers.VerifyNetworkType(networkType)
|
|
if (isValid == false){
|
|
networkTypeString := helpers.ConvertByteToString(networkType)
|
|
return errors.New("UpdateEnabledHostsList called with invalid networkType: " + networkTypeString)
|
|
}
|
|
|
|
_, err := GetEnabledHostsList(false, networkType)
|
|
if (err != nil){ return err }
|
|
|
|
return nil
|
|
}
|
|
|
|
|
|
func GetNumberOfEnabledHosts(allowCache bool, networkType byte)(int, error){
|
|
|
|
isValid := helpers.VerifyNetworkType(networkType)
|
|
if (isValid == false){
|
|
networkTypeString := helpers.ConvertByteToString(networkType)
|
|
return 0, errors.New("GetNumberOfEnabledHosts called with invalid networkType: " + networkTypeString)
|
|
}
|
|
|
|
currentEnabledHostsList, err := GetEnabledHostsList(allowCache, networkType)
|
|
if (err != nil){ return 0, err }
|
|
|
|
numberOfHosts := len(currentEnabledHostsList)
|
|
|
|
return numberOfHosts, nil
|
|
}
|
|
|
|
func CheckIfHostIsEnabled(allowCache bool, hostIdentityHash [16]byte, networkType byte)(bool, error){
|
|
|
|
isValid := helpers.VerifyNetworkType(networkType)
|
|
if (isValid == false){
|
|
networkTypeString := helpers.ConvertByteToString(networkType)
|
|
return false, errors.New("CheckIfHostIsEnabled called with invalid networkType: " + networkTypeString)
|
|
}
|
|
|
|
currentEnabledHostsList, err := GetEnabledHostsList(allowCache, networkType)
|
|
if (err != nil){ return false, err }
|
|
|
|
isEnabled := slices.Contains(currentEnabledHostsList, hostIdentityHash)
|
|
|
|
return isEnabled, nil
|
|
}
|
|
|
|
//Outputs:
|
|
// -[][16]byte: List of enabled host identity hashes
|
|
// -error
|
|
func GetEnabledHostsList(allowCache bool, networkType byte)([][16]byte, error){
|
|
|
|
isValid := helpers.VerifyNetworkType(networkType)
|
|
if (isValid == false){
|
|
networkTypeString := helpers.ConvertByteToString(networkType)
|
|
return nil, errors.New("GetEnabledHostsList called with invalid networkType: " + networkTypeString)
|
|
}
|
|
|
|
if (allowCache == true){
|
|
|
|
enabledHostsListMutex.RLock()
|
|
|
|
if (enabledHostsList != nil && enabledHostsListNetworkType == networkType){
|
|
|
|
// A cache list is generated which belongs to the specified networkType
|
|
|
|
listCopy := slices.Clone(enabledHostsList)
|
|
|
|
enabledHostsListMutex.RUnlock()
|
|
|
|
return listCopy, nil
|
|
}
|
|
|
|
// We must generate a new enabled hosts cache list
|
|
|
|
enabledHostsListMutex.RUnlock()
|
|
}
|
|
|
|
hostIdentityHashesList, err := badgerDatabase.GetAllProfileIdentityHashes("Host")
|
|
if (err != nil) { return nil, err }
|
|
|
|
newEnabledHostsList := make([][16]byte, 0)
|
|
|
|
for _, identityHash := range hostIdentityHashesList{
|
|
|
|
profileExists, _, _, _, _, newestRawProfileMap, err := profileStorage.GetNewestUserProfile(identityHash, networkType)
|
|
if (err != nil) { return nil, err }
|
|
if (profileExists == false){
|
|
// Profile does not exist anymore.
|
|
// Missing entries from Identity Profiles list will be removed automatically by backgroundJobs
|
|
continue
|
|
}
|
|
|
|
profileIsDisabled, _, err := readProfiles.GetFormattedProfileAttributeFromRawProfileMap(newestRawProfileMap, "Disabled")
|
|
if (err != nil) { return nil, err }
|
|
if (profileIsDisabled == true){
|
|
continue
|
|
}
|
|
|
|
newEnabledHostsList = append(newEnabledHostsList, identityHash)
|
|
}
|
|
|
|
enabledHostsListMutex.Lock()
|
|
|
|
enabledHostsList = newEnabledHostsList
|
|
enabledHostsListNetworkType = networkType
|
|
|
|
listCopy := slices.Clone(enabledHostsList)
|
|
|
|
enabledHostsListMutex.Unlock()
|
|
|
|
return listCopy, nil
|
|
}
|
|
|
|
|
|
|
|
|