Эх сурвалжийг харах

ssh: some cli commands work

Sergey Alirzaev 5 жил өмнө
parent
commit
956a64ffd4

+ 1 - 1
config/common_config.h

@@ -124,7 +124,7 @@
 /**
   * @brief  Веб сервер
   */
-#define WEB_SERVER_ENABLE
+//#define WEB_SERVER_ENABLE
 
 /**
   * @brief  SNMP протокол

+ 4 - 2
modules/Makefile

@@ -104,9 +104,9 @@ ifeq ($(HARDWARE), bt6703)
    CSRC += $(wildcard HTTP_Server/my_ssl_server.c)
 endif  
 ifneq (,$(filter $(HARDWARE),bt6707 bt6709))
-      INCLUDES += -ITelnet_Server 
+      #INCLUDES += -ITelnet_Server 
       CSRC += $(wildcard HTTP_Server/http_server.c)
-      CSRC += $(wildcard Telnet_Server/*.c)
+      #CSRC += $(wildcard Telnet_Server/*.c)
 endif
     CSRC += $(wildcard HTTP_Server/trap_params.c)
     CSRC += $(wildcard HTTP_Server/web_params_api.c)
@@ -127,11 +127,13 @@ endif
 CSRC += $(wildcard ../thirdparty/wolfssl/wolfcrypt/src/*.c) ../thirdparty/wolfssl/wolfcrypt/src/port/st/stm32.c
 INCLUDES += -I../thirdparty/wolfssl
 CFLAGS += -DWOLFSSL_LWIP -DWOLFSSL_STM32F4 -DFREERTOS -DFREERTOS_TCP -DNO_WOLFSSL_DIR -DWOLFSSL_USER_SETTINGS -DNO_FILESYSTEM -DWOLFSSL_IAR_ARM -DWOLFSSL_LEANPSK -DINLINE=inline -DNO_WOLFSSL_MEMORY -DHAVE_ECC -DHAVE_STRINGS_H -DWOLF_C99 -DWOLFSSL_NO_PEM -DHAVE_HASHDRBG -DSTM32F4 -DNO_WOLFSSL_CLIENT -DNO_DES3
+#CFLAGS += -DDEBUG_WOLFSSL
 # incompatible with SPL
 CFLAGS += -DNO_STM32_CRYPTO
 CSRC += $(wildcard ../thirdparty/wolfssh/wolfcrypt/src/*.c ../thirdparty/wolfssh/src/*.c)
 INCLUDES += -I../thirdparty/wolfssh
 CFLAGS += -DWOLFSSH_LWIP -DNO_WOLFSSH_DIR -DSINGLE_THREADED -DXMEMSET=memset -DWSTRNCPY=strncpy -DWMEMSET=memset -DWSTRLEN=strlen -DWMEMMOVE=memmove -DHAVE_DH -Dmin=min -DTINYPRINTF_OVERRIDE_LIBC
+#CFLAGS += -DDEBUG_WOLFSSH
 INCLUDES += -ISSH_Server
 CSRC += $(wildcard SSH_Server/*.c)
 

+ 60 - 63
modules/Telnet_Server/CLI_Commands.c → modules/SSH_Server/CLI_Commands.c

@@ -35,14 +35,10 @@
 #include "parameters.h"
 #include "CLI_Commands.h"
 #include "CLI_Parameters.h"
-#include "telnet_server.h"
+#include "cli.h"
 #include "netconf.h"
 #include "control_symbol.h"
 
-extern state_telnet_server_t telnetState;
-extern uint8_t id_change_pwd;
-
-
 const int8_t *const pcInvalidCommand = ( int8_t * )
     "Неправильно введены параметры команды.  Введите \"help\" для просмотра списка поддерживаемых команд.\r\n\r\n";
 const int8_t *const pcPermissionDenied = ( int8_t * ) "Отказ в доступе!\r\n\r\n";
@@ -154,105 +150,103 @@ const char *user_args_list[] = {
   */
 extern SETTINGS_t sSettings;
 
-extern user_level_t telnet_code_auth;
-
 /*
  * Implements the controller's information command.
  */
-static portBASE_TYPE prvTaskInfoCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
+static portBASE_TYPE prvTaskInfoCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
 
 /*
  * Implements the reboot command.
  */
-static portBASE_TYPE prvTaskRebootCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskRebootCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString );
 
 /*
  * Implements the systime command.
  */
-static portBASE_TYPE prvTaskSystimeCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskSystimeCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString );
 
 /*
  * Implements the ntp command.
  */
-static portBASE_TYPE prvTaskNTPCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
+static portBASE_TYPE prvTaskNTPCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
 
 /*
  * Implements the network command.
  */
-static portBASE_TYPE prvTaskNetworkCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskNetworkCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString );
 
 /*
  * Implements the snmp command.
  */
-static portBASE_TYPE prvTaskSNMPCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
+static portBASE_TYPE prvTaskSNMPCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
 
 /*
  * Implements the AKB command.
  */
-static portBASE_TYPE prvTaskAKBCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
+static portBASE_TYPE prvTaskAKBCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
 
 /*
  * Implements the alarm command.
  */
-static portBASE_TYPE prvTaskAlarmCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskAlarmCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString );
 
 #ifdef HARDWARE_BT6709
 /*
  * Implements the notification command.
  */
-static portBASE_TYPE prvTaskNotificationCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskNotificationCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString );
 
 /*
  * Implements the whitelist command.
  */
-static portBASE_TYPE prvTaskWhiteListCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskWhiteListCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString );
 #endif
 
 /*
  * Implements the change password command.
  */
-static portBASE_TYPE prvTaskUserCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
+static portBASE_TYPE prvTaskUserCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
 
 /*
  * Implements the config command.
  */
-static portBASE_TYPE prvTaskConfigCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskConfigCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString );
 
 /*
  * Implements the netconfig command.
  */
-static portBASE_TYPE prvTaskNetConfigCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskNetConfigCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString );
 
 /*
  * Implements the history command.
  */
-static portBASE_TYPE prvTaskHistoryCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskHistoryCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString );
 
 /*
  * Implements the sensor info command.
  */
