Explorar o código

[BT-6711]add radius parameters in mib, cli

balbekova %!s(int64=3) %!d(string=hai) anos
pai
achega
7bce68291d

+ 34 - 0
docs/bt6711/BT6711.MIB

@@ -488,6 +488,40 @@ IMPORTS
     "Syslog server port" 
     ::= { signals 57 }
 
+    radiusENA OBJECT-TYPE
+    SYNTAX  OCTET STRING
+    MAX-ACCESS  read-write
+    STATUS  current
+    DESCRIPTION
+    "RADIUS enable,
+    0 - disable;
+    1 - enable" 
+    ::= { signals 58 }
+
+    radiusServerIP OBJECT-TYPE
+    SYNTAX  OCTET STRING
+    MAX-ACCESS  read-write
+    STATUS  current
+    DESCRIPTION
+    "RADIUS server IP" 
+    ::= { signals 59 }
+
+    radiusServerPort OBJECT-TYPE
+    SYNTAX  OCTET STRING
+    MAX-ACCESS  read-write
+    STATUS  current
+    DESCRIPTION
+    "RADIUS server port" 
+    ::= { signals 60 }
+
+    radiusPWD OBJECT-TYPE
+    SYNTAX  OCTET STRING
+    MAX-ACCESS  read-write
+    STATUS  current
+    DESCRIPTION
+    "RADIUS secret word" 
+    ::= { signals 61 }
+
 -- DEVICE TRAPS
 
      fwVersionUpdate  NOTIFICATION-TYPE

+ 70 - 2
modules/Ethernet/private_mib_bt6711.c

@@ -49,6 +49,21 @@ static s16_t signal_get_value(struct snmp_node_instance *instance, void *value);
 static snmp_err_t signal_set_value(struct snmp_node_instance *instance, u16_t len, void *value);
 static snmp_err_t signal_set_test(struct snmp_node_instance *instance, u16_t len, void *value);
 
+/* signal .1.3.6.1.4.1.41752.911.11.1.61  */
+static const struct snmp_scalar_node signal61 = SNMP_SCALAR_CREATE_NODE(61, SNMP_NODE_INSTANCE_READ_WRITE,
+        SNMP_ASN1_TYPE_OCTET_STRING, signal_get_value, signal_set_test, signal_set_value);
+
+/* signal .1.3.6.1.4.1.41752.911.11.1.60  */
+static const struct snmp_scalar_node signal60 = SNMP_SCALAR_CREATE_NODE(60, SNMP_NODE_INSTANCE_READ_WRITE,
+        SNMP_ASN1_TYPE_OCTET_STRING, signal_get_value, signal_set_test, signal_set_value);
+
+/* signal .1.3.6.1.4.1.41752.911.11.1.59  */
+static const struct snmp_scalar_node signal59 = SNMP_SCALAR_CREATE_NODE(59, SNMP_NODE_INSTANCE_READ_WRITE,
+        SNMP_ASN1_TYPE_OCTET_STRING, signal_get_value, signal_set_test, signal_set_value);
+
+/* signal .1.3.6.1.4.1.41752.911.11.1.58  */
+static const struct snmp_scalar_node signal58 = SNMP_SCALAR_CREATE_NODE(58, SNMP_NODE_INSTANCE_READ_WRITE,
+        SNMP_ASN1_TYPE_OCTET_STRING, signal_get_value, signal_set_test, signal_set_value);
 
 /* signal .1.3.6.1.4.1.41752.911.11.1.57  */
 static const struct snmp_scalar_node signal57 = SNMP_SCALAR_CREATE_NODE(57, SNMP_NODE_INSTANCE_READ_WRITE,
@@ -337,6 +352,10 @@ static const struct snmp_node *const signals_nodes[] = {
     &signal55.node.node,
     &signal56.node.node,
     &signal57.node.node,
+    &signal58.node.node,
+    &signal59.node.node,
+    &signal60.node.node,
+    &signal61.node.node,
 };
 static const struct snmp_tree_node signals_node = SNMP_CREATE_TREE_NODE(1, signals_nodes);
 
@@ -584,6 +603,18 @@ static s16_t signal_get_value(struct snmp_node_instance *instance, void *value)
         case 57: /* syslogServerPort */
             GetSyslogPort((char *)paramStr, &paramLength);
             break;
+        case 58: /* radiusEnable */
+            GetRDSEnableStateStr((char *)paramStr, &paramLength);
+            break;
+         case 59: /* radiusServerIP */
+            GetRDSIpStr((char *)paramStr, &paramLength);
+            break;
+        case 60: /* radiusServerPort */
+            GetRDSPortStr((char *)paramStr, &paramLength);
+            break;
+        case 61: /* radiusServerPWD */
+            GetRDSPasswordkStr((char *)paramStr, &paramLength);
+            break;
         default:
             break;
     }
