⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cli_syscmd.c

📁 命令行在嵌入式系统的实现
💻 C
📖 第 1 页 / 共 3 页
字号:
    }
    return G_SUCCESS;
}

/*********************************************************************/
/* 函数功能 : 修改用户密码命令实现                                   */
/*********************************************************************/
_U32 CLI_CmdPassword(_U32 ulTermID)
{
    _S8 szUsername[USERNAME_LEN] = "";
    _S8 szPassword[PASSWORD_LEN];
    _S8 szPwdCfrm[PASSWORD_LEN];
    _U32 ulCount;
    PTerm_Data_S pTermStruct;
    PTermUserItem pTermUser;

    CLI_ASSURE_OR_FAIL(CLI_IS_TERMID_VALIDE(ulTermID));

    if ((pTermStruct = CLI_GetCurrentTaskData()) == G_NULL)
    {
        MT_ERRLOG(0);
        return G_FAILURE;
    }
    if (pTermStruct->ucUserLevel >= CT_AL_SUPER)
    {
        IO_Print(CLI_USERNAME_INPUT);
        if (IO_GetString(szUsername, USERNAME_LEN, EN_GETSTRING_NORMALLY) != G_SUCCESS)
            return G_FAILURE;

        if (szUsername[0] == 0)
        {
            IO_Print(CLI_USERNAME_IGNORED);
        }
    }

    if (szUsername[0] != 0 && EOS_StriCmp(szUsername, pTermStruct->szCurUserName))
    {
        pTermUser = CLI_GetUserByName(szUsername);
        if (pTermUser == G_NULL)
        {
            IO_Print(CLI_USER_NOT_EXISTED);
            return G_FAILURE;
        }
        if (pTermStruct->ucUserLevel < CT_AL_SUPER
         || pTermUser->ulLevel >= CT_AL_DEBUG)
        {
            IO_Print(CLI_USER_HAS_NO_RIGHT);
            return G_FAILURE;
        }
    }
    else
    {
        if (pTermStruct->ucUserLevel > CT_AL_SUPER)
        {
            IO_Print(CLI_USER_HAS_NO_RIGHT);
            return G_FAILURE;
        }

        EOS_StrCpy (szUsername, pTermStruct->szCurUserName);

        IO_Print(CLI_PASSWORD_INPUT_OLD);
        if (IO_GetString(szPassword, PASSWORD_LEN, EN_SHOWBACK_INVISIBLE) != G_SUCCESS)
            return G_FAILURE;

        if (szPassword[0] == '\0')
        {
            IO_Print(CLI_USER_PASSWORD_NULL);
            return G_FAILURE;
        }

        if (CLI_CheckUserPassword(szUsername, szPassword) != G_SUCCESS)
        {
            IO_Print(CLI_PASSWORD_ERROR);
            return G_FAILURE;
        }
    }

    for (ulCount = 0; ulCount < 3; ulCount++)
    {
        IO_Print(CLI_PASSWORD_INPUT_NEW);
        if (IO_GetString(szPassword, PASSWORD_LEN, EN_SHOWBACK_INVISIBLE) != G_SUCCESS)
            return G_FAILURE;

        if (szPassword[0] == '\0')
        {
            IO_Print(CLI_USER_PASSWORD_NULL);
            continue;
        }
        else if (szPassword[0] == KEY_CTRL_C)
        {
            IO_Print(CLI_STRING_INVALID);
            continue;
        }

        IO_Print(CLI_PASSWORD_CONFIRM);
        if (IO_GetString(szPwdCfrm, PASSWORD_LEN, EN_SHOWBACK_INVISIBLE) != G_SUCCESS)
            return G_FAILURE;

        if (EOS_StrCmp (szPassword, szPwdCfrm) != 0)
        {
            IO_Print(CLI_PASSWORD_NOT_SAME);
            continue;
        }
        break;
    }

    if (ulCount == 3)
        return G_FAILURE;

    return CLI_SetUserPassword(szUsername, szPassword);
}

