eReportBuilderStatus eGenerateJsonReport()

in source/defender-tools/report_builder.c [443:693]


eReportBuilderStatus eGenerateJsonReport( char * pcBuffer,
                                          uint32_t ulBufferLength,
                                          const ReportMetrics_t * pxMetrics,
                                          uint32_t ulMajorReportVersion,
                                          uint32_t ulMinorReportVersion,
                                          uint32_t ulReportId,
                                          uint32_t * pulOutReportLength )
{
    char * pcCurrentWritePos = pcBuffer;
    uint32_t ulRemainingBufferLength = ulBufferLength, bufferWritten;
    eReportBuilderStatus eStatus = eReportBuilderSuccess;
    int32_t lCharactersWritten;

    configASSERT( pcBuffer != NULL );
    configASSERT( pxMetrics != NULL );
    configASSERT( pulOutReportLength != NULL );
    configASSERT( ulBufferLength != 0 );

    if( ( pcBuffer == NULL ) ||
        ( ulBufferLength == 0 ) ||
        ( pxMetrics == NULL ) ||
        ( pulOutReportLength == NULL ) )
    {
        LogError( ( "Invalid parameters. pcBuffer: %p, ulBufferLength: %u"
                    " pMetrics: %p, pOutReprotLength: %p.",
                    pcBuffer,
                    ulBufferLength,
                    pxMetrics,
                    pulOutReportLength ) );
        eStatus = eReportBuilderBadParameter;
    }

    /* Write part1. */
    if( eStatus == eReportBuilderSuccess )
    {
        lCharactersWritten = snprintf( pcCurrentWritePos,
                                       ulRemainingBufferLength,
                                       reportbuilderJSON_REPORT_FORMAT_PART1,
                                       DEFENDER_REPORT_HEADER_KEY,
                                       DEFENDER_REPORT_ID_KEY,
                                       ulReportId,
                                       DEFENDER_REPORT_VERSION_KEY,
                                       ulMajorReportVersion,
                                       ulMinorReportVersion,
                                       DEFENDER_REPORT_METRICS_KEY,
                                       DEFENDER_REPORT_TCP_LISTENING_PORTS_KEY,
                                       DEFENDER_REPORT_PORTS_KEY
                                       );

        if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, ulRemainingBufferLength ) )
        {
            LogError( ( "Failed to write part 1." ) );
            eStatus = eReportBuilderBufferTooSmall;
        }
        else
        {
            ulRemainingBufferLength -= lCharactersWritten;
            pcCurrentWritePos += lCharactersWritten;
        }
    }

    /* Write TCP ports array. */
    if( eStatus == eReportBuilderSuccess )
    {
        eStatus = prvWritePortsArray( pcCurrentWritePos,
                                      ulRemainingBufferLength,
                                      pxMetrics->pusOpenTcpPortsArray,
                                      pxMetrics->ulOpenTcpPortsArrayLength,
                                      &( bufferWritten ) );

        if( eStatus == eReportBuilderSuccess )
        {
            pcCurrentWritePos += bufferWritten;
            ulRemainingBufferLength -= bufferWritten;
        }
        else
        {
            LogError( ( "Failed to write TCP ports array." ) );
        }
    }

    /* Write part2. */
    if( eStatus == eReportBuilderSuccess )
    {
        lCharactersWritten = snprintf( pcCurrentWritePos,
                                       ulRemainingBufferLength,
                                       reportbuilderJSON_REPORT_FORMAT_PART2,
                                       DEFENDER_REPORT_TOTAL_KEY,
                                       pxMetrics->ulOpenTcpPortsArrayLength,
                                       DEFENDER_REPORT_UDP_LISTENING_PORTS_KEY,
                                       DEFENDER_REPORT_PORTS_KEY
                                       );

        if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, ulRemainingBufferLength ) )
        {
            LogError( ( "Failed to write part 2." ) );
            eStatus = eReportBuilderBufferTooSmall;
        }
        else
        {
            ulRemainingBufferLength -= lCharactersWritten;
            pcCurrentWritePos += lCharactersWritten;
        }
    }

    /* Write UDP ports array. */
    if( eStatus == eReportBuilderSuccess )
    {
        eStatus = prvWritePortsArray( pcCurrentWritePos,
                                      ulRemainingBufferLength,
                                      pxMetrics->pusOpenUdpPortsArray,
                                      pxMetrics->ulOpenUdpPortsArrayLength,
                                      &( bufferWritten ) );

        if( eStatus == eReportBuilderSuccess )
        {
            pcCurrentWritePos += bufferWritten;
            ulRemainingBufferLength -= bufferWritten;
        }
        else
        {
            LogError( ( "Failed to write UDP ports array." ) );
        }
    }

    /* Write part3. */
    if( eStatus == eReportBuilderSuccess )
    {
        lCharactersWritten = snprintf( pcCurrentWritePos,
                                       ulRemainingBufferLength,
                                       reportbuilderJSON_REPORT_FORMAT_PART3,
                                       DEFENDER_REPORT_TOTAL_KEY,
                                       pxMetrics->ulOpenUdpPortsArrayLength,
                                       DEFENDER_REPORT_NETWORK_STATS_KEY,
                                       DEFENDER_REPORT_BYTES_IN_KEY,
                                       pxMetrics->pxNetworkStats->ulBytesReceived,
                                       DEFENDER_REPORT_BYTES_OUT_KEY,
                                       pxMetrics->pxNetworkStats->ulBytesSent,
                                       DEFENDER_REPORT_PKTS_IN_KEY,
                                       pxMetrics->pxNetworkStats->ulPacketsReceived,
                                       DEFENDER_REPORT_PKTS_OUT_KEY,
                                       pxMetrics->pxNetworkStats->ulPacketsSent,
                                       DEFENDER_REPORT_TCP_CONNECTIONS_KEY,
                                       DEFENDER_REPORT_ESTABLISHED_CONNECTIONS_KEY,
                                       DEFENDER_REPORT_CONNECTIONS_KEY
                                       );

        if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, ulRemainingBufferLength ) )
        {
            LogError( ( "Failed to write part 3." ) );
            eStatus = eReportBuilderBufferTooSmall;
        }
        else
        {
            ulRemainingBufferLength -= lCharactersWritten;
            pcCurrentWritePos += lCharactersWritten;
        }
    }

    /* Write connections array. */
    if( eStatus == eReportBuilderSuccess )
    {
        eStatus = prvWriteConnectionsArray( pcCurrentWritePos,
                                            ulRemainingBufferLength,
                                            pxMetrics->pxEstablishedConnectionsArray,
                                            pxMetrics->ulEstablishedConnectionsArrayLength,
                                            &( bufferWritten ) );

        if( eStatus == eReportBuilderSuccess )
        {
            pcCurrentWritePos += bufferWritten;
            ulRemainingBufferLength -= bufferWritten;
        }
        else
        {
            LogError( ( "Failed to write established connections array." ) );
        }
    }

    /* Write part4. */
    if( eStatus == eReportBuilderSuccess )
    {
        lCharactersWritten = snprintf( pcCurrentWritePos,
                                       ulRemainingBufferLength,
                                       reportbuilderJSON_REPORT_FORMAT_PART4,
                                       DEFENDER_REPORT_TOTAL_KEY,
                                       pxMetrics->ulEstablishedConnectionsArrayLength,
                                       DEFENDER_REPORT_CUSTOM_METRICS_KEY,
                                       DEFENDER_REPORT_NUMBER_KEY,
                                       pxMetrics->ulStackHighWaterMark,
                                       DEFENDER_REPORT_NUMBER_LIST_KEY
                                       );

        if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, ulRemainingBufferLength ) )
        {
            LogError( ( "Failed to write part 4." ) );
            eStatus = eReportBuilderBufferTooSmall;
        }
        else
        {
            ulRemainingBufferLength -= lCharactersWritten;
            pcCurrentWritePos += lCharactersWritten;
        }
    }

    /* Write task ids array. */
    if( eStatus == eReportBuilderSuccess )
    {
        eStatus = prvWriteTaskIdsArray( pcCurrentWritePos,
                                        ulRemainingBufferLength,
                                        pxMetrics->pulTaskIdsArray,
                                        pxMetrics->ulTaskIdsArrayLength,
                                        &( bufferWritten ) );

        if( eStatus == eReportBuilderSuccess )
        {
            pcCurrentWritePos += bufferWritten;
            ulRemainingBufferLength -= bufferWritten;
        }
        else
        {
            LogError( ( "Failed to write task ids array." ) );
        }
    }

    /* Write part5. */
    if( eStatus == eReportBuilderSuccess )
    {
        lCharactersWritten = snprintf( pcCurrentWritePos,
                                       ulRemainingBufferLength,
                                       reportbuilderJSON_REPORT_FORMAT_PART5 );

        if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, ulRemainingBufferLength ) )
        {
            LogError( ( "Failed to write part 5." ) );
            eStatus = eReportBuilderBufferTooSmall;
        }
        else
        {
            ulRemainingBufferLength -= lCharactersWritten;
            pcCurrentWritePos += lCharactersWritten;
        }
    }

    if( eStatus == eReportBuilderSuccess )
    {
        *pulOutReportLength = ulBufferLength - ulRemainingBufferLength;
    }

    return eStatus;
}