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

📄 cli_webif.c

📁 命令行在嵌入式系统的实现
💻 C
📖 第 1 页 / 共 4 页
字号:
    {
        DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebUserAdd() :: "
                 "Operation user <%s> is not exist !", szOprName  );
        (_VOID)WNM_SendErrString( CLI_USER_NOT_EXISTED );
        return G_FAILURE;
    }

    /* 操作用户必须是调试用户或超级用户 */
    if( pstOprUser->ulLevel < CT_AL_SUPER )
    {
        DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebUserAdd() :: "
                 "Operation user <%s> 's level %ld is too lower. must be debug user or super user !",
                 szOprName, pstOprUser->ulLevel  );
        (_VOID)WNM_SendErrString( CLI_USER_HAS_NO_RIGHT );
        return G_FAILURE;
    }

    /* 检查是否重名 */
    for( i = 0; i < MAX_USER_NUM; i ++ )
    {
        if(     ( 0 == EOS_StriCmp( m_sUserTable[i].szUserName, szUserName) )
             && ( m_sUserTable[i].ucUserType != USER_NOT_USED ) )
        {
            DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebUserAdd() :: "
                     "user <%s> has exist !",
                     szOprName  );
            (_VOID)WNM_SendErrString( CLI_USER_HAS_EXISTED );
            return G_FAILURE;
        }
    }

    /* 检查用户表是否已满. 调试用户为固定用户,不能被替换 */
    for( i = 1; i < MAX_USER_NUM; i++ )
    {
        if( m_sUserTable[i].ucUserType == USER_NOT_USED )
        {
            break;
        }
    }

    if( i == MAX_USER_NUM )
    {
        DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebUserAdd() :: "
                 "user table if full !" );
        (_VOID)WNM_SendErrString( CLI_USER_TABLE_FULL );
        return G_FAILURE;
    }


    /* 配置用户表 */
    (_VOID)CLI_UserInfoCfg( &m_sUserTable[i],
                     szUserName, szPassword, ucLevel, USER_FOR_WEB, ucLan );

    #if CLI_DBASE_SUPPORT
    /* 是否包含RDB模块 */
    if( G_YES == g_ul_INCLUDE_MODULE_CLI_RDB )
    {
        /* 函数指针是否注册 */
        if( G_NULL == g_pfn_CFG_CLI_RDB_RecordDirectInsert )
        {
            MT_ERRLOG(0);
            return G_FAILURE;
        }

        if( g_pfn_CFG_CLI_RDB_RecordDirectInsert(m_ulCliUserHandle, m_usUserTable, i, &m_sUserTable[i]) != G_SUCCESS )
        {
            m_sUserTable[i].ucUserType = USER_NOT_USED;
            return G_FAILURE;
        }
    }
    #endif

    return G_SUCCESS;

}

/*-----------------------------------------------------------------------------
 函数名称    : CLI_WebUserDel();
 功能        : 删除用户
 输入参数    : szOprName,   操作用户名;
               szName,      用户名;
 输出参数    : 无.
 返回值      : G_SUCCESS,   成功;
               其他,        失败.
 函数调用说明: woodhead和root不可删除;
               woodhead和root用户可以增删root级别以下(不包括root)的用户。
               root级别以下的用户(不包括root)不允许进行增删操作。
 典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_WebUserDel( const _S8* szOprName, const _S8* szUserName )
{
    _U32                i;
    _U8                 ucTmp;
    PTermUserItem       pstOprUser;

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

    DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebUserDel() :: "
             "Operation user <%s> . Delelte user <%s> .",
             szOprName, szUserName );

    /* 操作用户必须是调试用户或超级用户 */
    if( pstOprUser->ulLevel < CT_AL_SUPER )
    {
        DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebUserDel() :: "
                 "Operation user <%s> 's level %ld is too lower. must be debug user or super user !",
                 szOprName, pstOprUser->ulLevel  );
        (_VOID)WNM_SendErrString( CLI_USER_HAS_NO_RIGHT );
        return G_FAILURE;
    }

    /* 遍历查找匹配用户 */
    for( i = 0; i < MAX_USER_NUM; i ++ )
    {
        /* 如果用户名匹配 */
        if(     ( 0 ==EOS_StriCmp(m_sUserTable[i].szUserName, szUserName) )
             && ( m_sUserTable[i].ucUserType != USER_NOT_USED )
          )
        {
            /* 禁止删除调试用户和超级用户 */
            if( m_sUserTable[i].ulLevel >= CT_AL_SUPER )
            {
                DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebUserDel() :: "
                         "Can't delete debug user or super user <%s, %ld> !",
                         szUserName, m_sUserTable[i].ulLevel );
                (_VOID)WNM_SendErrString( CLI_USER_HAS_NO_RIGHT );
                return G_FAILURE;
            }
            /* 禁止低级别用户删除高级别用户 */
            else if ( pstOprUser->ulLevel < m_sUserTable[i].ulLevel )
            {
                DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebUserDel() :: "
                         "Operation user <%s, %ld> has no right to delete user <%s, %ld> !",
                         szOprName, pstOprUser->ulLevel, szUserName, m_sUserTable[i].ulLevel );
                (_VOID)WNM_SendErrString( CLI_USER_HAS_NO_RIGHT );
                return G_FAILURE;
            }
            /* 禁止删除在线用户 */
            else if( m_sUserTable[i].ulTermId != 0 )
            {
                DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebUserDel() :: "
                         "Delete user <%s> 's is online !",
                         szUserName  );
                (_VOID)WNM_SendErrString( CLI_USER_DEL_ONLINE );
                return G_FAILURE;
            }
            /* 终于匹配了 */
            else
            {
                break;
            }
        }
    }

    /* 未找到 */
    if( i == MAX_USER_NUM )
    {
        DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebUserDel() :: "
                 "Can't find Delete user <%s> !",
                 szUserName  );
        (_VOID)WNM_SendErrString( CLI_USER_NOT_EXISTED );
        return G_FAILURE;
    }

    ucTmp = m_sUserTable[i].ucUserType;
    m_sUserTable[i].ucUserType = USER_NOT_USED;

    #if CLI_DBASE_SUPPORT
    /* 是否包含RDB模块 */
    if( G_YES == g_ul_INCLUDE_MODULE_CLI_RDB )
    {
        /* 函数指针是否注册 */
        if( G_NULL == g_pfn_CFG_CLI_RDB_RecordDirectDelete )
        {
            MT_ERRLOG(0);
            return G_FAILURE;
        }

        if (g_pfn_CFG_CLI_RDB_RecordDirectDelete( m_ulCliUserHandle, m_usUserTable, i) != G_SUCCESS)
        {
            m_sUserTable[i].ucUserType = ucTmp;
            MT_ERRLOG(0);
            return G_FAILURE;
        }
    }
    #endif

    return G_SUCCESS;
}


