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

📄 cli_webif.c

📁 命令行在嵌入式系统的实现
💻 C
📖 第 1 页 / 共 4 页
字号:
/************************************************************************
Copyright 200X - 200X+1.

filename     : Cli_WebIf.c

description  : 命令行模块提供给web网管的接口的源文件;

author       : Woodhead

modification : Woodhead    create              2004-12-07
************************************************************************/

#include "Ros.h"
#include "Dbg.h"
#include "Board_Pub.h"
#include "CLI_Private.inc"
#include "ML.h"
#include "Sys_Ml.h"
#include "Cli_MlPriv.h"
#include "CLI_Io.h"
#include "CLI_User.inc"
#include "CLI_Log.inc"
#include "CLI_Intp.inc"
#include "CLI_Telnet.inc"
#include "Config\Cli_ConfigGlbVar.h"

#include "CLI_WebIf.inc"

#if ( CLI_WEB_SUPPORT == G_YES )

#undef __WNM_IF_LOGIN__


/*-----------------------------------------------------------------------------
 函数名称    : CLI_WebTermAlloc();
 功能        : 申请web终端;
 输入参数    : 无;
 输出参数    : pulTermId,   返回的web终端ID
 返回值      : G_SUCCESS,   成功;
               G_FAILURE    失败;
 函数调用说明:
 典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_WebTermAlloc( _U32 *pulTermID )
{
    _U32    i;

    if( G_NULL == pulTermID )
    {
        MT_ERRLOG(0);
        return G_FAILURE;
    }

    for( i = m_ulCliWebTermFirstIndex; i <= m_ulCliWebTermLastIndex; i ++ )
    {
        DBG_ASSERT( ( m_TDTable[i].pTermStruct->ulTermId - 1 ) == i );

        if( m_TDTable[i].pTermStruct->ucTermStatus == TERM_SLEEPING )
        {
            *pulTermID = i + 1;
            return G_SUCCESS;
        }
    }

    return G_FAILURE;
}


/*-----------------------------------------------------------------------------
 函数名称    : CLI_WebLogin();
 功能        : Web网管用户登录;
 输入参数    : ulLogIp,     登录IP;
               username,    用户名;
               password,    口令;
 输出参数    : pulTermId,   返回终端ID;
 返回值      : G_SUCCESS,               成功;
               G_FAILURE                失败;
               ERR_CLI_WEB_USER_ONLINE, 用户在线;
 函数调用说明: cli用户可以踢cli/web用户; web用户不能踢cli/web用户;
 典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_WebLogin( _U32 ulLogIp, const _S8* username, const _S8* password,_U32* pulTermId )
{
    _S8                 szUsername[USERNAME_LEN] ;
    _S8                 szPassword[PASSWORD_LEN] ;
    _U32                ulRet;
    _U32                ulTermID;
    PTermUserItem       pTermUser;
    PTerm_Data_S        pstTerm;

    (_VOID)EOS_StrNCpy( szUsername, username, ( USERNAME_LEN - 1 ) );
    szUsername[USERNAME_LEN - 1] = '\0';

    (_VOID)EOS_StrNCpy( szPassword, password, ( PASSWORD_LEN - 1 ) );
    szPassword[PASSWORD_LEN - 1] = '\0';

    /* 用户名不区分打小写 */
    (_VOID)_AffirmStrBeLower( szUsername );

    ulRet = CLI_CheckUserPassword( szUsername, szPassword );
    if( G_SUCCESS != ulRet )
    {
        DBG_Out( PID_CLI, MT_DBGOUT_NOTE, G_STR_HEAD
                 "CLI_WebLogin(): USER <%s> 's PASSWORD <%s> is invalid !",
                 szUsername, szPassword
               );
        return G_FAILURE;
    }

    /* 申请终端控制块 */
    ulRet = CLI_WebTermAlloc( &ulTermID );
    if( G_SUCCESS != ulRet )
    {
        DBG_Out( PID_CLI, MT_DBGOUT_NOTE, G_STR_HEAD
                 "CLI_WebLogin(): CLI_WebTermAlloc() fail !" );
        return G_FAILURE;
    }

    pstTerm = m_TDTable[ulTermID - 1].pTermStruct;

    DBG_ASSERT( ulTermID == pstTerm->ulTermId );

    /* 获取用户信息 */
    pTermUser = CLI_GetUserByName( szUsername );

    /* 如果该用户对应的终端ID不为零,表示该用户在另一个终端已经登录 */
    if( pTermUser->ulTermId != 0 )
    {
        DBG_ASSERT( 0 == EOS_StriCmp(szUsername, m_TDTable[pTermUser->ulTermId - 1].pTermStruct->szCurUserName) );

        DBG_Out( PID_CLI, MT_DBGOUT_NOTE, G_STR_HEAD
                 "CLI_WebLogin(): USER <%s> has log on from term <%ld> !",
                 szUsername, pTermUser->ulTermId
               );

        (_VOID)WNM_SendErrString( CLI_USER_ONLINE );

        return ERR_CLI_WEB_USER_ONLINE;
    }

    /* 成功登录后的一些用户与终端数据初始化 */
    pTermUser->ucUserStatus     = TERM_LOGED;
    pTermUser->ucInvadedFlag    = EN_USER_NOT_INVADED;
    pTermUser->ulTermId         = pstTerm->ulTermId;

    pstTerm->ucTermStatus       = TERM_LOGED;
    pstTerm->iSocket            = SOCKET_FOR_WEB;
    pstTerm->ucUserLevel        = (_U8)pTermUser->ulLevel;
    pstTerm->ulClientIP         = ulLogIp;

    (_VOID)EOS_StrCpy( pstTerm->szCurUserName, szUsername );
    (_VOID)ML_SetLanguage( pstTerm->ulTermId, pTermUser->ucLanguage );


    /* 写日志 */
    CLI_SaveUserLog(pstTerm->szCurUserName, LOG_MODE_WEB, ulLogIp, "logon[s]") ;

    DBG_Out( PID_CLI, MT_DBGOUT_NOTE, G_STR_HEAD
             "CLI_WebLogin(): USER <%s> log on web term <%d> ! CurTick = %ld",
             szUsername, pTermUser->ulTermId, EOS_GetCurTick() );

    *pulTermId = pstTerm->ulTermId;

    return G_SUCCESS;

}


