<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/20815">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">vty: introduce the expert mode and a command to enable it<br><br>Change-Id: Ie69c2a19b22fb31d7bd7f6412f0aeac86ea5048f<br>Related: SYS#4910<br>---<br>M include/osmocom/vty/command.h<br>M include/osmocom/vty/vty.h<br>M src/vty/command.c<br>M tests/vty/vty_transcript_test.c<br>M tests/vty/vty_transcript_test.vty<br>5 files changed, 126 insertions(+), 13 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/15/20815/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/vty/command.h b/include/osmocom/vty/command.h</span><br><span>index 2cb45dd..92701fc 100644</span><br><span>--- a/include/osmocom/vty/command.h</span><br><span>+++ b/include/osmocom/vty/command.h</span><br><span>@@ -24,6 +24,7 @@</span><br><span> #pragma once</span><br><span> </span><br><span> #include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdbool.h></span><br><span> #include <sys/types.h></span><br><span> #include "vector.h"</span><br><span> </span><br><span>@@ -65,6 +66,9 @@</span><br><span> </span><br><span> /*! VTY application information */</span><br><span> const struct vty_app_info *app_info;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /*! Whether the expert mode is enabled. */</span><br><span style="color: hsl(120, 100%, 40%);">+ bool expert_mode;</span><br><span> };</span><br><span> </span><br><span> /*! There are some command levels which called from command node. */</span><br><span>diff --git a/include/osmocom/vty/vty.h b/include/osmocom/vty/vty.h</span><br><span>index 4e83b1b..6a82d7e 100644</span><br><span>--- a/include/osmocom/vty/vty.h</span><br><span>+++ b/include/osmocom/vty/vty.h</span><br><span>@@ -32,7 +32,7 @@</span><br><span> #define VTY_CMD_USR_ATTR_NUM 32</span><br><span> /* Flag characters reserved for global VTY attributes */</span><br><span> #define VTY_CMD_ATTR_FLAGS_RESERVED \</span><br><span style="color: hsl(0, 100%, 40%);">- { '.', '!', '@' }</span><br><span style="color: hsl(120, 100%, 40%);">+ { '.', '!', '@', '^' }</span><br><span> </span><br><span> /*! VTY events */</span><br><span> enum event {</span><br><span>diff --git a/src/vty/command.c b/src/vty/command.c</span><br><span>index d8649f5..0edfce5 100644</span><br><span>--- a/src/vty/command.c</span><br><span>+++ b/src/vty/command.c</span><br><span>@@ -624,7 +624,7 @@</span><br><span> </span><br><span> static const struct value_string cmd_attr_desc[] = {</span><br><span> { CMD_ATTR_DEPRECATED, "This command is deprecated" },</span><br><span style="color: hsl(0, 100%, 40%);">- { CMD_ATTR_HIDDEN, "This command is hidden" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { CMD_ATTR_HIDDEN, "This command is hidden (check expert mode)" },</span><br><span> { CMD_ATTR_IMMEDIATE, "This command applies immediately" },</span><br><span> { CMD_ATTR_NODE_EXIT, "This command applies on VTY node exit" },</span><br><span> /* CMD_ATTR_LIB_COMMAND is intentionally skipped */</span><br><span>@@ -639,6 +639,8 @@</span><br><span> static char cmd_attr_get_flag(unsigned int attr)</span><br><span> {</span><br><span> switch (attr) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case CMD_ATTR_HIDDEN:</span><br><span style="color: hsl(120, 100%, 40%);">+ return '^';</span><br><span> case CMD_ATTR_IMMEDIATE:</span><br><span> return '!';</span><br><span> case CMD_ATTR_NODE_EXIT:</span><br><span>@@ -796,8 +798,11 @@</span><br><span> elem = vector_slot(cnode->cmd_vector, j);</span><br><span> if (!vty_command_is_common(elem))</span><br><span> continue;</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(elem->attr & (CMD_ATTR_DEPRECATED | CMD_ATTR_HIDDEN)))</span><br><span style="color: hsl(0, 100%, 40%);">- vty_dump_element(elem, print_func, data, newline);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (elem->attr & CMD_ATTR_DEPRECATED)</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!host.expert_mode && (elem->attr & CMD_ATTR_HIDDEN))</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_dump_element(elem, print_func, data, newline);</span><br><span> }</span><br><span> }</span><br><span> print_func(data, " </node>%s", newline);</span><br><span>@@ -834,8 +839,11 @@</span><br><span> elem = vector_slot(cnode->cmd_vector, j);</span><br><span> if (vty_command_is_common(elem))</span><br><span> continue;</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(elem->attr & (CMD_ATTR_DEPRECATED | CMD_ATTR_HIDDEN)))</span><br><span style="color: hsl(0, 100%, 40%);">- vty_dump_element(elem, print_func, data, newline);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (elem->attr & CMD_ATTR_DEPRECATED)</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!host.expert_mode && (elem->attr & CMD_ATTR_HIDDEN))</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_dump_element(elem, print_func, data, newline);</span><br><span> }</span><br><span> </span><br><span> print_func(data, " </node>%s", newline);</span><br><span>@@ -2007,7 +2015,9 @@</span><br><span> if (!cmd_element)</span><br><span> continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (cmd_element->attr & (CMD_ATTR_DEPRECATED|CMD_ATTR_HIDDEN))</span><br><span style="color: hsl(120, 100%, 40%);">+ if (cmd_element->attr & CMD_ATTR_DEPRECATED)</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!host.expert_mode && (cmd_element->attr & CMD_ATTR_HIDDEN))</span><br><span> continue;</span><br><span> </span><br><span> strvec = cmd_element->strvec;</span><br><span>@@ -2867,7 +2877,10 @@</span><br><span> }</span><br><span> </span><br><span> /* Enable command */</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(enable, config_enable_cmd, "enable", "Turn on privileged mode command\n")</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(enable, config_enable_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "enable [expert-mode]",</span><br><span style="color: hsl(120, 100%, 40%);">+ "Turn on privileged mode command\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "Enable the expert mode (show hidden commands)\n")</span><br><span> {</span><br><span> /* If enable password is NULL, change to ENABLE_NODE */</span><br><span> if ((host.enable == NULL && host.enable_encrypt == NULL) ||</span><br><span>@@ -2876,6 +2889,8 @@</span><br><span> else</span><br><span> vty->node = AUTH_ENABLE_NODE;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ host.expert_mode = argc > 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -2885,6 +2900,9 @@</span><br><span> {</span><br><span> if (vty->node == ENABLE_NODE)</span><br><span> vty->node = VIEW_NODE;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ host.expert_mode = false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -3083,7 +3101,9 @@</span><br><span> </span><br><span> if ((cmd = vector_slot(cnode->cmd_vector, i)) == NULL)</span><br><span> continue;</span><br><span style="color: hsl(0, 100%, 40%);">- if (cmd->attr & (CMD_ATTR_DEPRECATED | CMD_ATTR_HIDDEN))</span><br><span style="color: hsl(120, 100%, 40%);">+ if (cmd->attr & CMD_ATTR_DEPRECATED)</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!host.expert_mode && (cmd->attr & CMD_ATTR_HIDDEN))</span><br><span> continue;</span><br><span> if (~cmd->usrattr & ((unsigned)1 << f))</span><br><span> continue;</span><br><span>@@ -3111,7 +3131,9 @@</span><br><span> char *ptr = &char_mask[0];</span><br><span> </span><br><span> /* Mutually exclusive global attributes */</span><br><span style="color: hsl(0, 100%, 40%);">- if (cmd->attr & CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (cmd->attr & CMD_ATTR_HIDDEN)</span><br><span style="color: hsl(120, 100%, 40%);">+ *(ptr++) = cmd_attr_get_flag(CMD_ATTR_HIDDEN);</span><br><span style="color: hsl(120, 100%, 40%);">+ else if (cmd->attr & CMD_ATTR_IMMEDIATE)</span><br><span> *(ptr++) = cmd_attr_get_flag(CMD_ATTR_IMMEDIATE);</span><br><span> else if (cmd->attr & CMD_ATTR_NODE_EXIT)</span><br><span> *(ptr++) = cmd_attr_get_flag(CMD_ATTR_NODE_EXIT);</span><br><span>@@ -3170,7 +3192,9 @@</span><br><span> for (i = 0; i < vector_active(cnode->cmd_vector); i++) {</span><br><span> if ((cmd = vector_slot(cnode->cmd_vector, i)) == NULL)</span><br><span> continue;</span><br><span style="color: hsl(0, 100%, 40%);">- if (cmd->attr & (CMD_ATTR_DEPRECATED | CMD_ATTR_HIDDEN))</span><br><span style="color: hsl(120, 100%, 40%);">+ if (cmd->attr & CMD_ATTR_DEPRECATED)</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!host.expert_mode && (cmd->attr & CMD_ATTR_HIDDEN))</span><br><span> continue;</span><br><span> if (!argc)</span><br><span> vty_out(vty, " %s%s", cmd->string, VTY_NEWLINE);</span><br><span>@@ -4244,6 +4268,7 @@</span><br><span> host.lines = -1;</span><br><span> host.motd = default_motd;</span><br><span> host.motdfile = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ host.expert_mode = false;</span><br><span> </span><br><span> /* Install top nodes. */</span><br><span> install_node_bare(&view_node, NULL);</span><br><span>diff --git a/tests/vty/vty_transcript_test.c b/tests/vty/vty_transcript_test.c</span><br><span>index abe3702..c9ecf18 100644</span><br><span>--- a/tests/vty/vty_transcript_test.c</span><br><span>+++ b/tests/vty/vty_transcript_test.c</span><br><span>@@ -232,6 +232,23 @@</span><br><span> return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_DEPRECATED(cfg_attr_deprecated,</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg_attr_deprecated_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "foo-deprecated",</span><br><span style="color: hsl(120, 100%, 40%);">+ "This command is deprecated\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_HIDDEN(cfg_attr_hidden,</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg_attr_hidden_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "foo-hidden [expert-mode]",</span><br><span style="color: hsl(120, 100%, 40%);">+ "This command is hidden\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "But can be seen in the expert mode\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN_ATTR(cfg_attr_immediate, cfg_attr_immediate_cmd,</span><br><span> "foo-immediate",</span><br><span> "Applies immediately\n",</span><br><span>@@ -293,6 +310,15 @@</span><br><span> return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_ATTR_USRATTR(cfg_attr_hidden_app_attr_unbelievable,</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg_attr_hidden_app_attr_unbelievable_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ CMD_ATTR_HIDDEN, X(TEST_ATTR_UNBELIEVABLE),</span><br><span style="color: hsl(120, 100%, 40%);">+ "app-hidden-unbelievable",</span><br><span style="color: hsl(120, 100%, 40%);">+ "Hidden, but still unbelievable help message\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void init_vty_cmds()</span><br><span> {</span><br><span> install_element_ve(&single0_cmd);</span><br><span>@@ -302,6 +328,8 @@</span><br><span> </span><br><span> install_element(CONFIG_NODE, &cfg_attr_test_cmd);</span><br><span> install_node(&attr_test_node, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(ATTR_TEST_NODE, &cfg_attr_deprecated_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(ATTR_TEST_NODE, &cfg_attr_hidden_cmd);</span><br><span> install_element(ATTR_TEST_NODE, &cfg_attr_immediate_cmd);</span><br><span> install_element(ATTR_TEST_NODE, &cfg_attr_node_exit_cmd);</span><br><span> </span><br><span>@@ -311,6 +339,7 @@</span><br><span> </span><br><span> install_element(ATTR_TEST_NODE, &cfg_app_attr_unbelievable_magnificent_cmd);</span><br><span> install_element(ATTR_TEST_NODE, &cfg_app_attr_unbelievable_wonderful_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(ATTR_TEST_NODE, &cfg_attr_hidden_app_attr_unbelievable_cmd);</span><br><span> }</span><br><span> </span><br><span> int main(int argc, char **argv)</span><br><span>diff --git a/tests/vty/vty_transcript_test.vty b/tests/vty/vty_transcript_test.vty</span><br><span>index 2c618d8..7b8241e 100644</span><br><span>--- a/tests/vty/vty_transcript_test.vty</span><br><span>+++ b/tests/vty/vty_transcript_test.vty</span><br><span>@@ -87,6 +87,7 @@</span><br><span> </span><br><span> vty_transcript_test> show vty-attributes</span><br><span> Global attributes:</span><br><span style="color: hsl(120, 100%, 40%);">+ ^ This command is hidden (check expert mode)</span><br><span> ! This command applies immediately</span><br><span> @ This command applies on VTY node exit</span><br><span> Library specific attributes:</span><br><span>@@ -104,7 +105,7 @@</span><br><span> vty_transcript_test(config)# attribute-test</span><br><span> </span><br><span> vty_transcript_test(config-attr-test)# list</span><br><span style="color: hsl(0, 100%, 40%);">-...</span><br><span style="color: hsl(120, 100%, 40%);">+... !foo-(hidden|deprecated)</span><br><span> foo-immediate</span><br><span> foo-node-exit</span><br><span> app-unbelievable</span><br><span>@@ -112,9 +113,10 @@</span><br><span> app-wonderful</span><br><span> app-unbelievable-magnificent</span><br><span> app-unbelievable-wonderful</span><br><span style="color: hsl(120, 100%, 40%);">+... !app-hidden-*</span><br><span> </span><br><span> vty_transcript_test(config-attr-test)# list with-flags</span><br><span style="color: hsl(0, 100%, 40%);">-...</span><br><span style="color: hsl(120, 100%, 40%);">+... !foo-(hidden|deprecated)</span><br><span> ! ... foo-immediate</span><br><span> @ ... foo-node-exit</span><br><span> . u.. app-unbelievable</span><br><span>@@ -122,3 +124,56 @@</span><br><span> . ..w app-wonderful</span><br><span> . um. app-unbelievable-magnificent</span><br><span> . u.w app-unbelievable-wonderful</span><br><span style="color: hsl(120, 100%, 40%);">+... !app-hidden-*</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# foo-deprecated?</span><br><span style="color: hsl(120, 100%, 40%);">+% There is no matched command.</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# foo-hidden?</span><br><span style="color: hsl(120, 100%, 40%);">+% There is no matched command.</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# app-hidden-unbelievable?</span><br><span style="color: hsl(120, 100%, 40%);">+% There is no matched command.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# end</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test# disable</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test> enable?</span><br><span style="color: hsl(120, 100%, 40%);">+ enable Turn on privileged mode command</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test> enable ?</span><br><span style="color: hsl(120, 100%, 40%);">+ [expert-mode] Enable the expert mode (show hidden commands)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test> enable expert-mode</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test# configure terminal</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config)# attribute-test</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# list</span><br><span style="color: hsl(120, 100%, 40%);">+... !foo-deprected</span><br><span style="color: hsl(120, 100%, 40%);">+ foo-hidden [expert-mode]</span><br><span style="color: hsl(120, 100%, 40%);">+ foo-immediate</span><br><span style="color: hsl(120, 100%, 40%);">+ foo-node-exit</span><br><span style="color: hsl(120, 100%, 40%);">+ app-unbelievable</span><br><span style="color: hsl(120, 100%, 40%);">+ app-magnificent</span><br><span style="color: hsl(120, 100%, 40%);">+ app-wonderful</span><br><span style="color: hsl(120, 100%, 40%);">+ app-unbelievable-magnificent</span><br><span style="color: hsl(120, 100%, 40%);">+ app-unbelievable-wonderful</span><br><span style="color: hsl(120, 100%, 40%);">+ app-hidden-unbelievable</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# list with-flags</span><br><span style="color: hsl(120, 100%, 40%);">+... !foo-deprected</span><br><span style="color: hsl(120, 100%, 40%);">+ ^ ... foo-hidden [expert-mode]</span><br><span style="color: hsl(120, 100%, 40%);">+ ! ... foo-immediate</span><br><span style="color: hsl(120, 100%, 40%);">+ @ ... foo-node-exit</span><br><span style="color: hsl(120, 100%, 40%);">+ . u.. app-unbelievable</span><br><span style="color: hsl(120, 100%, 40%);">+ . .m. app-magnificent</span><br><span style="color: hsl(120, 100%, 40%);">+ . ..w app-wonderful</span><br><span style="color: hsl(120, 100%, 40%);">+ . um. app-unbelievable-magnificent</span><br><span style="color: hsl(120, 100%, 40%);">+ . u.w app-unbelievable-wonderful</span><br><span style="color: hsl(120, 100%, 40%);">+ ^ u.. app-hidden-unbelievable</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# foo-deprecated?</span><br><span style="color: hsl(120, 100%, 40%);">+% There is no matched command.</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# foo-hidden?</span><br><span style="color: hsl(120, 100%, 40%);">+ foo-hidden This command is hidden</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# foo-hidden ?</span><br><span style="color: hsl(120, 100%, 40%);">+ [expert-mode] But can be seen in the expert mode</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# app-hidden-unbelievable?</span><br><span style="color: hsl(120, 100%, 40%);">+ app-hidden-unbelievable Hidden, but still unbelievable help message</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/20815">change 20815</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmocore/+/20815"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ie69c2a19b22fb31d7bd7f6412f0aeac86ea5048f </div>
<div style="display:none"> Gerrit-Change-Number: 20815 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>