diff --git a/Dockerfile b/Dockerfile index dccf618..17a50c9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM nodered/node-red:4.1.4-minimal +FROM nodered/node-red:4.1.6-minimal WORKDIR /data RUN openssl genrsa -out privkey.pem 2048 diff --git a/flows.json b/flows.json index 668446e..d957e95 100644 --- a/flows.json +++ b/flows.json @@ -309,7 +309,7 @@ "winHide": false, "oldrc": false, "name": "Events", - "x": 350, + "x": 510, "y": 920, "wires": [ [ @@ -340,7 +340,7 @@ "y": 920, "wires": [ [ - "b3814c680815a25b" + "46148a6db99e8a8e" ] ] }, @@ -359,7 +359,7 @@ "checkall": "true", "repair": false, "outputs": 1, - "x": 670, + "x": 690, "y": 900, "wires": [ [ @@ -379,8 +379,8 @@ "stream": false, "addname": "", "property": "payload", - "x": 500, - "y": 900, + "x": 640, + "y": 960, "wires": [ [ "06b0b14f4b337cfe" @@ -419,7 +419,7 @@ "checkall": "true", "repair": false, "outputs": 4, - "x": 970, + "x": 980, "y": 900, "wires": [ [ @@ -438,7 +438,7 @@ "property": "payload", "action": "", "pretty": false, - "x": 830, + "x": 850, "y": 900, "wires": [ [ @@ -1332,7 +1332,7 @@ "t": "set", "p": "url", "pt": "msg", - "to": "msg.config.netbox_url & '/api/plugins/docker/containers/'", + "to": "msg.config.netbox_url & '/api/plugins/docker/containers/?host_id=' & msg.config.id & \"&name=\" & $replace(msg.container_info.Name,'/','')", "tot": "jsonata" }, { @@ -1346,8 +1346,8 @@ "t": "set", "p": "payload", "pt": "msg", - "to": "{\t \"host\": msg.config.id,\t \"name\": $replace(msg.result.Name,\"/\",\"\"),\t \"hostname\": msg.result.Config.Hostname,\t \"status\": msg.result.State.Status = \"running\"\t ? \"running \" & $ceil(($toMillis($now()) - $toMillis(msg.result.State.StartedAt)) / 1000 / 60 / 60 / 24) & \"d\"\t : \"na\",\t \"state\": msg.result.State.Status,\t \"operation\": \"none\",\t \"restart_policy\": msg.result.HostConfig.RestartPolicy.Name = \"\" ? \"no\" : msg.result.HostConfig.RestartPolicy.Name,\t \"image\": {\t \"host\": msg.config.id,\t \"ImageID\": msg.result.Image\t },\t \"HealthCheck\": msg.result.Config.Healthcheck,\t \"ContainerID\": msg.result.Id,\t \"cap_add\": msg.result.HostConfig.CapAdd,\t \"cap_drop\": msg.result.HostConfig.CapDrop,\t \"extra_hosts\": msg.result.HostConfig.ExtraHosts,\t \"pid_mode\": msg.result.HostConfig.PidMode,\t \"network_settings\": [\t $each(\t msg.result.NetworkSettings.Networks,\t function($v, $k) {\t { \"network\": { \"host\": msg.config.id, \"name\": $k } }\t }\t )\t ],\t \"ports\": msg.result.NetworkSettings.Ports\t ? [\t $each(\t msg.result.NetworkSettings.Ports,\t function($v, $k) {\t {\t \"public_port\": $v[0] = null or $length($v[0].HostPort) = 0 ? 0 : $v[0].HostPort,\t \"private_port\": $split($k,\"/\")[0],\t \"type\": $split($k,\"/\")[1]\t }\t }\t )\t ]\t : msg.result.HostConfig.PortBindings ? [\t $each(\t msg.result.HostConfig.PortBindings,\t function($v, $k) {\t {\t \"public_port\": $count($v) = 0 or $v[0] = null or $length($v[0].HostPort) = 0 ? 0 : $v[0].HostPort,\t \"private_port\": $split($k,\"/\")[0],\t \"type\": $split($k,\"/\")[1]\t }\t }\t )\t ] : [],\t \"env\": [\t $map(\t msg.result.Config.Env,\t function($v, $k) {\t {\t \"var_name\": $substringBefore($v, \"=\"),\t \"value\": $substringAfter($v, \"=\")\t }\t }\t )\t ],\t \"labels\": [\t $each(\t msg.result.Config.Labels,\t function($v, $k) {\t { \"key\": $k, \"value\": $v }\t }\t )\t ],\t \"devices\": msg.result.HostConfig.Devices\t ? [\t $map(\t msg.result.HostConfig.Devices,\t function($v, $k) {\t {\t \"container_path\": $v.PathInContainer,\t \"host_path\": $v.PathOnHost\t }\t }\t )\t ],\t \"mounts\": [\t $map(\t msg.result.Mounts,\t function($v, $k) {\t $v.Type = \"volume\"\t ? {\t \"source\": $v.Destination,\t \"volume\": { \"name\": $v.Name, \"host\": msg.config.id },\t \"read_only\": $not($v.RW)\t }\t }\t )\t ],\t \"binds\": [\t $map(\t msg.result.Mounts,\t function($v, $k) {\t $v.Type = \"bind\"\t ? {\t \"host_path\": $v.Source,\t \"container_path\": $v.Destination,\t \"read_only\": $not($v.RW)\t }\t }\t )\t ],\t \"log_driver\": msg.result.HostConfig.LogConfig.Type,\t \"log_driver_options\": [$each(msg.result.HostConfig.LogConfig.Config, function($v, $k) {\t {\t \"option_name\": $k,\t \"value\": $v\t }\t })],\t \"Cmd\": msg.result.Config.Cmd,\t \"sysctls\": [\t $each(\t msg.result.HostConfig.Sysctls,\t function($v, $k) {\t { \"key\": $k, \"value\": $v }\t }\t )\t ]\t}", - "tot": "jsonata" + "to": "{}", + "tot": "json" } ], "action": "", @@ -1381,33 +1381,6 @@ "headers": [], "x": 2850, "y": 880, - "wires": [ - [ - "c6d649272e52d4e8" - ] - ] - }, - { - "id": "c6d649272e52d4e8", - "type": "change", - "z": "216db6efc0df9bc0", - "name": "find by ContainerID", - "rules": [ - { - "t": "set", - "p": "netbox_container_id", - "pt": "msg", - "to": "$filter(msg.payload.results, function($v) {\t $v.ContainerID = msg.container_info.Id\t}).id", - "tot": "jsonata" - } - ], - "action": "", - "property": "", - "from": "", - "to": "", - "reg": false, - "x": 2550, - "y": 940, "wires": [ [ "6021f753e1831d36" @@ -1438,7 +1411,7 @@ "t": "set", "p": "url", "pt": "msg", - "to": "msg.config.netbox_url & '/api/plugins/docker/containers/' & $string(msg.netbox_container_id) & '/'", + "to": "msg.config.netbox_url & '/api/plugins/docker/containers/' & $string(msg.payload.results[0].id) & '/'", "tot": "jsonata" }, { @@ -1452,7 +1425,7 @@ "t": "set", "p": "payload", "pt": "msg", - "to": "{\t \"state\": msg.container_info.State.Status,\t \"ContainerID\": msg.patyload.Id,\t \"operation\": \"none\",\t \"status\": msg.container_info.State.Status = \"running\"\t ? \"running \" & $ceil(($toMillis($now()) - $toMillis(msg.container_info.State.StartedAt)) / 1000 / 60 / 60 / 24) & \"d\"\t : \"na\"\t}", + "to": "{\t \"state\": msg.container_info.State.Status,\t \"ContainerID\": msg.container_info.Id,\t \"operation\": \"none\",\t \"exitCode\": msg.container_info.State.ExitCode,\t \"status\": msg.container_info.State.Status = \"running\"\t ? \"running \" & $ceil(($toMillis($now()) - $toMillis(msg.container_info.State.StartedAt)) / 1000 / 60 / 60 / 24) & \"d\"\t : \"na\"\t}", "tot": "jsonata" } ], @@ -1461,8 +1434,8 @@ "from": "", "to": "", "reg": false, - "x": 2570, - "y": 1000, + "x": 2490, + "y": 940, "wires": [ [ "d8839cfa921a2951" @@ -1473,20 +1446,20 @@ "id": "6021f753e1831d36", "type": "switch", "z": "216db6efc0df9bc0", - "name": "exists?", - "property": "netbox_container_id", + "name": "count", + "property": "payload.count", "propertyType": "msg", "rules": [ { - "t": "istype", - "v": "number", - "vt": "number" + "t": "eq", + "v": "1", + "vt": "num" } ], "checkall": "true", "repair": false, "outputs": 1, - "x": 2760, + "x": 2250, "y": 940, "wires": [ [ @@ -1537,8 +1510,8 @@ "authType": "", "senderr": false, "headers": [], - "x": 2860, - "y": 1000, + "x": 2820, + "y": 940, "wires": [ [] ] @@ -1647,6 +1620,29 @@ ] ] }, + { + "id": "46148a6db99e8a8e", + "type": "switch", + "z": "216db6efc0df9bc0", + "name": "has netbox url ?", + "property": "config.netbox_url", + "propertyType": "global", + "rules": [ + { + "t": "nempty" + } + ], + "checkall": "true", + "repair": false, + "outputs": 1, + "x": 340, + "y": 920, + "wires": [ + [ + "b3814c680815a25b" + ] + ] + }, { "id": "91e25dba31c28805", "type": "http in", @@ -2219,7 +2215,7 @@ "t": "set", "p": "payload", "pt": "msg", - "to": "{\t \"host\": msg.config.id,\t \"name\": $replace(msg.result.Name,\"/\",\"\"),\t \"hostname\": msg.result.Config.Hostname,\t \"status\": msg.result.State.Status = \"running\"\t ? \"running \" & $ceil(\t (\t $toMillis($now()) - $toMillis(msg.result.State.StartedAt)\t ) / 1000 / 60 / 60 / 24\t ) & \"d\"\t : \"na\",\t \"state\": msg.result.State.Status,\t \"operation\": \"none\",\t \"restart_policy\": msg.result.HostConfig.RestartPolicy.Name = \"\" ? \"no\" : msg.result.HostConfig.RestartPolicy.Name,\t \"image\": {\t \"host\": msg.config.id,\t \"ImageID\": msg.result.Image\t },\t \"HealthCheck\": msg.result.Config.Healthcheck,\t \"ContainerID\": msg.result.Id,\t \"cap_add\": msg.result.HostConfig.CapAdd != null ? msg.result.HostConfig.CapAdd.$replace(\"CAP_\", \"\")[] : msg.result.HostConfig.CapAdd,\t \"cap_drop\": msg.result.HostConfig.CapDrop != null ? msg.result.HostConfig.CapDrop.$replace(\"CAP_\", \"\")[] : msg.result.HostConfig.CapDrop,\t \"extra_hosts\": msg.result.HostConfig.ExtraHosts,\t \"pid_mode\": msg.result.HostConfig.PidMode,\t \"network_settings\": [\t $each(\t msg.result.NetworkSettings.Networks,\t function($v, $k) {\t {\t \"network\": { \"host\": msg.config.id, \"name\": $k } \t }\t }\t )\t ],\t \"ports\":msg.result.HostConfig.PortBindings ? [\t $each(\t msg.result.HostConfig.PortBindings,\t function($v, $k) {\t {\t \"public_port\": $count($v) = 0 or $v[0] = null or $length($v[0].HostPort) = 0 ? 0 : $v[0].HostPort,\t \"private_port\": $split($k,\"/\")[0],\t \"type\": $split($k,\"/\")[1]\t }\t }\t )\t ] : msg.result.NetworkSettings.Ports\t ? [\t $each(\t msg.result.NetworkSettings.Ports,\t function($v, $k) {\t {\t \"public_port\": -1,\t \"private_port\": $split($k,\"/\")[0],\t \"type\": $split($k,\"/\")[1]\t }\t }\t )\t ]\t : [],\t \"env\": [\t $map(\t msg.result.Config.Env,\t function($v, $k) {\t {\t \"var_name\": $substringBefore($v, \"=\"),\t \"value\": $substringAfter($v, \"=\")\t }\t }\t )\t ],\t \"labels\": [\t $each(\t msg.result.Config.Labels,\t function($v, $k) {\t { \"key\": $k, \"value\": $v }\t }\t )\t ],\t \"devices\": msg.result.HostConfig.Devices\t ? [\t $map(\t msg.result.HostConfig.Devices,\t function($v, $k) {\t {\t \"container_path\": $v.PathInContainer,\t \"host_path\": $v.PathOnHost\t }\t }\t )\t ],\t \"mounts\": [\t $map(\t msg.result.Mounts,\t function($v, $k) {\t $v.Type = \"volume\"\t ? {\t \"source\": $v.Destination,\t \"volume\": {\t \"name\": $v.Name,\t \"host\": msg.config.id \t },\t \"read_only\": $not($v.RW)\t }\t }\t )\t ],\t \"binds\": [\t $map(\t msg.result.Mounts,\t function($v, $k) {\t $v.Type = \"bind\"\t ? {\t \"host_path\": $v.Source,\t \"container_path\": $v.Destination,\t \"read_only\": $not($v.RW)\t }\t }\t )\t ],\t \"log_driver\": msg.result.HostConfig.LogConfig.Type,\t \"log_driver_options\": [\t $each(\t msg.result.HostConfig.LogConfig.Config,\t function($v, $k) {\t {\t \"option_name\": $k,\t \"value\": $v\t }\t }\t )\t ],\t \"cmd\": msg.result.Config.Cmd,\t \"sysctls\": [\t $each(\t msg.result.HostConfig.Sysctls,\t function($v, $k) {\t { \"key\": $k, \"value\": $v }\t }\t )\t ]\t}", + "to": "{\t \"host\": msg.config.id,\t \"name\": $replace(msg.result.Name,\"/\",\"\"),\t \"hostname\": msg.result.Config.Hostname,\t \"exitCode\": msg.result.State.ExitCode,\t \"status\": msg.result.State.Status = \"running\"\t ? \"running \" & $ceil(\t (\t $toMillis($now()) - $toMillis(msg.result.State.StartedAt)\t ) / 1000 / 60 / 60 / 24\t ) & \"d\"\t : \"na\",\t \"state\": msg.result.State.Status,\t \"operation\": \"none\",\t \"restart_policy\": msg.result.HostConfig.RestartPolicy.Name = \"\" ? \"no\" : msg.result.HostConfig.RestartPolicy.Name,\t \"image\": {\t \"host\": msg.config.id,\t \"ImageID\": msg.result.Image\t },\t \"HealthCheck\": msg.result.Config.Healthcheck,\t \"ContainerID\": msg.result.Id,\t \"cap_add\": msg.result.HostConfig.CapAdd != null ? msg.result.HostConfig.CapAdd.$replace(\"CAP_\", \"\")[] : msg.result.HostConfig.CapAdd,\t \"cap_drop\": msg.result.HostConfig.CapDrop != null ? msg.result.HostConfig.CapDrop.$replace(\"CAP_\", \"\")[] : msg.result.HostConfig.CapDrop,\t \"extra_hosts\": msg.result.HostConfig.ExtraHosts,\t \"pid_mode\": msg.result.HostConfig.PidMode,\t \"network_settings\": [\t $each(\t msg.result.NetworkSettings.Networks,\t function($v, $k) {\t {\t \"network\": { \"host\": msg.config.id, \"name\": $k } \t }\t }\t )\t ],\t \"ports\":msg.result.HostConfig.PortBindings ? [\t $each(\t msg.result.HostConfig.PortBindings,\t function($v, $k) {\t {\t \"public_port\": $count($v) = 0 or $v[0] = null or $length($v[0].HostPort) = 0 ? 0 : $v[0].HostPort,\t \"private_port\": $split($k,\"/\")[0],\t \"type\": $split($k,\"/\")[1]\t }\t }\t )\t ] : msg.result.NetworkSettings.Ports\t ? [\t $each(\t msg.result.NetworkSettings.Ports,\t function($v, $k) {\t {\t \"public_port\": -1,\t \"private_port\": $split($k,\"/\")[0],\t \"type\": $split($k,\"/\")[1]\t }\t }\t )\t ]\t : [],\t \"env\": [\t $map(\t msg.result.Config.Env,\t function($v, $k) {\t {\t \"var_name\": $substringBefore($v, \"=\"),\t \"value\": $substringAfter($v, \"=\")\t }\t }\t )\t ],\t \"labels\": [\t $each(\t msg.result.Config.Labels,\t function($v, $k) {\t { \"key\": $k, \"value\": $v }\t }\t )\t ],\t \"devices\": msg.result.HostConfig.Devices\t ? [\t $map(\t msg.result.HostConfig.Devices,\t function($v, $k) {\t {\t \"container_path\": $v.PathInContainer,\t \"host_path\": $v.PathOnHost\t }\t }\t )\t ],\t \"mounts\": [\t $map(\t msg.result.Mounts,\t function($v, $k) {\t $v.Type = \"volume\"\t ? {\t \"source\": $v.Destination,\t \"volume\": {\t \"name\": $v.Name,\t \"host\": msg.config.id \t },\t \"read_only\": $not($v.RW)\t }\t }\t )\t ],\t \"binds\": [\t $map(\t msg.result.Mounts,\t function($v, $k) {\t $v.Type = \"bind\"\t ? {\t \"host_path\": $v.Source,\t \"container_path\": $v.Destination,\t \"read_only\": $not($v.RW)\t }\t }\t )\t ],\t \"log_driver\": msg.result.HostConfig.LogConfig.Type,\t \"log_driver_options\": [\t $each(\t msg.result.HostConfig.LogConfig.Config,\t function($v, $k) {\t {\t \"option_name\": $k,\t \"value\": $v\t }\t }\t )\t ],\t \"cmd\": msg.result.Config.Cmd,\t \"sysctls\": [\t $each(\t msg.result.HostConfig.Sysctls,\t function($v, $k) {\t { \"key\": $k, \"value\": $v }\t }\t )\t ]\t}", "tot": "jsonata" } ], @@ -6234,7 +6230,7 @@ "t": "set", "p": "payload", "pt": "msg", - "to": "{\t \"Image\": msg.input.data.image.ImageID,\t \"Hostname\": msg.input.data.hostname,\t \"Env\": [\t $map(\t msg.input.data.env,\t function($v, $k) {\t $v.var_name &\"=\" & $v.value\t }\t )\t ],\t \"Labels\": $merge(\t $map(\t msg.input.data.labels,\t function($v, $k) {\t { $v.key: $v.value }\t }\t )\t ),\t \"ExposedPorts\": $merge(\t $map(\t msg.input.data.ports,\t function($v, $k) {\t $v.public_port != -1\t ? {\t $v.private_port & \"/\" & $v.type: {} \t }\t : {}\t }\t )\t ),\t \"NetworkingConfig\": {\t \"EndpointsConfig\": $merge(\t $map(\t msg.input.data.network_settings,\t function($v, $k) {\t $k = 0 ? {\t $v.network.name : { \"NetworkID\": $v.network.NetworkID } \t }\t }\t )\t )\t },\t \"Cmd\": msg.input.data.cmd,\t \"HostConfig\": {\t \"CapAdd\": msg.input.data.cap_add,\t \"CapDrop\": msg.input.data.cap_drop,\t \"PidMode\": msg.input.data.pid_mode,\t \"ExtraHosts\": msg.input.data.extra_hosts,\t \"PortBindings\": $merge(\t $map(\t msg.input.data.ports,\t function($v, $k) {\t $v.public_port != -1\t ? {\t ($string($v.private_port) & \"/\" & $v.type): [\t {\t \"HostIp\": \"\",\t \"HostPort\": $string($v.public_port)\t }\t ]\t }\t : {}\t }\t )\t ),\t \"Devices\": [\t $map(\t msg.input.data.devices,\t function($v, $k) {\t {\t \"PathInContainer\": $v.container_path,\t \"PathOnHost\": $v.host_path,\t \"CgroupPermissions\": \"rwm\"\t }\t }\t )\t ],\t \"Mounts\": [\t $map(\t msg.input.data.mounts,\t function($v, $k) {\t {\t \"Target\": $v.source,\t \"Name\": $v.volume.name,\t \"Type\": \"volume\",\t \"Destination\": $v.source,\t \"ReadOnly\": $v.read_only,\t \"Source\": $v.volume.name,\t \"Driver\": $v.volume.driver\t }\t }\t ),\t $map(\t msg.input.data.binds,\t function($v, $k) {\t {\t \"Target\": $v.container_path,\t \"Type\": \"bind\",\t \"Destination\": $v.container_path,\t \"ReadOnly\": $v.read_only,\t \"Source\": $v.host_path,\t \"BindOptions\": {\t \"CreateMountpoint\": true\t }\t }\t }\t )\t ],\t \"RestartPolicy\": {\t \"Name\": msg.input.data.restart_policy\t },\t \"NetworkMode\": $count([msg.input.data.network_settings.network[driver = \"host\"]]) >= 1 ? \"host\" : undefined,\t \"LogConfig\": {\t \"Type\": msg.input.data.log_driver,\t \"Config\": $count(msg.input.data.log_driver_options) = 0 ? {} : msg.input.data.log_driver_options{option_name: value}\t },\t \"Sysctls\": $merge(\t $map(\t msg.input.data.sysctls,\t function($v, $k) {\t { $v.key: $v.value }\t }\t )\t )\t }\t}\t", + "to": "{\t \"Image\": msg.input.data.image.ImageID,\t \"Hostname\": msg.input.data.hostname,\t \"Env\": [\t $map(\t msg.input.data.env,\t function($v, $k) {\t $v.var_name &\"=\" & $v.value\t }\t )\t ],\t \"Labels\": $merge(\t $map(\t msg.input.data.labels,\t function($v, $k) {\t { $v.key: $v.value }\t }\t )\t ),\t \"ExposedPorts\": $merge(\t $map(\t msg.input.data.ports,\t function($v, $k) {\t $v.public_port != -1\t ? {\t $v.private_port & \"/\" & $v.type: {} \t }\t : {}\t }\t )\t ),\t \"NetworkingConfig\": {\t \"EndpointsConfig\": $merge(\t $map(\t msg.input.data.network_settings,\t function($v, $k) {\t $k = 0 ? {\t $v.network.name : { \"NetworkID\": $v.network.NetworkID } \t }\t }\t )\t )\t },\t \"Cmd\": msg.input.data.cmd,\t \"HostConfig\": {\t \"CapAdd\": msg.input.data.cap_add,\t \"CapDrop\": msg.input.data.cap_drop,\t \"PidMode\": msg.input.data.pid_mode,\t \"ExtraHosts\": msg.input.data.extra_hosts,\t \"SecurityOpt\": msg.input.data.secOpt,\t \"PortBindings\": $merge(\t $map(\t msg.input.data.ports,\t function($v, $k) {\t $v.public_port != -1\t ? {\t ($string($v.private_port) & \"/\" & $v.type): [\t {\t \"HostIp\": \"\",\t \"HostPort\": $string($v.public_port)\t }\t ]\t }\t : {}\t }\t )\t ),\t \"Devices\": [\t $map(\t msg.input.data.devices,\t function($v, $k) {\t {\t \"PathInContainer\": $v.container_path,\t \"PathOnHost\": $v.host_path,\t \"CgroupPermissions\": \"rwm\"\t }\t }\t )\t ],\t \"Mounts\": [\t $map(\t msg.input.data.mounts,\t function($v, $k) {\t {\t \"Target\": $v.source,\t \"Name\": $v.volume.name,\t \"Type\": \"volume\",\t \"Destination\": $v.source,\t \"ReadOnly\": $v.read_only,\t \"Source\": $v.volume.name,\t \"Driver\": $v.volume.driver\t }\t }\t ),\t $map(\t msg.input.data.binds,\t function($v, $k) {\t {\t \"Target\": $v.container_path,\t \"Type\": \"bind\",\t \"Destination\": $v.container_path,\t \"ReadOnly\": $v.read_only,\t \"Source\": $v.host_path,\t \"BindOptions\": {\t \"CreateMountpoint\": true\t }\t }\t }\t )\t ],\t \"RestartPolicy\": {\t \"Name\": msg.input.data.restart_policy\t },\t \"NetworkMode\": $count([msg.input.data.network_settings.network[driver = \"host\"]]) >= 1 ? \"host\" : undefined,\t \"LogConfig\": {\t \"Type\": msg.input.data.log_driver,\t \"Config\": $count(msg.input.data.log_driver_options) = 0 ? {} : msg.input.data.log_driver_options{option_name: value}\t },\t \"Sysctls\": $merge(\t $map(\t msg.input.data.sysctls,\t function($v, $k) {\t { $v.key: $v.value }\t }\t )\t )\t }\t}\t", "tot": "jsonata" }, { @@ -6641,7 +6637,7 @@ "t": "set", "p": "payload", "pt": "msg", - "to": "[\t {\t \"id\": msg.input.data.id,\t \"host\": msg.input.data.host.id,\t \"name\": $replace(msg.result.Name,\"/\",\"\"),\t \"hostname\": msg.result.Config.Hostname,\t \"operation\": \"none\",\t \"state\": msg.result.State.Status,\t \"extra_hosts\": msg.result.HostConfig.ExtraHosts,\t \"restart_policy\": msg.result.HostConfig.RestartPolicy.Name = \"\" ? \"no\" : msg.result.HostConfig.RestartPolicy.Name,\t \"status\": msg.result.State.Status = \"running\"\t ? \"running \" & $ceil(\t (\t $toMillis($now()) - $toMillis(msg.result.State.StartedAt)\t ) / 1000 / 60 / 60 / 24\t ) & \"d\"\t : \"na\",\t \"image\": {\t \"host\": msg.input.data.host.id,\t \"ImageID\": msg.result.Image\t },\t \"ContainerID\": msg.result.Id,\t \"cap_add\": msg.result.HostConfig.CapAdd != null ? msg.result.HostConfig.CapAdd.$replace(\"CAP_\", \"\")[] : msg.result.HostConfig.CapAdd,\t \"cap_drop\": msg.result.HostConfig.CapDrop != null ? msg.result.HostConfig.CapDrop.$replace(\"CAP_\", \"\")[] : msg.result.HostConfig.CapDrop,\t \"network_settings\": [\t $each(\t msg.result.NetworkSettings.Networks,\t function($v, $k) {\t {\t \"network\": { \"name\": $k, \"host\": msg.config.id } \t }\t }\t )\t ],\t \"ports\":msg.result.HostConfig.PortBindings ? [\t $each(\t msg.result.HostConfig.PortBindings,\t function($v, $k) {\t {\t \"public_port\": $count($v) = 0 or $v[0] = null or $length($v[0].HostPort) = 0 ? 0 : $v[0].HostPort,\t \"private_port\": $split($k,\"/\")[0],\t \"type\": $split($k,\"/\")[1]\t }\t }\t )\t ] : msg.result.NetworkSettings.Ports\t ? [\t $each(\t msg.result.NetworkSettings.Ports,\t function($v, $k) {\t {\t \"public_port\": -1,\t \"private_port\": $split($k,\"/\")[0],\t \"type\": $split($k,\"/\")[1]\t }\t }\t )\t ]\t : [],\t \"env\": [\t $map(\t msg.result.Config.Env,\t function($v, $k) {\t {\t \"var_name\": $substringBefore($v, \"=\"),\t \"value\": $substringAfter($v, \"=\")\t }\t }\t )\t ],\t \"labels\": [\t $each(\t msg.result.Config.Labels,\t function($v, $k) {\t { \"key\": $k, \"value\": $v }\t }\t )\t ],\t \"mounts\": [\t $map(\t msg.result.Mounts,\t function($v, $k) {\t $v.Type = \"volume\"\t ? {\t \"source\": $v.Destination,\t \"volume\": {\t \"name\": $v.Name,\t \"host\": msg.config.id \t },\t \"read_only\": $not($v.RW)\t }\t }\t )\t ],\t \"binds\": [\t $map(\t msg.result.Mounts,\t function($v, $k) {\t $v.Type = \"bind\"\t ? {\t \"host_path\": $v.Source,\t \"container_path\": $v.Destination,\t \"read_only\": $not($v.RW)\t }\t }\t )\t ],\t \"log_driver\": msg.result.HostConfig.LogConfig.Type,\t \"log_driver_options\": [\t $each(\t msg.result.HostConfig.LogConfig.Config,\t function($v, $k) {\t {\t \"option_name\": $k,\t \"value\": $v\t }\t }\t )\t ],\t \"cmd\": msg.result.Config.Cmd,\t \"sysctls\": [\t $each(\t msg.result.HostConfig.Sysctls,\t function($v, $k) {\t { \"key\": $k, \"value\": $v }\t }\t )\t ]\t}\t]", + "to": "[\t {\t \"id\": msg.input.data.id,\t \"host\": msg.input.data.host.id,\t \"name\": $replace(msg.result.Name,\"/\",\"\"),\t \"hostname\": msg.result.Config.Hostname,\t \"operation\": \"none\",\t \"exitCode\": msg.result.State.ExitCode,\t \"state\": msg.result.State.Status,\t \"extra_hosts\": msg.result.HostConfig.ExtraHosts,\t \"restart_policy\": msg.result.HostConfig.RestartPolicy.Name = \"\" ? \"no\" : msg.result.HostConfig.RestartPolicy.Name,\t \"status\": msg.result.State.Status = \"running\"\t ? \"running \" & $ceil(\t (\t $toMillis($now()) - $toMillis(msg.result.State.StartedAt)\t ) / 1000 / 60 / 60 / 24\t ) & \"d\"\t : \"na\",\t \"image\": {\t \"host\": msg.input.data.host.id,\t \"ImageID\": msg.result.Image\t },\t \"ContainerID\": msg.result.Id,\t \"cap_add\": msg.result.HostConfig.CapAdd != null ? msg.result.HostConfig.CapAdd.$replace(\"CAP_\", \"\")[] : msg.result.HostConfig.CapAdd,\t \"cap_drop\": msg.result.HostConfig.CapDrop != null ? msg.result.HostConfig.CapDrop.$replace(\"CAP_\", \"\")[] : msg.result.HostConfig.CapDrop,\t \"network_settings\": [\t $each(\t msg.result.NetworkSettings.Networks,\t function($v, $k) {\t {\t \"network\": { \"name\": $k, \"host\": msg.config.id } \t }\t }\t )\t ],\t \"ports\":msg.result.HostConfig.PortBindings ? [\t $each(\t msg.result.HostConfig.PortBindings,\t function($v, $k) {\t {\t \"public_port\": $count($v) = 0 or $v[0] = null or $length($v[0].HostPort) = 0 ? 0 : $v[0].HostPort,\t \"private_port\": $split($k,\"/\")[0],\t \"type\": $split($k,\"/\")[1]\t }\t }\t )\t ] : msg.result.NetworkSettings.Ports\t ? [\t $each(\t msg.result.NetworkSettings.Ports,\t function($v, $k) {\t {\t \"public_port\": -1,\t \"private_port\": $split($k,\"/\")[0],\t \"type\": $split($k,\"/\")[1]\t }\t }\t )\t ]\t : [],\t \"env\": [\t $map(\t msg.result.Config.Env,\t function($v, $k) {\t {\t \"var_name\": $substringBefore($v, \"=\"),\t \"value\": $substringAfter($v, \"=\")\t }\t }\t )\t ],\t \"labels\": [\t $each(\t msg.result.Config.Labels,\t function($v, $k) {\t { \"key\": $k, \"value\": $v }\t }\t )\t ],\t \"mounts\": [\t $map(\t msg.result.Mounts,\t function($v, $k) {\t $v.Type = \"volume\"\t ? {\t \"source\": $v.Destination,\t \"volume\": {\t \"name\": $v.Name,\t \"host\": msg.config.id \t },\t \"read_only\": $not($v.RW)\t }\t }\t )\t ],\t \"binds\": [\t $map(\t msg.result.Mounts,\t function($v, $k) {\t $v.Type = \"bind\"\t ? {\t \"host_path\": $v.Source,\t \"container_path\": $v.Destination,\t \"read_only\": $not($v.RW)\t }\t }\t )\t ],\t \"log_driver\": msg.result.HostConfig.LogConfig.Type,\t \"log_driver_options\": [\t $each(\t msg.result.HostConfig.LogConfig.Config,\t function($v, $k) {\t {\t \"option_name\": $k,\t \"value\": $v\t }\t }\t )\t ],\t \"secOpt\": msg.result.HostConfig.SecurityOpt,\t \"cmd\": msg.result.Config.Cmd,\t \"sysctls\": [\t $each(\t msg.result.HostConfig.Sysctls,\t function($v, $k) {\t { \"key\": $k, \"value\": $v }\t }\t )\t ]\t}\t]", "tot": "jsonata" } ], diff --git a/package-lock.json b/package-lock.json index 3f031e7..0ad0990 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "netbox-docker-agent", - "version": "1.20.1", + "version": "1.21.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "netbox-docker-agent", - "version": "1.20.1", + "version": "1.21.0", "license": "ISC", "dependencies": { - "docker-exec-websocket-server": "^3.0.0", + "docker-exec-websocket-server": "^1.3.7", "node-red": "*" }, "devDependencies": { @@ -87,14 +87,14 @@ } }, "node_modules/@node-red/editor-api": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@node-red/editor-api/-/editor-api-4.1.4.tgz", - "integrity": "sha512-VpbsW2blBjcf6LOyo4Mq5HTSIgNGrFqsZRbStErtxhm1hVcJ+xX6pilyPPaDQXPUdVO55HVTGLfn1yHLkkWQyg==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@node-red/editor-api/-/editor-api-4.1.6.tgz", + "integrity": "sha512-adAW90HraVtm96SzqtWagWlhybjE9Kt7kTlXr1ZDqD0hN2v0y4awgm1ZpmM6pd3XSmZPoHH3INzr5MPAisbBww==", "license": "Apache-2.0", "dependencies": { - "@node-red/editor-client": "4.1.4", - "@node-red/util": "4.1.4", - "bcryptjs": "3.0.2", + "@node-red/editor-client": "4.1.6", + "@node-red/util": "4.1.6", + "bcryptjs": "3.0.3", "body-parser": "1.20.4", "clone": "2.1.2", "cors": "2.8.5", @@ -114,42 +114,21 @@ "@node-rs/bcrypt": "1.10.7" } }, - "node_modules/@node-red/editor-api/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@node-red/editor-client": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@node-red/editor-client/-/editor-client-4.1.4.tgz", - "integrity": "sha512-oQ2Jm3wdy1kFJKAOw9vk0YCqvlLoHdMiZFRkOsOMzjhkUZMzgImnxTBA7K2yMpRIQrup782A9WmM7LbkXWljvw==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@node-red/editor-client/-/editor-client-4.1.6.tgz", + "integrity": "sha512-fpmz1JTK3xPR8vphsXI98SYXN0s8uW91vxm3JaR1mMYccJktR5ccbCM3mLpXvHui6w4NhCRQ4tCseiZbEfCHvg==", "license": "Apache-2.0" }, "node_modules/@node-red/nodes": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@node-red/nodes/-/nodes-4.1.4.tgz", - "integrity": "sha512-soTIr5EhE7NSSpNvXScUxNUNjvrt3N/ArHwHbAvSjArDwUF1mGLci9t3TGA66lESdhffy1hxucxiiaZMmtRLkw==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@node-red/nodes/-/nodes-4.1.6.tgz", + "integrity": "sha512-ac66cR4PNAxoHQ5+nmYaHz8B8GGm+shtLDAHesr4r14gEO816p6ZZe3bPoi3zVHXYojen5GLHqEoFWLJongxqQ==", "license": "Apache-2.0", "dependencies": { - "acorn": "8.15.0", - "acorn-walk": "8.3.4", - "ajv": "8.17.1", + "acorn": "8.16.0", + "acorn-walk": "8.3.5", + "ajv": "8.18.0", "body-parser": "1.20.4", "cheerio": "1.0.0-rc.10", "content-type": "1.0.5", @@ -168,7 +147,7 @@ "is-utf8": "0.2.1", "js-yaml": "4.1.1", "media-typer": "1.1.0", - "mqtt": "5.11.0", + "mqtt": "5.15.0", "multer": "2.0.2", "mustache": "4.2.0", "node-watch": "0.7.4", @@ -180,49 +159,28 @@ "xml2js": "0.6.2" } }, - "node_modules/@node-red/nodes/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@node-red/registry": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@node-red/registry/-/registry-4.1.4.tgz", - "integrity": "sha512-AI7QU0TykXgXho7sfOPEBNJECnFsyuJgamAaKjFQ3vvHXRezNR3AOmH1n6JFguBbcNrdq3Rvt8+S3roekWllrQ==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@node-red/registry/-/registry-4.1.6.tgz", + "integrity": "sha512-MvyT8Tu7a8PmxGPKRkN00wjNo4F26kVZ0dKnnMincZOBk2EJniy4T5bqLythlpradRDG9MDSBSkG6NkhniWzwA==", "license": "Apache-2.0", "dependencies": { - "@node-red/util": "4.1.4", + "@node-red/util": "4.1.6", "clone": "2.1.2", "fs-extra": "11.3.0", - "semver": "7.7.1", - "tar": "7.5.6", + "semver": "7.7.4", + "tar": "7.5.9", "uglify-js": "3.19.3" } }, "node_modules/@node-red/runtime": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@node-red/runtime/-/runtime-4.1.4.tgz", - "integrity": "sha512-CHmbxyr61yhW80RG5Qj46+w1IsRiMoQEQjBX/6qsqhVjrH0TnmbFhHUT1OWhZje14mANsSNpGVymLgZCGDCQSQ==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@node-red/runtime/-/runtime-4.1.6.tgz", + "integrity": "sha512-xfU5b/3JaHbzWZPmXTbrwzgJfe3L9Uc1rrPAYjRYgwF4lDOKhLdiY9sQzfDpdQr0mwuhtKng4lESemIqH676Rw==", "license": "Apache-2.0", "dependencies": { - "@node-red/registry": "4.1.4", - "@node-red/util": "4.1.4", + "@node-red/registry": "4.1.6", + "@node-red/util": "4.1.6", "async-mutex": "0.5.0", "clone": "2.1.2", "cronosjs": "1.7.1", @@ -230,14 +188,14 @@ "fs-extra": "11.3.0", "got": "12.6.1", "json-stringify-safe": "5.0.1", - "rfdc": "^1.3.1", - "semver": "7.7.1" + "rfdc": "1.4.1", + "semver": "7.7.4" } }, "node_modules/@node-red/util": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@node-red/util/-/util-4.1.4.tgz", - "integrity": "sha512-TxqrN2T8qiYrM70lxYUmwE+W7U5dIHKUxtYSYmVB9l3LOBRlTFAb5dj4+dqMM8Rf2SaahO+4mJmHl/xfJ6zfew==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@node-red/util/-/util-4.1.6.tgz", + "integrity": "sha512-x49OC+VwHWSA2iPOTfxorDzBBWUdBe28RJPF2PYrWzU3VpJ2NCrjNKdl02LYJA8w4TqDRgPDmA8t5VyrUivwEg==", "license": "Apache-2.0", "dependencies": { "chalk": "^4.1.2", @@ -505,15 +463,15 @@ } }, "node_modules/@orangeopensource/hurl": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@orangeopensource/hurl/-/hurl-7.1.2.tgz", - "integrity": "sha512-DfphCypN8zX7wsgGeh1RXFT8QLZij0eoJ95mR47I2reBDXlsRplFUkrrwhafiYKlmJOV7/7gZTYV83GUi6Vn6w==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@orangeopensource/hurl/-/hurl-7.1.4.tgz", + "integrity": "sha512-vXWrAqEEq/yap06l029uSKQq9tQdWSZ5dirGazwZ/GXbSSZ3NhrPMd8uC/14jXRO81diY/5l3F1+6UkxMfmZ8A==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "extract-zip": "2.0.1", - "tar": "7.5.6" + "tar": "7.5.9" }, "bin": { "hurl": "hurl.js", @@ -561,12 +519,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz", - "integrity": "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==", + "version": "25.3.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.3.tgz", + "integrity": "sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==", "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.18.0" } }, "node_modules/@types/readable-stream": { @@ -630,9 +588,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -642,9 +600,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "license": "MIT", "dependencies": { "acorn": "^8.11.0" @@ -666,9 +624,9 @@ } }, "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -757,16 +715,32 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", - "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", + "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -809,9 +783,9 @@ } }, "node_modules/bcryptjs": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz", - "integrity": "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.3.tgz", + "integrity": "sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==", "license": "BSD-3-Clause", "bin": { "bcrypt": "bin/bcrypt" @@ -917,6 +891,18 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "license": "ISC" }, + "node_modules/broker-factory": { + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/broker-factory/-/broker-factory-3.1.13.tgz", + "integrity": "sha512-H2VALe31mEtO/SRcNp4cUU5BAm1biwhc/JaF77AigUuni/1YT0FLCJfbUxwIEs9y6Kssjk2fmXgf+Y9ALvmKlw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "fast-unique-numbers": "^9.0.26", + "tslib": "^2.8.1", + "worker-factory": "^7.0.48" + } + }, "node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -1420,19 +1406,20 @@ } }, "node_modules/docker-exec-websocket-server": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/docker-exec-websocket-server/-/docker-exec-websocket-server-3.0.0.tgz", - "integrity": "sha512-sVgZhs97cU/dg0GxH734NXERlD8oRJmJogu+PiQXBdNwRunrNXEifik/WzSNylxQNFBIV+cKReLdVPRvFEdt7A==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/docker-exec-websocket-server/-/docker-exec-websocket-server-1.4.0.tgz", + "integrity": "sha512-ZbJnuXYQjt3BmPF/JVE+E+iiladzNMOp4emBvPycJ8vbYU2RWmaR/l71vtOXAj0aX3eDYD9764Ci6A2c9G+QaA==", "license": "MPL-2.0", "dependencies": { "debug": "^4.1.1", "dockerode": "^3.2.1", - "lodash": "^4.17.21", - "through2": "^4.0.2", - "ws": "^8.4.2" + "lodash": "^4.17.19", + "slugid": "^2.0.0", + "through2": "^3.0.1", + "ws": "^7.1.2" }, "engines": { - "node": ">12.0" + "node": ">8.0" } }, "node_modules/docker-modem": { @@ -1826,16 +1813,16 @@ "license": "MIT" }, "node_modules/fast-unique-numbers": { - "version": "8.0.13", - "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-8.0.13.tgz", - "integrity": "sha512-7OnTFAVPefgw2eBJ1xj2PGGR9FwYzSUso9decayHgCDX4sJkHLdcsYTytTg+tYv+wKF3U8gJuSBz2jJpQV4u/g==", + "version": "9.0.26", + "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.26.tgz", + "integrity": "sha512-3Mtq8p1zQinjGyWfKeuBunbuFoixG72AUkk4VvzbX4ykCW9Q4FzRaNyIlfQhUjnKw2ARVP+/CKnoyr6wfHftig==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.8", - "tslib": "^2.6.2" + "@babel/runtime": "^7.28.6", + "tslib": "^2.8.1" }, "engines": { - "node": ">=16.1.0" + "node": ">=18.2.0" } }, "node_modules/fast-uri": { @@ -2538,10 +2525,10 @@ } }, "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -2598,28 +2585,27 @@ } }, "node_modules/mqtt": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.11.0.tgz", - "integrity": "sha512-VDqfADTNvohwcY02NgxPb7OojIeDrNQ1q62r/DcM+bnIWY8LBi3nMTvdEaFEp6Bu4ejBIpHjJVthUEgnvGLemA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.15.0.tgz", + "integrity": "sha512-KC+wAssYk83Qu5bT8YDzDYgUJxPhbLeVsDvpY2QvL28PnXYJzC2WkKruyMUgBAZaQ7h9lo9k2g4neRNUUxzgMw==", "license": "MIT", "dependencies": { - "@types/readable-stream": "^4.0.18", - "@types/ws": "^8.5.14", + "@types/readable-stream": "^4.0.21", + "@types/ws": "^8.18.1", "commist": "^3.2.0", "concat-stream": "^2.0.0", - "debug": "^4.4.0", + "debug": "^4.4.1", "help-me": "^5.0.0", "lru-cache": "^10.4.3", "minimist": "^1.2.8", "mqtt-packet": "^9.0.2", "number-allocator": "^1.0.14", "readable-stream": "^4.7.0", - "reinterval": "^1.1.0", "rfdc": "^1.4.1", - "socks": "^2.8.3", + "socks": "^2.8.6", "split2": "^4.2.0", - "worker-timers": "^7.1.8", - "ws": "^8.18.0" + "worker-timers": "^8.0.23", + "ws": "^8.18.3" }, "bin": { "mqtt": "build/bin/mqtt.js", @@ -2663,6 +2649,27 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/mqtt/node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2722,23 +2729,23 @@ } }, "node_modules/node-red": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/node-red/-/node-red-4.1.4.tgz", - "integrity": "sha512-shFbq5V7E9U0ivD0yjo7V0ZwJv0x6ut+1aRm9SiUOXbnO7WIX8jdkgYaM8dBs4skSj/SbT8cuxyV2ke/rBJJVw==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/node-red/-/node-red-4.1.6.tgz", + "integrity": "sha512-1j5H0HPvxwgtHjdENr6sppyMNSlXF9Cnnd8vVx5hwvctSe/uVdesm5ZBcIGAJEvRsjBpoFmirA2GsnjyM4rSnQ==", "license": "Apache-2.0", "dependencies": { - "@node-red/editor-api": "4.1.4", - "@node-red/nodes": "4.1.4", - "@node-red/runtime": "4.1.4", - "@node-red/util": "4.1.4", + "@node-red/editor-api": "4.1.6", + "@node-red/nodes": "4.1.6", + "@node-red/runtime": "4.1.6", + "@node-red/util": "4.1.6", "basic-auth": "2.0.1", - "bcryptjs": "3.0.2", + "bcryptjs": "3.0.3", "cors": "2.8.5", "express": "4.22.1", "fs-extra": "11.3.0", - "node-red-admin": "^4.1.2", + "node-red-admin": "^4.1.3", "nopt": "5.0.0", - "semver": "7.7.1" + "semver": "7.7.4" }, "bin": { "node-red": "red.js", @@ -2752,13 +2759,13 @@ } }, "node_modules/node-red-admin": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/node-red-admin/-/node-red-admin-4.1.2.tgz", - "integrity": "sha512-Yqe3dREfZZmc/BqT3Ntg0DEXivbP3HBNYCbjDkUaakkIIrapNR8TK1vj3RgkSW6FMtpfcVXBcLGI4cA0I1zbOw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/node-red-admin/-/node-red-admin-4.1.3.tgz", + "integrity": "sha512-Kb3uF59389eZh78SmhN8eiUT1uUMCoH2dC60KOQKsHx3R9qHGBpJu0nozi9E4odnCJMLFOe+n4ENjEeRF+etwQ==", "license": "Apache-2.0", "dependencies": { "ansi-colors": "^4.1.3", - "axios": "1.12.2", + "axios": "^1.13.5", "bcryptjs": "3.0.2", "cli-table": "^0.3.11", "enquirer": "^2.3.6", @@ -2776,6 +2783,15 @@ "@node-rs/bcrypt": "1.10.7" } }, + "node_modules/node-red-admin/node_modules/bcryptjs": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz", + "integrity": "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==", + "license": "BSD-3-Clause", + "bin": { + "bcrypt": "bin/bcrypt" + } + }, "node_modules/node-watch": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.4.tgz", @@ -3058,9 +3074,9 @@ "license": "ISC" }, "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -3068,9 +3084,9 @@ } }, "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -3178,12 +3194,6 @@ "node": ">= 6" } }, - "node_modules/reinterval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", - "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==", - "license": "MIT" - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -3233,18 +3243,18 @@ "license": "MIT" }, "node_modules/sax": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", - "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.5.0.tgz", + "integrity": "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==", "license": "BlueOak-1.0.0", "engines": { "node": ">=11.0.0" } }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -3397,6 +3407,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/slugid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slugid/-/slugid-2.0.0.tgz", + "integrity": "sha512-zTCivUfTk2GC6MU4Fjcz0iXwAjhe0NweMJqpfWcGrBbrm2dWtVAUupAonfsc7ysw4M0kZ934Nle5ljwM2dR+/g==", + "license": "MIT", + "dependencies": { + "uuid": "^3.2.1", + "uuid-parse": "^1.0.0" + } + }, + "node_modules/slugid/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -3524,10 +3554,9 @@ } }, "node_modules/tar": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz", - "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", - "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", + "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", @@ -3619,12 +3648,13 @@ } }, "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", "license": "MIT", "dependencies": { - "readable-stream": "3" + "inherits": "^2.0.4", + "readable-stream": "2 || 3" } }, "node_modules/tldts": { @@ -3737,9 +3767,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "license": "MIT" }, "node_modules/universalify": { @@ -3788,6 +3818,12 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/uuid-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/uuid-parse/-/uuid-parse-1.1.0.tgz", + "integrity": "sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==", + "license": "MIT" + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -3797,38 +3833,51 @@ "node": ">= 0.8" } }, + "node_modules/worker-factory": { + "version": "7.0.48", + "resolved": "https://registry.npmjs.org/worker-factory/-/worker-factory-7.0.48.tgz", + "integrity": "sha512-CGmBy3tJvpBPjUvb0t4PrpKubUsfkI1Ohg0/GGFU2RvA9j/tiVYwKU8O7yu7gH06YtzbeJLzdUR29lmZKn5pag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "fast-unique-numbers": "^9.0.26", + "tslib": "^2.8.1" + } + }, "node_modules/worker-timers": { - "version": "7.1.8", - "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-7.1.8.tgz", - "integrity": "sha512-R54psRKYVLuzff7c1OTFcq/4Hue5Vlz4bFtNEIarpSiCYhpifHU3aIQI29S84o1j87ePCYqbmEJPqwBTf+3sfw==", + "version": "8.0.30", + "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-8.0.30.tgz", + "integrity": "sha512-8P7YoMHWN0Tz7mg+9oEhuZdjBIn2z6gfjlJqFcHiDd9no/oLnMGCARCDkV1LR3ccQus62ZdtIp7t3aTKrMLHOg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.24.5", - "tslib": "^2.6.2", - "worker-timers-broker": "^6.1.8", - "worker-timers-worker": "^7.0.71" + "@babel/runtime": "^7.28.6", + "tslib": "^2.8.1", + "worker-timers-broker": "^8.0.15", + "worker-timers-worker": "^9.0.13" } }, "node_modules/worker-timers-broker": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-6.1.8.tgz", - "integrity": "sha512-FUCJu9jlK3A8WqLTKXM9E6kAmI/dR1vAJ8dHYLMisLNB/n3GuaFIjJ7pn16ZcD1zCOf7P6H62lWIEBi+yz/zQQ==", + "version": "8.0.15", + "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-8.0.15.tgz", + "integrity": "sha512-Te+EiVUMzG5TtHdmaBZvBrZSFNauym6ImDaCAnzQUxvjnw+oGjMT2idmAOgDy30vOZMLejd0bcsc90Axu6XPWA==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.24.5", - "fast-unique-numbers": "^8.0.13", - "tslib": "^2.6.2", - "worker-timers-worker": "^7.0.71" + "@babel/runtime": "^7.28.6", + "broker-factory": "^3.1.13", + "fast-unique-numbers": "^9.0.26", + "tslib": "^2.8.1", + "worker-timers-worker": "^9.0.13" } }, "node_modules/worker-timers-worker": { - "version": "7.0.71", - "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-7.0.71.tgz", - "integrity": "sha512-ks/5YKwZsto1c2vmljroppOKCivB/ma97g9y77MAAz2TBBjPPgpoOiS1qYQKIgvGTr2QYPT3XhJWIB6Rj2MVPQ==", + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-9.0.13.tgz", + "integrity": "sha512-qjn18szGb1kjcmh2traAdki1eiIS5ikFo+L90nfMOvSRpuDw1hAcR1nzkP2+Hkdqz5thIRnfuWx7QSpsEUsA6Q==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.24.5", - "tslib": "^2.6.2" + "@babel/runtime": "^7.28.6", + "tslib": "^2.8.1", + "worker-factory": "^7.0.48" } }, "node_modules/wrappy": { @@ -3838,16 +3887,16 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">=8.3.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "utf-8-validate": "^5.0.2" }, "peerDependenciesMeta": { "bufferutil": { diff --git a/package.json b/package.json index 10f17d2..7835757 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "netbox-docker-agent", - "version": "1.20.1", + "version": "1.21.0", "description": "Saashup agent for netbox manager", "main": "index.js", "scripts": { @@ -18,7 +18,7 @@ }, "license": "ISC", "dependencies": { - "docker-exec-websocket-server": "^3.0.0", + "docker-exec-websocket-server": "^1.3.7", "node-red": "*" }, "devDependencies": {