/*-----------------------------------------------------------------------------
 函数名称    : CLI_WebLogout();
 功能        : Web网管用户退出;
 输入参数    : ulLogIp,     登录IP;
               ulTermId,    终端ID;
 输出参数    : 无.
 返回值      : G_SUCCESS,   成功;
               其他,        失败.
 函数调用说明:
 典型使用示例:
-----------------------------------------------------------------------------*/
_VOID CLI_WebLogout( _U32 ulLogIp, _U32 ulTermId )
{
    PTermUserItem       pTermUser;
    PTerm_Data_S        pstTerm;

    /* web终端ID的合法性检查 */
    if( ! IS_WEB_TERMID(ulTermId) )
    {
        MT_ERRLOG(ulTermId);
        return;
    }

    pstTerm = m_TDTable[ulTermId - 1].pTermStruct;

    DBG_ASSERT( ulTermId == pstTerm->ulTermId );

    if( TERM_LOGED != pstTerm->ucTermStatus )
    {
        DBG_Out( PID_CLI, MT_DBGOUT_NOTE, G_STR_HEAD
                 "CLI_WebLogout() : try to log out unlogon term <%ld>. pstTerm->ucTermStatus = 0x%lx",
                 ulTermId, pstTerm->ucTermStatus );
        DBG_ErrLog( 0, EN_ERR_LEVEL_GENERAL, ulTermId, pstTerm->ucTermStatus );
        return;
    }

    /* 写日志 */
    DBG_ASSERT( ulLogIp == pstTerm->ulClientIP );
    CLI_SaveUserLog(pstTerm->szCurUserName, LOG_MODE_WEB, ulLogIp, "logout[s]") ;

    pTermUser = CLI_GetUserByName( pstTerm->szCurUserName );

    /* 如果该终端已经注销过,不能重复注销   */
    if( ( G_NULL == pTermUser ) || ( 0 == pTermUser->ulTermId ) )
    {
        DBG_ErrLog( 0, EN_ERR_LEVEL_GENERAL, ulTermId, (_U32)pTermUser );
        return;
    }

    /* 考虑到可能在该终端注销前另一个终端已经使用同名用户登录 ??? */
    if( pTermUser->ulTermId == ulTermId )
    {
        pTermUser->ulTermId     = 0;
        pTermUser->ucUserStatus = TERM_SLEEPING;
    }
    else
    {
        /* 如果是cli用户踢web用户, 是否会走到这里 ??? 应该不可能走到这里 */
        DBG_ErrLog( 0, EN_ERR_LEVEL_GENERAL, ulTermId, pTermUser->ulTermId );
    }

    CLI_TaskDataInit( pstTerm );

    DBG_Out( PID_CLI, MT_DBGOUT_NOTE, G_STR_HEAD
             "CLI_WebOut(): USER <%s> Log out from Web term <%d> ! CurTick = %ld",
             pTermUser->szUserName, ulTermId, EOS_GetCurTick() );

    return;

}