/*********************************************************************/
/* 函数功能 : 修改用户惯用语种命令实现                               */
/*********************************************************************/
_U32 CLI_CmdUserLan(_U32 ulTermID)
{
    _S8 szUsername[USERNAME_LEN];
    _S8 *pLanguage;
    _U8 ucLan;

    CLI_ASSURE_OR_FAIL(CLI_IS_TERMID_VALIDE(ulTermID));

    if ((pLanguage = CT_GetParamByName("language", ulTermID)) == G_NULL)
    {
        MT_ERRLOG(0);
        return G_FAILURE;
    }

    EOS_StrCpy (szUsername, m_TDTable[ulTermID - 1].pTermStruct->szCurUserName);

    if (!EOS_StriCmp(pLanguage, "chinese"))
    {
        ucLan = ML_CHS;
    }
    else if (!EOS_StriCmp(pLanguage, "english"))
    {
        ucLan = ML_ENG;
    }
    else
    {
        return G_FAILURE;
    }

    if (ML_SetLanguage(ulTermID, ucLan) != G_SUCCESS)
            return G_FAILURE;

    IO_Print(CLI_LANGUAGE_CHANGED);

    return CLI_SetUserLanguage(szUsername, ucLan);

}

/*********************************************************************/
/* 函数功能 : 踢除指定的在线用户命令实现                             */
/*********************************************************************/
_U32 CLI_CmdUserKickOut(_U32 ulTermID)
{
    _S8 *pParam;
    _S8 szUsername[USERNAME_LEN];
    PTermUserItem pTermUser ;
    PTerm_Data_S  pstKickTerm;

    CLI_ASSURE_OR_FAIL(CLI_IS_TERMID_VALIDE(ulTermID));

    pParam = CT_GetParamByName("operator-name", ulTermID);
    if (pParam == G_NULL)
    {
        return G_FAILURE;
    }
    EOS_StrCpy(szUsername, pParam);

    pTermUser = CLI_GetUserByName(szUsername) ;
    if (G_NULL == pTermUser || pTermUser->ulLevel >= CT_AL_DEBUG)
    {
        IO_Print(CLI_USER_NOT_EXISTED);
        return G_FAILURE ;
    }

    // 如果该用户不在线,返回
    if (pTermUser->ulTermId == 0)
    {
        IO_Print(CLI_USER_NOT_ONLINE);
        return G_SUCCESS;
    }

    //因为超级用户以上才可以进行该操作,而这类用户每种等级只有一个,因此如果
    //等级相同,则认为是删除自己
    if ((_U8)pTermUser->ulLevel == m_TDTable[ulTermID - 1].pTermStruct->ucUserLevel)
    {
        IO_Print(CLI_TERMINAL_KICK_SELF);
        return G_FAILURE;
    }

    /* 如果用户正处于同名踢除的阶段,短时间内不允许进行该操作*/
    if (pTermUser->ucInvadedFlag == EN_USER_INVADED)
    {
        IO_Print(CLI_USER_TOO_BUSY);
        return G_FAILURE;
    }

    pstKickTerm = m_TDTable[pTermUser->ulTermId - 1].pTermStruct;

    pTermUser->ucInvadedFlag = EN_USER_INVADED;
    if (IO_GetConfirm(CLI_TERMINAL_KICK_OUT, INPUT_NO) == INPUT_YES)
    {
        /* 强制注销一个命令行终端 */
        if( CLI_IS_TERMID_VALIDE(pTermUser->ulTermId) )
        {
            /* 加此重复判断是为了防止在确认的过程中,对方的登录状况有变*/
            if (pTermUser->ulTermId == 0)
            {
                IO_Print(CLI_USER_NOT_ONLINE);
                pTermUser->ucInvadedFlag = EN_USER_INVADED;
                return G_SUCCESS;
            }

            IO_PrintToTerm(pTermUser->ulTermId, CLI_TERMINAL_KICKED_OFF);
            CLI_SetTermStatus(pstKickTerm, TERM_SLEEPING);

            pTermUser->ucInvadedFlag = EN_USER_NOT_INVADED;
            CLI_RECORD(CLI_STAT_KICKOFF_OTHER);
            DBG_Out(PID_CLI, MT_DBGOUT_NOTE,
                "\r\n CLI: Term %d Be Forced Logout!", pTermUser->ulTermId);

            //强行注销该终端
            CLI_TermLogout(pstKickTerm);

        }
        /* 强制注销一个web终端 */
        #if ( CLI_WEB_SUPPORT == G_YES )
        else if( IS_WEB_TERMID( pTermUser->ulTermId ) )
        {
            _U32    ulStratCentiSec, ulElapsCentiSec = 0;
            _BOOL   bWebLogOutOk = G_FALSE;

            DBG_Out( PID_CLI, MT_DBGOUT_NOTE, G_STR_HEAD
                     "CLI_CmdUserKickOut(): Web term %d is Forced Logout!", pTermUser->ulTermId );

            (_VOID)EOS_GetCentiSecondFromStart( &ulStratCentiSec );

            /* 通过消息包方式通知web网管踢用户, 异步方式 */
            (_VOID)CLI_WebSendKickOffUserMsg( pTermUser->ulTermId );

            /* 延迟让权, 保证web网管处理结束, 最多等1秒 */
            while(  ulElapsCentiSec < ( 1 * 100 ) )
            {
                CLI_DELAY(1);

                /* 确保web网管退出登录的处理结果正确 */
                if(    ( TERM_SLEEPING == pstKickTerm->ucTermStatus )
                    && ( TERM_SLEEPING == pTermUser->ucUserStatus )
                    && ( 0 == pTermUser->ulTermId )
                  )
                {
                    bWebLogOutOk = G_TRUE;
                    break;
                }

                (_VOID)EOS_GetCentiSecondFromStart( &ulElapsCentiSec );
                ulElapsCentiSec = ulElapsCentiSec - ulStratCentiSec;
            }

            /* 确保web网管退出登录的处理结果正确 */
            if( G_TRUE != bWebLogOutOk )
            {
                DBG_ErrLog( 0, EN_ERR_LEVEL_GENERAL, ulElapsCentiSec, pstKickTerm->ucTermStatus );
                DBG_ErrLog( 0, EN_ERR_LEVEL_GENERAL, pTermUser->ucUserStatus, pTermUser->ulTermId );
            }

        }
        #endif /* #if ( CLI_WEB_SUPPORT == G_YES ) */
        else
        {
            MT_ERRLOG(0);
        }

    }
    else
    {
        pTermUser->ucInvadedFlag = EN_USER_NOT_INVADED;
        return CMD_FAILED_SILENT;
    }
    return G_SUCCESS;

}