@@ -794,13 +825,34 @@ static snmp_err_t signal_set_value(struct snmp_node_instance *instance, u16_t le
             val_string = (char *)value;
             SetSyslogPort(val_string);
             break;
+        case 58: /* radiusEnable */
+            val_string = (char *)value;
+            if (val_string[0] == '1') {
+                strcpy(val_string, "on");
+            } else {
+                strcpy(val_string, "off");
+            }
+            SetRDSEnableStateStr(val_string);
+            break;
+         case 59: /* radiusServerIP */
+            val_string = (char *)value;
+            SetRDSIpStr(val_string);
+            break;
+        case 60: /* radiusServerPort */
+            val_string = (char *)value;
+            SetRDSPortStr(val_string);
+            break;
+        case 61: /* radiusServerPWD */
+            val_string = (char *)value;
+            SetRDSPasswordkStr(val_string);
+            break;
         default :
             return SNMP_ERR_GENERROR;
             break;
     };
 
-    if ((oid >= 18 && oid <= 22)
-        || (oid >= 28 && oid <= 38)) {
+    if ((oid >= 22 && oid <= 26)
+        || (oid >= 28 && oid <= 61)) {
         SETTINGS_Save();
         log_event_data(LOG_SETTING_SAVE, "Администратор (SNMP)");
     }
@@ -850,6 +902,7 @@ static snmp_err_t signal_set_test(struct snmp_node_instance *instance, u16_t len
         case 26:
         case 50:
         case 56:
+        case 59:
             if ( len <= 15 ) {
                 val_string = (char *)value;
                 val_string[len] = 0;
@@ -1061,6 +1114,7 @@ static snmp_err_t signal_set_test(struct snmp_node_instance *instance, u16_t len
             break;
         case 49:
         case 55:
+        case 58:
             val_string = (char *)value;
             val_string[len] = 0;
             if (len == 1) {
@@ -1145,6 +1199,7 @@ static snmp_err_t signal_set_test(struct snmp_node_instance *instance, u16_t len
             }
             break;
         case 57:
+        case 60:
             val_string = (char *)value;
             val_string[len] = 0;
             for (j = 0; j < len; j ++) {
@@ -1157,6 +1212,19 @@ static snmp_err_t signal_set_test(struct snmp_node_instance *instance, u16_t len
                 ret = SNMP_ERR_NOERROR;
             }
             break;
+         case 61: /* radiusServerPWD */
+            val_string = (char *)value;
+            val_string[len] = 0;
+            if (len >= 17) {
+                return ret;
+            }
+            for (j = 0; j < len; j ++) {
+                if (val_string[j] >= 127 || val_string[j] <= 32) {
+                    return ret;
+                }
+            }
+            ret = SNMP_ERR_NOERROR;
+            break;
     };
 
 

+ 189 - 0
modules/cli/CLI_Commands.c

@@ -557,6 +557,40 @@ static const CLI_Command_Definition_t prvSysLogCommandDefinition = {
 };
 #endif
 
+#ifdef RADIUS_SERVER_ENABLE
+
+const char *radius_args_list[] = {
+    "info",
+    "ENA",
+    "DIS",
+    "server_ip",
+    "server_port",
+    "secret",
+};
+
+typedef enum{
+    ARG_RADIUS_INFO = 0,
+	ARG_RADIUS_ENABLE,
+	ARG_RADIUS_DISABLE,
+	ARG_RADIUS_IP,
+    ARG_RADIUS_PORT,
+    ARG_RADIUS_SECRET,
+	ARG_RADIUS_ALL
+}radius_args_t;
+
+static portBASE_TYPE prvTaskRADIUSCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
+static const CLI_Command_Definition_t prvRADIUSCommandDefinition = {
+    (const int8_t *const)"radius",  /* The command string to type. */
+    (const int8_t *const)"\tradius info: вывод информации о настройках RADIUS\r\n"
+                         "\tradius ENA|DIS: вкл./выкл. авторизации через RADIUS\r\n"
+                         "\tradius server_ip <ip address>: установка ip-адреса RADIUS-сервера\r\n"
+                         "\tradius server_port <port>: установка порта RADIUS-сервера\r\n"
+                         "\tradius secret <secret>: установка пароля RADIUS-сервера\r\n",
+    prvTaskRADIUSCommand, /* The function to run. */
+    -1 /* The user can enter any number of commands. */
+};
+#endif
+
 /* Structure that defines the "quit" command line command.   This
 generates a table that shows how much run time each task has */
 static const CLI_Command_Definition_t prvQuitCommandDefinition = {
@@ -597,6 +631,9 @@ void vRegisterCLICommands( void )
 #endif
 #ifdef SYSLOG_ENABLE
     FreeRTOS_CLIRegisterCommand( &prvSysLogCommandDefinition );
+#endif
+#ifdef RADIUS_SERVER_ENABLE
+    FreeRTOS_CLIRegisterCommand( &prvRADIUSCommandDefinition );
 #endif
     FreeRTOS_CLIRegisterCommand( &prvQuitCommandDefinition );
 }
@@ -2332,6 +2369,11 @@ static portBASE_TYPE prvTaskConfigCommand(cli_state_t *cli_state, int8_t *pcWrit
 	                case PARAM_CONFIG_SYSLOG:
                         syslog_config_param(pcWriteBuffer);
                         break;
+#endif
+#ifdef RADIUS_SERVER_ENABLE
+	                case PARAM_CONFIG_RADIUS:
+                        radius_config_param(pcWriteBuffer);
+                        break;
 #endif
                     case PARAM_CONFIG_AKB:
                         akb_config_param(pcWriteBuffer);
@@ -3104,6 +3146,153 @@ static portBASE_TYPE  prvTaskSysLogCommand(cli_state_t *cli_state, int8_t *pcWri
 }
 #endif
 
+#ifdef RADIUS_SERVER_ENABLE
+static portBASE_TYPE  prvTaskRADIUSCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
+{
+    int8_t *pcParameterString;
+    signed portBASE_TYPE xParameterStringLength, xReturn;
+    portBASE_TYPE xParameterNumber = 1;
+    char str[110];
+    char str_temp[110];
+    uint8_t len;
+    uint8_t i;
+    bool enable_old_radius;
+
+    ( void ) pcCommandString;
+    ( void ) xWriteBufferLen;
+    configASSERT( pcWriteBuffer );
+
+    memset(pcWriteBuffer, 0, configCOMMAND_INT_MAX_OUTPUT_SIZE);
+    /* Obtain the parameter string. */
+    pcParameterString = ( int8_t * ) FreeRTOS_CLIGetParameter
+        (
+            pcCommandString,        /* The command string itself. */
+            xParameterNumber,       /* Return the next parameter. */
+            &xParameterStringLength /* Store the parameter string length. */
+        );
+    if (pcParameterString == NULL) {
+        strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcInvalidCommand, strlen( ( char * ) pcInvalidCommand ) );
+        return pdFALSE;
+    }
+
+    for (i = 0; i < ARG_RADIUS_ALL; i ++) {
+        if ( strncmp( ( const char * ) pcParameterString, radius_args_list[i], strlen(radius_args_list[i]) ) == 0 
+            && xParameterStringLength == strlen(radius_args_list[i])) {
+            break;
+        }
+    }
+
+    if (cli_state->user_id != ADMIN && i != ARG_RADIUS_INFO) {
+        strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPermissionDenied, strlen( ( char * ) pcPermissionDenied ) );
+        return pdFALSE;
+    }
+
+    xParameterNumber ++;
+    /* Obtain the parameter string. */
+    pcParameterString = ( int8_t * ) FreeRTOS_CLIGetParameter
+        (
+            pcCommandString,        /* The command string itself. */
+            xParameterNumber,       /* Return the next parameter. */
+            &xParameterStringLength /* Store the parameter string length. */
+        );
+    if (pcParameterString == NULL) {
+        switch (i) {
+            case ARG_RADIUS_INFO:
+                /* Return the next command help string, before moving the pointer on to
+                the next command in the list. */
+                radius_config_param(pcWriteBuffer);
+                break;
+            case ARG_RADIUS_ENABLE:
+                enable_old_radius = sSettings.sRADIUS.RDSEnable;
+                SetRDSEnableStateStr("on");
+                if (sSettings.sRADIUS.RDSEnable != enable_old_radius) {
+                    cli_save_config(cli_state);
+                }
+                break;
+            case ARG_RADIUS_DISABLE:
+                enable_old_radius = sSettings.sRADIUS.RDSEnable;
+                SetRDSEnableStateStr("off");
+                if (sSettings.sRADIUS.RDSEnable != enable_old_radius) {
+                    cli_save_config(cli_state);
+                }
+                break;
+            default:
+                strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcInvalidCommand, strlen( ( char * ) pcInvalidCommand ) );
+                break;
+        }
+    } else {
+        memset(str_temp, 0, sizeof(str_temp));
+        if (xParameterStringLength > (int32_t)sizeof(str_temp)) {
+            xParameterStringLength = sizeof(str_temp) - 1;
+        }
+        strncat(str_temp, ( const char * ) pcParameterString, xParameterStringLength);
+        switch (i) {
+            case ARG_RADIUS_IP:
+                if (xParameterStringLength <= 15) {
+                    if (ipaddr_addr(str_temp) != IPADDR_NONE) {
+                        GetRDSIpStr(str, &len);
+                        if (strncmp(str_temp, str, strlen(str_temp)) != 0) {
+                            SetRDSIpStr(str_temp);
+                            cli_save_config(cli_state);
+                        }
+                    } else {
+                        strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcInvalidCommand, strlen( ( char * ) pcInvalidCommand ) );
+                    }
+                } else {
+                    strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcInvalidCommand, strlen( ( char * ) pcInvalidCommand ) );
+                }
+                break;
+            case ARG_RADIUS_PORT:
+                if (xParameterStringLength <= 5) {
+                    for (uint8_t j = 0; j < xParameterStringLength; j++) {
+                        if (!isdigit_int(str_temp[j])) {
+                            strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcInvalidCommand, strlen( ( char * ) pcInvalidCommand ) );
+                            return pdFALSE;
+                        }
+                    }
+                    int temp = atoi(str_temp);
+                    if (temp > 0 && temp < 65535) {
+                        GetRDSPortStr(str, &len);
+                        if (strncmp(str_temp, str, strlen(str_temp)) != 0) {
+                            SetRDSPortStr(str_temp);
+                            cli_save_config(cli_state);
+                        }
+                    } else {
+                        strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcInvalidCommand, strlen( ( char * ) pcInvalidCommand ) );
+                    }
+                } else {
+                    strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcInvalidCommand, strlen( ( char * ) pcInvalidCommand ) );
+                }
+                break;
+            case ARG_RADIUS_SECRET:
+                if (xParameterStringLength <= 17) {
+                    for (uint8_t j = 0; j < xParameterStringLength; j++) {
+                        if ( str_temp[j] < 33 || str_temp[j] > 127 ) {
+                            strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcInvalidCommand, strlen( ( char * ) pcInvalidCommand ) );
+                            return pdFALSE;
+                        }
+                    }
+                    GetRDSPasswordkStr(str, &len);
+                    if (strncmp(str_temp, str, strlen(str_temp)) != 0) {
+                        SetRDSPasswordkStr(str_temp);
+                        cli_save_config(cli_state);
+                    }
+                } else {
+                    strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcInvalidCommand, strlen( ( char * ) pcInvalidCommand ) );
+                }
+                break;
+            default:
+                strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcInvalidCommand, strlen( ( char * ) pcInvalidCommand ) );
+                break;
+        }     
+    }
+
+    xReturn = pdFALSE;
+
+    return xReturn;    
+}
+#endif
+
 #ifdef FTP_ENABLE
 #pragma GCC diagnostic error "-Wall"
 #pragma GCC diagnostic error "-Wextra"

