diff --git a/src/components/standalone/openvpn_tunnel/CreateOrEditTunnelDrawer.vue b/src/components/standalone/openvpn_tunnel/CreateOrEditTunnelDrawer.vue
index 2287811d9..f82272ab8 100644
--- a/src/components/standalone/openvpn_tunnel/CreateOrEditTunnelDrawer.vue
+++ b/src/components/standalone/openvpn_tunnel/CreateOrEditTunnelDrawer.vue
@@ -1,5 +1,5 @@
@@ -670,6 +670,7 @@ watch(
v-model="name"
:disabled="id != ''"
:label="t('standalone.openvpn_tunnel.tunnel_name')"
+ :helper-text="t('standalone.openvpn_tunnel.tunnel_name_max_length')"
:invalid-message="validationErrorBag.getFirstFor('ns_name')"
/>
diff --git a/src/components/standalone/openvpn_tunnel/DeleteTunnelModal.vue b/src/components/standalone/openvpn_tunnel/DeleteTunnelModal.vue
index aaff174ae..d015ab06b 100644
--- a/src/components/standalone/openvpn_tunnel/DeleteTunnelModal.vue
+++ b/src/components/standalone/openvpn_tunnel/DeleteTunnelModal.vue
@@ -1,5 +1,5 @@
@@ -57,6 +57,7 @@ function close() {
kind="warning"
:title="t('standalone.openvpn_tunnel.delete_tunnel')"
:primary-label="t('common.delete')"
+ :cancel-label="t('common.cancel')"
:primary-button-disabled="isDeleting"
:primary-button-loading="isDeleting"
primary-button-kind="danger"
diff --git a/src/components/standalone/openvpn_tunnel/RegenerateCertsModal.vue b/src/components/standalone/openvpn_tunnel/RegenerateCertsModal.vue
new file mode 100644
index 000000000..91dbd1c36
--- /dev/null
+++ b/src/components/standalone/openvpn_tunnel/RegenerateCertsModal.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+ {{ t('standalone.openvpn_tunnel.name') }}
+
+ {{ _itemToShow.ns_name }}
+
+ {{ t('standalone.openvpn_tunnel.tunnel_id') }}
+
+ {{ _itemToShow.id }}
+
+ {{ t('standalone.openvpn_tunnel.port') }}
+
+ {{ _itemToShow.port }}
+
+ {{ t('standalone.openvpn_tunnel.status') }}
+
+ {{
+ _itemToShow.enabled
+ ? t('standalone.openvpn_tunnel.enabled')
+ : t('standalone.openvpn_tunnel.disabled')
+ }}
+
+ {{ t('standalone.openvpn_tunnel.topology') }}
+
+ {{
+ _itemToShow.topology
+ ? _itemToShow.topology === 'subnet'
+ ? t('standalone.openvpn_tunnel.subnet')
+ : t('standalone.openvpn_tunnel.p2p')
+ : ''
+ }}
+
+ {{ t('standalone.openvpn_tunnel.remote_networks') }}
+
+
+ {{ _itemToShow.remote_network.join(', ') }}
+
+ -
+
+ {{ t('standalone.openvpn_tunnel.remote_host') }}
+
+
+ {{ _itemToShow.remote_host.join(', ') }}
+
+ -
+
+ {{ t('standalone.openvpn_tunnel.local_networks') }}
+
+
+ {{ _itemToShow.local_network.join(', ') }}
+
+ -
+
+ {{ t('standalone.openvpn_tunnel.vpn_network') }}
+
+ {{ _itemToShow.vpn_network }}
+
+ {{ t('standalone.openvpn_tunnel.real_address') }}
+
+ {{ _itemToShow.real_address }}
+
+ {{ t('standalone.openvpn_tunnel.virtual_address') }}
+
+ {{ _itemToShow.virtual_address }}
+
+ {{ t('standalone.openvpn_tunnel.connection') }}
+
+ {{
+ _itemToShow.connected
+ ? t('standalone.openvpn_tunnel.connected')
+ : t('standalone.openvpn_tunnel.not_connected')
+ }}
+
+ {{ t('standalone.openvpn_tunnel.since') }}
+
+ {{ _itemToShow.since ? new Date(_itemToShow.since * 1000).toLocaleString(locale) : '-' }}
+
+ {{ t('standalone.openvpn_tunnel.bytes_sent') }}
+
+ {{ _itemToShow.bytes_sent ? _itemToShow.bytes_sent : '-' }}
+
+ {{ t('standalone.openvpn_tunnel.bytes_received') }}
+
+ {{ _itemToShow.bytes_received ? _itemToShow.bytes_received : '-' }}
+
+ {{
+ isClientTunnel(_itemToShow!)
+ ? t('standalone.openvpn_tunnel.client_cert_expiry')
+ : t('standalone.openvpn_tunnel.cert_expiry')
+ }}
+
+ {{
+ _itemToShow.cert_expiry_ts
+ ? new Date(_itemToShow.cert_expiry_ts * 1000).toLocaleString(locale)
+ : ''
+ }}
+
+ {{ t(certificateStatus.messageKey!, certificateStatus.messageParams!) }}
+
{{ item.ns_name }}
- - -{{ item.port }}
- - - -
+ {{ item.ns_name }}
+ {{
+ t(
+ getCertificateStatus(item.cert_expiry_ts, checkIsClientTunnel(item))
+ .messageKey!
+ )
+ }}
+ {{ item.port }}
-
- - - -+
+ {{ local }}{{ item.local_network.length > 2 && idx == 1 ? '...' : '' }} +
+ +-
+ ++ {{ remote }}{{ item.remote_network.length > 2 && idx == 1 ? '...' : '' }} +
+ +-
+-
-+
+ {{ remoteHost }}{{ item.remote_host.length > 2 && idx == 1 ? '...' : '' }} +
+ + ++ {{ + item.topology === 'subnet' + ? t('standalone.openvpn_tunnel.subnet') + : t('standalone.openvpn_tunnel.p2p') + }} +
+- {{ - item.topology === 'subnet' - ? t('standalone.openvpn_tunnel.subnet') - : t('standalone.openvpn_tunnel.p2p') - }} -
- - -{{ item.vpn_network }}
- - -- {{ - item.enabled - ? t('standalone.openvpn_tunnel.enabled') - : t('standalone.openvpn_tunnel.disabled') - }} -
-- {{ - item.connected - ? t('standalone.openvpn_tunnel.connected') - : t('standalone.openvpn_tunnel.not_connected') - }} -
-+ {{ + item.enabled + ? t('standalone.openvpn_tunnel.enabled') + : t('standalone.openvpn_tunnel.disabled') + }} +
++ {{ + item.connected + ? t('standalone.openvpn_tunnel.connected') + : t('standalone.openvpn_tunnel.not_connected') + }} +
+