/*********************************************************************/
/* 函数功能 : 在线客户端的查询命令                                   */
/*********************************************************************/
#if 0
_U32 CLI_CmdShowClient(_U32 ulTermID)
{
    _S8  *pUserName;
    _S8  szTmp[81];
    _U32 ulIndex, ulFlag = G_FALSE;
    _U32 ulClientID, ulIPAddress;
    PTerm_Data_S pTermStruct;

    CLI_ASSURE_OR_FAIL(CLI_IS_TERMID_VALIDE(ulTermID));

    for (ulIndex = FIRST_TELNET_DATA; ulIndex < (int)FIRST_TELNET_DATA + g_ul_CFG_CLI_MAX_TELNET_CLIENT_NUM; ulIndex++)
    {
        pTermStruct = m_TDTable[ulIndex].pTermStruct;

        /* 只显示登录后的客户端信息 */
        if (pTermStruct->ucTermStatus == TERM_SLEEPING)
            continue ;

        if ((_U8)m_TDTable[ulTermID - 1].pTermStruct->ucUserLevel < pTermStruct->ucUserLevel || pTermStruct->ucUserLevel == CT_AL_DEBUG)
        {
            continue;
        }

        if (ulFlag == G_FALSE)
        {
            IO_Print(CLI_CLIENT_TABLE_HEAD);
            IO_Print(PUB_TABLE_EMBODY);
            ulFlag = G_TRUE;
        }

        ulClientID  = pTermStruct->ulTermId;
        pUserName   = pTermStruct->szCurUserName ;
        ulIPAddress = htonl(pTermStruct->ulClientIP);
        EOS_Sprintf(szTmp, "\r\n  %-14d%-14s%d.%d.%d.%d",
                ulClientID,
                pUserName ,
                ulIPAddress>>24, (ulIPAddress>>16) & 0xff,
                (ulIPAddress>>8) & 0xff, ulIPAddress & 0xff);
        IO_OutString(szTmp);
    }
    if (ulFlag == G_FALSE)
    {
        IO_Print(CLI_CLIENT_NO_ONLINE);
    }
    else
    {
        IO_Print(PUB_TABLE_EMBODY);
    }

    return G_SUCCESS;
}
#endif

