diff --git a/central_auth_acl_handling.go b/central_auth_acl_handling.go index 7c44029..f9ed7b7 100644 --- a/central_auth_acl_handling.go +++ b/central_auth_acl_handling.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" "io" - "log" "os" "path/filepath" "sort" @@ -43,7 +42,7 @@ type accessLists struct { func newAccessLists(pki *pki, errorKernel *errorKernel, configuration *Configuration) *accessLists { a := accessLists{ - schemaMain: newSchemaMain(configuration), + schemaMain: newSchemaMain(configuration, errorKernel), schemaGenerated: newSchemaGenerated(), errorKernel: errorKernel, configuration: configuration, @@ -65,21 +64,25 @@ type schemaMain struct { NodeGroupMap map[nodeGroup]map[Node]struct{} CommandGroupMap map[commandGroup]map[command]struct{} mu sync.Mutex + configuration *Configuration + errorKernel *errorKernel } -func newSchemaMain(configuration *Configuration) *schemaMain { +func newSchemaMain(configuration *Configuration, errorKernel *errorKernel) *schemaMain { s := schemaMain{ ACLMap: make(map[Node]map[Node]map[command]struct{}), ACLMapFilePath: filepath.Join(configuration.DatabaseFolder, "central_aclmap.txt"), NodeGroupMap: make(map[nodeGroup]map[Node]struct{}), CommandGroupMap: make(map[commandGroup]map[command]struct{}), + configuration: configuration, + errorKernel: errorKernel, } // Load ACLMap from disk if present. func() { if _, err := os.Stat(s.ACLMapFilePath); os.IsNotExist(err) { - er := fmt.Errorf("error: newSchemaMain: no file for ACLMap found %v: %v", s.ACLMapFilePath, err) - log.Printf("%v\n", er) + er := fmt.Errorf("info: newSchemaMain: no file for ACLMap found, will create new one, %v: %v", s.ACLMapFilePath, err) + errorKernel.logInfo(er, configuration) // If no aclmap is present on disk we just return from this // function without loading any values. @@ -89,20 +92,20 @@ func newSchemaMain(configuration *Configuration) *schemaMain { fh, err := os.Open(s.ACLMapFilePath) if err != nil { er := fmt.Errorf("error: newSchemaMain: failed to open file for reading %v: %v", s.ACLMapFilePath, err) - log.Printf("%v\n", er) + errorKernel.logError(er, configuration) } b, err := io.ReadAll(fh) if err != nil { er := fmt.Errorf("error: newSchemaMain: failed to ReadAll file %v: %v", s.ACLMapFilePath, err) - log.Printf("%v\n", er) + errorKernel.logError(er, configuration) } // Unmarshal the data read from disk. err = json.Unmarshal(b, &s.ACLMap) if err != nil { er := fmt.Errorf("error: newSchemaMain: failed to unmarshal content from file %v: %v", s.ACLMapFilePath, err) - log.Printf("%v\n", er) + errorKernel.logError(er, configuration) } // Generate the aclGenerated map happens in the function where this function is called. @@ -222,7 +225,7 @@ func (c *centralAuth) aclAddCommand(host Node, source Node, cmd command) { err := c.generateACLsForAllNodes() if err != nil { er := fmt.Errorf("error: addCommandForFromNode: %v", err) - log.Printf("%v\n", er) + c.errorKernel.logError(er, c.configuration) } // fmt.Printf(" * DEBUG: aclNodeFromnodeCommandAdd: a.schemaMain.ACLMap=%v\n", a.schemaMain.ACLMap) @@ -252,7 +255,7 @@ func (c *centralAuth) aclDeleteCommand(host Node, source Node, cmd command) erro err := c.generateACLsForAllNodes() if err != nil { er := fmt.Errorf("error: aclNodeFromNodeCommandDelete: %v", err) - log.Printf("%v\n", er) + c.errorKernel.logError(er, c.configuration) } return nil @@ -277,7 +280,7 @@ func (c *centralAuth) aclDeleteSource(host Node, source Node) error { err := c.generateACLsForAllNodes() if err != nil { er := fmt.Errorf("error: aclNodeFromnodeDelete: %v", err) - log.Printf("%v\n", er) + c.errorKernel.logError(er, c.configuration) } return nil @@ -296,7 +299,7 @@ func (c *centralAuth) generateACLsForAllNodes() error { fh, err := os.OpenFile(c.accessLists.schemaMain.ACLMapFilePath, os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0660) if err != nil { er := fmt.Errorf("error: generateACLsForAllNodes: opening file for writing: %v, err: %v", c.accessLists.schemaMain.ACLMapFilePath, err) - log.Printf("%v\n", er) + c.errorKernel.logError(er, c.configuration) return } defer fh.Close() @@ -308,7 +311,7 @@ func (c *centralAuth) generateACLsForAllNodes() error { enc.Encode(c.accessLists.schemaMain.ACLMap) if err != nil { er := fmt.Errorf("error: generateACLsForAllNodes: encoding json to file failed: %v, err: %v", c.accessLists.schemaMain.ACLMapFilePath, err) - log.Printf("%v\n", er) + c.errorKernel.logError(er, c.configuration) return } }() @@ -352,7 +355,7 @@ func (c *centralAuth) generateACLsForAllNodes() error { cb, err := cbor.Marshal(m) if err != nil { er := fmt.Errorf("error: generateACLsForAllNodes: failed to generate cbor for host in schemaGenerated: %v", err) - log.Printf("%v\n", er) + c.errorKernel.logError(er, c.configuration) os.Exit(1) } @@ -362,8 +365,8 @@ func (c *centralAuth) generateACLsForAllNodes() error { b, err := cbor.Marshal(sns) if err != nil { - err := fmt.Errorf("error: generateACLsForAllNodes: failed to generate cbor for hash: %v", err) - log.Printf("%v\n", err) + er := fmt.Errorf("error: generateACLsForAllNodes: failed to generate cbor for hash: %v", err) + c.errorKernel.logError(er, c.configuration) return [32]byte{} } @@ -452,7 +455,8 @@ func (c *centralAuth) groupNodesAddNode(ng nodeGroup, n Node) { //} if !strings.HasPrefix(string(ng), "grp_nodes_") { - log.Printf("error: group name do not start with grp_nodes_\n") + er := fmt.Errorf("error: group name do not start with grp_nodes_") + c.errorKernel.logError(er, c.configuration) return } @@ -469,7 +473,7 @@ func (c *centralAuth) groupNodesAddNode(ng nodeGroup, n Node) { err := c.generateACLsForAllNodes() if err != nil { er := fmt.Errorf("error: groupNodesAddNode: %v", err) - log.Printf("%v\n", er) + c.errorKernel.logError(er, c.configuration) } } @@ -479,7 +483,8 @@ func (c *centralAuth) groupNodesDeleteNode(ng nodeGroup, n Node) { c.accessLists.schemaMain.mu.Lock() defer c.accessLists.schemaMain.mu.Unlock() if _, ok := c.accessLists.schemaMain.NodeGroupMap[ng][n]; !ok { - log.Printf("info: no such node with name=%v found in group=%v\n", ng, n) + er := fmt.Errorf("info: no such node with name=%v found in group=%v", ng, n) + c.errorKernel.logError(er, c.configuration) return } @@ -490,7 +495,7 @@ func (c *centralAuth) groupNodesDeleteNode(ng nodeGroup, n Node) { err := c.generateACLsForAllNodes() if err != nil { er := fmt.Errorf("error: groupNodesDeleteNode: %v", err) - log.Printf("%v\n", er) + c.errorKernel.logError(er, c.configuration) } } @@ -500,7 +505,8 @@ func (c *centralAuth) groupNodesDeleteGroup(ng nodeGroup) { c.accessLists.schemaMain.mu.Lock() defer c.accessLists.schemaMain.mu.Unlock() if _, ok := c.accessLists.schemaMain.NodeGroupMap[ng]; !ok { - log.Printf("info: no such group found: %v\n", ng) + er := fmt.Errorf("info: no such group found: %v", ng) + c.errorKernel.logError(er, c.configuration) return } @@ -511,7 +517,7 @@ func (c *centralAuth) groupNodesDeleteGroup(ng nodeGroup) { err := c.generateACLsForAllNodes() if err != nil { er := fmt.Errorf("error: groupNodesDeleteGroup: %v", err) - log.Printf("%v\n", er) + c.errorKernel.logError(er, c.configuration) } } @@ -528,7 +534,8 @@ func (c *centralAuth) groupCommandsAddCommand(cg commandGroup, cmd command) { // } if !strings.HasPrefix(string(cg), "grp_commands_") { - log.Printf("error: group name do not start with grp_commands_\n") + er := fmt.Errorf("error: group name do not start with grp_commands_") + c.errorKernel.logError(er, c.configuration) return } @@ -545,7 +552,7 @@ func (c *centralAuth) groupCommandsAddCommand(cg commandGroup, cmd command) { err := c.generateACLsForAllNodes() if err != nil { er := fmt.Errorf("error: groupCommandsAddCommand: %v", err) - log.Printf("%v\n", er) + c.errorKernel.logError(er, c.configuration) } } @@ -555,7 +562,8 @@ func (c *centralAuth) groupCommandsDeleteCommand(cg commandGroup, cmd command) { c.accessLists.schemaMain.mu.Lock() defer c.accessLists.schemaMain.mu.Unlock() if _, ok := c.accessLists.schemaMain.CommandGroupMap[cg][cmd]; !ok { - log.Printf("info: no such command with name=%v found in group=%v\n", c, cg) + er := fmt.Errorf("info: no such command with name=%v found in group=%v", c, cg) + c.errorKernel.logError(er, c.configuration) return } @@ -566,7 +574,7 @@ func (c *centralAuth) groupCommandsDeleteCommand(cg commandGroup, cmd command) { err := c.generateACLsForAllNodes() if err != nil { er := fmt.Errorf("error: groupCommandsDeleteCommand: %v", err) - log.Printf("%v\n", er) + c.errorKernel.logError(er, c.configuration) } } @@ -576,7 +584,8 @@ func (c *centralAuth) groupCommandDeleteGroup(cg commandGroup) { c.accessLists.schemaMain.mu.Lock() defer c.accessLists.schemaMain.mu.Unlock() if _, ok := c.accessLists.schemaMain.CommandGroupMap[cg]; !ok { - log.Printf("info: no such group found: %v\n", cg) + er := fmt.Errorf("info: no such group found: %v", cg) + c.errorKernel.logError(er, c.configuration) return } @@ -587,7 +596,7 @@ func (c *centralAuth) groupCommandDeleteGroup(cg commandGroup) { err := c.generateACLsForAllNodes() if err != nil { er := fmt.Errorf("error: groupCommandDeleteGroup: %v", err) - log.Printf("%v\n", er) + c.errorKernel.logError(er, c.configuration) } } diff --git a/central_auth_key_handling.go b/central_auth_key_handling.go index d6b4ffe..4961c7c 100644 --- a/central_auth_key_handling.go +++ b/central_auth_key_handling.go @@ -18,12 +18,17 @@ type centralAuth struct { // acl and authorization level related data and methods. accessLists *accessLists // public key distribution related data and methods. - pki *pki + pki *pki + configuration *Configuration + errorKernel *errorKernel } // newCentralAuth will return a new and prepared *centralAuth func newCentralAuth(configuration *Configuration, errorKernel *errorKernel) *centralAuth { - c := centralAuth{} + c := centralAuth{ + configuration: configuration, + errorKernel: errorKernel, + } c.pki = newPKI(configuration, errorKernel) c.accessLists = newAccessLists(c.pki, errorKernel, configuration) @@ -290,8 +295,7 @@ func (c *centralAuth) updateHash(proc process, message Message) { b, err := cbor.Marshal(sortedNodesAndKeys) if err != nil { er := fmt.Errorf("error: methodREQKeysAllow, failed to marshal slice, and will not update hash for public keys: %v", err) - c.pki.errorKernel.errSend(proc, message, er, logWarning) - log.Printf(" * DEBUG: %v\n", er) + c.pki.errorKernel.errSend(proc, message, er, logError) return } @@ -304,8 +308,7 @@ func (c *centralAuth) updateHash(proc process, message Message) { c.pki.dbUpdateHash(hash[:]) if err != nil { er := fmt.Errorf("error: methodREQKeysAllow, failed to store the hash into the db: %v", err) - c.pki.errorKernel.errSend(proc, message, er, logWarning) - log.Printf(" * DEBUG: %v\n", er) + c.pki.errorKernel.errSend(proc, message, er, logError) return } @@ -320,13 +323,15 @@ func (p *pki) dbViewHash() ([]byte, error) { //Open a bucket to get key's and values from. bu := tx.Bucket([]byte("hash")) if bu == nil { - log.Printf("info: no db hash bucket exist\n") + er := fmt.Errorf("info: no db hash bucket exist") + p.errorKernel.logWarn(er, p.configuration) return nil } v := bu.Get([]byte("hash")) if len(v) == 0 { - log.Printf("info: view: hash key not found\n") + er := fmt.Errorf("info: view: hash key not found") + p.errorKernel.logWarn(er, p.configuration) return nil } diff --git a/errorkernel.go b/errorkernel.go index ad99cc6..3497465 100644 --- a/errorkernel.go +++ b/errorkernel.go @@ -270,6 +270,24 @@ func (e *errorKernel) infoSend(proc process, msg Message, err error) { e.errorCh <- ev } +func (e *errorKernel) logError(err error, c *Configuration) { + if c.LogLevel == string(logError) { + slog.Error("error", err) + } +} + +func (e *errorKernel) logInfo(err error, c *Configuration) { + if c.LogLevel == string(logInfo) { + slog.Info(err.Error()) + } +} + +func (e *errorKernel) logWarn(err error, c *Configuration) { + if c.LogLevel == string(logWarning) { + slog.Warn(err.Error()) + } +} + func (e *errorKernel) logConsoleOnlyIfDebug(err error, c *Configuration) { if c.LogLevel == string(logDebug) { slog.Debug(err.Error()) diff --git a/message_and_subject.go b/message_and_subject.go index 144103f..5ca3e40 100644 --- a/message_and_subject.go +++ b/message_and_subject.go @@ -132,7 +132,7 @@ func newSubject(method Method, node string) Subject { mh, ok := ma.CheckIfExists(method) //mh, ok := ma.Methodhandlers[method] if !ok { - log.Printf("error: no Event type specified for the method: %v\n", method) + log.Printf("error: newSubject: no Event type specified for the method: %v\n", method) os.Exit(1) } diff --git a/message_readers.go b/message_readers.go index 52c619c..a327d36 100644 --- a/message_readers.go +++ b/message_readers.go @@ -4,7 +4,6 @@ import ( "bytes" "fmt" "io" - "log" "net" "net/http" "os" @@ -39,11 +38,13 @@ func (s *server) readStartupFolder() { } for _, fp := range filePaths { - log.Printf("info: ranging filepaths, current filePath contains: %v\n", fp) + er := fmt.Errorf("info: ranging filepaths, current filePath contains: %v", fp) + s.errorKernel.logInfo(er, s.configuration) } for _, filePath := range filePaths { - log.Printf("info: reading and working on file from startup folder %v\n", filePath) + er := fmt.Errorf("info: reading and working on file from startup folder %v", filePath) + s.errorKernel.logInfo(er, s.configuration) // Read the content of each file. readBytes, err := func(filePath string) ([]byte, error) { @@ -211,14 +212,15 @@ func (s *server) readFolder() { err := os.MkdirAll(s.configuration.ReadFolder, 0770) if err != nil { er := fmt.Errorf("error: failed to create readfolder folder: %v", err) - log.Printf("%v\n", er) + s.errorKernel.logError(er, s.configuration) os.Exit(1) } } watcher, err := fsnotify.NewWatcher() if err != nil { - log.Printf("main: failed to create new logWatcher: %v\n", err) + er := fmt.Errorf("main: failed to create new logWatcher: %v", err) + s.errorKernel.logError(er, s.configuration) os.Exit(1) } @@ -301,7 +303,8 @@ func (s *server) readFolder() { // Add a path. err = watcher.Add(s.configuration.ReadFolder) if err != nil { - log.Printf("startLogsWatcher: failed to add watcher: %v\n", err) + er := fmt.Errorf("startLogsWatcher: failed to add watcher: %v", err) + s.errorKernel.logError(er, s.configuration) os.Exit(1) } } @@ -313,7 +316,8 @@ func (s *server) readFolder() { func (s *server) readTCPListener() { ln, err := net.Listen("tcp", s.configuration.TCPListener) if err != nil { - log.Printf("error: readTCPListener: failed to start tcp listener: %v\n", err) + er := fmt.Errorf("error: readTCPListener: failed to start tcp listener: %v", err) + s.errorKernel.logError(er, s.configuration) os.Exit(1) } // Loop, and wait for new connections. @@ -417,7 +421,8 @@ func (s *server) readHttpListener() { go func() { n, err := net.Listen("tcp", s.configuration.HTTPListener) if err != nil { - log.Printf("error: startMetrics: failed to open prometheus listen port: %v\n", err) + er := fmt.Errorf("error: startMetrics: failed to open prometheus listen port: %v", err) + s.errorKernel.logError(er, s.configuration) os.Exit(1) } mux := http.NewServeMux() @@ -425,7 +430,8 @@ func (s *server) readHttpListener() { err = http.Serve(n, mux) if err != nil { - log.Printf("error: startMetrics: failed to start http.Serve: %v\n", err) + er := fmt.Errorf("error: startMetrics: failed to start http.Serve: %v", err) + s.errorKernel.logError(er, s.configuration) os.Exit(1) } }() diff --git a/node_auth.go b/node_auth.go index ea4af75..919b2a6 100644 --- a/node_auth.go +++ b/node_auth.go @@ -6,7 +6,6 @@ import ( "encoding/json" "fmt" "io" - "log" "os" "path/filepath" "strings" @@ -55,7 +54,8 @@ func newNodeAuth(configuration *Configuration, errorKernel *errorKernel) *nodeAu err := n.loadSigningKeys() if err != nil { - log.Printf("%v\n", err) + er := fmt.Errorf("newNodeAuth: %v", err) + errorKernel.logError(er, configuration) os.Exit(1) } @@ -96,7 +96,8 @@ func newNodeAcl(c *Configuration, errorKernel *errorKernel) *nodeAcl { err := n.loadFromFile() if err != nil { - log.Printf("error: loading acl's from file: %v\n", err) + er := fmt.Errorf("error: newNodeAcl: loading acl's from file: %v", err) + errorKernel.logError(er, c) // os.Exit(1) } @@ -201,7 +202,8 @@ func newPublicKeys(c *Configuration, errorKernel *errorKernel) *publicKeys { err := p.loadFromFile() if err != nil { - log.Printf("error: loading public keys from file: %v\n", err) + er := fmt.Errorf("error: newPublicKeys: loading public keys from file: %v", err) + errorKernel.logError(er, c) // os.Exit(1) } @@ -215,7 +217,8 @@ func (p *publicKeys) loadFromFile() error { if _, err := os.Stat(p.filePath); os.IsNotExist(err) { // Just logging the error since it is not crucial that a key file is missing, // since a new one will be created on the next update. - log.Printf("no public keys file found at %v\n", p.filePath) + er := fmt.Errorf("no public keys file found at %v, new file will be created", p.filePath) + p.errorKernel.logInfo(er, p.configuration) return nil } @@ -319,7 +322,7 @@ func (n *nodeAuth) loadSigningKeys() error { n.SignPrivateKey = priv er := fmt.Errorf("info: no signing keys found, generating new keys") - log.Printf("%v\n", er) + n.errorKernel.logInfo(er, n.configuration) // We got the new generated keys now, so we can return. return nil @@ -390,7 +393,8 @@ func (n *nodeAuth) readKeyFile(keyFile string) (ed2519key []byte, b64Key []byte, func (n *nodeAuth) verifySignature(m Message) bool { // NB: Only enable signature checking for REQCliCommand for now. if m.Method != REQCliCommand { - log.Printf(" * DEBUG: verifySignature,not REQCliCommand and will not do signature check, method: %v\n", m.Method) + er := fmt.Errorf("verifySignature: not REQCliCommand and will not do signature check, method: %v", m.Method) + n.errorKernel.logInfo(er, n.configuration) return true } @@ -402,7 +406,7 @@ func (n *nodeAuth) verifySignature(m Message) bool { n.publicKeys.mu.Lock() pubKey := n.publicKeys.keysAndHash.Keys[m.FromNode] if len(pubKey) != 32 { - err := fmt.Errorf("DEBUG: Length of publicKey: %v", len(pubKey)) + err := fmt.Errorf("length of publicKey not equal to 32: %v", len(pubKey)) return err } @@ -413,10 +417,11 @@ func (n *nodeAuth) verifySignature(m Message) bool { }() if err != nil { - log.Printf("%v\n", err) + n.errorKernel.logError(err, n.configuration) } - log.Printf("info: verifySignature, result: %v, fromNode: %v, method: %v\n", ok, m.FromNode, m.Method) + er := fmt.Errorf("info: verifySignature, result: %v, fromNode: %v, method: %v", ok, m.FromNode, m.Method) + n.errorKernel.logInfo(er, n.configuration) return ok } @@ -425,7 +430,8 @@ func (n *nodeAuth) verifySignature(m Message) bool { func (n *nodeAuth) verifyAcl(m Message) bool { // NB: Only enable acl checking for REQCliCommand for now. if m.Method != REQCliCommand { - log.Printf(" * DEBUG: verifyAcl: not REQCliCommand and will not do acl check, method: %v\n", m.Method) + er := fmt.Errorf("verifyAcl: not REQCliCommand and will not do acl check, method: %v", m.Method) + n.errorKernel.logInfo(er, n.configuration) return true } @@ -437,23 +443,27 @@ func (n *nodeAuth) verifyAcl(m Message) bool { cmdMap, ok := n.nodeAcl.aclAndHash.Acl[m.FromNode] if !ok { - log.Printf(" * DEBUG: verifyAcl: The fromNode=%v was not found in the acl\n", m.FromNode) + er := fmt.Errorf("verifyAcl: The fromNode=%v was not found in the acl", m.FromNode) + n.errorKernel.logError(er, n.configuration) return false } _, ok = cmdMap[command("*")] if ok { - log.Printf(" * DEBUG: verifyAcl: The acl said \"*\", all commands allowed from node=%v\n", m.FromNode) + er := fmt.Errorf("verifyAcl: The acl said \"*\", all commands allowed from node=%v", m.FromNode) + n.errorKernel.logInfo(er, n.configuration) return true } _, ok = cmdMap[command(argsStringified)] if !ok { - log.Printf(" * DEBUG: verifyAcl: The command=%v was NOT FOUND in the acl\n", m.MethodArgs) + er := fmt.Errorf("verifyAcl: The command=%v was NOT FOUND in the acl", m.MethodArgs) + n.errorKernel.logInfo(er, n.configuration) return false } - log.Printf(" * DEBUG: The command was FOUND in the acl, verifyAcl, result: %v, fromNode: %v, method: %v\n", ok, m.FromNode, m.Method) + er := fmt.Errorf("verifyAcl: the command was FOUND in the acl, verifyAcl, result: %v, fromNode: %v, method: %v", ok, m.FromNode, m.Method) + n.errorKernel.logInfo(er, n.configuration) return true } diff --git a/process.go b/process.go index 9a23856..f0ee2bd 100644 --- a/process.go +++ b/process.go @@ -9,7 +9,6 @@ import ( "errors" "fmt" "io" - "log" "os" "sync" "time" @@ -822,7 +821,8 @@ func (p process) publishMessages(natsConn *nats.Conn) { // enc, err := zstd.NewWriter(nil, zstd.WithEncoderLevel(zstd.SpeedBestCompression)) enc, err := zstd.NewWriter(nil, zstd.WithEncoderConcurrency(1)) if err != nil { - log.Printf("error: zstd new encoder failed: %v\n", err) + er := fmt.Errorf("error: zstd new encoder failed: %v", err) + p.errorKernel.logError(er, p.configuration) os.Exit(1) } zEnc = enc diff --git a/requests_copy.go b/requests_copy.go index 1514e9e..17180aa 100644 --- a/requests_copy.go +++ b/requests_copy.go @@ -6,7 +6,6 @@ import ( "fmt" "io" "io/fs" - "log" "os" "path/filepath" "sort" @@ -157,7 +156,8 @@ func (m methodREQCopySrc) handler(proc process, message Message, node string) ([ var err error folderPermission, err = strconv.ParseUint(message.MethodArgs[5], 8, 32) if err != nil { - log.Printf("%v\n", err) + er := fmt.Errorf("methodREQCopySrc: failed to parse uint, %v", err) + proc.errorKernel.logError(er, proc.configuration) } er := fmt.Errorf("info: FolderPermission defined in message for socket: %v, converted = %v", message.MethodArgs[5], folderPermission) @@ -348,7 +348,8 @@ func (m methodREQCopyDst) handler(proc process, message Message, node string) ([ proc.processes.active.mu.Unlock() if ok { - log.Printf(" * * * DEBUG: subprocesses already existed, will not start another subscriber for %v\n", pn) + er := fmt.Errorf("methodREQCopyDst: subprocesses already existed, will not start another subscriber for %v", pn) + proc.errorKernel.logConsoleOnlyIfDebug(er, proc.configuration) // HERE!!! // If the process name already existed we return here before any