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

📄 cli_log.c

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

    if (EOS_GetTime(&sTime) != G_SUCCESS)
    {
        sTime.ucYear   = 0x03;
        sTime.ucMonth  = 0x05;
        sTime.ucDay    = 0x01;
        sTime.ucHour   = 0x00;
        sTime.ucMinute = 0x00;
        sTime.ucSecond = 0x00;
        CLI_RECORD(CLI_STAT_CANNOT_GET_TIME);
    }

    /*---------------------------------------- ------------
            记录日志
      ---------------------------------------------------- */
    usSaveIndex = m_pstLogTblCtrl->usLogTail;
    pstLogItem  = &m_astLogTable[usSaveIndex];
    ulDelLevel  = pstLogItem->ulLevel;

    pstLogItem->ulLogDate  = LOG_MAKE_TIME(sTime.ucYear, sTime.ucMonth, sTime.ucDay);
    pstLogItem->ulLogTime  = LOG_MAKE_TIME(sTime.ucHour, sTime.ucMinute, sTime.ucSecond);
    pstLogItem->ulClientIp = ulClientIp;
    pstLogItem->ulLevel    = ulLevel;
    pstLogItem->ulLogMode  = ulLogMode;
    EOS_StrNCpy(pstLogItem->szCommand, szCommand, MT_LOG_CMD_LEN - 1);
    pstLogItem->szCommand[MT_LOG_CMD_LEN - 1] = '\0';
    EOS_StrNCpy(pstLogItem->szUserName, szUserName, USERNAME_LEN - 1);
    pstLogItem->szUserName[USERNAME_LEN - 1] = '\0';
    pstLogItem->sReserve = 0;

    pstLogItem->usLogCrc = EOS_CrcMakeCheckSum((_U8*)pstLogItem + sizeof(_U16), sizeof(ST_LOG_ITEM) - sizeof(_U16));


    /*---------------------------------------- ------------
            日志表的处理
      ---------------------------------------------------- */

    /* 日志表不满 */
    if( m_pstLogTblCtrl->usLogCount < LOG_MAX_NUM )
    {
        DBG_ASSERT( m_pstLogTblCtrl->usLogHead == 0 );

        m_pstLogTblCtrl->usLogTail = CLI_INCCYCLE(m_pstLogTblCtrl->usLogTail, LOG_MAX_NUM);

        m_pstLogTblCtrl->usLogCount ++;
    }
    /* 日志表满, 循环覆盖 */
    else
    {
        DBG_ASSERT( m_pstLogTblCtrl->usLogHead  == m_pstLogTblCtrl->usLogTail );
        DBG_ASSERT( m_pstLogTblCtrl->usLogCount == LOG_MAX_NUM );

        m_pstLogTblCtrl->usLogTail = CLI_INCCYCLE(m_pstLogTblCtrl->usLogTail, LOG_MAX_NUM);
        m_pstLogTblCtrl->usLogHead = CLI_INCCYCLE(m_pstLogTblCtrl->usLogHead, LOG_MAX_NUM);
    }

    m_pstLogTblCtrl->usCtrlCrc = EOS_CrcMakeCheckSum((_U8*)m_pstLogTblCtrl + sizeof(_U16), sizeof(ST_LOG_TBL_CTRL) - sizeof(_U16));


    /*---------------------------------------- ------------
            映射表的处理
      ---------------------------------------------------- */

    /* 映射表要重置的最小用户级别 */
    ulMinLevel = MIN( ulLevel, ulDelLevel );
    if( ulMinLevel < m_ulLogMapResetMinLevel )
    {
        m_ulLogMapResetMinLevel = ulMinLevel;
    }

    return G_SUCCESS;

}

/*********************************************************************/
/* 函数名称 : CLI_GetOneLog()                                        */
/* 函数功能 : 根据索引获取一条日志信息                               */
/* 输入参数 : usIndex: 日志索引                                      */
/* 返回     : 日志信息结构指针                                       */
/* 上层函数 :                                                        */
/* 创建者   :                                                        */
/* 修改记录 :                                                        */
/*********************************************************************/
P_ST_LOG_ITEM CLI_GetOneLog(_U16 usIndex)
{
    /* 索引的合法性检查 */
    if (LOG_MAX_NUM <= usIndex)
    {
        MT_ERRLOG(usIndex);
        return G_NULL;
    }

    return &(m_astLogTable[usIndex]);
}

