rasmus #4
58
godoor.go
58
godoor.go
@ -6,10 +6,6 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/joho/godotenv"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
|
||||||
"github.com/prometheus/client_golang/prometheus/promauto"
|
|
||||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -22,13 +18,20 @@ import (
|
|||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"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"
|
||||||
|
|
||||||
"godoor/hash"
|
"godoor/hash"
|
||||||
)
|
)
|
||||||
|
|
||||||
const wiegand_a_default = 17
|
const (
|
||||||
const wiegand_b_default = 18
|
wiegand_a_default = 17
|
||||||
const wiegand_bit_timeout = time.Millisecond * 8
|
wiegand_b_default = 18
|
||||||
const solenoid_default = 21
|
wiegand_bit_timeout = time.Millisecond * 8
|
||||||
|
solenoid_default = 21
|
||||||
|
)
|
||||||
|
|
||||||
type card struct {
|
type card struct {
|
||||||
UidHash string `json:"uid_hash"`
|
UidHash string `json:"uid_hash"`
|
||||||
@ -46,7 +49,7 @@ type ValidUids map[string]bool // bool has no meaning
|
|||||||
type Config struct {
|
type Config struct {
|
||||||
door string
|
door string
|
||||||
uidSalt string
|
uidSalt string
|
||||||
doorOpenTime int
|
doorOpenTime time.Duration
|
||||||
mock bool
|
mock bool
|
||||||
api struct {
|
api struct {
|
||||||
allowed string
|
allowed string
|
||||||
@ -86,11 +89,13 @@ var Commit = func() string {
|
|||||||
|
|
||||||
var Version string
|
var Version string
|
||||||
|
|
||||||
var config Config
|
var (
|
||||||
var globalLock sync.Mutex
|
config Config
|
||||||
var validUids ValidUids
|
globalLock sync.Mutex
|
||||||
var wiegand Wiegand
|
validUids ValidUids
|
||||||
var keepDoorOpen KeepDoorOpen
|
wiegand Wiegand
|
||||||
|
keepDoorOpen KeepDoorOpen
|
||||||
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
godoorBuildInfo = promauto.NewGaugeVec(prometheus.GaugeOpts{
|
godoorBuildInfo = promauto.NewGaugeVec(prometheus.GaugeOpts{
|
||||||
@ -153,10 +158,16 @@ func loadConfig() {
|
|||||||
config.api.swipe = os.Getenv("KDOORPI_API_SWIPE")
|
config.api.swipe = os.Getenv("KDOORPI_API_SWIPE")
|
||||||
config.api.key = os.Getenv("KDOORPI_API_KEY")
|
config.api.key = os.Getenv("KDOORPI_API_KEY")
|
||||||
config.uidSalt = os.Getenv("KDOORPI_UID_SALT")
|
config.uidSalt = os.Getenv("KDOORPI_UID_SALT")
|
||||||
config.doorOpenTime, err = strconv.Atoi(os.Getenv("KDOORPI_OPEN_TIME"))
|
|
||||||
if err != nil {
|
config.doorOpenTime = 8 * time.Second
|
||||||
config.doorOpenTime = 3
|
if doorOpenTimeStr, ok := os.LookupEnv("KDOORPI_OPEN_TIME"); ok {
|
||||||
|
if openTime, err := time.ParseDuration(doorOpenTimeStr); err != nil {
|
||||||
|
log.Printf("parsing KDOORPI_OPEN_TIME: %v, keeping default %v", err, config.doorOpenTime)
|
||||||
|
} else {
|
||||||
|
config.doorOpenTime = openTime
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_, config.mock = os.LookupEnv("KDOORPI_MOCK_HW")
|
_, config.mock = os.LookupEnv("KDOORPI_MOCK_HW")
|
||||||
config.prometheusMetricsBind = os.Getenv("KDOORPI_PROMETHEUS_METRICS_BIND")
|
config.prometheusMetricsBind = os.Getenv("KDOORPI_PROMETHEUS_METRICS_BIND")
|
||||||
if config.prometheusMetricsBind == "" {
|
if config.prometheusMetricsBind == "" {
|
||||||
@ -254,7 +265,7 @@ func OpenAndCloseDoor(w Wiegand) error {
|
|||||||
|
|
||||||
fmt.Println("Door is now open")
|
fmt.Println("Door is now open")
|
||||||
|
|
||||||
time.Sleep(time.Duration(config.doorOpenTime) * time.Second)
|
time.Sleep(config.doorOpenTime)
|
||||||
|
|
||||||
err = CloseDoor(w)
|
err = CloseDoor(w)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -290,7 +301,7 @@ func cardRunner(w Wiegand) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
//printCardId(card)
|
// printCardId(card)
|
||||||
hashedHex := hash.HashCardUid(card)
|
hashedHex := hash.HashCardUid(card)
|
||||||
log.Println(hashedHex)
|
log.Println(hashedHex)
|
||||||
|
|
||||||
@ -302,7 +313,7 @@ func cardRunner(w Wiegand) {
|
|||||||
err := sendSwipeEvent(hashedHex, ok)
|
err := sendSwipeEvent(hashedHex, ok)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
apiFailuresCount.WithLabelValues("swipe", config.api.swipe).Inc()
|
apiFailuresCount.WithLabelValues("swipe", config.api.swipe).Inc()
|
||||||
log.Println("Failed to send swipe event: %v", err)
|
log.Printf("Failed to send swipe event: %v", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@ -343,7 +354,6 @@ func ParseNextMessage(r *bufio.Reader) (string, error) {
|
|||||||
|
|
||||||
r.UnreadByte()
|
r.UnreadByte()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func waitEvents() error {
|
func waitEvents() error {
|
||||||
@ -384,9 +394,6 @@ func waitEvents() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("%v\n", resp)
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func reloadTokens() error {
|
func reloadTokens() error {
|
||||||
@ -420,7 +427,7 @@ func reloadTokens() error {
|
|||||||
validUids = make(ValidUids)
|
validUids = make(ValidUids)
|
||||||
var totalCardCount int = 0
|
var totalCardCount int = 0
|
||||||
for i, val := range cl.AllowedUids {
|
for i, val := range cl.AllowedUids {
|
||||||
//log.Printf("%d: %+v\n", i, val.Token.UidHash)
|
// log.Printf("%d: %+v\n", i, val.Token.UidHash)
|
||||||
validUids[val.Token.UidHash] = true
|
validUids[val.Token.UidHash] = true
|
||||||
totalCardCount = i
|
totalCardCount = i
|
||||||
}
|
}
|
||||||
@ -437,7 +444,6 @@ func reloadTokens() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func updateKeepOpenDoor(newKeepOpenTime time.Time) {
|
func updateKeepOpenDoor(newKeepOpenTime time.Time) {
|
||||||
|
|
||||||
// is there one active?
|
// is there one active?
|
||||||
if keepDoorOpen.timer != nil {
|
if keepDoorOpen.timer != nil {
|
||||||
keepDoorOpen.timer.Stop()
|
keepDoorOpen.timer.Stop()
|
||||||
|
@ -217,7 +217,7 @@ func (doobserver *DoorBoyServer) postKeepDoorOpen(w http.ResponseWriter, r *http
|
|||||||
rs, _ := io.ReadAll(r.Body)
|
rs, _ := io.ReadAll(r.Body)
|
||||||
parsedTime, err := time.Parse(time.RFC3339, strings.TrimSpace(string(rs)))
|
parsedTime, err := time.Parse(time.RFC3339, strings.TrimSpace(string(rs)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Error with parsing time: %v", err)
|
fmt.Printf("Error with parsing time: %v", err)
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
w.WriteHeader(http.StatusBadRequest)
|
||||||
}
|
}
|
||||||
keepOpenUntil = &parsedTime
|
keepOpenUntil = &parsedTime
|
||||||
@ -229,6 +229,9 @@ func main() {
|
|||||||
|
|
||||||
var dumpKeys []cardToken
|
var dumpKeys []cardToken
|
||||||
savedKeys, err := os.ReadFile("keys.json")
|
savedKeys, err := os.ReadFile("keys.json")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("reading saved keys from keys.json: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
err = json.Unmarshal(savedKeys, &dumpKeys)
|
err = json.Unmarshal(savedKeys, &dumpKeys)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
@ -268,7 +271,7 @@ func main() {
|
|||||||
keyLock.Lock()
|
keyLock.Lock()
|
||||||
data, err := json.Marshal(keys)
|
data, err := json.Marshal(keys)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
os.WriteFile("keys.json", data, 0600)
|
os.WriteFile("keys.json", data, 0o600)
|
||||||
log.Println("Saved keys successfully!")
|
log.Println("Saved keys successfully!")
|
||||||
}
|
}
|
||||||
keyLock.Unlock()
|
keyLock.Unlock()
|
||||||
|
Loading…
Reference in New Issue
Block a user