/*********************************************************************/
/* 函数功能 : 终端用户的查询命令                                     */
/*********************************************************************/
_U32 CLI_CmdShowUser(_U32 ulTermID)
{
    _S8 *pParam;
    PTermUserItem pTermUserItem;

    CLI_ASSURE_OR_FAIL(CLI_IS_TERMID_VALIDE(ulTermID));

    if ((pParam = CT_GetParamByName("all|online|by-name", ulTermID)) == G_NULL)
    {
        MT_ERRLOG(0);
        return G_FAILURE;
    }

    if ( !EOS_StriCmp(pParam, "all") )
    {
        /*显示所有用户信息 */
        IO_Print(CLI_USER_HEAD_DISP);
        IO_Print(PUB_TABLE_EMBODY);
        (_VOID)CLI_DisplayAllUserInfo();
        IO_Print(PUB_TABLE_EMBODY);
        return G_SUCCESS;
    }
    else if ( !EOS_StriCmp(pParam, "online") )
    {
        /* 显示在线用户信息 */
        IO_Print(CLI_USER_HEAD_DISP);
        IO_Print(PUB_TABLE_EMBODY);
        (_VOID)CLI_DisplayOnlineUser();
        IO_Print(PUB_TABLE_EMBODY);
        return G_SUCCESS;
    }
    else if ( !EOS_StriCmp(pParam, "by-name") )
    {
        if ((pParam = CT_GetParamByName("operator-name", ulTermID)) == G_NULL)
        {
            return G_FAILURE;
        }

        pTermUserItem = CLI_GetUserByName(pParam);
        if (pTermUserItem == G_NULL || pTermUserItem->ulLevel == CT_AL_DEBUG)
        {
            IO_PrintToTerm(ulTermID, CLI_USER_NOT_EXISTED);
            return CMD_FAILED_SILENT;
        }
        if ((_U8)pTermUserItem->ulLevel > m_TDTable[ulTermID - 1].pTermStruct->ucUserLevel)
        {
            IO_Print(CLI_USER_HAS_NO_RIGHT);
            return CMD_FAILED_SILENT;
        }
        /* 显示指定用户信息 */
        IO_Print(CLI_USER_HEAD_DISP);
        IO_Print(PUB_TABLE_EMBODY);
        (_VOID)CLI_DisplayOneUserInfo(pTermUserItem);
        IO_Print(PUB_TABLE_EMBODY);
        return G_SUCCESS;
    }
    return G_FAILURE;
}

/*********************************************************************/
/* 函数功能 : 日志查询                                               */
/*********************************************************************/
_U32 CLI_CmdShowLog(_U32 ulTermID)
{
    CLI_ASSURE_OR_FAIL(CLI_IS_TERMID_VALIDE(ulTermID));

    return CLI_DisplayAllLog();
}


/*********************************************************************/
/* 函数功能 : 判断对象是否需要在help中显示                           */
/*********************************************************************/
_BOOL CLI_IsObjNeedShow(_U32 ulMode, CT_OBJECT_P pObject, _U32 ulLevel)
{
    CT_OBJECT_P pObj;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -