diff --git a/dockers/docker-sonic-gnmi/gnmi-native.sh b/dockers/docker-sonic-gnmi/gnmi-native.sh index 8c7766a00f7..8288a882925 100755 --- a/dockers/docker-sonic-gnmi/gnmi-native.sh +++ b/dockers/docker-sonic-gnmi/gnmi-native.sh @@ -3,6 +3,11 @@ EXIT_TELEMETRY_VARS_FILE_NOT_FOUND=1 INCORRECT_TELEMETRY_VALUE=2 TELEMETRY_VARS_FILE=/usr/share/sonic/templates/telemetry_vars.j2 +ESCAPE_QUOTE="'\''" + +extract_field() { + echo $(echo $1 | jq -r $2) +} if [ ! -f "$TELEMETRY_VARS_FILE" ]; then echo "Telemetry vars template file not found" @@ -21,30 +26,29 @@ TELEMETRY_ARGS=" -logtostderr" export CVL_SCHEMA_PATH=/usr/sbin/schema if [ -n "$CERTS" ]; then - SERVER_CRT=$(echo $CERTS | jq -r '.server_crt') - SERVER_KEY=$(echo $CERTS | jq -r '.server_key') + SERVER_CRT=$(extract_field "$CERTS" '.server_crt') + SERVER_KEY=$(extract_field "$CERTS" '.server_key') if [ -z $SERVER_CRT ] || [ -z $SERVER_KEY ]; then TELEMETRY_ARGS+=" --insecure" else TELEMETRY_ARGS+=" --server_crt $SERVER_CRT --server_key $SERVER_KEY " fi - CA_CRT=$(echo $CERTS | jq -r '.ca_crt') + CA_CRT=$(extract_field "$CERTS" '.ca_crt') if [ ! -z $CA_CRT ]; then TELEMETRY_ARGS+=" --ca_crt $CA_CRT" fi - TELEMETRY_ARGS+=" --config_table_name GNMI_CLIENT_CERT" elif [ -n "$X509" ]; then - SERVER_CRT=$(echo $X509 | jq -r '.server_crt') - SERVER_KEY=$(echo $X509 | jq -r '.server_key') + SERVER_CRT=$(extract_field "$X509" '.server_crt') + SERVER_KEY=$(extract_field "$X509" '.server_key') if [ -z $SERVER_CRT ] || [ -z $SERVER_KEY ]; then TELEMETRY_ARGS+=" --insecure" else TELEMETRY_ARGS+=" --server_crt $SERVER_CRT --server_key $SERVER_KEY " fi - CA_CRT=$(echo $X509 | jq -r '.ca_crt') + CA_CRT=$(extract_field "$X509" '.ca_crt') if [ ! -z $CA_CRT ]; then TELEMETRY_ARGS+=" --ca_crt $CA_CRT" fi @@ -56,16 +60,21 @@ fi if [ -z "$GNMI" ]; then PORT=8080 else - PORT=$(echo $GNMI | jq -r '.port') + PORT=$(extract_field "$GNMI" '.port') + if ! [[ $PORT =~ ^[0-9]+$ ]]; then + echo "Incorrect port value ${PORT}, expecting positive integers" >&2 + exit $INCORRECT_TELEMETRY_VALUE + fi fi + TELEMETRY_ARGS+=" --port $PORT" -CLIENT_AUTH=$(echo $GNMI | jq -r '.client_auth') +CLIENT_AUTH=$(extract_field "$GNMI" '.client_auth') if [ -z $CLIENT_AUTH ] || [ $CLIENT_AUTH == "false" ]; then TELEMETRY_ARGS+=" --allow_no_client_auth" fi -LOG_LEVEL=$(echo $GNMI | jq -r '.log_level') +LOG_LEVEL=$(extract_field "$GNMI" '.log_level') if [[ $LOG_LEVEL =~ ^[0-9]+$ ]]; then TELEMETRY_ARGS+=" -v=$LOG_LEVEL" else @@ -79,7 +88,7 @@ if [[ x"${LOCALHOST_SUBTYPE}" == x"SmartSwitch" ]]; then fi # Server will handle threshold connections consecutively -THRESHOLD_CONNECTIONS=$(echo $GNMI | jq -r '.threshold') +THRESHOLD_CONNECTIONS=$(extract_field "$GNMI" '.threshold') if [[ $THRESHOLD_CONNECTIONS =~ ^[0-9]+$ ]]; then TELEMETRY_ARGS+=" --threshold $THRESHOLD_CONNECTIONS" else @@ -92,7 +101,7 @@ else fi # Close idle connections after certain duration (in seconds) -IDLE_CONN_DURATION=$(echo $GNMI | jq -r '.idle_conn_duration') +IDLE_CONN_DURATION=$(extract_field "$GNMI" '.idle_conn_duration') if [[ $IDLE_CONN_DURATION =~ ^[0-9]+$ ]]; then TELEMETRY_ARGS+=" --idle_conn_duration $IDLE_CONN_DURATION" else @@ -104,4 +113,24 @@ else fi fi +USER_AUTH=$(extract_field "$GNMI" '.user_auth') +if [ ! -z "$USER_AUTH" ] && [ $USER_AUTH != "null" ]; then + TELEMETRY_ARGS+=" --client_auth $USER_AUTH" + + if [ $USER_AUTH == "cert" ]; then + TELEMETRY_ARGS+=" --config_table_name GNMI_CLIENT_CERT" + + ENABLE_CRL=$(echo $GNMI | jq -r '.enable_crl') + if [ $ENABLE_CRL == "true" ]; then + TELEMETRY_ARGS+=" --enable_crl" + fi + + CRL_EXPIRE_DURATION=$(extract_field "$GNMI" '.crl_expire_duration') + if [ ! -z "$CRL_EXPIRE_DURATION" ] && [ $CRL_EXPIRE_DURATION != "null" ]; then + TELEMETRY_ARGS+=" --crl_expire_duration $CRL_EXPIRE_DURATION" + fi + fi +fi + +echo "gnmi args: $TELEMETRY_ARGS" exec /usr/sbin/telemetry ${TELEMETRY_ARGS} diff --git a/dockers/docker-sonic-telemetry/telemetry.sh b/dockers/docker-sonic-telemetry/telemetry.sh index 547c522b684..007c4ba9dde 100755 --- a/dockers/docker-sonic-telemetry/telemetry.sh +++ b/dockers/docker-sonic-telemetry/telemetry.sh @@ -3,6 +3,11 @@ EXIT_TELEMETRY_VARS_FILE_NOT_FOUND=1 INCORRECT_TELEMETRY_VALUE=2 TELEMETRY_VARS_FILE=/usr/share/sonic/templates/telemetry_vars.j2 +ESCAPE_QUOTE="'\''" + +extract_field() { + echo $(echo $1 | jq -r $2) +} if [ ! -f "$TELEMETRY_VARS_FILE" ]; then echo "Telemetry vars template file not found" @@ -22,31 +27,28 @@ export CVL_SCHEMA_PATH=/usr/sbin/schema export GOTRACEBACK=crash if [ -n "$CERTS" ]; then - SERVER_CRT=$(echo $CERTS | jq -r '.server_crt') - SERVER_KEY=$(echo $CERTS | jq -r '.server_key') + SERVER_CRT=$(extract_field "$CERTS" '.server_crt') + SERVER_KEY=$(extract_field "$CERTS" '.server_key') if [ -z $SERVER_CRT ] || [ -z $SERVER_KEY ]; then TELEMETRY_ARGS+=" --insecure" else TELEMETRY_ARGS+=" --server_crt $SERVER_CRT --server_key $SERVER_KEY " fi - CA_CRT=$(echo $CERTS | jq -r '.ca_crt') + CA_CRT=$(extract_field "$CERTS" '.ca_crt') if [ ! -z $CA_CRT ]; then TELEMETRY_ARGS+=" --ca_crt $CA_CRT" fi - - # Reuse GNMI_CLIENT_CERT for telemetry service - TELEMETRY_ARGS+=" --config_table_name GNMI_CLIENT_CERT" elif [ -n "$X509" ]; then - SERVER_CRT=$(echo $X509 | jq -r '.server_crt') - SERVER_KEY=$(echo $X509 | jq -r '.server_key') + SERVER_CRT=$(extract_field "$X509" '.server_crt') + SERVER_KEY=$(extract_field "$X509" '.server_key') if [ -z $SERVER_CRT ] || [ -z $SERVER_KEY ]; then TELEMETRY_ARGS+=" --insecure" else TELEMETRY_ARGS+=" --server_crt $SERVER_CRT --server_key $SERVER_KEY " fi - CA_CRT=$(echo $X509 | jq -r '.ca_crt') + CA_CRT=$(extract_field "$X509" '.ca_crt') if [ ! -z $CA_CRT ]; then TELEMETRY_ARGS+=" --ca_crt $CA_CRT" fi @@ -58,16 +60,20 @@ fi if [ -z "$GNMI" ]; then PORT=8080 else - PORT=$(echo $GNMI | jq -r '.port') + PORT=$(extract_field "$GNMI" '.port') + if ! [[ $PORT =~ ^[0-9]+$ ]]; then + echo "Incorrect port value ${PORT}, expecting positive integers" >&2 + exit $INCORRECT_TELEMETRY_VALUE + fi fi TELEMETRY_ARGS+=" --port $PORT" -CLIENT_AUTH=$(echo $GNMI | jq -r '.client_auth') +CLIENT_AUTH=$(extract_field "$GNMI" '.client_auth') if [ -z $CLIENT_AUTH ] || [ $CLIENT_AUTH == "false" ]; then TELEMETRY_ARGS+=" --allow_no_client_auth" fi -LOG_LEVEL=$(echo $GNMI | jq -r '.log_level') +LOG_LEVEL=$(extract_field "$GNMI" '.log_level') if [[ $LOG_LEVEL =~ ^[0-9]+$ ]]; then TELEMETRY_ARGS+=" -v=$LOG_LEVEL" else @@ -75,7 +81,7 @@ else fi # Server will handle threshold connections consecutively -THRESHOLD_CONNECTIONS=$(echo $GNMI | jq -r '.threshold') +THRESHOLD_CONNECTIONS=$(extract_field "$GNMI" '.threshold') if [[ $THRESHOLD_CONNECTIONS =~ ^[0-9]+$ ]]; then TELEMETRY_ARGS+=" --threshold $THRESHOLD_CONNECTIONS" else @@ -88,7 +94,7 @@ else fi # Close idle connections after certain duration (in seconds) -IDLE_CONN_DURATION=$(echo $GNMI | jq -r '.idle_conn_duration') +IDLE_CONN_DURATION=$(extract_field "$GNMI" '.idle_conn_duration') if [[ $IDLE_CONN_DURATION =~ ^[0-9]+$ ]]; then TELEMETRY_ARGS+=" --idle_conn_duration $IDLE_CONN_DURATION" else @@ -101,4 +107,25 @@ else fi TELEMETRY_ARGS+=" -gnmi_native_write=false" +USER_AUTH=$(extract_field "$GNMI" '.user_auth') +if [ ! -z "$USER_AUTH" ] && [ $USER_AUTH != "null" ]; then + TELEMETRY_ARGS+=" --client_auth $USER_AUTH" + + if [ $USER_AUTH == "cert" ]; then + # Reuse GNMI_CLIENT_CERT for telemetry service + TELEMETRY_ARGS+=" --config_table_name GNMI_CLIENT_CERT" + + ENABLE_CRL=$(echo $GNMI | jq -r '.enable_crl') + if [ $ENABLE_CRL == "true" ]; then + TELEMETRY_ARGS+=" --enable_crl" + fi + + CRL_EXPIRE_DURATION=$(extract_field "$GNMI" '.crl_expire_duration') + if [ ! -z "$CRL_EXPIRE_DURATION" ] && [ $CRL_EXPIRE_DURATION != "null" ]; then + TELEMETRY_ARGS+=" --crl_expire_duration $CRL_EXPIRE_DURATION" + fi + fi +fi + +echo "telemetry args: $TELEMETRY_ARGS" exec /usr/sbin/telemetry ${TELEMETRY_ARGS} diff --git a/src/sonic-yang-models/yang-models/sonic-gnmi.yang b/src/sonic-yang-models/yang-models/sonic-gnmi.yang index b27ab84938b..515db6e783c 100644 --- a/src/sonic-yang-models/yang-models/sonic-gnmi.yang +++ b/src/sonic-yang-models/yang-models/sonic-gnmi.yang @@ -71,6 +71,12 @@ module sonic-gnmi { description "Port gnmi runs on."; } + leaf user_auth { + type string { + pattern 'password|jwt|cert'; + } + description "GNMI service user authorization type."; + } } } @@ -78,7 +84,6 @@ module sonic-gnmi { description "GNMI client cert list"; list GNMI_CLIENT_CERT_LIST { - max-elements 8; key "cert_cname"; leaf cert_cname { diff --git a/src/sonic-yang-models/yang-models/sonic-telemetry.yang b/src/sonic-yang-models/yang-models/sonic-telemetry.yang index d3d7600a8e9..293a23afec2 100644 --- a/src/sonic-yang-models/yang-models/sonic-telemetry.yang +++ b/src/sonic-yang-models/yang-models/sonic-telemetry.yang @@ -71,6 +71,12 @@ module sonic-telemetry { description "Port gnmi runs on."; } + leaf user_auth { + type string { + pattern 'password|jwt|cert'; + } + description "Telemetry service user authorization type."; + } } }