switched to scribble as database

This commit is contained in:
2018-08-18 23:39:54 +02:00
parent eb0a70d87d
commit 010f7a89fb
2 changed files with 45 additions and 38 deletions

77
ledd.go
View File

@@ -2,8 +2,9 @@ package main
import ( import (
"encoding/binary" "encoding/binary"
"gopkg.in/mgo.v2" "encoding/json"
"gopkg.in/mgo.v2/bson" "github.com/nanobox-io/golang-scribble"
"math"
"net" "net"
"os" "os"
"os/signal" "os/signal"
@@ -27,7 +28,7 @@ const LOG_CLIENTS = "CH"
// STRUCTS // STRUCTS
type Config struct { type Config struct {
Name string Name string
Daemon struct { Daemon struct {
Frontend struct { Frontend struct {
Host string Host string
@@ -92,11 +93,11 @@ type LEDManager struct {
// GLOBAL VARS // GLOBAL VARS
var log = logging.MustGetLogger("LedD") var log = logging.MustGetLogger("LedD")
var backManager = BackendManager{} var backManager BackendManager
var clientManager = ClientManager{} var clientManager ClientManager
var ledManager = LEDManager{} var ledManager LEDManager
var LEDCollection = &mgo.Collection{} var db *scribble.Driver
var config = Config{} var config Config
// SOCKET SETUP // SOCKET SETUP
@@ -141,20 +142,30 @@ func (manager *LEDManager) start() {
} }
if _, ok := manager.leds[led.Name]; ok { if _, ok := manager.leds[led.Name]; ok {
log.Warningf("[%s] Can't add LED: already existent! (%s)", LOG_CLIENTS, led.Name) log.Warningf("[%s] Can't add LED: already in LEDM! (%s)", LOG_CLIENTS, led.Name)
continue continue
} }
var dbLED LED
err := db.Read("led", led.Name, &dbLED)
if err == nil {
// log.Warningf("[%s] LED already in DB! (%s)", LOG_CLIENTS, led.Name)
} else if os.IsNotExist(err) {
err = db.Write("led", led.Name, led)
if err != nil {
log.Warning("[%s] Error while adding LED to database: %s", LOG_BACKEND, err)
}
} else {
log.Warning("[%s] Error while checking database for LED: %s", LOG_BACKEND, err)
}
manager.leds[led.Name] = led manager.leds[led.Name] = led
go manager.color(led) go manager.color(led)
err := LEDCollection.Insert(led)
if err != nil {
log.Warning("[%s] Error while adding LED to database: %s", LOG_BACKEND, err)
}
case led := <-manager.remove: case led := <-manager.remove:
if _, ok := manager.leds[led.Name]; ok { if _, ok := manager.leds[led.Name]; ok {
log.Debugf("[%s] Request to remove %s", led.Backend, led.Name) log.Debugf("[%s] Request to remove %s", led.Backend, led.Name)
LEDCollection.RemoveAll(bson.M{"name": led.Name}) err := db.Delete("led", led.Name)
check(err)
delete(manager.leds, led.Name) delete(manager.leds, led.Name)
} }
case color := <-manager.broadcast: case color := <-manager.broadcast:
@@ -180,9 +191,12 @@ func (manager *LEDManager) color(led *LED) {
cMap := make(map[int32]int32) cMap := make(map[int32]int32)
if !color.IsValid() { if !color.IsValid() {
log.Warningf("[%s] Got invalid HCL->RGB color, clamping!", led.Name)
color = color.Clamped() color = color.Clamped()
} }
log.Debugf("[%s] New color: \x1b[38;2;%d;%d;%dm%s\x1b[0m", led.Name, int(math.Round(color.R*255)), int(math.Round(color.G*255)), int(math.Round(color.B*255)), color.Hex())
cMap[led.Channel[0]] = int32(color.R * float64(backend.resolution)) cMap[led.Channel[0]] = int32(color.R * float64(backend.resolution))
cMap[led.Channel[1]] = int32(color.G * float64(backend.resolution)) cMap[led.Channel[1]] = int32(color.G * float64(backend.resolution))
cMap[led.Channel[2]] = int32(color.B * float64(backend.resolution)) cMap[led.Channel[2]] = int32(color.B * float64(backend.resolution))
@@ -391,10 +405,8 @@ func (manager *ClientManager) receive(client *Client) {
break break
} }
if length > 0 { if length > 0 {
//log.Debugf("[%s] Read %d bytes", client.socket.RemoteAddr(), length)
for i := 0; i < length; { for i := 0; i < length; {
msgLen := int(binary.BigEndian.Uint32(message[i:i+4])) msgLen := int(binary.BigEndian.Uint32(message[i : i+4]))
// log.Debugf("[%s] Reading protobuf after %d (len=%d)", client.socket.RemoteAddr(), i+4, msgLen) // log.Debugf("[%s] Reading protobuf after %d (len=%d)", client.socket.RemoteAddr(), i+4, msgLen)
@@ -437,14 +449,14 @@ func (manager *ClientManager) receive(client *Client) {
break break
} }
nLED := &LED{ nLED := LED{
Name: msg.MAddLed.Name, Name: msg.MAddLed.Name,
Channel: msg.MAddLed.Channel, Channel: msg.MAddLed.Channel,
Backend: backend.name, Backend: backend.name,
color: make(chan colorful.Color, 20), color: make(chan colorful.Color, 20),
} }
ledManager.add <- nLED ledManager.add <- &nLED
case *ledd.ClientWrapperMessage_MSetLed: case *ledd.ClientWrapperMessage_MSetLed:
leds := clientMsg.Leds leds := clientMsg.Leds
@@ -530,7 +542,6 @@ func prepareProtobuf(data []byte) []byte {
} }
// MAIN // MAIN
func main() { func main() {
killSignals := make(chan os.Signal, 1) killSignals := make(chan os.Signal, 1)
signal.Notify(killSignals, syscall.SIGINT, syscall.SIGTERM) signal.Notify(killSignals, syscall.SIGINT, syscall.SIGTERM)
@@ -543,11 +554,8 @@ func main() {
err = yaml.Unmarshal(content, &config) err = yaml.Unmarshal(content, &config)
check(err) check(err)
session, err := mgo.Dial(fmt.Sprintf("%s:%d", config.Mongodb.Host, config.Mongodb.Port)) db, err = scribble.New("db", nil)
check(err) check(err)
defer session.Close()
LEDCollection = session.DB(config.Mongodb.Database).C("led")
backManager = BackendManager{ backManager = BackendManager{
backends: make(map[string]*Backend), backends: make(map[string]*Backend),
@@ -555,7 +563,6 @@ func main() {
register: make(chan *Backend, 10), register: make(chan *Backend, 10),
unregister: make(chan *Backend, 10), unregister: make(chan *Backend, 10),
} }
go backManager.start() go backManager.start()
clientManager = ClientManager{ clientManager = ClientManager{
@@ -564,7 +571,6 @@ func main() {
register: make(chan *Client, 10), register: make(chan *Client, 10),
unregister: make(chan *Client, 10), unregister: make(chan *Client, 10),
} }
go clientManager.start() go clientManager.start()
ledManager = LEDManager{ ledManager = LEDManager{
@@ -573,17 +579,22 @@ func main() {
add: make(chan *LED, 10), add: make(chan *LED, 10),
remove: make(chan *LED, 10), remove: make(chan *LED, 10),
} }
go ledManager.start() go ledManager.start()
var dbLEDs = make([]LED, 0) leds, err := db.ReadAll("led")
err = LEDCollection.Find(nil).All(&dbLEDs) if os.IsNotExist(err) {
if err != nil { log.Infof("No DB found.")
log.Notice("Failed to load LEDs from db. If there should be LEDs, check db connection") } else {
check(err)
} }
for _, l := range dbLEDs { for _, ledJson := range leds {
ledManager.add <- &l led := LED{}
err = json.Unmarshal([]byte(ledJson), &led)
check(err)
led.color = make(chan colorful.Color, 20)
ledManager.add <- &led
} }
backendThread, err := setupSocket(config.Daemon.Backend.Host, config.Daemon.Backend.Port, LOG_BACKEND, true) backendThread, err := setupSocket(config.Daemon.Backend.Host, config.Daemon.Backend.Port, LOG_BACKEND, true)

View File

@@ -5,8 +5,4 @@ daemon:
port: 5635 port: 5635
backend: backend:
host: "" host: ""
port: 5640 port: 5640
mongodb:
host: "127.0.0.1"
port: 27017
database: "ledd"