/*********************************************************************/
/* 函数名称 : CLI_DisplayOneLog()                                    */
/* 函数功能 : 显示一条日志信息                                       */
/* 输入参数 : pstLogItem :要显示的日志结构                             */
/* 输出参数 : 无                                                     */
/* 返回     : 成功、失败                                             */
/* 上层函数 :                                                        */
/* 创建者   :                                                        */
/* 修改记录 :                                                        */
/*********************************************************************/
_U32 CLI_DisplayOneLog(P_ST_LOG_ITEM pstLogItem)
{
    _S8 szIPString[20] ;
    _S8 szTime[20];
    _S8 szCmd[30];
    _S8 szName[10];
    PTerm_Data_S pTermStruct;

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

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

    /* 如果操作者的权限比所查询的日志的用户权限小,不允许查询 */
    if (pTermStruct->ucUserLevel < (_U8)pstLogItem->ulLevel)
        return G_FAILURE;

    if (pstLogItem->ulClientIp != 0)
        EOS_IPAddrToStr(pstLogItem->ulClientIp, szIPString);
    else
        EOS_StrCpy(szIPString, "   --");

    EOS_Sprintf(szTime, "%02d-%02d-%02d %02d:%02d:%02d", (pstLogItem->ulLogDate >> 16) & 0xff,
                                               ((pstLogItem->ulLogDate >> 8) & 0xff) + 1,
                                               (pstLogItem->ulLogDate ) & 0xff,
                                               (pstLogItem->ulLogTime >> 16) & 0xff,
                                               (pstLogItem->ulLogTime >> 8) & 0xff,
                                               (pstLogItem->ulLogTime) & 0xff);
    EOS_StrNCpy(szCmd, pstLogItem->szCommand, 25);
    szCmd[25] = '\0';
    EOS_StrNCpy(szName, pstLogItem->szUserName, 9);
    szName[9] = '\0';

    return IO_Print(CLI_LOG_TABLE_ITEM,  szCmd,
                                         szName,
                                         CLI_GetUserLogModeString( pstLogItem->ulLogMode ),
                                         szIPString,
                                         szTime,
                                         LINE_LENGTH);
}

/*********************************************************************/
/* 函数名称 : CLI_DisplayAllLog()                                    */
/* 函数功能 : 显示所有的日志信息                                     */
/* 返回     : 成功、失败                                             */
/* 上层函数 :                                                        */
/* 创建者   :                                                        */
/* 修改记录 :                                                        */
/*********************************************************************/
_U32 CLI_DisplayAllLog(_VOID)
{
    P_ST_LOG_ITEM  psLogItem;
    _U16           i, usIndex;

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

    /* 无记录 */
    if ( 0 == m_pstLogTblCtrl->usLogCount )
    {
        return G_FAILURE;
    }

    if ( CLI_LogTableCtlrCheck() != G_SUCCESS )
    {
        MT_ERRLOG(0);
        (_VOID)CLI_LogTableInit();
        return G_FAILURE;
    }

    IO_Print(CLI_LOG_HEAD_DISP);
    IO_Print(PUB_TABLE_EMBODY);

    usIndex = m_pstLogTblCtrl->usLogTail;

    for( i = 0; i < m_pstLogTblCtrl->usLogCount; i ++ )
    {
        usIndex = CLI_DECCYCLE(usIndex, LOG_MAX_NUM);

        if ((psLogItem = CLI_GetOneLog(usIndex)) == G_NULL)
        {
            return G_FAILURE;
        }
        /* 显示当前所取得的日志 */
        if (CLI_LogItemCheck(psLogItem) == G_SUCCESS)
        {
            (_VOID)CLI_DisplayOneLog(psLogItem);
        }
    }

    DBG_ASSERT( usIndex == m_pstLogTblCtrl->usLogHead );

    IO_Print(PUB_TABLE_EMBODY);

    return G_SUCCESS;

}