/*-----------------------------------------------------------------------------
函数名称    : CLI_WebSendKickOffUserMsg();
功能        : 向web模块发送踢用户消息;
输入参数    : ulTermId: 要踢掉的用户的终端标识符
输出参数    : 无
返回值      : G_SUCCESS,   成功;
              其他         失败;
典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_WebSendKickOffUserMsg( _U32 ulTermId )
{
    static _U32                 s_ulSeqNo           = 0;
    _U32                        ulRet;
    _U16                        usPayLoadLen;
    ST_MSG*                     pstMsg;
    WNM_KICK_USER_MSG_DATA*     pstKickOffUser;

    /* 消息包净荷的长度 */
    usPayLoadLen = sizeof(WNM_KICK_USER_MSG_DATA);

    /* 申请消息包 */
    pstMsg = (ST_MSG *)ROS_MsgAlloc( PUBLIC_LENS_TOTAL + usPayLoadLen,
                                     ROS_MSG_ALLOC_OPT_LEAK_CHECK );
    if( G_NULL == pstMsg )
    {
        MT_ERRLOG( usPayLoadLen );
        return G_FAILURE;
    }

    /* 设置消息包 */
    pstMsg->usSrcBid        = 0;
    pstMsg->usDstBid        = 0;
    pstMsg->usSrcPid        = PID_CLI;
    pstMsg->usDstPid        = PID_WNM;
    pstMsg->ulSendSeq       = s_ulSeqNo ++;

    pstMsg->usMsgCode       = MSG_CODE_WNM_KICK_USER;
    pstMsg->usDataOffset    = 0;
    pstMsg->usDataLens      = usPayLoadLen;

    pstKickOffUser = (WNM_KICK_USER_MSG_DATA *)( pstMsg->ucData );

    EOS_MemZero( pstKickOffUser, usPayLoadLen );
    pstKickOffUser->ulTermId = ulTermId;

    /* 发送消息包 */
    ulRet = BOARD_SEND_MSG( pstMsg );
    if( G_SUCCESS != ulRet )
    {
        /* 发送消息失败,释放消息包 */
        ROS_MsgFree( pstMsg );

        MT_ERRLOG(ulRet);
        return G_FAILURE;
    }

    // 操作成功
    return G_SUCCESS;

}




#undef __WNM_IF_USER__
/*-----------------------------------------------------------------------------
 函数名称    : CLI_WebGetUserInfoByIndex();
 功能        : 获取用户信息;
 输入参数    : szOprName,   操作用户名;
               ulIndex,     用户索引;
 输出参数    : szName,      用户名;
               *pucLevel,   用户权限级别;
               *pucLan,     用户惯用语种(中文,英文);
               *pbIsLogin,  是否处于登录状态;
               *pulLogMode, 用户登录方式, 枚举EN_USER_LOG_MODE.
                            注: ( *pbIsLogin == G_TRUE )才有效
               *pulLogIP,   用户登录的IP地址
                            注:    ( *pulLogMode == LOG_MODE_WEB )
                                或 ( *pulLogMode == LOG_MODE_TELNET ) 才有效
 返回值      : G_SUCCESS,   成功;
               其他,        失败.
 函数调用说明:
 典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_WebGetUserInfoByIndex(
                            const _S8* szOprName, _U32 ulIndex,
                            _S8 *szName, _U8* pucLevel, _U8* pucLan,
                            _BOOL* pbIsLogin, _U32* pulLogMode, _U32* pulLogIP )
{
    PTermUserItem       pstOprUser, pstShowUser;

    /* 输入索引的合法性检查 */
    if( MAX_USER_NUM <= ulIndex )
    {
        MT_ERRLOG(0);
        return G_FAILURE;
    }

    /* 入口指针的合法性检查 */
    if(    ( G_NULL == szName )
        || ( G_NULL == pucLevel )
        || ( G_NULL == pucLan )
        || ( G_NULL == pbIsLogin )
      )
    {
        MT_ERRLOG(0);
        return G_FAILURE;
    }

    /* 根据用户名获取用户信息 */
    pstOprUser = CLI_GetUserByName( szOprName );
    if( pstOprUser == G_NULL )
    {
        DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebGetUserInfoByIndex() :: "
                 "Operation user <%s> is not exist !", szOprName  );
        (_VOID)WNM_SendErrString( CLI_USER_NOT_EXISTED );
        return G_FAILURE;
    }

    pstShowUser = &m_sUserTable[ulIndex];

    /* 此用户表项未使用 */
    if( pstShowUser->ucUserType == USER_NOT_USED)
    {
        return G_FAILURE;
    }

    /* 检查当前用户是否有查看的权限 */
    if( pstOprUser->ulLevel < pstShowUser->ulLevel )
    {
        return G_FAILURE;
    }

    /* 调试用户不显示 */
    if( CT_AL_DEBUG <= pstShowUser->ulLevel)
    {
        return G_FAILURE;
    }

    /* 获取用户的当前信息 */
    (_VOID)EOS_StrNCpy( szName, pstShowUser->szUserName, ( USERNAME_LEN - 1 ) );
    szName[USERNAME_LEN - 1] = '\0';

    *pucLevel   = (_U8)pstShowUser->ulLevel;
    *pucLan     = (_U8)pstShowUser->ucLanguage;
    *pbIsLogin  = ( TERM_LOGED == pstShowUser->ucUserStatus ) ? G_TRUE : G_FALSE;

    /* 如果已经登录, 则获取登录方式 */
    if( G_TRUE == *pbIsLogin )
    {
        *pulLogMode = CLI_GetUserLogModeByTermID( pstShowUser->ulTermId );
    }
    else
    {
        return G_SUCCESS;
    }

    /* 如果是从telnet或web登录, 则返回IP地址 */
    if(    ( *pulLogMode == LOG_MODE_WEB )
        || ( *pulLogMode == LOG_MODE_TELNET )
      )
    {
        *pulLogIP = m_TDTable[pstShowUser->ulTermId - 1].pTermStruct->ulClientIP;
    }

    return G_SUCCESS;

}

⌨️ 快捷键说明

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