+ 3 - 0
modules/cli/CLI_Commands.h

@@ -115,6 +115,9 @@ typedef enum{
 #endif
 #ifdef SYSLOG_ENABLE
 	PARAM_CONFIG_SYSLOG,
+#endif
+#ifdef RADIUS_SERVER_ENABLE
+	PARAM_CONFIG_RADIUS,
 #endif
 	PARAM_CONFIG_AKB,
 	PARAM_CONFIG_ALARM,

+ 32 - 1
modules/cli/CLI_Parameters.c

@@ -181,7 +181,7 @@ void syslog_config_param(int8_t *buf)
     uint8_t len = 0;
 
     const int8_t *const pcInfoTableHeader = ( int8_t * )
-    "\r\n***********SysLog настройки Контроллера***********\r\n";
+    "\r\n****************SysLog настройки ******************\r\n";
 
     strncpy( ( char * ) buf, ( const char * ) pcInfoTableHeader, strlen( ( char * ) pcInfoTableHeader ) );
 
@@ -201,6 +201,37 @@ void syslog_config_param(int8_t *buf)
 }
 #endif
 
+#ifdef RADIUS_SERVER_ENABLE
+void radius_config_param(int8_t *buf)
+{
+    char str[100];
+    uint8_t len = 0;
+
+    const int8_t *const pcInfoTableHeader = ( int8_t * )
+    "\r\n***************RADIUS настройки***************\r\n";
+
+    strncpy( ( char * ) buf, ( const char * ) pcInfoTableHeader, strlen( ( char * ) pcInfoTableHeader ) );
+
+    GetRADIUSEnableStrRU(str, &len);
+    strcat(( char * ) buf, "Аторизация по RADIUS:\t\t");
+    strncat(( char * ) buf, str, len);
+
+    strcat(( char * ) buf, "\r\nIP адрес сервера:\t\t");
+    GetRDSIpStr(str, &len);
+    strncat(( char * ) buf, str, len);
+
+    strcat(( char * ) buf, "\r\nПорт сервера:\t\t\t");
+    GetRDSPortStr(str, &len);
+    strncat(( char * ) buf, str, len);
+
+    strcat(( char * ) buf, "\r\nПароль сервера:\t\t\t");
+    GetRDSPasswordkStr(str, &len);
+    strncat(( char * ) buf, str, len);
+
+    strcat(( char * ) buf, "\r\n");
+}
+#endif
+
 //Настройки времени
 void time_config_param(int8_t *buf)
 {

+ 4 - 0
modules/cli/CLI_Parameters.h

@@ -27,6 +27,10 @@ void time_config_param(int8_t *buf);
 void syslog_config_param(int8_t *buf);
 #endif
 
+#ifdef RADIUS_SERVER_ENABLE
+void radius_config_param(int8_t *buf);
+#endif
+
 //Настройки АКБ
 void akb_config_param(int8_t *buf);
 

+ 10 - 0
modules/parameters.c

@@ -1537,6 +1537,16 @@ void GetRDSEnableStateStr(char *str, uint8_t *len)
     *len = 1;
 }
 
+void GetRADIUSEnableStrRU(char *str, uint8_t *len)
+{
+  if( sSettings.sRADIUS.RDSEnable) {
+    strcpy(str, "Включена");
+  } else {
+    strcpy(str, "Выключена");
+  } 
+  *len = strlen(str);
+}
+
 /**
   * @brief  Настройка вкл/ выкл авторизации
   */

+ 2 - 0
modules/parameters.h

@@ -456,6 +456,8 @@ void GetRDSPasswordkStr(char *str, uint8_t *len);
   */
 void GetRDSEnableStateStr(char *str, uint8_t *len);
 
+void GetRADIUSEnableStrRU(char *str, uint8_t *len);
+
 /**
   * @brief  Настройка вкл/ выкл авторизации
   */