Преобразование 45 файлов Fortify .fpr в .csv (BuildFolder, ProjectName, Critical, High, Medium, Low) - PullRequest
0 голосов
/ 13 февраля 2019

Что мне нужно: Преобразовать ~ 45 ReportGenerator.bat .fpr Формировать выходные файлы отчета (в XML, а затем анализировать) в число ошибок SCA по степени серьезности.Вывод в CSV (или, по крайней мере, вывод на экран в виде таблицы) с одной строкой для каждого проекта.

Требуемый вывод:

BuildFolder,ProjectName,Critical,High,Medium,Low
ScaBuild1,Project1,1,1,2,13
ScaBuild1,Project2,0,0,7,500
ScaBuild2,Project3,0,0,5,10
...

Вопросы (проблемы с моим текущим сценарием ниже):

1: Как отсортировать изменения в разобранном порядке XML-узлов: Критический, Высокий, Средний, Низкий (вставка 0 в случае отсутствия результата)?

Note the default XML output is tricky to parse (GroupingSection has count attribute followed by groupTitle Element containing the severity title).
Example:  <GroupingSection count="4484"><groupTitle>Low</groupTitle></GroupingSection>

Q1 - это то, что я буду использоватьдля правильного ответа (но комментарии / ответы для № 2 и № 3 являются сильным бонусом и достойны повышенного голоса)

2: преобразовать текущий «Select-XML… Select-Object… | Format-Table» по трубопроводувместо вывода заполнить объект массива (объединить с BuildFolder и ProjectName)?

3: Как только массив результатов построен, как вывести в файл .csv, а затем вывести на экран (в виде таблицы с вкладками)?

Заранее благодарим за ваш полезный ввод!

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Пример пути и структуры файла (для 45 проектов):

c:\FortifyResults\ScaBuild1\  Project1.fpr, Project2.fpr
c:\FortifyResults\ScaBuild2\  Project3.fpr, Project4.fpr, Project5.fpr
…

Сценарий в настоящее времяused (преобразует каждый файл .fpr в XML (шаблон Fortify по умолчанию) и выводитs считает GroupingSection как таблицу для каждого XML-файла)

#Parameters
$FprFilePath="d:\HPFortifyBuild1\2019.02.06"

#HPF References
    $FortifyInstallPath       ="C:\Program Files\HP_Fortify\HP_Fortify_SCA_and_Apps_16.11"
    $FortifyReportGenerator   ="$FortifyInstallPath\ReportGenerator.bat"
    $FortifyXmlReportTemplate ="$FortifyInstallPath\Core\config\reports\DefaultReportDefinition.xml"

CD $FprFilePath
    Get-ChildItem "$FprFilePath" -Filter *.fpr | 
    Foreach-Object {
        $NameFpr=$_.Name
        $NameXml=($_.BaseName+".xml")

        Write-Host "$NameFpr - Generating $NameXml report..."
        & "C:\Program Files\HP_Fortify\HP_Fortify_SCA_and_Apps_16.11\bin\ReportGenerator.bat" -format xml -f $NameXml -source $NameFpr -template DefaultReportDefinition.xml

        #Write-Host "$FprFilePath\$NameXml RESULTS:"
        Select-XML -Path $FprFilePath\$NameXml -Xpath "/ReportDefinition[1]/ReportSection[1]/SubSection[2]/IssueListing[1]/Chart[1]/GroupingSection" | Select-Object -ExpandProperty Node | Format-Table -AutoSize
        #Write-Host " "
    }

Текущий пример выходных данных скрипта:

Project1.fpr - Generating Project1.xml report...

count groupTitle
----- ----------
13    Low       
2     Medium    
1     Critical  
1     High      


Project2.fpr - Generating Project2.xml report...

count groupTitle
----- ----------
500   Low       
7     Medium
…

Выдержка из Project1.xml (анализируется из Project1.fpr через скрипт)

Команда сценария: ReportGenerator.bat "-format xml -f $ NameXml -source $ NameFpr -template DefaultReportDefinition.xml

Project1.xml выдержка:

<Description>A table summarizing the number of issues found and the breakdown of issues in each Fortify Priority Level</Description>
    <IssueListing listing="false" limit="-1">
    <Refinement/>
        <Chart chartType="table">
            <Axis>Fortify Priority Order</Axis>
            <MajorAttribute>Analysis</MajorAttribute>
            <GroupingSection count="4484"><groupTitle>Low</groupTitle></GroupingSection>
            <GroupingSection count="431"><groupTitle>Medium</groupTitle></GroupingSection>
            <GroupingSection count="114"><groupTitle>High</groupTitle></GroupingSection>
            <GroupingSection count="13"><groupTitle>Critical</groupTitle></GroupingSection>
        </Chart>
    </IssueListing>

Обратите внимание на значение по умолчаниюXML-вывод сложно разобрать (GroupingSection имеет атрибут count, за которым следует элемент groupTitle, содержащий заголовок серьезности).Пример:

<GroupingSection count="4484"><groupTitle>Low</groupTitle></GroupingSection>

SSC - это NA: У меня нет SSC для этой изолированной среды сборки, поэтому API-интерфейсы SSC или связанные с ними решения не применимы к этому вопросу.

Рассмотрено связанных вопросов StackOverflow (на данный момент):

1 Ответ

0 голосов
/ 13 февраля 2019

Похоже, что это ответ на ваш первоначальный вопрос:

$xml = [xml]Get-Content Project1.xml
Foreach ($status in @("Critical", "High", "Medium", "Low"))
{
    $node = $xml.SelectNodes("//GroupingSection[groupTitle=""$status""]").Item(0)
    Write-Host $node.groupTitle, ",", $node.count;
}

Это дает довольно плохо отформатированный вывод, но это поможет вам начать:

Critical , 13
High , 114
Medium , 431
Low , 4484
...