Checkpoint 2
This commit is contained in:
149
godoor.go
149
godoor.go
@@ -1,6 +1,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
@@ -9,6 +10,8 @@ import (
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
"sync"
|
||||
"syscall"
|
||||
)
|
||||
import "time"
|
||||
@@ -37,6 +40,7 @@ type ValidUids map[string]bool // bool has no meaning
|
||||
type Config struct {
|
||||
door string
|
||||
uid_salt string
|
||||
mock string
|
||||
api struct {
|
||||
allowed string
|
||||
longpoll string
|
||||
@@ -46,6 +50,9 @@ type Config struct {
|
||||
}
|
||||
|
||||
var config Config
|
||||
var globalLock sync.Mutex
|
||||
var validUids ValidUids
|
||||
var wiegand Wiegand
|
||||
|
||||
func main() {
|
||||
|
||||
@@ -60,16 +67,31 @@ func main() {
|
||||
config.api.swipe = os.Getenv("KDOORPI_API_SWIPE")
|
||||
config.api.key = os.Getenv("KDOORPI_API_KEY")
|
||||
config.uid_salt = os.Getenv("KDOORPI_UID_SALT")
|
||||
config.mock = os.Getenv("KDOORPI_MOCK_HW")
|
||||
|
||||
//wiegand := WiegandSetup(wiegand_a, wiegand_b, wiegand_bit_timeout, solenoid)
|
||||
if config.mock == "true" {
|
||||
wiegand = &WiegandMock{}
|
||||
} else {
|
||||
wiegand = WiegandSetup(wiegand_a, wiegand_b, wiegand_bit_timeout, solenoid)
|
||||
}
|
||||
|
||||
http.DefaultClient.Timeout = 60
|
||||
http.DefaultClient.Timeout = 120 * time.Second
|
||||
|
||||
reloadTokens()
|
||||
for {
|
||||
err := reloadTokens()
|
||||
if err == nil {
|
||||
break
|
||||
}
|
||||
time.Sleep(10 * time.Second)
|
||||
}
|
||||
|
||||
//go wiegand.cardRunner(validUids)
|
||||
go cardRunner(wiegand)
|
||||
|
||||
waitEvents()
|
||||
go func() {
|
||||
for {
|
||||
waitEvents()
|
||||
}
|
||||
}()
|
||||
|
||||
fmt.Printf("Sleeping\n")
|
||||
|
||||
@@ -79,36 +101,101 @@ func main() {
|
||||
// cleanup
|
||||
}
|
||||
|
||||
func waitEvents() {
|
||||
req, err := http.NewRequest(http.MethodGet, config.api.longpoll, nil)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
req.Header.Add("KEY", config.api.key)
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fmt.Printf("%v\n", resp)
|
||||
func cardRunner(w Wiegand) {
|
||||
for {
|
||||
card, err := w.GetCardUid()
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
_, err = io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
printCardId(card)
|
||||
hashedHex := hashCardUid(card)
|
||||
fmt.Println(hashedHex)
|
||||
|
||||
fmt.Printf("%v\n", resp)
|
||||
globalLock.Lock()
|
||||
ok := validUids[hashedHex]
|
||||
globalLock.Unlock()
|
||||
if ok {
|
||||
fmt.Println("Opening door")
|
||||
w.OpenDoor()
|
||||
} else {
|
||||
fmt.Println("Unknown card")
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
func ParseNextMessage(r *bufio.Reader) (string, error) {
|
||||
var message string
|
||||
|
||||
for {
|
||||
s, err := r.ReadString('\n')
|
||||
if err != nil {
|
||||
return message, err
|
||||
}
|
||||
|
||||
message = message + s
|
||||
nextBytes, err := r.ReadByte()
|
||||
if err != nil {
|
||||
return message, err
|
||||
}
|
||||
|
||||
if nextBytes == '\n' {
|
||||
return message, nil
|
||||
}
|
||||
|
||||
r.UnreadByte()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func reloadTokens() {
|
||||
req, err := http.NewRequest(http.MethodGet, config.api.allowed, nil)
|
||||
func waitEvents() error {
|
||||
req, err := http.NewRequest(http.MethodGet, config.api.longpoll, nil)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return err
|
||||
}
|
||||
req.Header.Add("KEY", config.api.key)
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return err
|
||||
}
|
||||
fmt.Printf("%v\n", resp)
|
||||
|
||||
reader := bufio.NewReader(resp.Body)
|
||||
for {
|
||||
msg, err := ParseNextMessage(reader)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, line := range strings.Split(msg, "\n") {
|
||||
data, found_data := strings.CutPrefix(line, "data:")
|
||||
if !found_data {
|
||||
continue
|
||||
}
|
||||
fmt.Printf("got server data: %q\n", data)
|
||||
if strings.TrimSpace(data) == config.door {
|
||||
wiegand.OpenDoor()
|
||||
}
|
||||
|
||||
go reloadTokens()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fmt.Printf("%v\n", resp)
|
||||
return nil
|
||||
}
|
||||
|
||||
func reloadTokens() error {
|
||||
req, err := http.NewRequest(http.MethodGet, config.api.allowed, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
req.Header.Add("KEY", config.api.key)
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Printf("%v\n", resp)
|
||||
|
||||
@@ -116,17 +203,21 @@ func reloadTokens() {
|
||||
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return err
|
||||
}
|
||||
|
||||
err = json.Unmarshal(body, &cl)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return err
|
||||
}
|
||||
|
||||
validUids := make(ValidUids)
|
||||
globalLock.Lock()
|
||||
defer globalLock.Unlock()
|
||||
validUids = make(ValidUids)
|
||||
for i, val := range cl.AllowedUids {
|
||||
fmt.Printf("%d: %+v\n", i, val.Token.UidHash)
|
||||
validUids[val.Token.UidHash] = false
|
||||
validUids[val.Token.UidHash] = true
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user