Skip to content

Commit 2ed50db

Browse files
authored
Merge pull request #356 from nsacyber/issue-354
Support new command line options for validation report download
2 parents 1d33054 + da7e1de commit 2ed50db

File tree

2 files changed

+147
-29
lines changed

2 files changed

+147
-29
lines changed

HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/ValidationReportsPageController.java

Lines changed: 60 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,13 @@ public class ValidationReportsPageController extends PageController<NoPageParams
5858
private final CertificateManager certificateManager;
5959
private final DeviceManager deviceManager;
6060

61-
private static String columnHeaders = "Verified Manufacturer,"
62-
+ "Model,SN,Verification Date,Device Status,"
63-
+ "Component name,Component manufacturer,Component model,"
64-
+ "Component SN,Issuer,Component status";
61+
private static String systemColumnHeaders = "Verified Manufacturer,"
62+
+ "Model,SN,Verification Date,Device Status";
63+
private static String componentColumnHeaders = "Component name,Component manufacturer,"
64+
+ "Component model,Component SN,Issuer,Component status";
6565
private static final String DEFAULT_COMPANY = "AllDevices";
6666
private static final String UNDEFINED = "undefined";
67+
private static final String TRUE = "true";
6768
private static final Logger LOGGER = getLogger(ValidationReportsPageController.class);
6869

