improve logging + updated readme

This commit is contained in:
Cedric Verstraeten
2023-12-27 10:25:03 +01:00
parent e7fd0bd8a3
commit b1ab6bf522
4 changed files with 39 additions and 54 deletions

View File

@@ -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" |

View File

@@ -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 {

View File

@@ -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())
}

View File

@@ -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")
}