diff --git a/README.md b/README.md index 019adf9..58c945d 100644 --- a/README.md +++ b/README.md @@ -195,6 +195,7 @@ Next to attaching the configuration file, it is also possible to override the co | Name | Description | Default Value | | --------------------------------------- | ----------------------------------------------------------------------------------------------- | ------------------------------ | | `LOG_LEVEL` | Level for logging, could be "info", "warning", "debug", "error" or "fatal". | "info" | +| `LOG_OUTPUT` | Logging output format "json" or "text". | "text" | | `AGENT_MODE` | You can choose to run this in 'release' for production, and or 'demo' for showcasing. | "release" | | `AGENT_TLS_INSECURE` | Specify if you want to use `InsecureSkipVerify` for the internal HTTP client. | "false" | | `AGENT_USERNAME` | The username used to authenticate against the Kerberos Agent login page. | "root" | diff --git a/machinery/main.go b/machinery/main.go index 48bb9e2..d49e4c8 100644 --- a/machinery/main.go +++ b/machinery/main.go @@ -69,17 +69,18 @@ func main() { flag.StringVar(&timeout, "timeout", "2000", "Number of milliseconds to wait for the ONVIF discovery to complete") flag.Parse() - timezone, _ := time.LoadLocation("CET") - // Specify the level of loggin: "info", "warning", "debug", "error" or "fatal." logLevel := os.Getenv("LOG_LEVEL") if logLevel == "" { logLevel = "info" } + // Specify the output formatter of the log: "text" or "json". logOutput := os.Getenv("LOG_OUTPUT") if logOutput == "" { logOutput = "text" } + // Specify the timezone of the log: "UTC" or "Local". + timezone, _ := time.LoadLocation("CET") log.Log.Init(logLevel, logOutput, configDirectory, timezone) switch action { diff --git a/machinery/src/onvif/main.go b/machinery/src/onvif/main.go index 6de7001..f76cd0b 100644 --- a/machinery/src/onvif/main.go +++ b/machinery/src/onvif/main.go @@ -731,25 +731,19 @@ func ContinuousZoom(device *onvif.Device, configuration ptz.GetConfigurationsRes resp.Body.Close() } if err != nil { - log.Log.Error("ContinuousPanTiltZoom: " + err.Error()) + log.Log.Error("onvif.main.ContinuousZoom(): " + err.Error()) } - log.Log.Debug("ContinuousPanTiltZoom: " + string(b)) - + log.Log.Debug("onvif.main.ContinuousZoom(): " + string(b)) time.Sleep(500 * time.Millisecond) - resp, err = device.CallMethod(ptz.Stop{ + _, err = device.CallMethod(ptz.Stop{ ProfileToken: token, Zoom: true, }) - b = []byte{} - if resp != nil { - b, err = io.ReadAll(resp.Body) - resp.Body.Close() - } if err != nil { - log.Log.Error("ContinuousPanTiltZoom: " + err.Error()) + log.Log.Error("onvif.main.ContinuousZoom(): " + err.Error()) } return err @@ -759,7 +753,7 @@ func GetCapabilitiesFromDevice(dev *onvif.Device) []string { var capabilities []string services := dev.GetServices() for key, _ := range services { - log.Log.Debug("GetCapabilitiesFromDevice: has key: " + key) + log.Log.Debug("onvif.main.GetCapabilitiesFromDevice(): has key: " + key) if key != "" { keyParts := strings.Split(key, "/") if len(keyParts) > 0 { @@ -781,41 +775,39 @@ func GetPresetsFromDevice(device *onvif.Device) ([]models.OnvifActionPreset, err resp, err := device.CallMethod(ptz.GetPresets{ ProfileToken: token, }) - var b []byte if resp != nil { b, err = io.ReadAll(resp.Body) resp.Body.Close() } - if err == nil { stringBody := string(b) decodedXML, et, err := getXMLNode(stringBody, "GetPresetsResponse") if err != nil { - log.Log.Error("GetPresetsFromDevice: " + err.Error()) + log.Log.Error("onvif.main.GetPresetsFromDevice(): " + err.Error()) return presets, err } else { if err := decodedXML.DecodeElement(&presetsResponse, et); err != nil { - log.Log.Error("GetPresetsFromDevice: " + err.Error()) + log.Log.Error("onvif.main.GetPresetsFromDevice(): " + err.Error()) return presets, err } for _, preset := range presetsResponse.Preset { + log.Log.Debug("onvif.main.GetPresetsFromDevice(): " + string(preset.Name) + " (" + string(preset.Token) + ")") p := models.OnvifActionPreset{ Name: string(preset.Name), Token: string(preset.Token), } - presets = append(presets, p) } return presets, err } } else { - log.Log.Error("GetPresetsFromDevice: " + err.Error()) + log.Log.Error("onvif.main.GetPresetsFromDevice(): " + err.Error()) } } else { - log.Log.Error("GetPresetsFromDevice: " + err.Error()) + log.Log.Error("onvif.main.GetPresetsFromDevice(): " + err.Error()) } return presets, err @@ -841,20 +833,20 @@ func GoToPresetFromDevice(device *onvif.Device, presetName string) error { stringBody := string(b) decodedXML, et, err := getXMLNode(stringBody, "GotoPresetResponses") if err != nil { - log.Log.Error("GoToPresetFromDevice: " + err.Error()) + log.Log.Error("onvif.main.GoToPresetFromDevice(): " + err.Error()) return err } else { if err := decodedXML.DecodeElement(&goToPresetResponse, et); err != nil { - log.Log.Error("GoToPresetFromDevice: " + err.Error()) + log.Log.Error("onvif.main.GoToPresetFromDevice(): " + err.Error()) return err } return err } } else { - log.Log.Error("GoToPresetFromDevice: " + err.Error()) + log.Log.Error("onvif.main.GoToPresetFromDevice(): " + err.Error()) } } else { - log.Log.Error("GoToPresetFromDevice: " + err.Error()) + log.Log.Error("onvif.main.GoToPresetFromDevice(): " + err.Error()) } return err @@ -917,31 +909,18 @@ func VerifyOnvifConnection(c *gin.Context) { if err == nil { device, err := ConnectToOnvifDevice(&cameraConfig) if err == nil { - // Get the list of configurations - configurations, err := GetPTZConfigurationsFromDevice(device) - if err == nil { - - // Check if can zoom and/or pan/tilt is supported - ptzFunctions, canZoom, canPanTilt := GetPTZFunctionsFromDevice(configurations) - c.JSON(200, models.APIResponse{ - Data: device, - PTZFunctions: ptzFunctions, - CanZoom: canZoom, - CanPanTilt: canPanTilt, - }) - } else { - c.JSON(400, models.APIResponse{ - Message: "Something went wrong while getting the configurations " + err.Error(), - }) - } + log.Log.Info("onvif.main.VerifyOnvifConnection(): successfully verified the ONVIF connection") + c.JSON(200, models.APIResponse{ + Data: device, + }) } else { c.JSON(400, models.APIResponse{ - Message: "Something went wrong while verifying the ONVIF connection " + err.Error(), + Message: "onvif.main.VerifyOnvifConnection(): s went wrong while verifying the ONVIF connection " + err.Error(), }) } } else { c.JSON(400, models.APIResponse{ - Message: "Something went wrong while receiving the config " + err.Error(), + Message: "onvif.main.VerifyOnvifConnection(): s went wrong while receiving the config " + err.Error(), }) } } @@ -1286,8 +1265,10 @@ func TriggerRelayOutput(dev *onvif.Device, output string) (setRelayOutputState d func getXMLNode(xmlBody string, nodeName string) (*xml.Decoder, *xml.StartElement, error) { xmlBytes := bytes.NewBufferString(xmlBody) decodedXML := xml.NewDecoder(xmlBytes) + var token xml.Token + var err error for { - token, err := decodedXML.Token() + token, err = decodedXML.Token() if err != nil { break } @@ -1298,5 +1279,5 @@ func getXMLNode(xmlBody string, nodeName string) (*xml.Decoder, *xml.StartElemen } } } - return nil, nil, errors.New("error in NodeName - username and password might be wrong") + return nil, nil, errors.New("getXMLNode(): " + err.Error()) } diff --git a/machinery/src/routers/websocket/main.go b/machinery/src/routers/websocket/main.go index 22aefdb..dcd4bf5 100644 --- a/machinery/src/routers/websocket/main.go +++ b/machinery/src/routers/websocket/main.go @@ -60,6 +60,10 @@ func WebsocketHandler(c *gin.Context, communication *models.Communication, captu var message Message err = conn.ReadJSON(&message) + if err != nil { + log.Log.Error("routers.websocket.main.WebsocketHandler(): " + err.Error()) + return + } clientID := message.ClientID if sockets[clientID] == nil { connection := new(Connection) @@ -87,14 +91,14 @@ func WebsocketHandler(c *gin.Context, communication *models.Communication, captu if exists { sockets[clientID].Cancels["stream-sd"]() } else { - log.Log.Error("Streaming sd does not exists for " + clientID) + log.Log.Error("routers.websocket.main.WebsocketHandler(): streaming sd does not exists for " + clientID) } case "stream-sd": if communication.CameraConnected { _, exists := sockets[clientID].Cancels["stream-sd"] if exists { - log.Log.Info("Already streaming sd for " + clientID) + log.Log.Info("routers.websocket.main.WebsocketHandler(): already streaming sd for " + clientID) } else { startStream := Message{ ClientID: clientID, @@ -121,7 +125,7 @@ func WebsocketHandler(c *gin.Context, communication *models.Communication, captu _, exists := sockets[clientID] if exists { delete(sockets, clientID) - log.Log.Info("WebsocketHandler: " + clientID + ": terminated and disconnected websocket connection.") + log.Log.Info("routers.websocket.main.WebsocketHandler(): " + clientID + ": terminated and disconnected websocket connection.") } } } @@ -158,7 +162,7 @@ logreader: encodedImage = base64.StdEncoding.EncodeToString(bytes) } } else { - log.Log.Error("ForwardSDStream:" + err.Error()) + log.Log.Error("routers.websocket.main.ForwardSDStream():" + err.Error()) break logreader } } @@ -172,7 +176,7 @@ logreader: } err := connection.WriteJson(startStrean) if err != nil { - log.Log.Error("ForwardSDStream:" + err.Error()) + log.Log.Error("routers.websocket.main.ForwardSDStream():" + err.Error()) break logreader } select { @@ -182,16 +186,14 @@ logreader: } } - //frame.Free() - // Close socket for streaming _, exists := connection.Cancels["stream-sd"] if exists { delete(connection.Cancels, "stream-sd") } else { - log.Log.Error("Streaming sd does not exists for " + clientID) + log.Log.Error("routers.websocket.main.ForwardSDStream(): streaming sd does not exists for " + clientID) } // Send stop streaming message - log.Log.Info("ForwardSDStream: stop sending streaming over websocket") + log.Log.Info("routers.websocket.main.ForwardSDStream(): stop sending streaming over websocket") }