6970
/**
@@ -155,6 +156,11 @@ public void download(final HttpServletRequest request,
155156
LocalDate endDate = null;
156157
ArrayList<LocalDate> createTimes = new ArrayList<LocalDate>();
157158
String[] deviceNames = new String[]{};
159+
String columnHeaders = "";
160+
boolean systemOnly = false;
161+
boolean componentOnly = false;
162+
String filterManufacturer = "";
163+
String filterSerial = "";
158164

159165
Enumeration parameters = request.getParameterNames();
160166
while (parameters.hasMoreElements()) {
@@ -208,6 +214,29 @@ public void download(final HttpServletRequest request,
208214
deviceNames = parameterValue.split(",");
209215
}
210216
break;
217+
case "system":
218+
if (parameterValue.equals(TRUE)) {
219+
systemOnly = true;
220+
columnHeaders = systemColumnHeaders + columnHeaders;
221+
}
222+
break;
223+
case "component":
224+
if (parameterValue.equals(TRUE)) {
225+
componentOnly = true;
226+
columnHeaders += componentColumnHeaders;
227+
}
228+
break;
229+
case "manufacturer":
230+
if (parameterValue != null && !parameterValue.isEmpty()) {
231+
filterManufacturer = parameterValue;
232+
}
233+
break;
234+
case "serial":
235+
if (parameterValue != null && !parameterValue.isEmpty()) {
236+
filterSerial = parameterValue;
237+
}
238+
break;
239+
211240
default:
212241
}
213242
}
@@ -220,37 +249,46 @@ public void download(final HttpServletRequest request,
220249
StringBuilder reportData = new StringBuilder();
221250
bufferedWriter.append("Company: " + company + "\n");
222251
bufferedWriter.append("Contract number: " + contractNumber + "\n");
252+
if (systemOnly && componentOnly) {
253+
systemOnly = false;
254+
componentOnly = false;
255+
}
223256
for (int i = 0; i < deviceNames.length; i++) {
224257
if ((createTimes.get(i).isAfter(startDate) || createTimes.get(i).isEqual(startDate))
225258
&& (createTimes.get(i).isBefore(endDate)
226259
|| createTimes.get(i).isEqual(endDate))) {
227260
UUID deviceId = deviceManager.getDevice(deviceNames[i]).getId();
228-
LOGGER.info(deviceId);
229261
PlatformCredential pc = PlatformCredential.select(certificateManager)
230262
.byDeviceId(deviceId).getCertificate();
231-
LOGGER.info("Found platform credential: " + pc.toString());
232-
reportData.append(pc.getManufacturer() + ","
233-
+ pc.getModel() + ","
234-
+ pc.getPlatformSerial() + ","
235-
+ LocalDateTime.now().toString() + ","
236-
+ pc.getDevice().getSupplyChainStatus() + ",");
237-
ArrayList<ArrayList<String>> parsedComponents = parseComponents(pc);
238-
for (ArrayList<String> component : parsedComponents) {
239-
for (String data : component) {
240-
reportData.append(data + ",");
263+
if ((filterManufacturer.isEmpty() || filterManufacturer.equals(
264+
pc.getManufacturer()))
265+
&& (filterSerial.isEmpty() || filterSerial.equals(
266+
pc.getPlatformSerial()))) {
267+
if (!componentOnly) {
268+
reportData.append(pc.getManufacturer() + ","
269+
+ pc.getModel() + ","
270+
+ pc.getPlatformSerial() + ","
271+
+ LocalDateTime.now().toString() + ","
272+
+ pc.getDevice().getSupplyChainStatus() + ",");
273+
}
274+
if (!systemOnly) {
275+
ArrayList<ArrayList<String>> parsedComponents = parseComponents(pc);
276+
for (ArrayList<String> component : parsedComponents) {
277+
for (String data : component) {
278+
reportData.append(data + ",");
279+
}
280+
reportData.deleteCharAt(reportData.length() - 1);
281+
reportData.append("\n,,,,,");
282+
}
241283
}
242-
reportData.deleteCharAt(reportData.length() - 1);
243-
reportData.append("\n,,,,,");
244-
}
245-
if (reportData.lastIndexOf(",") > 4) {
246-
reportData.delete(reportData.lastIndexOf(",") - 4, reportData.length());
247284
}
248285
}
249286
}
287+
if (columnHeaders.isEmpty()) {
288+
columnHeaders = systemColumnHeaders + componentColumnHeaders;
289+
}
250290
bufferedWriter.append(columnHeaders + "\n");
251291
bufferedWriter.append(reportData.toString() + "\n");
252-
LOGGER.info(columnHeaders);
253-
LOGGER.info(reportData.toString());
254292
bufferedWriter.flush();
255293
}
256294

scripts/download_validation_reports.sh

Lines changed: 87 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,102 @@
55
#$2 filter end date 'yyyy-mm-dd'
66
#$3 ACA address, default is localhost if not given
77

8-
if [ -z "$3" ]
9-
then
10-
endpoint="https://localhost:8443/HIRS_AttestationCAPortal/portal/validation-reports"
11-
else
12-
endpoint="https://$3:8443/HIRS_AttestationCAPortal/portal/validation-reports"
8+
#check for getopt(1) on local system
9+
getopt --test > /dev/null
10+
if [[ ${PIPESTATUS[0]} -ne 4 ]]
11+
then
12+
echo "getopt is required to use this script, please ensure installation!"
13+
else
14+
echo "getopt detected"
1315
fi
16+
17+
#set parameter names and call getopts on inputsi, then parse/assign arguments
18+
SHORTOPTS=m:s:h
19+
LONGOPTS=start-date:,end-date:,ip:,system-only,component-only,manufacturer:,serial:,help
20+
PARSED=$(getopt --options=$SHORTOPTS --longoptions=$LONGOPTS --name "$0" -- "$@")
21+
if [[ ${PIPESTATUS[0]} -ne 0 ]]
22+
then
23+
exit 2
24+
fi
25+
eval set -- "$PARSED"
26+
startDate=
27+
endDate=
28+
ip=localhost
29+
system=
30+
component=
31+
manufacturer=
32+
serial=
33+
34+
helpText="\n\n\nHELP MENU\n\nThe following options are available:\n--start-date\t\t<yyyy-mm-dd>\tDefault: 1970-01-01\tThe earliest date to return validation reports from.\n"
35+
helpText+="--end-date\t\t<yyyy-mm-dd>\tDefault: current time\tThe latest date to return validation reports from.\n"
36+
helpText+="--ip\t\t\t<ACA address>\tDefault: localhost\tThe IP address where the ACA is located.\n"
37+
helpText+="--system-only\t\t\t\t\t\t\tReturn only system information from validation reports.\n"
38+
helpText+="--component-only\t\t\t\t\t\tReturn only component information from validation reports.\n"
39+
helpText+="-m|--manufacturer\t<manufacturer's name>\t\t\tReturn only the validation report of the device from this manufacturer.\n"
40+
helpText+="-s|--serial\t\t<serial number>\t\t\t\tReturn only the validation report of the device with this serial number.\n"
41+
42+
while true
43+
do
44+
case "$1" in
45+
--start-date)
46+
startDate="$2"
47+
shift 2
48+
;;
49+
--end-date)
50+
endDate="$2"
51+
shift 2
52+
;;
53+
--ip)
54+
ip="$2"
55+
shift 2
56+
;;
57+
--system-only)
58+
system=true
59+
shift
60+
;;
61+
--component-only)
62+
component=true
63+
shift
64+
;;
65+
-m|--manufacturer)
66+
manufacturer="$2"
67+
shift 2
68+
;;
69+
-s|--serial)
70+
serial="$2"
71+
shift 2
72+
;;
73+
-h|--help)
74+
printf "$helpText"
75+
exit 0
76+
;;
77+
--)
78+
shift
79+
break
80+
;;
81+
*)
82+
echo "Programming error"
83+
exit 3
84+
;;
85+
esac
86+
done
87+
88+
#echo "start date: $startDate, end date: $endDate, ip: $ip, system: $system, component: $component, manufacturer: $manufacturer, serial: $serial"
89+
90+
#call ACA for validation report
91+
endpoint="https://$ip:8443/HIRS_AttestationCAPortal/portal/validation-reports"
1492
echo "$endpoint"
1593
content=$(curl --insecure $endpoint/list)
94+
95+
#Parse JSON response for create times and device names
1696
rawTimes=$(jq -r '.data | map(.createTime | tostring) | join(",")' <<< "$content")
1797
createTimes=""
1898
for i in ${rawTimes//,/ }
1999
do
20100
createTimes+="$(date -u +"%Y-%m-%d %H:%M:%S" -d @"$(($i/1000))"),"
21101
done
22102
deviceNames=$(jq -r '.data | map(.device.name) | join(",")' <<< "$content")
103+
23104
echo "Create times: $createTimes"
24105
echo "Device names: $deviceNames"
25-
curl --data "dateStart=$1&dateEnd=$2&createTimes=$createTimes&deviceNames=$deviceNames" --insecure $endpoint/download
26-
106+
curl --data "dateStart=$startDate&dateEnd=$endDate&createTimes=$createTimes&deviceNames=$deviceNames&system=$system&component=$component&manufacturer=$manufacturer&serial=$serial" --insecure $endpoint/download

0 commit comments

Comments
 (0)