Skip to content
Snippets Groups Projects
Commit a97e5359 authored by Malte Bauch's avatar Malte Bauch
Browse files

Merge branch 'log-system-improvement' into 'main'

Streamline Logging to be more useful for using the proto-kms

See merge request proto-kms!10
parents e0e59692 3725fa65
Branches
Tags
1 merge request!8Create a monorepo for ekms and quantumlayer
...@@ -9,17 +9,19 @@ package quantumlayer ...@@ -9,17 +9,19 @@ package quantumlayer
* transmitted to the other end. * transmitted to the other end.
* *
*/ */
import ( import (
"context" "context"
"crypto/rand" "crypto/rand"
"encoding/json" "encoding/json"
"errors" "errors"
"log" "io"
"math/big" "math/big"
"net" "net"
"sync" "sync"
"time" "time"
"github.com/sirupsen/logrus"
logi "github.com/sirupsen/logrus"
) )
type QuantumPayloadElement struct { type QuantumPayloadElement struct {
...@@ -43,7 +45,32 @@ type QuantumlayerEmuPRNG struct { ...@@ -43,7 +45,32 @@ type QuantumlayerEmuPRNG struct {
qlPeerMutex sync.Mutex qlPeerMutex sync.Mutex
} }
func NewQuantumlayerEmuPRNG() (newql *QuantumlayerEmuPRNG) { // We use our own logrus instance, as we would like to have different log levels for different parts.
var log = logrus.New()
func NewQuantumlayerEmuPRNG(logOutput io.Writer, logLevel logi.Level, logInJson bool) (newql *QuantumlayerEmuPRNG) {
/*
* Setup logging
*/
//What level
log.SetLevel(logLevel)
// Where to send log out put
log.SetOutput(logOutput)
// and plain-text (standard) or json
if !logInJson {
log.SetFormatter(&logi.TextFormatter{})
} else {
log.SetFormatter(&logi.JSONFormatter{})
}
// print code function if level is set to Trace
if logLevel == logi.TraceLevel {
log.SetReportCaller(true)
} else {
log.SetReportCaller(false)
}
// Return PRNG Quantum Layer
return &QuantumlayerEmuPRNG{ return &QuantumlayerEmuPRNG{
configured: false, configured: false,
poweron: false, poweron: false,
...@@ -77,28 +104,28 @@ func (qlemuprng *QuantumlayerEmuPRNG) Configure(localQLAddress ...string) { ...@@ -77,28 +104,28 @@ func (qlemuprng *QuantumlayerEmuPRNG) Configure(localQLAddress ...string) {
func (qlemuprng *QuantumlayerEmuPRNG) PowerOn() { func (qlemuprng *QuantumlayerEmuPRNG) PowerOn() {
if qlemuprng.configured == false { if qlemuprng.configured == false {
// nothing do here move on // nothing do here move on
log.Printf("Sorry, the quantum layer is not configured for action. You've missed Configure()") log.Errorf("QuantumlayerEmuPRNG: Sorry, the quantum layer is not configured for action. You've missed Configure()")
return return
} }
//qlemuprng.poweron = false //qlemuprng.poweron = false
log.Println("QuantumlayerEmuPRNG is powering on...charging.") log.Infof("QuantumlayerEmuPRNG: is powering on...charging.")
// serve UDP incoming // serve UDP incoming
if qlemuprng.udpSrvConn == nil { if qlemuprng.udpSrvConn == nil {
go func() { go func() {
// Get UDP server part going... // Get UDP server part going...
log.Printf("localQLAddress is %s", qlemuprng.localQLAddress) log.Debugf("QuantumlayerEmuPRNG: localQLAddress is %s", qlemuprng.localQLAddress)
// This reads random numbers from other Quantum end // This reads random numbers from other Quantum end
udpSrvPort, err := net.ResolveUDPAddr("udp", qlemuprng.localQLAddress) udpSrvPort, err := net.ResolveUDPAddr("udp", qlemuprng.localQLAddress)
if err != nil { if err != nil {
log.Fatalf("QuantumlayerEmuPRNG UDP failure: %s", err) log.Fatalf("QuantumlayerEmuPRNG: UDP failure: %s", err)
return return
} }
qlemuprng.udpSrvConn, err = net.ListenUDP("udp", udpSrvPort) qlemuprng.udpSrvConn, err = net.ListenUDP("udp", udpSrvPort)
if err != nil { if err != nil {
log.Fatalf("QuantumlayerEmuPRNG UDP failure: %s", err) log.Fatalf("QuantumlayerEmuPRNG: UDP failure: %s", err)
return return
} }
defer qlemuprng.udpSrvConn.Close() defer qlemuprng.udpSrvConn.Close()
...@@ -106,20 +133,20 @@ func (qlemuprng *QuantumlayerEmuPRNG) PowerOn() { ...@@ -106,20 +133,20 @@ func (qlemuprng *QuantumlayerEmuPRNG) PowerOn() {
// Retrieve local UDP address and store it for further actions. // Retrieve local UDP address and store it for further actions.
qlemuprng.qlLocalPort = qlemuprng.udpSrvConn.LocalAddr().(*net.UDPAddr) qlemuprng.qlLocalPort = qlemuprng.udpSrvConn.LocalAddr().(*net.UDPAddr)
log.Printf("QuantumlayerEmuPRNG: started server, waiting for incoming rands on port %s \n", qlemuprng.udpSrvConn.LocalAddr().(*net.UDPAddr).String()) log.Infof("QuantumlayerEmuPRNG: started server, waiting for incoming rands on port %s \n", qlemuprng.udpSrvConn.LocalAddr().(*net.UDPAddr).String())
inBuffer := make([]byte, 1500) inBuffer := make([]byte, 1500)
for { for {
// Buffer for reading from "Quantum link" // Buffer for reading from "Quantum link"
n, addr, err := qlemuprng.udpSrvConn.ReadFromUDP(inBuffer) n, addr, err := qlemuprng.udpSrvConn.ReadFromUDP(inBuffer)
if err != nil { if err != nil {
log.Printf("QuantumlayerEmuPRNG: Could not read from UDP: %s", err) log.Errorf("QuantumlayerEmuPRNG: Could not read from UDP: %s", err)
} else { } else {
log.Printf("QuantumlayerEmuPRNG: read %d bytes from %s\n", n, addr) log.Debugf("QuantumlayerEmuPRNG: read %d bytes from %s\n", n, addr)
// Check if sender of datagram is qlPeer // Check if sender of datagram is qlPeer
// Warning this is not checking the validity of the sender, i.e., spoofing is possible // Warning this is not checking the validity of the sender, i.e., spoofing is possible
if addr.String() == qlemuprng.qlPeer { if addr.String() == qlemuprng.qlPeer {
log.Printf("QuantumlayerEmuPRNG: Peer %s listed", addr) log.Debugf("QuantumlayerEmuPRNG: Peer %s listed", addr)
//dumb the received data into the channel and carry on //dumb the received data into the channel and carry on
// TODO/XXX: no vetting for anything // TODO/XXX: no vetting for anything
// Unmarshall out of JSON // Unmarshall out of JSON
...@@ -129,7 +156,7 @@ func (qlemuprng *QuantumlayerEmuPRNG) PowerOn() { ...@@ -129,7 +156,7 @@ func (qlemuprng *QuantumlayerEmuPRNG) PowerOn() {
qlemuprng.incomingRandNums <- inQBuffer qlemuprng.incomingRandNums <- inQBuffer
} }
} else { } else {
log.Printf("QuantumlayerEmuPRNG: Peer %s NOT listed", addr) log.Infof("QuantumlayerEmuPRNG: Peer %s NOT listed", addr)
} }
} }
} }
...@@ -143,14 +170,14 @@ func (qlemuprng *QuantumlayerEmuPRNG) PowerOn() { ...@@ -143,14 +170,14 @@ func (qlemuprng *QuantumlayerEmuPRNG) PowerOn() {
// Ready, set, go! // Ready, set, go!
qlemuprng.poweron = true qlemuprng.poweron = true
log.Println("QuantumlayerEmuPRNG is charged and powered on.") log.Infof("QuantumlayerEmuPRNG: is charged and powered on.")
} }
// Power off the quantum layer, i.e., close the communication ports for the // Power off the quantum layer, i.e., close the communication ports for the
// other quantum module // other quantum module
func (qlemuprng *QuantumlayerEmuPRNG) PowerOff() { func (qlemuprng *QuantumlayerEmuPRNG) PowerOff() {
qlemuprng.poweron = false qlemuprng.poweron = false
log.Println("QuantumlayerEmuPRNG is powered off...discharging.") log.Println("QuantumlayerEmuPRNG: is powered off...discharging.")
} }
func (qlemuprng *QuantumlayerEmuPRNG) AddPeer(addr *net.UDPAddr) { func (qlemuprng *QuantumlayerEmuPRNG) AddPeer(addr *net.UDPAddr) {
...@@ -184,15 +211,16 @@ func (qlemuprng *QuantumlayerEmuPRNG) AddPeer(addr *net.UDPAddr) { ...@@ -184,15 +211,16 @@ func (qlemuprng *QuantumlayerEmuPRNG) AddPeer(addr *net.UDPAddr) {
// XXX/TODO: error must be handled // XXX/TODO: error must be handled
jsonPayload, err := json.Marshal(qpe) jsonPayload, err := json.Marshal(qpe)
if err != nil { if err != nil {
log.Printf("json.Marshal error %s", err) log.Errorf("QuantumlayerEmuPRNG: json.Marshal error %s", err)
} }
_, _, err = qlemuprng.udpSrvConn.WriteMsgUDP(jsonPayload, nil, addr) _, _, err = qlemuprng.udpSrvConn.WriteMsgUDP(jsonPayload, nil, addr)
if err != nil { if err != nil {
log.Fatalf("WriteMsgUDPAddrPort failed: %s", err) log.Fatalf("QuantumlayerEmuPRNG: WriteMsgUDPAddrPort failed: %s", err)
} }
qlemuprng.outgoingRandNums <- qpe qlemuprng.outgoingRandNums <- qpe
} }
// TODO: This sleep timer has to replaced by something for clever.
time.Sleep(5 * time.Second) time.Sleep(5 * time.Second)
} }
} }
...@@ -294,7 +322,7 @@ func (store *NumberStore) GetBatch() (batch []byte) { ...@@ -294,7 +322,7 @@ func (store *NumberStore) GetBatch() (batch []byte) {
defer store.mu.Unlock() defer store.mu.Unlock()
if store.topOfStorage != 0 { if store.topOfStorage != 0 {
log.Println("Have Storage in my belly") log.Debugf("QuantumlayerEmuPRNG: Have Storage in my belly")
} }
// prepare to return full batch of numbers // prepare to return full batch of numbers
batchReturn := make([]byte, store.topOfStorage) batchReturn := make([]byte, store.topOfStorage)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment