From 7371cefc27cb7169427c40791bd2e105439a3d46 Mon Sep 17 00:00:00 2001
From: filippolauria <filippo.lauria@iit.cnr.it>
Date: Fri, 31 Jan 2025 14:12:54 +0100
Subject: [PATCH] added UI for advanced ping configuration

Added form fields to configure:
- packet count
- timeout
- deadline
- numeric output option
in monitor creation/edit view
---
 src/pages/EditMonitor.vue | 82 ++++++++++++++++++++++++++++++++++++---
 1 file changed, 77 insertions(+), 5 deletions(-)

diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue
index a83f91cab..3d3f3ca13 100644
--- a/src/pages/EditMonitor.vue
+++ b/src/pages/EditMonitor.vue
@@ -660,12 +660,54 @@
                                 </div>
                             </div>
 
-                            <!-- Ping packet size -->
+                            <!-- Max Packets / Count -->
+                            <div v-if="monitor.type === 'ping'" class="my-3">
+                                <label for="ping-count" class="form-label">{{ $t("Max Packets") }}</label>
+                                <input id="ping-count" v-model="monitor.ping_count" type="number" class="form-control" required :min="ping_count_min" :max="ping_count_max" step="1">
+                                <div class="form-text">
+                                    {{ $t("Number of packets to send before stopping") }}
+                                </div>
+                            </div>
+
+                            <!-- Numeric Output -->
+                            <div v-if="monitor.type === 'ping'" class="my-3 form-check">
+                                <input id="ping_numeric" v-model="monitor.ping_numeric" type="checkbox" class="form-check-input"
+                                    :checked="monitor.ping_numeric">
+                                <label class="form-check-label" for="ping_numeric">
+                                    {{ $t("Numeric Output") }}
+                                </label>
+                                <div class="form-text">
+                                    {{ $t("If checked, IP addresses will be output instead of symbolic hostnames") }}
+                                </div>
+                            </div>
+
+                            <!-- Packet size -->
                             <div v-if="monitor.type === 'ping'" class="my-3">
                                 <label for="packet-size" class="form-label">{{ $t("Packet Size") }}</label>
-                                <input id="packet-size" v-model="monitor.packetSize" type="number" class="form-control" required min="1" max="65500" step="1">
+                                <input id="packet-size" v-model="monitor.packetSize" type="number" class="form-control"
+                                    required :min="packetSize_min" :max="packetSize_max" step="1">
                             </div>
 
+                            <!-- Max Duration / Deadline -->
+                            <div v-if="monitor.type === 'ping'" class="my-3">
+                                <label for="ping_deadline" class="form-label">{{ $t("Max Duration") }}</label>
+                                <input id="ping_deadline" v-model="monitor.ping_deadline" type="number" class="form-control"
+                                    required :min="ping_deadline_min" :max="ping_deadline_max" step="1">
+                                <div class="form-text">
+                                    {{ $t("Total time in seconds before ping stops, regardless of packets sent") }}
+                                </div>
+                            </div>
+
+                            <!-- Response Timeout -->
+                            <div v-if="monitor.type === 'ping'" class="my-3">
+                                <label for="ping_timeout" class="form-label">{{ $t("Response Timeout") }}</label>
+                                <input id="ping_timeout" v-model="monitor.ping_timeout" type="number" class="form-control" required :min="ping_timeout_min" :max="ping_timeout_max" step="1">
+                                <div class="form-text">
+                                    {{ $t("Maximum time in seconds to wait for each response") }}
+                                </div>
+                            </div>
+
+
                             <!-- HTTP / Keyword only -->
                             <template v-if="monitor.type === 'http' || monitor.type === 'keyword' || monitor.type === 'json-query' || monitor.type === 'grpc-keyword' ">
                                 <div class="my-3">
@@ -1060,7 +1102,25 @@ import DockerHostDialog from "../components/DockerHostDialog.vue";
 import RemoteBrowserDialog from "../components/RemoteBrowserDialog.vue";
 import ProxyDialog from "../components/ProxyDialog.vue";
 import TagsManager from "../components/TagsManager.vue";
-import { genSecret, isDev, MAX_INTERVAL_SECOND, MIN_INTERVAL_SECOND, sleep } from "../util.ts";
+import { 
+    genSecret, 
+    isDev, 
+    MAX_INTERVAL_SECOND, 
+    MIN_INTERVAL_SECOND, 
+    sleep,
+    PING_PACKET_SIZE_MIN,
+    PING_PACKET_SIZE_MAX,
+    PING_PACKET_SIZE_DEFAULT,
+    PING_DEADLINE_MIN,
+    PING_DEADLINE_MAX,
+    PING_DEADLINE_DEFAULT,
+    PING_COUNT_MIN,
+    PING_COUNT_MAX,
+    PING_COUNT_DEFAULT,
+    PING_TIMEOUT_MIN,
+    PING_TIMEOUT_MAX,
+    PING_TIMEOUT_DEFAULT
+} from "../util.ts";
 import { hostNameRegexPattern } from "../util-frontend";
 import HiddenInput from "../components/HiddenInput.vue";
 import EditMonitorConditions from "../components/EditMonitorConditions.vue";
@@ -1082,7 +1142,6 @@ const monitorDefaults = {
     notificationIDList: {},
     ignoreTls: false,
     upsideDown: false,
-    packetSize: 56,
     expiryNotification: false,
     maxredirects: 10,
     accepted_statuscodes: [ "200-299" ],
@@ -1133,6 +1192,14 @@ export default {
         return {
             minInterval: MIN_INTERVAL_SECOND,
             maxInterval: MAX_INTERVAL_SECOND,
+            ping_count_min: PING_COUNT_MIN,
+            ping_count_max: PING_COUNT_MAX,
+            packetSize_min: PING_PACKET_SIZE_MIN,
+            packetSize_max: PING_PACKET_SIZE_MAX,
+            ping_deadline_min: PING_DEADLINE_MIN,
+            ping_deadline_max: PING_DEADLINE_MAX,
+            ping_timeout_min: PING_TIMEOUT_MIN,
+            ping_timeout_max: PING_TIMEOUT_MAX,
             processing: false,
             monitor: {
                 notificationIDList: {},
@@ -1564,7 +1631,12 @@ message HealthCheckResponse {
             if (this.isAdd) {
 
                 this.monitor = {
-                    ...monitorDefaults
+                    ...monitorDefaults,
+                    ping_count: PING_COUNT_DEFAULT,
+                    ping_numeric: true,
+                    packetSize: PING_PACKET_SIZE_DEFAULT,
+                    ping_deadline: PING_DEADLINE_DEFAULT,
+                    ping_timeout: PING_TIMEOUT_DEFAULT,
                 };
 
                 if (this.$root.proxyList && !this.monitor.proxyId) {