refactor: flatten hash updates
This commit is contained in:
104
godoor.go
104
godoor.go
@@ -18,7 +18,6 @@ import (
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/joho/godotenv"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/client_golang/prometheus/promauto"
|
||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||
@@ -33,18 +32,12 @@ const (
|
||||
solenoid_default = 21
|
||||
)
|
||||
|
||||
type card struct {
|
||||
UidHash string `json:"uid_hash"`
|
||||
}
|
||||
|
||||
type cardList struct {
|
||||
AllowedUids []struct {
|
||||
Token card `json:"token"`
|
||||
} `json:"allowed_uids"`
|
||||
type upstreamUpdate struct {
|
||||
AllowedHashes []string `json:"allowed_hashes"`
|
||||
KeepOpenUntil *time.Time `json:"keep_open_until,omitempty"`
|
||||
}
|
||||
|
||||
type ValidUids map[string]bool // bool has no meaning
|
||||
type ValidHashesT map[string]bool // bool has no meaning
|
||||
|
||||
type Config struct {
|
||||
door string
|
||||
@@ -90,11 +83,11 @@ var Commit = func() string {
|
||||
var Version string
|
||||
|
||||
var (
|
||||
config Config
|
||||
globalLock sync.Mutex
|
||||
validUids ValidUids
|
||||
wiegand Wiegand
|
||||
keepDoorOpen KeepDoorOpen
|
||||
config Config
|
||||
VALID_HASHES_LOCK sync.Mutex
|
||||
VALID_HASHES = make(ValidHashesT)
|
||||
wiegand Wiegand
|
||||
keepDoorOpen KeepDoorOpen
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -130,6 +123,7 @@ func main() {
|
||||
defer cancel()
|
||||
|
||||
loadConfig()
|
||||
log.Printf("Door name: %s\n", config.door)
|
||||
|
||||
godoorBuildInfo.WithLabelValues(Version, Commit).Set(1)
|
||||
|
||||
@@ -146,12 +140,6 @@ func main() {
|
||||
func loadConfig() {
|
||||
var err error
|
||||
|
||||
log.Println("Loading .env config")
|
||||
err = godotenv.Load()
|
||||
if err != nil {
|
||||
log.Println("Failed to load .env config, using internal defaults")
|
||||
}
|
||||
|
||||
config.door = os.Getenv("KDOORPI_DOOR")
|
||||
config.api.allowed = os.Getenv("KDOORPI_API_ALLOWED")
|
||||
config.api.longpoll = os.Getenv("KDOORPI_API_LONGPOLL")
|
||||
@@ -189,8 +177,6 @@ func loadConfig() {
|
||||
}
|
||||
|
||||
func setup(ctx context.Context) {
|
||||
log.Println("Started Setup")
|
||||
|
||||
if config.mock {
|
||||
log.Println("MOCK mode enabled")
|
||||
if config.door == "" {
|
||||
@@ -208,7 +194,7 @@ func setup(ctx context.Context) {
|
||||
|
||||
for {
|
||||
log.Println("Start initial token population")
|
||||
err := reloadTokens()
|
||||
err := reloadInfo()
|
||||
if err == nil {
|
||||
break
|
||||
}
|
||||
@@ -230,9 +216,9 @@ func setup(ctx context.Context) {
|
||||
}
|
||||
time.Sleep(1 * time.Second)
|
||||
go func() {
|
||||
err := reloadTokens()
|
||||
err := reloadInfo()
|
||||
if err != nil {
|
||||
log.Printf("ReloadTokens failed: %q", err)
|
||||
log.Printf("reloadTokens failed: %q", err)
|
||||
apiFailuresCount.WithLabelValues("allowed", config.api.allowed).Inc()
|
||||
}
|
||||
}()
|
||||
@@ -325,9 +311,9 @@ func cardRunner(w Wiegand) {
|
||||
hashedHex := hash.HashCardUid(card)
|
||||
log.Println(hashedHex)
|
||||
|
||||
globalLock.Lock()
|
||||
ok := validUids[hashedHex]
|
||||
globalLock.Unlock()
|
||||
VALID_HASHES_LOCK.Lock()
|
||||
ok := VALID_HASHES[hashedHex]
|
||||
VALID_HASHES_LOCK.Unlock()
|
||||
|
||||
go func() {
|
||||
err := sendSwipeEvent(hashedHex, ok)
|
||||
@@ -416,12 +402,13 @@ func waitEvents() error {
|
||||
}
|
||||
}
|
||||
|
||||
func reloadTokens() error {
|
||||
func reloadInfo() error {
|
||||
req, err := http.NewRequest(http.MethodGet, config.api.allowed, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
req.Header.Add("KEY", config.api.key)
|
||||
req.Header.Add("DOOR_NAME", config.door)
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -430,32 +417,35 @@ func reloadTokens() error {
|
||||
log.Printf("%v\n", resp)
|
||||
}
|
||||
|
||||
var cl cardList
|
||||
var info upstreamUpdate
|
||||
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = json.Unmarshal(body, &cl)
|
||||
err = json.Unmarshal(body, &info)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
globalLock.Lock()
|
||||
defer globalLock.Unlock()
|
||||
validUids = make(ValidUids)
|
||||
var totalCardCount int = 0
|
||||
for i, val := range cl.AllowedUids {
|
||||
// log.Printf("%d: %+v\n", i, val.Token.UidHash)
|
||||
validUids[val.Token.UidHash] = true
|
||||
totalCardCount = i
|
||||
// Update Allowed hashes
|
||||
validHashesPre := make(ValidHashesT)
|
||||
for _, hash := range info.AllowedHashes {
|
||||
validHashesPre[hash] = true
|
||||
}
|
||||
log.Printf("Got %d cards from server", totalCardCount)
|
||||
nrCardsInAllowList.Set(float64(totalCardCount))
|
||||
|
||||
if cl.KeepOpenUntil != nil {
|
||||
updateKeepOpenDoor(*cl.KeepOpenUntil)
|
||||
VALID_HASHES_LOCK.Lock()
|
||||
VALID_HASHES = validHashesPre
|
||||
VALID_HASHES_LOCK.Unlock()
|
||||
|
||||
log.Printf("Got %d cards from server", len(info.AllowedHashes))
|
||||
nrCardsInAllowList.Set(float64(len(info.AllowedHashes)))
|
||||
|
||||
// Update Keep open
|
||||
|
||||
if info.KeepOpenUntil != nil {
|
||||
updateKeepOpenDoor(*info.KeepOpenUntil)
|
||||
}
|
||||
|
||||
lastSyncTimestamp.SetToCurrentTime()
|
||||
@@ -463,32 +453,6 @@ func reloadTokens() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func updateKeepOpenDoor(newKeepOpenTime time.Time) {
|
||||
// is there one active?
|
||||
if keepDoorOpen.timer != nil {
|
||||
keepDoorOpen.timer.Stop()
|
||||
keepDoorOpen = KeepDoorOpen{}
|
||||
}
|
||||
|
||||
if newKeepOpenTime.After(time.Now()) {
|
||||
log.Printf("Keeping door open until %v", newKeepOpenTime)
|
||||
OpenDoor(wiegand)
|
||||
timer := time.AfterFunc(time.Until(newKeepOpenTime), handleKeepDoorOpenCloseCleanup)
|
||||
keepDoorOpen = KeepDoorOpen{
|
||||
timer: timer,
|
||||
until: newKeepOpenTime,
|
||||
}
|
||||
} else {
|
||||
CloseDoor(wiegand)
|
||||
}
|
||||
}
|
||||
|
||||
func handleKeepDoorOpenCloseCleanup() {
|
||||
fmt.Println("Keep door open time is reached!")
|
||||
CloseDoor(wiegand)
|
||||
keepDoorOpen = KeepDoorOpen{}
|
||||
}
|
||||
|
||||
func sendSwipeEvent(cardUidHash string, success bool) error {
|
||||
swipeEvent := map[string]any{
|
||||
"uid_hash": cardUidHash,
|
||||
|
||||
Reference in New Issue
Block a user