#undef __WNM_IF_ACL__
/*-----------------------------------------------------------------------------
 函数名称    : CLI_WebAddClientACL();
 功能        : 增加ACL的表项;
 输入参数    : ulIpaddr     IP地址;
               ulIpMask     子网掩码;
 输出参数    : 无.
 返回值      : G_SUCCESS,   成功;
               其他,        失败.
 函数调用说明:
 典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_WebAddClientACL( _U32 ulIpaddr, _U32 ulIpMask )
{
    _S8 szIPAdd[20], szIpMsk[20];
    _U32 i;

    /* 转换为字符串 */
    (_VOID)_IPAddrToStr(ulIpaddr, szIPAdd);
    (_VOID)_IPAddrToStr(ulIpMask, szIpMsk);

    DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebAddClientACL() :: "
             "Add ip addr <%s> and mask <%s> to ACL talbe .",
             szIPAdd, szIpMsk );

    /* IP地址和子网掩码的合法性检查 */
    if (_VerifyGeneralIPAddress(szIPAdd) != G_SUCCESS
     || _VerifyMASKAddress(szIpMsk) != G_SUCCESS)
    {
        DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebAddClientACL() :: "
                 "Input ip addr <%s> or mask <%s> is invalid .",
                 szIPAdd, szIpMsk );
        (_VOID)WNM_SendErrString( CLI_CLIENT_PARAM_VERIFY_FAILED );
        return G_FAILURE;
    }

    for (i = 0; i < MT_ACL_NUM; i++)
    {
        if (((m_stCliAcl[i].ulIpAddr & m_stCliAcl[i].ulIpMask)
            == (ulIpaddr & ulIpMask))
            && (m_stCliAcl[i].ulIpMask == ulIpMask))
        {
            DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebAddClientACL() :: "
                     "Input ip addr <%s> and mask <%s> has exist .",
                     szIPAdd, szIpMsk );
            (_VOID)WNM_SendErrString( CLI_CLIENT_LIST_EXISTED );
            return G_FAILURE;
        }
    }

    for (i = 0; i < MT_ACL_NUM; i++)
    {
        if (m_stCliAcl[i].ulState != ACL_USED_FLAG)
        {
            m_stCliAcl[i].ulIpAddr = ulIpaddr;
            m_stCliAcl[i].ulIpMask = ulIpMask;
            m_stCliAcl[i].ulState  = ACL_USED_FLAG;

            #if CLI_DBASE_SUPPORT
            /* 是否包含RDB模块 */
            if( G_YES == g_ul_INCLUDE_MODULE_CLI_RDB )
            {
                /* 函数指针是否注册 */
                if( G_NULL == g_pfn_CFG_CLI_RDB_RecordDirectInsert )
                {
                    MT_ERRLOG(0);
                    return G_FAILURE;
                }

                if (g_pfn_CFG_CLI_RDB_RecordDirectInsert(m_ulCliUserHandle, m_usClientACLTable, i, &m_stCliAcl[i])!= G_SUCCESS)
                {
                    DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebAddClientACL() :: "
                             "Input ip addr <%s> and mask <%s> insert to RDB fail .",
                             szIPAdd, szIpMsk );
                    MT_ERRLOG(0);
                    return G_FAILURE;
                }
            }
            #endif

            return G_SUCCESS;
        }
    }

    DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebAddClientACL() :: "
             "ACL table is full .",
             szIPAdd, szIpMsk );
    (_VOID)WNM_SendErrString( CLI_CLIENT_TABLE_FULL );

    return G_FAILURE;

}