-static portBASE_TYPE prvTaskSensorCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskSensorCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString );
 
 /*
  * Implements the firmware download http command.
  */
-static portBASE_TYPE prvTaskUploadCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskUploadCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString );
 
 /*
  * Implements the ups command.
  */
-static portBASE_TYPE prvTaskUPSCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
+static portBASE_TYPE prvTaskUPSCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
 
 
 /* Structure that defines the "info" command line command.   This
@@ -506,7 +500,7 @@ void vRegisterCLICommands( void )
 }
 /*-----------------------------------------------------------*/
 
-static portBASE_TYPE prvTaskInfoCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
+static portBASE_TYPE prvTaskInfoCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
 {
     int8_t *pcParameterString;
     signed portBASE_TYPE xParameterStringLength, xReturn;
@@ -631,7 +625,7 @@ static portBASE_TYPE prvTaskInfoCommand( int8_t *pcWriteBuffer, size_t xWriteBuf
         if (control_string_en_digit(str, strlen(str))) {
             switch (i) {
                 case INFO_DEV_NAME:
-                    if (telnet_code_auth == ADMIN) {
+                    if (cli_state->user_id == ADMIN) {
                         str[19] = 0;
                         SetNameDeviceStr(str);
                     } else {
@@ -639,7 +633,7 @@ static portBASE_TYPE prvTaskInfoCommand( int8_t *pcWriteBuffer, size_t xWriteBuf
                     }
                     break;
                 case INFO_ADDRESS:
-                    if (telnet_code_auth == ADMIN) {
+                    if (cli_state->user_id == ADMIN) {
                         str[109] = 0;
                         SetLocation(str);
                     } else {
@@ -647,7 +641,7 @@ static portBASE_TYPE prvTaskInfoCommand( int8_t *pcWriteBuffer, size_t xWriteBuf
                     }
                     break;
                 case INFO_OWNER:
-                    if (telnet_code_auth == ADMIN) {
+                    if (cli_state->user_id == ADMIN) {
                         str[49] = 0;
                         SetOwner(str);
                     } else {
@@ -655,7 +649,7 @@ static portBASE_TYPE prvTaskInfoCommand( int8_t *pcWriteBuffer, size_t xWriteBuf
                     }
                     break;
                 case INFO_COMMENTS:
-                    if (telnet_code_auth == ADMIN) {
+                    if (cli_state->user_id == ADMIN) {
                         str[109] = 0;
                         SetComment(str);
                     } else {
@@ -679,7 +673,7 @@ static portBASE_TYPE prvTaskInfoCommand( int8_t *pcWriteBuffer, size_t xWriteBuf
     return xReturn;
 }
 
-static portBASE_TYPE prvTaskRebootCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskRebootCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString )
 {
 
@@ -690,7 +684,7 @@ static portBASE_TYPE prvTaskRebootCommand( int8_t *pcWriteBuffer, size_t xWriteB
     ( void ) pcCommandString;
     ( void ) xWriteBufferLen;
 
-    if (telnet_code_auth != ADMIN) {
+    if (cli_state->user_id != ADMIN) {
         strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPermissionDenied, strlen( ( char * ) pcPermissionDenied ) );
         return pdFALSE;
     }
@@ -706,7 +700,7 @@ static portBASE_TYPE prvTaskRebootCommand( int8_t *pcWriteBuffer, size_t xWriteB
     }
 }
 
-static portBASE_TYPE prvTaskSystimeCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskSystimeCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString )
 {
     int8_t *pcParameterString;
@@ -751,7 +745,7 @@ static portBASE_TYPE prvTaskSystimeCommand( int8_t *pcWriteBuffer, size_t xWrite
         strings to return after this one and pdFALSE should be returned. */
         xReturn = pdFALSE;
     } else {
-        if (telnet_code_auth != ADMIN) {
+        if (cli_state->user_id != ADMIN) {
             strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPermissionDenied, strlen( ( char * ) pcPermissionDenied ) );
             return pdFALSE;
         }
@@ -875,7 +869,7 @@ static portBASE_TYPE prvTaskSystimeCommand( int8_t *pcWriteBuffer, size_t xWrite
 /*
  * Implements the ntp command.
  */
-static portBASE_TYPE prvTaskNTPCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
+static portBASE_TYPE prvTaskNTPCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
 {
     int8_t *pcParameterString;
     signed portBASE_TYPE xParameterStringLength, xReturn;
@@ -913,7 +907,7 @@ static portBASE_TYPE prvTaskNTPCommand( int8_t *pcWriteBuffer, size_t xWriteBuff
         }
     }
 
-    if (telnet_code_auth != ADMIN && i != ARG_NTP_INFO) {
+    if (cli_state->user_id != ADMIN && i != ARG_NTP_INFO) {
         strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPermissionDenied, strlen( ( char * ) pcPermissionDenied ) );
         return pdFALSE;
     }
@@ -1063,7 +1057,7 @@ static portBASE_TYPE prvTaskNTPCommand( int8_t *pcWriteBuffer, size_t xWriteBuff
 /*
  * Implements the network command.
  */
-static portBASE_TYPE prvTaskNetworkCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskNetworkCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString )
 {
     int8_t *pcParameterString;
@@ -1095,7 +1089,7 @@ static portBASE_TYPE prvTaskNetworkCommand( int8_t *pcWriteBuffer, size_t xWrite
             break;
         }
     }
-    if (telnet_code_auth != ADMIN && i != ARG_NETWORK_INFO) {
+    if (cli_state->user_id != ADMIN && i != ARG_NETWORK_INFO) {
         strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPermissionDenied, strlen( ( char * ) pcPermissionDenied ) );
         return pdFALSE;
     }
@@ -1193,7 +1187,7 @@ static portBASE_TYPE prvTaskNetworkCommand( int8_t *pcWriteBuffer, size_t xWrite
 /*
  * Implements the snmp command.
  */
-static portBASE_TYPE prvTaskSNMPCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
+static portBASE_TYPE prvTaskSNMPCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
 {
     int8_t *pcParameterString;
     signed portBASE_TYPE xParameterStringLength, xReturn;
@@ -1226,7 +1220,7 @@ static portBASE_TYPE prvTaskSNMPCommand( int8_t *pcWriteBuffer, size_t xWriteBuf
         }
     }
 
-    if (telnet_code_auth != ADMIN && i != ARG_SNMP_INFO) {
+    if (cli_state->user_id != ADMIN && i != ARG_SNMP_INFO) {
         strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPermissionDenied, strlen( ( char * ) pcPermissionDenied ) );
         return pdFALSE;
     }
@@ -1355,7 +1349,7 @@ static portBASE_TYPE prvTaskSNMPCommand( int8_t *pcWriteBuffer, size_t xWriteBuf
 /*
  * Implements the akb command.
  */
-static portBASE_TYPE prvTaskAKBCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
+static portBASE_TYPE prvTaskAKBCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
 {
     int8_t *pcParameterString;
     signed portBASE_TYPE xParameterStringLength, xReturn;
@@ -1389,7 +1383,7 @@ static portBASE_TYPE prvTaskAKBCommand( int8_t *pcWriteBuffer, size_t xWriteBuff
             break;
         }
     }
-    if (telnet_code_auth != ADMIN && i != ARG_AKB_INFO) {
+    if (cli_state->user_id != ADMIN && i != ARG_AKB_INFO) {
         strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPermissionDenied, strlen( ( char * ) pcPermissionDenied ) );
         return pdFALSE;
     }
@@ -1544,7 +1538,7 @@ static portBASE_TYPE prvTaskAKBCommand( int8_t *pcWriteBuffer, size_t xWriteBuff
 /*
  * Implements the alarm command.
  */
-static portBASE_TYPE prvTaskAlarmCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
+static portBASE_TYPE prvTaskAlarmCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
 {
     int8_t *pcParameterString;
     signed portBASE_TYPE xParameterStringLength, xReturn;
@@ -1577,7 +1571,7 @@ static portBASE_TYPE prvTaskAlarmCommand( int8_t *pcWriteBuffer, size_t xWriteBu
             break;
         }
     }
-    if (telnet_code_auth != ADMIN && i != ARG_ALARM_INFO) {
+    if (cli_state->user_id != ADMIN && i != ARG_ALARM_INFO) {
         strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPermissionDenied, strlen( ( char * ) pcPermissionDenied ) );
         return pdFALSE;
     }
@@ -1796,7 +1790,7 @@ static portBASE_TYPE prvTaskAlarmCommand( int8_t *pcWriteBuffer, size_t xWriteBu
 /*
  * Implements the notification command.
  */
-static portBASE_TYPE prvTaskNotificationCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskNotificationCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString )
 {
     int8_t *pcParameterString;
@@ -1832,7 +1826,7 @@ static portBASE_TYPE prvTaskNotificationCommand( int8_t *pcWriteBuffer, size_t x
         }
     }
 
-    if (telnet_code_auth != ADMIN && i != ARG_NOTIFICATION_INFO) {
+    if (cli_state->user_id != ADMIN && i != ARG_NOTIFICATION_INFO) {
         strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPermissionDenied, strlen( ( char * ) pcPermissionDenied ) );
         return pdFALSE;
     }
@@ -1908,7 +1902,7 @@ static portBASE_TYPE prvTaskNotificationCommand( int8_t *pcWriteBuffer, size_t x
 /*
  * Implements the whitelist command.
  */
-static portBASE_TYPE prvTaskWhiteListCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskWhiteListCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString )
 {
     int8_t *pcParameterString;
@@ -1945,7 +1939,7 @@ static portBASE_TYPE prvTaskWhiteListCommand( int8_t *pcWriteBuffer, size_t xWri
         }
     }
 
-    if (telnet_code_auth != ADMIN && i != ARG_WHITELIST_INFO) {
+    if (cli_state->user_id != ADMIN && i != ARG_WHITELIST_INFO) {
         strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPermissionDenied, strlen( ( char * ) pcPermissionDenied ) );
         return pdFALSE;
     }
@@ -2054,7 +2048,7 @@ static portBASE_TYPE prvTaskWhiteListCommand( int8_t *pcWriteBuffer, size_t xWri
 /*
  * Implements the change password command.
  */
-static portBASE_TYPE prvTaskUserCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
+static portBASE_TYPE prvTaskUserCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
 {
     int8_t *pcParameterString;
     signed portBASE_TYPE xParameterStringLength, xReturn;
@@ -2072,7 +2066,7 @@ static portBASE_TYPE prvTaskUserCommand( int8_t *pcWriteBuffer, size_t xWriteBuf
 
     memset(pcWriteBuffer, 0, configCOMMAND_INT_MAX_OUTPUT_SIZE);
 
-    if (telnet_code_auth != ADMIN) {
+    if (cli_state->user_id != ADMIN) {
         strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPermissionDenied, strlen( ( char * ) pcPermissionDenied ) );
         return pdFALSE;
     }
@@ -2109,6 +2103,8 @@ static portBASE_TYPE prvTaskUserCommand( int8_t *pcWriteBuffer, size_t xWriteBuf
             strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcInvalidCommand, strlen( ( char * ) pcInvalidCommand ) );
         } else {
             strncat(temp_str, ( const char * ) pcParameterString, strlen(( const char * ) pcParameterString));
+            // FIXME proper context
+#if 0
             for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
 
                 GetUserLogin(user_id, WebLogin, &valueLen);
@@ -2119,13 +2115,14 @@ static portBASE_TYPE prvTaskUserCommand( int8_t *pcWriteBuffer, size_t xWriteBuf
                     /* Login and pass are valid */
                     id_change_pwd = user_id;
                     strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcChangePWDHeader, strlen( ( char * ) pcChangePWDHeader ) );
-                    telnetState = TELNET_CHANGE_PWD;
+                    telnetState = CLI_CHANGE_PWD;
                     break;
                 }
             }
-            if (telnetState != TELNET_CHANGE_PWD) {
+            if (telnetState != CLI_CHANGE_PWD) {
+#endif
                 strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcInvalidCommand, strlen( ( char * ) pcInvalidCommand ) );
-            }
+            //}
         }
     } else {
         strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcInvalidCommand, strlen( ( char * ) pcInvalidCommand ) );
@@ -2140,7 +2137,7 @@ static portBASE_TYPE prvTaskUserCommand( int8_t *pcWriteBuffer, size_t xWriteBuf
 /*
  * Implements the config command.
  */
-static portBASE_TYPE prvTaskConfigCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskConfigCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString )
 {
     int8_t *pcParameterString;
@@ -2177,7 +2174,7 @@ static portBASE_TYPE prvTaskConfigCommand( int8_t *pcWriteBuffer, size_t xWriteB
         }
     }
 
-    if (telnet_code_auth != ADMIN && i != ARG_CONFIG_INFO) {
+    if (cli_state->user_id != ADMIN && i != ARG_CONFIG_INFO) {
         strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPermissionDenied, strlen( ( char * ) pcPermissionDenied ) );
         return pdFALSE;
     }
@@ -2274,7 +2271,7 @@ static portBASE_TYPE prvTaskConfigCommand( int8_t *pcWriteBuffer, size_t xWriteB
 /*
  * Implements the config command.
  */
-static portBASE_TYPE prvTaskNetConfigCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskNetConfigCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString )
 {
     int8_t *pcParameterString;
@@ -2303,7 +2300,7 @@ static portBASE_TYPE prvTaskNetConfigCommand( int8_t *pcWriteBuffer, size_t xWri
         }
     }
 
-    if (telnet_code_auth != ADMIN) {
+    if (cli_state->user_id != ADMIN) {
         strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPermissionDenied, strlen( ( char * ) pcPermissionDenied ) );
         return pdFALSE;
     }
@@ -2347,7 +2344,7 @@ static portBASE_TYPE prvTaskNetConfigCommand( int8_t *pcWriteBuffer, size_t xWri
 /*
  * Implements the history command.
  */
-static portBASE_TYPE prvTaskHistoryCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskHistoryCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString )
 {
     int8_t *pcParameterString;
@@ -2498,7 +2495,7 @@ static portBASE_TYPE prvTaskHistoryCommand( int8_t *pcWriteBuffer, size_t xWrite
 /*
  * Implements the sensor info command.
  */
-static portBASE_TYPE prvTaskSensorCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskSensorCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString )
 {
     int8_t *pcParameterString;
@@ -2586,7 +2583,7 @@ static portBASE_TYPE prvTaskSensorCommand( int8_t *pcWriteBuffer, size_t xWriteB
         switch (i) {
 #ifdef HARDWARE_BT6707
             case ARG_SENSOR_SETUP:
-                if (telnet_code_auth != ADMIN) {
+                if (cli_state->user_id != ADMIN) {
                     strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPermissionDenied, strlen( ( char * ) pcPermissionDenied ) );
                     return pdFALSE;
                 }
@@ -2689,7 +2686,7 @@ static portBASE_TYPE prvTaskSensorCommand( int8_t *pcWriteBuffer, size_t xWriteB
 /*
  * Implements the firmware download http command.
  */
-static portBASE_TYPE prvTaskUploadCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen,
+static portBASE_TYPE prvTaskUploadCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen,
     const int8_t *pcCommandString )
 {
     static bool start_update = true;
@@ -2699,7 +2696,7 @@ static portBASE_TYPE prvTaskUploadCommand( int8_t *pcWriteBuffer, size_t xWriteB
     ( void ) pcCommandString;
     ( void ) xWriteBufferLen;
 
-    if (telnet_code_auth != ADMIN) {
+    if (cli_state->user_id != ADMIN) {
         strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPermissionDenied, strlen( ( char * ) pcPermissionDenied ) );
         return pdFALSE;
     }
@@ -2718,7 +2715,7 @@ static portBASE_TYPE prvTaskUploadCommand( int8_t *pcWriteBuffer, size_t xWriteB
 /*
  * Implements the ups command.
  */
-static portBASE_TYPE prvTaskUPSCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
+static portBASE_TYPE prvTaskUPSCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
 {
     int8_t *pcParameterString;
     signed portBASE_TYPE xParameterStringLength, xReturn;
@@ -2735,7 +2732,7 @@ static portBASE_TYPE prvTaskUPSCommand( int8_t *pcWriteBuffer, size_t xWriteBuff
 
     memset(pcWriteBuffer, 0, configCOMMAND_INT_MAX_OUTPUT_SIZE);
 
-    if (telnet_code_auth != ADMIN && i != ARG_CONFIG_INFO) {
+    if (cli_state->user_id != ADMIN && i != ARG_CONFIG_INFO) {
         strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPermissionDenied, strlen( ( char * ) pcPermissionDenied ) );
         return pdFALSE;
     }

+ 0 - 0
modules/Telnet_Server/CLI_Commands.h → modules/SSH_Server/CLI_Commands.h


+ 0 - 0
modules/Telnet_Server/CLI_Parameters.c → modules/SSH_Server/CLI_Parameters.c


+ 0 - 0
modules/Telnet_Server/CLI_Parameters.h → modules/SSH_Server/CLI_Parameters.h


+ 5 - 5
modules/Telnet_Server/FreeRTOS_CLI.c → modules/SSH_Server/FreeRTOS_CLI.c

@@ -57,7 +57,7 @@ typedef struct xCOMMAND_INPUT_LIST
  * The callback function that is executed when "help" is entered.  This is the
  * only default command that is always present.
  */
-static portBASE_TYPE prvHelpCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
+static portBASE_TYPE prvHelpCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString );
 
 /* The definition of the "help" command.  This command is always at the front
 of the list of registered commands. */
@@ -85,7 +85,7 @@ to save RAM.  Note, however, that the command console itself is not re-entrant,
 so only one command interpreter interface can be used at any one time.  For that
 reason, no attempt at providing mutual exclusion to the cOutputBuffer array is
 attempted. */
-static int8_t cOutputBuffer[ configCOMMAND_INT_MAX_OUTPUT_SIZE ];
+int8_t cOutputBuffer[ configCOMMAND_INT_MAX_OUTPUT_SIZE ];
 
 /*-----------------------------------------------------------*/
 
@@ -130,7 +130,7 @@ portBASE_TYPE xReturn = pdFAIL;
 }
 /*-----------------------------------------------------------*/
 
-portBASE_TYPE FreeRTOS_CLIProcessCommand( const int8_t * const pcCommandInput, int8_t * pcWriteBuffer, size_t xWriteBufferLen  )
+portBASE_TYPE FreeRTOS_CLIProcessCommand(cli_state_t *cli_state, const int8_t * const pcCommandInput, int8_t * pcWriteBuffer, size_t xWriteBufferLen  )
 {
 	static const CLI_Definition_List_Item_t *pxCommand = NULL;
 	portBASE_TYPE xReturn = pdTRUE;
@@ -184,7 +184,7 @@ portBASE_TYPE FreeRTOS_CLIProcessCommand( const int8_t * const pcCommandInput, i
 	else if( pxCommand != NULL )
 	{
 		/* Call the callback function that is registered to this command. */
-		xReturn = pxCommand->pxCommandLineDefinition->pxCommandInterpreter( pcWriteBuffer, xWriteBufferLen, pcCommandInput );
+		xReturn = pxCommand->pxCommandLineDefinition->pxCommandInterpreter(cli_state, pcWriteBuffer, xWriteBufferLen, pcCommandInput );
 
 		/* If xReturn is pdFALSE, then no further strings will be returned
 		after this one, and	pxCommand can be reset to NULL ready to search
@@ -267,7 +267,7 @@ const int8_t *pcReturn = NULL;
 }
 /*-----------------------------------------------------------*/
 
-static portBASE_TYPE prvHelpCommand( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
+static portBASE_TYPE prvHelpCommand(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t *pcCommandString )
 {
 	static const CLI_Definition_List_Item_t * pxCommand = NULL;
 	signed portBASE_TYPE xReturn;

+ 4 - 15
modules/Telnet_Server/FreeRTOS_CLI.h → modules/SSH_Server/FreeRTOS_CLI.h

@@ -38,12 +38,14 @@
 #ifndef COMMAND_INTERPRETER_H
 #define COMMAND_INTERPRETER_H
 
+#include "cli.h"
+
 /* The prototype to which callback functions used to process command line
 commands must comply.  pcWriteBuffer is a buffer into which the output from 
 executing the command can be written, xWriteBufferLen is the length, in bytes of 
 the pcWriteBuffer buffer, and pcCommandString is the entire string as input by
 the user (from which parameters can be extracted).*/
-typedef portBASE_TYPE (*pdCOMMAND_LINE_CALLBACK)( int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t * pcCommandString );
+typedef portBASE_TYPE (*pdCOMMAND_LINE_CALLBACK)(cli_state_t *cli_state, int8_t *pcWriteBuffer, size_t xWriteBufferLen, const int8_t * pcCommandString );
 
 /* The structure that defines command line commands.  A command line command
 should be defined by declaring a const structure of this type. */
@@ -77,7 +79,7 @@ portBASE_TYPE FreeRTOS_CLIRegisterCommand( const CLI_Command_Definition_t * cons
  * pcCmdIntProcessCommand is not reentrant.  It must not be called from more
  * than one task - or at least - by more than one task at a time.
  */
-portBASE_TYPE FreeRTOS_CLIProcessCommand( const int8_t * const pcCommandInput, int8_t * pcWriteBuffer, size_t xWriteBufferLen  );
+portBASE_TYPE FreeRTOS_CLIProcessCommand(cli_state_t *cli_state, const int8_t * const pcCommandInput, int8_t * pcWriteBuffer, size_t xWriteBufferLen  );
 
 /*-----------------------------------------------------------*/
 
@@ -107,16 +109,3 @@ int8_t prvGetNumberOfParameters( const int8_t * pcCommandString );
 portBASE_TYPE FreeRTOS_CLICompleteCMDCommand( const int8_t * const pcCommandInput, int8_t * pcWriteBuffer);
 
 #endif /* COMMAND_INTERPRETER_H */
-
-
-
-
-
-
-
-
-
-
-
-
-

+ 336 - 0
modules/SSH_Server/cli.c

@@ -0,0 +1,336 @@
+#include "cli.h"
+#include <string.h>
+#include "FreeRTOS.h"
+#include "task.h"
+#include "FreeRTOS_CLI.h"
+#include "CLI_Commands.h"
+#include "settings_api.h"
+#include "parameters.h"
+#include "control_symbol.h"
+#include "log.h"
+#include "web_params_api.h"
+#include "tinystdio.h"
+
+#define ISO_nl       0x0a
+#define ISO_cr       0x0d
+
+/**
+  * @brief  Общая структура настроек
+  */
+extern SETTINGS_t sSettings;
+
+uint8_t id_change_pwd = 0;
+
+const int8_t * const pcWarningMessage = ( const int8_t * ) "Количество соединенений превышено. Данное соединение будет закрыто\r\n";
+#ifdef HARDWARE_BT6709
+const int8_t * const pcWelcomeMessage = ( const int8_t * ) "BT-6709 command server - connection accepted.\r\nlogin:";
+#else
+const int8_t * const pcWelcomeMessage = ( const int8_t * ) "BT-6707 command server - connection accepted.\r\nlogin:";
+#endif
+static const int8_t * const pcEndOfCommandOutputString = ( int8_t * ) "\r\n[Нажмите клавишу ENTER для повторного выполнения предыдущей команды]\r\n>";
+extern int8_t cOutputBuffer[ configCOMMAND_INT_MAX_OUTPUT_SIZE ];
+cli_state_t cli_states[MAX_SESSIONS];
+
+void SensorInfoTimerCallback(TimerHandle_t pxTimer) {
+	portBASE_TYPE xReturned = pdTRUE;
+	uint8_t num_timer;
+	for(uint8_t i = 0; i < MAX_SESSIONS; i ++){
+		if(pxTimer == cli_states[i].RepeatSensorInfoTimer){
+			num_timer = i;
+			break;
+		}
+	}
+	do
+	{
+		/* Ensure there is not a string lingering in
+		the output buffer. */
+		cOutputBuffer[ 0 ] = 0x00;
+		// TODO
+		//xReturned = FreeRTOS_CLIProcessCommand( "sensor info", cOutputBuffer, configCOMMAND_INT_MAX_OUTPUT_SIZE );
+		cli_states[num_timer].send(cli_states[num_timer].num_connect, cOutputBuffer, strlen( ( const char * ) cOutputBuffer ));
+
+	} while( xReturned != pdFALSE );
+	xTimerStart(cli_states[num_timer].RepeatSensorInfoTimer, 0);
+}
+
+static portBASE_TYPE FreeRTOS_CLIAuthProcess( int8_t * pcWriteBuffer, cli_state_t *s  )
+{
+	portBASE_TYPE xReturn = pdTRUE;
+	uint32_t len;
+	uint8_t valueLen, user_id;
+	char WebPassword[MAX_WEB_PASSWD_LEN];
+	char WebLogin[MAX_WEB_LOGIN_LEN];
+	char password[cmdMAX_INPUT_SIZE] = { 0 };
+	const int8_t * const pcPSWHeader = ( int8_t * ) "\r\npassword:";
+	const int8_t * const pcLoginHeader = ( int8_t * ) "\r\nlogin:";
+
+	memset(pcWriteBuffer, 0, configCOMMAND_INT_MAX_OUTPUT_SIZE);
+
+	switch(s->input_state){
+	case CLI_AUTH:
+		memset(s->login, 0, MAX_WEB_LOGIN_LEN);
+		len = strlen(s->buf);
+		if(len < MAX_WEB_LOGIN_LEN){
+			strncpy(s->login, s->buf, len);
+			//sendopt(s, TELNET_WILL, TELOPT_ECHO);
+			strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcPSWHeader, strlen( ( char * ) pcPSWHeader ) );
+			s->input_state = CLI_AUTH_PASSW;
+			xReturn = pdTRUE;
+		}
+		else{
+			xReturn = pdFALSE;
+		}
+		break;
+	case CLI_AUTH_PASSW:
+		//sendopt(s, TELNET_WONT, TELOPT_ECHO);
+		memset(name_login_telnet, 0, 50);
+		memset(password, 0, MAX_WEB_PASSWD_LEN);
+		len = strlen(s->buf);
+		strncpy(password, s->buf, len);
+		for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
+
+			GetUserLogin(user_id, WebLogin, &valueLen);
+			GetUserPassword(user_id, WebPassword, &valueLen);
+
+			/* Check login and password */
+			if ((strncmp(WebLogin, s->login, MAX_WEB_LOGIN_LEN) == 0) &&
+				(strncmp(WebPassword, password, MAX_WEB_PASSWD_LEN) == 0)) {
+
+				/* Login and pass are valid */
+				s->user_id = user_id;
+				s->login_err = 0;
+				strcpy( ( char * ) pcWriteBuffer, "\r\nАвторизация успешно пройдена\r\n>" );
+				s->input_state = CLI_CMD;
+				switch (user_id) {
+				  case 0:
+					  snprintf(name_login_telnet, sizeof(name_login_telnet), "Администратор");
+					  break;
+				  case 1:
+					  snprintf(name_login_telnet, sizeof(name_login_telnet), "Пользователь");
+					  break;
+				  default:
+					  break;
+				}
+
+				log_event_data(LOG_LOGIN_TELNET, name_login_telnet);
+				xReturn = pdTRUE;
+				break;
+			}
+			else{
+				xReturn = pdFALSE;
+			}
+		}
+		break;
+	default:
+		xReturn = pdFALSE;
+		s->input_state = CLI_AUTH;
+		return xReturn;
+		break;
+	}
+
+	if(xReturn == pdFALSE){
+		s->input_state = CLI_AUTH;
+		if(s->login_err < 4){
+			s->login_err ++;
+			strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка авторизации\r\n" );
+			strncat( ( char * ) pcWriteBuffer, ( const char * ) pcLoginHeader, strlen( ( char * ) pcLoginHeader ) );
+			xReturn = pdTRUE;
+		}
+		else{
+			s->login_err = 0;
+			xReturn = pdFALSE;
+		}
+	}
+
+	return xReturn;
+}
+
+static portBASE_TYPE FreeRTOS_ChangePWDProcess( int8_t * pcWriteBuffer, cli_state_t *s  )
+{
+	portBASE_TYPE xReturn = pdTRUE;
+	uint32_t len;
+	static char password[ MAX_WEB_PASSWD_LEN ] = { 0 };
+	char password2[ MAX_WEB_PASSWD_LEN ] = { 0 };
+	const int8_t * const pcNewPSWHeader = ( int8_t * ) "\r\nВведите повторно новый пароль:";
+
+	memset(pcWriteBuffer, 0, configCOMMAND_INT_MAX_OUTPUT_SIZE);
+
+	len = strlen(s->buf);
+	if(s->input_state == CLI_CHANGE_PWD){
+		memset(password, 0, MAX_WEB_PASSWD_LEN);
+		if(len >= MAX_WEB_PASSWD_LEN){
+			strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка при вводе нового пароля\r\n>" );
+			s->input_state = CLI_CMD;
+		} else {
+			if(!control_string_en_digit(s->buf, len)){
+				strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка при вводе нового пароля\r\n>" );
+				s->input_state = CLI_CMD;
+			} else {
+				strncpy(password, s->buf, len);
+				strncpy( ( char * ) pcWriteBuffer, ( const char * ) pcNewPSWHeader, strlen( ( char * ) pcNewPSWHeader ) );
+				s->input_state = CLI_CHANGE_PWD_ACK;
+			}
+		}
+	} else {
+		s->input_state = CLI_CHANGE_PWD;
+		memset(password2, 0, cmdMAX_INPUT_SIZE);
+		if(len >= MAX_WEB_LOGIN_LEN){
+			strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка при вводе нового пароля\r\n>" );
+			s->input_state = CLI_CMD;
+		} else {
+			strncpy(password2, s->buf, len);
+
+			if (strncmp(password, password2, MAX_WEB_PASSWD_LEN) == 0) {
+				memcpy(sSettings.sAuth[id_change_pwd].password, password, 11);
+				telnet_act = true;
+				HTTP_SaveSettings();
+				log_event_data(LOG_PSW_CHANGE, name_login_telnet);
+				strcpy( ( char * ) pcWriteBuffer, "\r\nПароль успешно изменен\r\n>" );
+				s->input_state = CLI_CMD;
+				xReturn = pdTRUE;
+			} else {
+				strcpy( ( char * ) pcWriteBuffer, "\r\nОшибка при вводе нового пароля\r\n>" );
+				s->input_state = CLI_CMD;
+			}
+		}
+	}
+
+	return xReturn;
+}
+
+
+static void cli_input(cli_state_t *s)
+{
+	portBASE_TYPE xReturned;
+
+	switch(s->input_state){
+		case CLI_AUTH:
+		case CLI_AUTH_PASSW:
+			if(FreeRTOS_CLIAuthProcess(cOutputBuffer, s)){
+				s->send(s->num_connect, cOutputBuffer, strlen( ( const char * ) cOutputBuffer ));
+				memset( s->buf, 0x00, cmdMAX_INPUT_SIZE );
+			}
+			else{
+				s->state = STATE_CLOSE;
+			}
+			break;
+		case CLI_CMD:
+			/* The input string has been terminated.  Was the
+			input a quit command? */
+			if( strcmp( "quit", ( const char * ) s->buf ) == 0 )
+			{
+				s->state = STATE_CLOSE;
+			}
+			else
+			{
+				/* The input string was not a quit command.
+				Pass the string to the command interpreter. */
+
+				/* See if the command is empty, indicating that the last command is
+				to be executed again. */
+				if( s->bufptr == 0 )
+				{
+					if(s->flag_telnet_ip_option ){
+						s->flag_telnet_ip_option = false;
+						return;
+					}
+					else{
+						strcpy( s->buf, s->prev_cmd );
+					}
+				}
+
+				/* Transmit a line separator, just to make the
+				output easier to read. */
+				s->send(s->num_connect, "\r\n", strlen( "\r\n" ));
+
+				do
+				{
+					/* Ensure there is not a string lingering in
+					the output buffer. */
+					cOutputBuffer[ 0 ] = 0x00;
+                                        // FIXME telnetState should go into the command processor
+					//input_state = s->input_state;
+					xReturned = FreeRTOS_CLIProcessCommand(s, s->buf, cOutputBuffer, configCOMMAND_INT_MAX_OUTPUT_SIZE );
+					//s->input_state = input_state;
+					s->send(s->num_connect, cOutputBuffer, strlen( ( const char * ) cOutputBuffer ));
+
+				} while( xReturned != pdFALSE );
+
+				if( strcmp( "sensor info", ( const char * ) s->buf ) == 0 ){
+					strcpy( s->prev_cmd, s->buf );
+					memset( s->buf, 0x00, cmdMAX_INPUT_SIZE );
+					xTimerStart(s->RepeatSensorInfoTimer, 0);
+				}
+				else{
+
+					/* All the strings generated by the input
+					command have been sent.  Clear the input
+					string ready to receive the next command.
+					Remember the command that was just processed
+					first in case it is to be processed again. */
+					strcpy( s->prev_cmd, s->buf );
+					memset( s->buf, 0x00, cmdMAX_INPUT_SIZE );
+					if(s->input_state != CLI_CHANGE_PWD)
+						s->send(s->num_connect, pcEndOfCommandOutputString, strlen( ( const char * ) pcEndOfCommandOutputString ));
+				}
+			}
+			break;
+		case CLI_CHANGE_PWD:
+		case CLI_CHANGE_PWD_ACK:
+			FreeRTOS_ChangePWDProcess(cOutputBuffer, s);
+			s->send(s->num_connect, cOutputBuffer, strlen( ( const char * ) cOutputBuffer ));
+			memset( s->buf, 0x00, cmdMAX_INPUT_SIZE );
+			break;
+
+	}
+}
+
+void cli_getchar(cli_state_t *s, char incoming_char)
+{
+	s->buf[s->bufptr] = incoming_char;
+
+	bool echo_enabled = true;	// FIXME
+	if(echo_enabled && s->input_state != CLI_AUTH_PASSW){
+		if(s->buf[s->bufptr] != 0x03 && s->buf[s->bufptr] != 0x7f){
+			s->send( s->num_connect, &s->buf[s->bufptr], 1);
+		}
+	}
+	else if(s->input_state == CLI_AUTH_PASSW){
+		s->send( s->num_connect, " ", 1);
+	}
+
+
+  if(s->buf[s->bufptr] == ISO_nl ||
+	s->buf[s->bufptr] == 0) {
+	s->bufptr = 0;
+    return;
+  }
+
+  if(s->buf[s->bufptr] == ISO_cr ||
+     s->bufptr == sizeof(s->buf) - 1) {
+    if(s->bufptr > 0) {
+      s->buf[s->bufptr] = 0;
+    }
+    cli_input(s);
+    s->bufptr = 0;
+  } else if( s->buf[s->bufptr] == '\b' || s->buf[s->bufptr] == 0x7f)
+	{
+		/* Backspace was pressed.  Erase the last
+		character in the string - if any. */
+	  	s->buf[s->bufptr] = '\0';
+		if( s->bufptr > 0 )
+		{
+			s->bufptr--;
+			s->buf[s->bufptr] = '\0';
+		}
+	}
+  else if (s->buf[s->bufptr] == 0x03){
+	  xTimerStop(s->RepeatSensorInfoTimer, 0);
+	  s->flag_telnet_ip_option = true;
+	  if(s->input_state != CLI_CHANGE_PWD && s->input_state != CLI_CHANGE_PWD_ACK)
+	  	s->send( s->num_connect, pcEndOfCommandOutputString, strlen( ( const char * ) pcEndOfCommandOutputString ));
+  }
+  else {
+    ++s->bufptr;
+  }
+}

+ 58 - 0
modules/SSH_Server/cli.h

@@ -0,0 +1,58 @@
+#ifndef __CLI_H
+#define __CLI_H
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "FreeRTOS.h"
+#include "fr_timers.h"
+#include "settings_api.h"
+
+/* Dimensions the buffer into which input characters are placed. */
+#define cmdMAX_INPUT_SIZE			144
+#define MAX_SESSIONS	2
+
+typedef enum{
+	CLI_AUTH = 0,
+	CLI_AUTH_PASSW,
+	CLI_CMD,
+	CLI_CHANGE_PWD,
+	CLI_CHANGE_PWD_ACK
+} input_state_t;
+
+typedef enum {
+	STATE_NORMAL,
+	STATE_IAC,
+	STATE_OPT,
+	STATE_SB,
+	STATE_OPTDAT,
+	STATE_SE,
+	STATE_CLOSE,
+} conn_state_t;
+
+/**
+ * A cli connection structure.
+ */
+typedef struct {
+	TimerHandle_t RepeatSensorInfoTimer;
+	conn_state_t state;
+//	uint8_t code;
+	char buf[cmdMAX_INPUT_SIZE];
+	char bufptr;
+	char prev_cmd[cmdMAX_INPUT_SIZE];
+	unsigned char optdata[cmdMAX_INPUT_SIZE];
+	uint8_t optlen;
+	input_state_t input_state;
+	user_level_t user_id;
+	char login[MAX_WEB_LOGIN_LEN];
+	uint8_t login_err;	// the number of failed password entry attempts
+//	bool active_conn;
+	bool flag_telnet_ip_option;	// wtf is this
+
+	//send( cli_states[num_timer].num_connect, pcOutputString, strlen( ( const char * ) pcOutputString ), 0 );
+	void (*send)(intptr_t fd, const char *str, unsigned len);
+	intptr_t num_connect;	// fd
+} cli_state_t;
+
+void cli_getchar(cli_state_t *s, char incoming_char);
+
+#endif

+ 18 - 1
modules/SSH_Server/server.c

@@ -25,6 +25,8 @@
 #include "FreeRTOS.h"
 #include "task.h"
 #include "wolfssh_test.h"
+#include "cli.h"
+#include "CLI_Commands.h"
 
 #ifdef WOLFSSL_USER_SETTINGS
     #include <wolfssl/wolfcrypt/settings.h>
@@ -141,6 +143,12 @@ static int NonBlockSSH_accept(WOLFSSH* ssh)
     return ret;
 }
 
+static void cli_send(intptr_t fd, const char *str, unsigned len)
+{
+    wolfSSH_stream_send((WOLFSSH *)fd, str, len);
+}
+
+extern cli_state_t cli_states[MAX_SESSIONS];
 
 static void *server_worker(void* vArgs)
 {
@@ -153,6 +161,12 @@ static void *server_worker(void* vArgs)
         ret = NonBlockSSH_accept(threadCtx->ssh);
 
     if (ret == WS_SUCCESS) {
+        // create the new CLI context
+        cli_states[threadCtx->fd].num_connect = threadCtx->ssh;
+        cli_states[threadCtx->fd].input_state = CLI_CMD;
+        cli_states[threadCtx->fd].state = STATE_NORMAL;
+        cli_states[threadCtx->fd].send = cli_send;
+
         byte* buf = NULL;
         byte* tmpBuf;
         int bufSz, backlogSz = 0, rxSz, txSz, stop = 0, txSum;
@@ -176,10 +190,12 @@ static void *server_worker(void* vArgs)
                 } while (rxSz == WS_WANT_READ || rxSz == WS_WANT_WRITE);
 
                 if (rxSz > 0) {
+                    cli_getchar(cli_states + threadCtx->fd, buf[backlogSz]);    // TODO handle rxSz > 1
                     backlogSz += rxSz;
                     txSum = 0;
                     txSz = 0;
 
+                    //wolfSSH_stream_send(threadCtx->ssh, "loh", 3);
                     while (backlogSz != txSum && txSz >= 0 && !stop) {
                         txSz = wolfSSH_stream_send(threadCtx->ssh,
                                                    buf + txSum,
@@ -710,5 +726,6 @@ static void ssh_server(void *arg)
 
 void ssh_server_init(void)
 {
-	xTaskCreate(ssh_server, ( char * ) "ssh_server", 8*configMINIMAL_STACK_SIZE , NULL, tskIDLE_PRIORITY + 1, NULL);
+    vRegisterCLICommands();
+    xTaskCreate(ssh_server, ( char * ) "ssh_server", 16*configMINIMAL_STACK_SIZE , NULL, tskIDLE_PRIORITY + 1, NULL);
 }

+ 0 - 5
modules/SSH_Server/user_settings.h

@@ -113,10 +113,5 @@ static inline void ws_Ioctl(int fd, int flag, int* ret)
 #define WIOCTL ws_Ioctl
 
 #include "wolfssl_test.h"
-/* Debugging - Optional */
-#if 0
-#define fprintf(file, format, ...)   printf(format, ##__VA_ARGS__)
-#define DEBUG_WOLFSSL
-#endif
 
 #endif

+ 1 - 1
modules/parameters.c

@@ -20,7 +20,7 @@
 #include "snmp.h"
 #include "megatec.h"
 #if defined HARDWARE_BT6707 || HARDWARE_BT6709
-#include "telnet_server.h"
+#include "server.h"
 #endif
 #endif
 #include "sntp.h"

+ 1 - 1
user/init_task.c

@@ -26,7 +26,7 @@
 #include "snmp_api.h"
 #if defined HARDWARE_BT6707 || HARDWARE_BT6709
 #include "http_server.h"
-#include "telnet_server.h"
+//#include "telnet_server.h"
 #include "server.h"
 #elif defined HARDWARE_BT6703
 #include "my_ssl_server.h"