/*==============================================================*/
/*      函数名      :CLI_CmdRecord                              */
/*      函数功能    :操作命令的记录                             */
/*      输入参数    :PTerm_Data_S pTermStruct  任务数据指针     */
/*      输出参数    :PTerm_Data_S pTermStruct  任务数据指针     */
/*      返回值      :无                                         */
/*      调用函数    :无                                         */
/*      被调函数    :                                           */
/*==============================================================*/
_VOID CLI_CmdRecord ( PTerm_Data_S pTermStruct )
{
    _U32 ulTmp ;
    _U32 ulLogMode ;
    _S8  szCommandBuf[CT_MAX_CMDBUF] ;

    /* 去掉多余空格 */
    _TrimString( szCommandBuf, pTermStruct->szCommandBuf ) ;

    /* 如果命令缓冲区非空则保存该命令到历史命令缓冲区中         */
    if ( szCommandBuf[0] == '\0'
        || szCommandBuf[0] == KEY_CTRL_Z
        || szCommandBuf[0] == KEY_CTRL_C
        || strchr (szCommandBuf, '?') != G_NULL)
    {
        if ( pTermStruct->szCommandBuf [ EOS_StrLen ( pTermStruct->szCommandBuf ) - 1 ]
             == '?' && pTermStruct->ucHelpMode == 0)
        {
             pTermStruct->szCommandBuf [ EOS_StrLen ( pTermStruct->szCommandBuf ) - 1 ]
                = '\0' ;
             EOS_StrCpy ( pTermStruct->szEditBuf, pTermStruct->szCommandBuf ) ;
             pTermStruct->iCurrentPos = (_S32)EOS_StrLen ( pTermStruct->szEditBuf ) ;
        }

        pTermStruct->ulCommandExecOk = COMMAND_UNFINISHED ;
        pTermStruct->szCommandBuf[0] = '\0' ;
        pTermStruct->pWS->szCmdString[0] = '\0';

        return ;
    }

    /* 搜寻第一个空闲的历史命令缓冲区                       */
    for ( ulTmp = 0 ; ulTmp < HISTORY_SIZE ; ulTmp ++ )
    {
        if ( ! ( pTermStruct->szHistory[ulTmp][0] ) )
            break ;
    }
    pTermStruct->iHistoryPos = (_S32)ulTmp;

    if (ulTmp == 0 || EOS_StriCmp(szCommandBuf, pTermStruct->szHistory[ulTmp - 1]))
    {

        /* 如果历史命令缓冲区已满,则将最早的历史命令清除        */
        if ( ulTmp == HISTORY_SIZE )
        {
            for ( ulTmp = 1 ; ulTmp < HISTORY_SIZE ; ulTmp ++ )
                EOS_StrCpy ( pTermStruct->szHistory[ ulTmp - 1 ],
                         pTermStruct->szHistory[ ulTmp ] ) ;
            ulTmp = HISTORY_SIZE - 1 ;
        }

        /* 将当前命令写入到找到的空闲历史命令缓冲区中去         */
        EOS_StrCpy ( pTermStruct->szHistory[ ulTmp ], szCommandBuf ) ;
        pTermStruct->iHistoryPos = (_S32)ulTmp + 1 ;
    }

    if (pTermStruct->iSocket == -1)
        ulLogMode = 0 ;
    else if(pTermStruct->iSocket == -2)
        ulLogMode = 2 ;
    else
        ulLogMode = 1 ;

    if (pTermStruct->ulCommandExecOk == COMMAND_ACCOMPLISHED)
    {
        if (szCommandBuf[0] == 0)
            return ;
        _AffirmStrBeLower(szCommandBuf);
        if ((m_ulLogTag == 1)
         && (EOS_StrNCmp(szCommandBuf, "show ", 5) != 0)
         && (EOS_StrNCmp(szCommandBuf, "display ", 8) != 0))
        {
             (_VOID)CLI_SaveUserLog(pTermStruct->szCurUserName, ulLogMode, pTermStruct->ulClientIP, szCommandBuf) ;
        }
        m_ulLogTag = 0;
    }

    pTermStruct->ulCommandExecOk = COMMAND_UNFINISHED ;

    /* 清空命令缓冲区,等待接收下一个命令                        */
    pTermStruct->szCommandBuf[0] = '\0' ;
    pTermStruct->pWS->szCmdString[0] = '\0';

    return ;
}

/*==============================================================*/
/*      函数名      :CLI_RecordCurrentCmd                       */
/*      函数功能    :当前操作命令的记录                         */
/*      输入参数    :PTerm_Data_S pTermStruct  任务数据指针     */
/*      输出参数    :PTerm_Data_S pTermStruct  任务数据指针     */
/*      返回值      :无                                         */
/*      调用函数    :无                                         */
/*      被调函数    :该函数仅供命令执行函数可能不返回到正常命令 */
/*                   流程的情况下调用                           */
/*==============================================================*/
_VOID CLI_RecordCurrentCmd (_VOID)
{
    PTerm_Data_S pTermStruct;

    if ((pTermStruct = CLI_GetCurrentTaskData()) == G_NULL)
    {
        MT_ERRLOG(0);
        return ;
    }

    pTermStruct->ulCommandExecOk = COMMAND_ACCOMPLISHED;
    m_ulLogTag = 1;
    CLI_CmdRecord(pTermStruct);

    return;
}

#else

#endif

⌨️ 快捷键说明

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