/*-----------------------------------------------------------------------------
 函数名称    : NMS_DelClientACL();
 功能        : 删除ACL的表项;
 输入参数    : ulIpaddr     IP地址;
               ulIpMask     子网掩码;
 输出参数    : 无.
 返回值      : G_SUCCESS,   成功;
               其他,        失败.
 函数调用说明:
 典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_WebDelClientACL( _U32 ulIpaddr, _U32 ulIpMask )
{
    _S8 szIPAdd[20], szIpMsk[20];
    _U32 i;

    /* 转换为字符串 */
    (_VOID)_IPAddrToStr(ulIpaddr, szIPAdd);
    (_VOID)_IPAddrToStr(ulIpMask, szIpMsk);

    DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebDelClientACL() :: "
             "delete ip addr <%s> and mask <%s> from ACL talbe .",
             szIPAdd, szIpMsk );


    /* IP地址和子网掩码的合法性检查 */
    if ( _VerifyGeneralIPAddress(szIPAdd) != G_SUCCESS
     || _VerifyMASKAddress(szIpMsk) != G_SUCCESS)
    {
        DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebDelClientACL() :: "
                 "Input ip addr <%s> or mask <%s> is invalid .",
                 szIPAdd, szIpMsk );
        (_VOID)WNM_SendErrString( CLI_CLIENT_PARAM_VERIFY_FAILED );
        return G_FAILURE;
    }

    for (i = 0; i < MT_ACL_NUM; i++)
    {
        if (m_stCliAcl[i].ulIpAddr == ulIpaddr
         && m_stCliAcl[i].ulIpMask == ulIpMask
         && m_stCliAcl[i].ulState == ACL_USED_FLAG)
        {
            /*将Ip地址和掩码初始化为255.255.255.255*/
            m_stCliAcl[i].ulIpAddr = G_NULL_DWORD;
            m_stCliAcl[i].ulIpMask = G_NULL_DWORD;
            m_stCliAcl[i].ulState  = 0;

            #if CLI_DBASE_SUPPORT
            /* 是否包含RDB模块 */
            if( G_YES == g_ul_INCLUDE_MODULE_CLI_RDB )
            {
                /* 函数指针是否注册 */
                if( G_NULL == g_pfn_CFG_CLI_RDB_RecordDirectDelete )
                {
                    MT_ERRLOG(0);
                    return G_FAILURE;
                }

                if (g_pfn_CFG_CLI_RDB_RecordDirectDelete( m_ulCliUserHandle, m_usClientACLTable, i) != G_SUCCESS)
                {
                    DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebDelClientACL() :: "
                             "Input ip addr <%s> and mask <%s> delete from RDB fail .",
                             szIPAdd, szIpMsk );
                    MT_ERRLOG(0);
                    return G_FAILURE;
                }
            }
            #endif

            return G_SUCCESS;
        }
    }

    DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebDelClientACL() :: "
             "Can't find ip addr <%s> or mask <%s> from ACL table .",
             szIPAdd, szIpMsk );
    (_VOID)WNM_SendErrString( CLI_TELNET_ACL_UNFIND );

    return G_FAILURE;

}


#undef __WNM_IF_LOG__
#if ( LOG_SAVE_FLASH == G_NO )
/*-----------------------------------------------------------------------------
 函数名称    : CLI_WebGetLogNum();
 功能        : 获取指定用户权限级别的日志数目;
 输入参数    : ucOprLevel,  操作用户的权限级别;
 输出参数    : *pulLogNum,  指定用户权限级别的日志数目;
 返回值      : G_SUCCESS,   成功;
               其他,        失败.
 函数调用说明: 本函数调用CLI_LogMapReset(), 必须保证在后面的几个函数前调用;
 典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_WebGetLogNum( _U8 ucOprLevel, _U32* pulLogNum )
{
    _U32                    ulRet;
    ST_LOG_INDEX_MAP_CTRL  *pstMapCtrl;

    /* WIN32调试版本, 做一下检查 */
    #if (EOS_OS_TYPE == EOS_WIN32)
    DBG_ASSERT( CLI_LogTableCheck() == G_SUCCESS );
    #endif

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

    /* 操作用户的权限级别的合法性检查 */
    if( CT_AL_NULL <= ucOprLevel )
    {
        MT_ERRLOG(ucOprLevel);

⌨️ 快捷键说明

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