diff --git a/go.mod b/go.mod index 67f5f869e3044817cc3706720a863c2e74a1aeaf..8628f46fafb45b308fa95a0247ffe2eda56ed629 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.20 require ( github.com/google/uuid v1.3.0 + github.com/sirupsen/logrus v1.9.3 google.golang.org/grpc v1.56.2 google.golang.org/protobuf v1.31.0 ) diff --git a/go.sum b/go.sum index dd5cac2ad34df0f5e7bdbd392eb30bfea2ded46b..d03b5e77e82b5bd48952a6ba0acdbdf4d461bc2c 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,6 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= @@ -5,8 +8,16 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= @@ -20,3 +31,6 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/kms/kms-keystore.go b/kms/kms-keystore.go index 6828a08b38774a1ebff07afa668aeb2595ac5a0e..c3741054388084247fd318fac25f3de08bbe63a4 100644 --- a/kms/kms-keystore.go +++ b/kms/kms-keystore.go @@ -3,9 +3,10 @@ package kms import ( "errors" "fmt" - "log" "sync" + log "github.com/sirupsen/logrus" + "code.fbi.h-da.de/danet/proto-kms/quantumlayer" ) @@ -36,7 +37,7 @@ func (ks *kmsKeyStore) addKey(bulkKeyId int64, keyToadd []byte) { defer ks.keyStoreMutex.Unlock() // test for collisions if _, notThere := ks.keyStore[newKeyElement.keyID]; notThere { - log.Printf("Whop: addKey collission of key id %s for bulkKeyID %d", newKeyElement.keyID, bulkKeyId) + log.Errorf("Whop: addKey collission of key id %s for bulkKeyID %d", newKeyElement.keyID, bulkKeyId) return } // ok to add diff --git a/kms/kms.go b/kms/kms.go index 8c21b44209244141a0c3ab011ddd2755a426c8c7..3b274eb2305c122782258bb1f8989ce0719d4cb7 100644 --- a/kms/kms.go +++ b/kms/kms.go @@ -7,10 +7,12 @@ package kms import ( "crypto/rand" "encoding/binary" - "log" + "io" "sync" "time" + log "github.com/sirupsen/logrus" + pbETSI "code.fbi.h-da.de/danet/proto-kms/api/gen/proto/go/kmsetsi" pbIC "code.fbi.h-da.de/danet/proto-kms/api/gen/proto/go/kmsintercom" "code.fbi.h-da.de/danet/proto-kms/quantumlayer" @@ -60,7 +62,27 @@ type QuantumElement struct { keyStoreRemote *kmsKeyStore // the keys th remote entity (peer) has produced and are ready to use } -func NewEKMS(kmsName string, kmsUUID uuid.UUID) (newEKMS *EKMS) { +func NewEKMS(kmsName string, kmsUUID uuid.UUID, logOutput io.Writer, logLevel log.Level, logInJson bool) (newEKMS *EKMS) { + + /* + * 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(&log.TextFormatter{}) + } else { + log.SetFormatter(&log.JSONFormatter{}) + } + // print code function if level is set to Trace + if logLevel == log.TraceLevel { + log.SetReportCaller(true) + } else { + log.SetReportCaller(false) + } return &EKMS{ kmsName: kmsName, @@ -72,10 +94,10 @@ func NewEKMS(kmsName string, kmsUUID uuid.UUID) (newEKMS *EKMS) { } } -func (kms *EKMS) AddQuantumElement(kmsUDPAddrr string) *QuantumElement { +func (kms *EKMS) AddQuantumElement(kmsUDPAddrr string, logOutput io.Writer, logLevel log.Level, logInJson bool) *QuantumElement { //Get an emulated Quantumlayer - ql := quantumlayer.NewQuantumlayerEmuPRNG() + ql := quantumlayer.NewQuantumlayerEmuPRNG(logOutput, logLevel, logInJson) ql.Configure(kmsUDPAddrr) ql.PowerOn() @@ -96,7 +118,7 @@ func (kms *EKMS) AddQuantumElement(kmsUDPAddrr string) *QuantumElement { var randError error qle.QlID, randError = kms.GenerateNewQleID() if randError != nil { - log.Fatalf("GenerateNewQleID: %s", randError) + log.Fatalf("%s: GenerateNewQleID: %s", kms.kmsName, randError) return nil } @@ -113,27 +135,28 @@ func (kms *EKMS) GlobalKeyHandler(waitTime time.Duration) error { // feed this into the corresponding key buffers of the kmss for { for currentQE := range kms.QuantumElements { - log.Printf("%s GlobalKeyHandler reading...\n", kms.kmsName) + log.Debugf("%s GlobalKeyHandler reading...\n", kms.kmsName) bulkKeysLocal, err := kms.QuantumElements[currentQE].QuantumElementLink.GetKeyBatchLocal() if err != nil { - log.Printf("%s failed to retrieve local bulkkeys with error %s", kms.kmsName, err) + log.Errorf("%s failed to retrieve local bulkkeys with error %s", kms.kmsName, err) } else { // process bulkKeysLocal - log.Printf("%s produced %d bytes of key locally", kms.kmsName, bulkKeysLocal.BulkKeyLength) + log.Debugf("%s produced %d bytes of key locally", kms.kmsName, bulkKeysLocal.BulkKeyLength) kms.QuantumElements[currentQE].keyStoreLocal.KeyChopper256Bit(&bulkKeysLocal) } bulkKeysRemote, err := kms.QuantumElements[currentQE].QuantumElementLink.GetKeyBatchPeer() if err != nil { - log.Printf("%s failed to retrieve remote bulkkeys with error %s", kms.kmsName, err) + log.Errorf("%s failed to retrieve remote bulkkeys with error %s", kms.kmsName, err) } else { // process bulkKeysRemote - log.Printf("%s received %d bytes of key from remote peer", kms.kmsName, bulkKeysRemote.BulkKeyLength) + log.Debugf("%s received %d bytes of key from remote peer", kms.kmsName, bulkKeysRemote.BulkKeyLength) kms.QuantumElements[currentQE].keyStoreRemote.KeyChopper256Bit(&bulkKeysRemote) } } + // TODO: Better approach required than a sleep timer! time.Sleep(waitTime) } } @@ -142,7 +165,7 @@ func (kms *EKMS) GlobalKeyHandler(waitTime time.Duration) error { // However, when being used a potential other caller might received the same qlElementId // TODO/XXX: This would be collision and must be eventually avoided func (kms *EKMS) GenerateNewQleID() (uint32, error) { - for { // this needs a condiction to stop! + for { // this needs a condition to stop! // create buffer for uint32, so reserve 4 bytes buf := make([]byte, 4) @@ -166,7 +189,7 @@ func (kms *EKMS) GenerateNewQleID() (uint32, error) { func (kms *EKMS) AddPeer(kmsPeerSocket string, servingQLE *QuantumElement) { //check if peer exists if _, there := kms.KmsPeers[kmsPeerSocket]; there { - log.Printf("Trying to add existing peer %s", kmsPeerSocket) + log.Errorf("Trying to add existing peer %s", kmsPeerSocket) return } peer := NewKmsPeer(servingQLE, kms.externalNotifierKMSPeer) @@ -186,7 +209,7 @@ func (kms *EKMS) RemovePeer(kmsPeerSocket string) { delete(kms.KmsPeers, kmsPeerSocket) return } - log.Printf("Can not find a peer with socekt: %s", kmsPeerSocket) + log.Errorf("%s: Can not find a peer with socket: %s", kms.kmsName, kmsPeerSocket) return } diff --git a/kms/kmsetsi.go b/kms/kmsetsi.go index 826499979c6946f69a93056242b912cae6d80dae..4cc3f1cf10378f2a3c96e49e13ea233d0ecec3ae 100644 --- a/kms/kmsetsi.go +++ b/kms/kmsetsi.go @@ -6,10 +6,11 @@ import ( "errors" "flag" "fmt" - "log" "net" "os/exec" + log "github.com/sirupsen/logrus" + pb "code.fbi.h-da.de/danet/proto-kms/api/gen/proto/go/kmsetsi" "google.golang.org/grpc" "google.golang.org/grpc/codes" @@ -27,7 +28,7 @@ type etsiServer struct { } func (es *etsiServer) ETSICapabilities(ctx context.Context, in *pb.ETSICapabilitiesRequest) (capReply *pb.ETSICapabilitiesReply, err error) { - log.Printf("Received: %v", in.GetMyKmsName()) + log.Debugf("Received: %v", in.GetMyKmsName()) return &pb.ETSICapabilitiesReply{ PeerKmsName: "whatever", @@ -52,7 +53,7 @@ func (es *etsiServer) ETSIGetQuantumInterfaces(ctx context.Context, in *pb.ETSIK func (es *etsiServer) ETSIAddKMSPeer(ctx context.Context, in *pb.ETSIKMSPeerRequest) (*pb.ETSIKMSPeerReply, error) { //determine the kms structure to call - log.Printf("AddKMSPeer called.") + log.Debugf("AddKMSPeer called.") // Check first if KmsLocalQLEId is actually one of ours... qleID := in.KmsLocalQLEId @@ -112,6 +113,7 @@ func (es *etsiServer) ETSIGetEncryptKeys256Bit(ctx context.Context, in *pb.ETSIG es.visitedKeys[randomKey] = true } + // TODO: Remove/move ssh-kind prototype code below keyAsString := base64.StdEncoding.EncodeToString(randomKey.key) // push the key to the encryptor via ssh ssh := "ssh" @@ -121,7 +123,7 @@ func (es *etsiServer) ETSIGetEncryptKeys256Bit(ctx context.Context, in *pb.ETSIG cmd := exec.Command(ssh, args...) err = cmd.Run() if err != nil { - log.Println("could not execute command") + log.Errorf("could not execute ssh command with parameters") return nil, status.Errorf(codes.Internal, "%v", err) } @@ -145,7 +147,7 @@ func StartETSI(listenAddr string, callingKMS *EKMS) { handlingEkms: callingKMS, visitedKeys: make(map[*kmsKSElement]bool), }) - log.Printf("server listening at %v", lis.Addr()) + log.Infof("server listening at %v", lis.Addr()) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } diff --git a/kms/kmsintercom.go b/kms/kmsintercom.go index d9ab896d9f407ea843e9570c952e286b5e9bcd8b..807375b6729a8cde8b388948328ac91875a3559b 100644 --- a/kms/kmsintercom.go +++ b/kms/kmsintercom.go @@ -4,9 +4,10 @@ import ( "context" "flag" "fmt" - "log" "net" + log "github.com/sirupsen/logrus" + pb "code.fbi.h-da.de/danet/proto-kms/api/gen/proto/go/kmsintercom" "google.golang.org/grpc" ) @@ -16,7 +17,7 @@ type kmsTalkerServer struct { } func (s *kmsTalkerServer) InterComCapabilities(ctx context.Context, in *pb.InterComCapabilitiesRequest) (capReply *pb.InterComCapabilitiesReply, err error) { - log.Printf("Received: %v", in.GetMyKmsName()) + log.Debugf("Received: %v", in.GetMyKmsName()) return &pb.InterComCapabilitiesReply{ PeerKmsName: "whatever", @@ -39,7 +40,7 @@ func StartInterComm(interComPort int) { } s := grpc.NewServer() pb.RegisterKmsTalkerServer(s, &kmsTalkerServer{}) - log.Printf("server listening at %v", lis.Addr()) + log.Infof("server listening at %v", lis.Addr()) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } diff --git a/kms/kmspeers.go b/kms/kmspeers.go index 9b938306ee4318b18d067cb39b2ebc1bf61ca38b..a889a4470e87bfa7366de907371610fe3d090ca7 100644 --- a/kms/kmspeers.go +++ b/kms/kmspeers.go @@ -4,11 +4,12 @@ import ( "context" "encoding/base64" "fmt" - "log" "net" "os/exec" "time" + log "github.com/sirupsen/logrus" + pb "code.fbi.h-da.de/danet/proto-kms/api/gen/proto/go/kmsetsi" "github.com/google/uuid" "google.golang.org/grpc" @@ -53,12 +54,12 @@ func NewKmsPeer(servQLE *QuantumElement, in chan string) (peer kmsPeer) { // Handles everything with respect to a specific KMS peer func (ph *kmsPeer) PeerHandler(kmsName string) { - log.Printf("%s started PeerHandler for %s:", kmsName, ph.tcpSocketStr) + log.Infof("%s started PeerHandler for %s:", kmsName, ph.tcpSocketStr) // contact peer newPeerConn, err := grpc.Dial(ph.tcpSocketStr, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { - log.Printf("did not connect: %v", err) + log.Errorf("%s: did not connect: %v", kmsName, err) ph.peerStatus = KmsPeerDown return } @@ -71,7 +72,7 @@ func (ph *kmsPeer) PeerHandler(kmsName string) { defer cancel() r, err := c.ETSICapabilities(ctx, &pb.ETSICapabilitiesRequest{MyKmsName: kmsName}) if err != nil { - log.Printf("could not greet: %v", err) + log.Errorf("%s: could not greet: %v", kmsName, err) ph.peerStatus = KmsPeerDown // Send notification about change if ph.externalNotifierKMSPeer != nil { @@ -102,7 +103,7 @@ func (ph *kmsPeer) PeerHandler(kmsName string) { encryptKeyRequest, err := c.ETSIGetEncryptKeys256Bit(ctx, &pb.ETSIGetEncryptKeys256BitRequest{Amount: 1}) if err != nil { - log.Println("could not request a encryption key: ", err) + log.Errorf("%s: could not request a encryption key: %s", kmsName, err) ph.peerStatus = KmsPeerDown // Send notification about change if ph.externalNotifierKMSPeer != nil { @@ -114,8 +115,9 @@ func (ph *kmsPeer) PeerHandler(kmsName string) { // check if key is in remoteKeyStore if key, ok := ph.servingQLE.keyStoreRemote.keyStore[encryptKeyRequest.KeyID]; ok { keyAsString := base64.StdEncoding.EncodeToString(key.key) - log.Printf("Agreed Key: %s", keyAsString) + log.Debugf("Agreed Key: %s", keyAsString) + // TODO: Remove/move ssh-kind prototype code below // push the key to the encryptor via ssh ssh := "ssh" complexArg := fmt.Sprintf("(rc=$(sed \"12 c PresharedKey = %s\" /etc/wireguard/wg0.conf); echo \"$rc\" > /etc/wireguard/wg0.conf)", keyAsString) @@ -124,7 +126,7 @@ func (ph *kmsPeer) PeerHandler(kmsName string) { cmd := exec.Command(ssh, args...) err := cmd.Run() if err != nil { - log.Println("could not execute command") + log.Errorf("%s: could not execute ssh command with parameters", kmsName) return } } diff --git a/main_test.go b/main_test.go index df2c4abef5e37c036dc1c0fb63d77d9b3f1eb325..8cb9adb0a68cee1f8dbd8da68c13337f515164e6 100644 --- a/main_test.go +++ b/main_test.go @@ -5,11 +5,13 @@ package main import ( "flag" - "log" "net" + "os" "testing" "time" + log "github.com/sirupsen/logrus" + "code.fbi.h-da.de/danet/proto-kms/kms" "github.com/google/uuid" ) @@ -50,11 +52,11 @@ func TestMain(m *testing.M) { log.Println("Welcome to the proto-kms called: ", ql1Name) if selfTesting == true { - log.Printf("%s in self-testing mode", ql1Name) + log.Infof("%s in self-testing mode", ql1Name) go emulatedKMS(ql2Name, udpQL2AddrString, udpQL1AddrString) emulatedKMS(ql1Name, udpQL1AddrString, udpQL2AddrString) } else { - log.Printf("%s in regular operations mode", ql1Name) + log.Infof("%s in regular operations mode", ql1Name) emulatedKMS(ql1Name, udpQL1AddrString, udpQL2AddrString) } @@ -63,14 +65,14 @@ func TestMain(m *testing.M) { func emulatedKMS(myName string, myUDPAddr string, peerUDPAddr string) { // Attach to eKMS - emuKMS := kms.NewEKMS(myName, uuid.New()) + emuKMS := kms.NewEKMS(myName, uuid.New(), os.Stdout, log.DebugLevel, false) // Fire up Quantum LinK - myQL := emuKMS.AddQuantumElement(myUDPAddr) + myQL := emuKMS.AddQuantumElement(myUDPAddr, os.Stdout, log.ErrorLevel, false) udpQL2Addr, err := net.ResolveUDPAddr("udp", peerUDPAddr) if err != nil { - log.Fatalf("QuantumlayerEmuPRNG UDP failure: %s", err) + log.Fatalf("%s: QuantumlayerEmuPRNG UDP failure: %s", myName, err) return } diff --git a/quantumlayer/quantumlayer-emu-prng.go b/quantumlayer/quantumlayer-emu-prng.go index d6c0cc00cea2b79bd05ca59a0cc2b2345f457523..c1ff93295465377387b8d141a5b0179ed28e0657 100644 --- a/quantumlayer/quantumlayer-emu-prng.go +++ b/quantumlayer/quantumlayer-emu-prng.go @@ -9,17 +9,19 @@ package quantumlayer * transmitted to the other end. * */ - import ( "context" "crypto/rand" "encoding/json" "errors" - "log" + "io" "math/big" "net" "sync" "time" + + "github.com/sirupsen/logrus" + logi "github.com/sirupsen/logrus" ) type QuantumPayloadElement struct { @@ -43,7 +45,32 @@ type QuantumlayerEmuPRNG struct { 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{ configured: false, poweron: false, @@ -77,28 +104,28 @@ func (qlemuprng *QuantumlayerEmuPRNG) Configure(localQLAddress ...string) { func (qlemuprng *QuantumlayerEmuPRNG) PowerOn() { if qlemuprng.configured == false { // 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 } //qlemuprng.poweron = false - log.Println("QuantumlayerEmuPRNG is powering on...charging.") + log.Infof("QuantumlayerEmuPRNG: is powering on...charging.") // serve UDP incoming if qlemuprng.udpSrvConn == nil { go func() { // 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 udpSrvPort, err := net.ResolveUDPAddr("udp", qlemuprng.localQLAddress) if err != nil { - log.Fatalf("QuantumlayerEmuPRNG UDP failure: %s", err) + log.Fatalf("QuantumlayerEmuPRNG: UDP failure: %s", err) return } qlemuprng.udpSrvConn, err = net.ListenUDP("udp", udpSrvPort) if err != nil { - log.Fatalf("QuantumlayerEmuPRNG UDP failure: %s", err) + log.Fatalf("QuantumlayerEmuPRNG: UDP failure: %s", err) return } defer qlemuprng.udpSrvConn.Close() @@ -106,20 +133,20 @@ func (qlemuprng *QuantumlayerEmuPRNG) PowerOn() { // Retrieve local UDP address and store it for further actions. 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) for { // Buffer for reading from "Quantum link" n, addr, err := qlemuprng.udpSrvConn.ReadFromUDP(inBuffer) if err != nil { - log.Printf("QuantumlayerEmuPRNG: Could not read from UDP: %s", err) + log.Errorf("QuantumlayerEmuPRNG: Could not read from UDP: %s", err) } 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 // Warning this is not checking the validity of the sender, i.e., spoofing is possible 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 // TODO/XXX: no vetting for anything // Unmarshall out of JSON @@ -129,7 +156,7 @@ func (qlemuprng *QuantumlayerEmuPRNG) PowerOn() { qlemuprng.incomingRandNums <- inQBuffer } } 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() { // Ready, set, go! 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 // other quantum module func (qlemuprng *QuantumlayerEmuPRNG) PowerOff() { qlemuprng.poweron = false - log.Println("QuantumlayerEmuPRNG is powered off...discharging.") + log.Println("QuantumlayerEmuPRNG: is powered off...discharging.") } func (qlemuprng *QuantumlayerEmuPRNG) AddPeer(addr *net.UDPAddr) { @@ -184,15 +211,16 @@ func (qlemuprng *QuantumlayerEmuPRNG) AddPeer(addr *net.UDPAddr) { // XXX/TODO: error must be handled jsonPayload, err := json.Marshal(qpe) 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) if err != nil { - log.Fatalf("WriteMsgUDPAddrPort failed: %s", err) + log.Fatalf("QuantumlayerEmuPRNG: WriteMsgUDPAddrPort failed: %s", err) } qlemuprng.outgoingRandNums <- qpe } + // TODO: This sleep timer has to replaced by something for clever. time.Sleep(5 * time.Second) } } @@ -294,7 +322,7 @@ func (store *NumberStore) GetBatch() (batch []byte) { defer store.mu.Unlock() 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 batchReturn := make([]byte, store.topOfStorage)