diff --git a/.github/workflows/create_aca_images.yml b/.github/workflows/create_aca_images.yml index 12677cb2..9cda9434 100644 --- a/.github/workflows/create_aca_images.yml +++ b/.github/workflows/create_aca_images.yml @@ -17,7 +17,7 @@ env: PUBLIC_IMAGE_NAME: ghcr.io/nsacyber/hirs/aca PUBLIC_IMAGE_TAG_LATEST: ghcr.io/nsacyber/hirs/aca:latest TAG_LATEST: ${{ github.event_name == 'release' || inputs.also_tag_latest }} # The public docker image will be tagged 'latest' for releases, or if this option is manually selected. -jobs: +jobs: setup: runs-on: ubuntu-latest outputs: @@ -27,44 +27,44 @@ jobs: WINDOWS_COMPAT_IMAGE_TAG: ${{ steps.setenv.outputs.WINDOWS_COMPAT_IMAGE_TAG }} PUBLIC_IMAGE_TAG: ${{ steps.setenv.outputs.PUBLIC_IMAGE_TAG }} steps: - - name: Set env - id: setenv - shell: bash - run: | - # Parse docker image tag from GitHub tag if available - if [ "${{ github.ref_type }}" = "tag" ]; then - # tags start with refs/tags/. Also remove v if it exists. - export IMAGE_TAG_VAR=${GITHUB_REF:10} - export IMAGE_TAG_VAR=${IMAGE_TAG_VAR//v/} - else - # Not a tag, use the commit hash. Do not tag as latest. - export IMAGE_TAG_VAR=${GITHUB_SHA:0:7} - fi - # To lowercase - export IMAGE_TAG_VAR=${IMAGE_TAG_VAR,,} - - # Save to output - echo "IMAGE_TAG=$IMAGE_TAG_VAR" >> "$GITHUB_OUTPUT" - echo "ROCKY_IMAGE_TAG=$IMAGE_NAME_ROCKY:$IMAGE_TAG_VAR" >> "$GITHUB_OUTPUT" - echo "WINDOWS_IMAGE_TAG=$IMAGE_NAME_WINDOWS:$IMAGE_TAG_VAR" >> "$GITHUB_OUTPUT" - echo "WINDOWS_COMPAT_IMAGE_TAG=$IMAGE_NAME_WINDOWS_COMPAT:$IMAGE_TAG_VAR" >> "$GITHUB_OUTPUT" - echo "PUBLIC_IMAGE_TAG=$PUBLIC_IMAGE_NAME:$IMAGE_TAG_VAR" >> "$GITHUB_OUTPUT" - - name: Print env - run: | - echo GITHUB_REF_NAME=${{ github.ref_name }} - echo DOCKERFILE_ROCKY=$DOCKERFILE_ROCKY - echo DOCKERFILE_WINDOWS=$DOCKERFILE_WINDOWS - echo IMAGE_NAME_ROCKY=$IMAGE_NAME_ROCKY - echo IMAGE_NAME_WINDOWS=$IMAGE_NAME_WINDOWS - echo IMAGE_NAME_WINDOWS_COMPAT=$IMAGE_NAME_WINDOWS_COMPAT - echo PUBLIC_IMAGE_NAME=$PUBLIC_IMAGE_NAME - echo PUBLIC_IMAGE_TAG_LATEST=$PUBLIC_IMAGE_TAG_LATEST - echo TAG_LATEST=$TAG_LATEST - echo IMAGE_TAG=${{ steps.setenv.outputs.IMAGE_TAG }} - echo ROCKY_IMAGE_TAG=${{ steps.setenv.outputs.ROCKY_IMAGE_TAG }} - echo WINDOWS_IMAGE_TAG=${{ steps.setenv.outputs.WINDOWS_IMAGE_TAG }} - echo WINDOWS_COMPAT_IMAGE_TAG=${{ steps.setenv.outputs.WINDOWS_COMPAT_IMAGE_TAG }} - echo PUBLIC_IMAGE_TAG=${{ steps.setenv.outputs.PUBLIC_IMAGE_TAG }} + - name: Set env + id: setenv + shell: bash + run: | + # Parse docker image tag from GitHub tag if available + if [ "${{ github.ref_type }}" = "tag" ]; then + # tags start with refs/tags/. Also remove v if it exists. + export IMAGE_TAG_VAR=${GITHUB_REF:10} + export IMAGE_TAG_VAR=${IMAGE_TAG_VAR//v/} + else + # Not a tag, use the commit hash. Do not tag as latest. + export IMAGE_TAG_VAR=${GITHUB_SHA:0:7} + fi + # To lowercase + export IMAGE_TAG_VAR=${IMAGE_TAG_VAR,,} + + # Save to output + echo "IMAGE_TAG=$IMAGE_TAG_VAR" >> "$GITHUB_OUTPUT" + echo "ROCKY_IMAGE_TAG=$IMAGE_NAME_ROCKY:$IMAGE_TAG_VAR" >> "$GITHUB_OUTPUT" + echo "WINDOWS_IMAGE_TAG=$IMAGE_NAME_WINDOWS:$IMAGE_TAG_VAR" >> "$GITHUB_OUTPUT" + echo "WINDOWS_COMPAT_IMAGE_TAG=$IMAGE_NAME_WINDOWS_COMPAT:$IMAGE_TAG_VAR" >> "$GITHUB_OUTPUT" + echo "PUBLIC_IMAGE_TAG=$PUBLIC_IMAGE_NAME:$IMAGE_TAG_VAR" >> "$GITHUB_OUTPUT" + - name: Print env + run: | + echo GITHUB_REF_NAME=${{ github.ref_name }} + echo DOCKERFILE_ROCKY=$DOCKERFILE_ROCKY + echo DOCKERFILE_WINDOWS=$DOCKERFILE_WINDOWS + echo IMAGE_NAME_ROCKY=$IMAGE_NAME_ROCKY + echo IMAGE_NAME_WINDOWS=$IMAGE_NAME_WINDOWS + echo IMAGE_NAME_WINDOWS_COMPAT=$IMAGE_NAME_WINDOWS_COMPAT + echo PUBLIC_IMAGE_NAME=$PUBLIC_IMAGE_NAME + echo PUBLIC_IMAGE_TAG_LATEST=$PUBLIC_IMAGE_TAG_LATEST + echo TAG_LATEST=$TAG_LATEST + echo IMAGE_TAG=${{ steps.setenv.outputs.IMAGE_TAG }} + echo ROCKY_IMAGE_TAG=${{ steps.setenv.outputs.ROCKY_IMAGE_TAG }} + echo WINDOWS_IMAGE_TAG=${{ steps.setenv.outputs.WINDOWS_IMAGE_TAG }} + echo WINDOWS_COMPAT_IMAGE_TAG=${{ steps.setenv.outputs.WINDOWS_COMPAT_IMAGE_TAG }} + echo PUBLIC_IMAGE_TAG=${{ steps.setenv.outputs.PUBLIC_IMAGE_TAG }} rocky-image: needs: setup @@ -72,78 +72,78 @@ jobs: env: TAG: ${{ needs.setup.outputs.ROCKY_IMAGE_TAG }} steps: - - name: Checkout main - uses: actions/checkout@v4 - - - name: Login to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build and push a release Docker image for ${{ github.repository }} - uses: docker/build-push-action@v5 - with: - context: "{{defaultContext}}:.ci/docker" - file: Dockerfile.${{env.DOCKERFILE_ROCKY}} - build-args: REF=${{ github.ref_name }} - tags: ${{env.TAG}} - push: true - + - name: Checkout main + uses: actions/checkout@v4 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v4 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push a release Docker image for ${{ github.repository }} + uses: docker/build-push-action@v5 + with: + context: "{{defaultContext}}:.ci/docker" + file: Dockerfile.${{env.DOCKERFILE_ROCKY}} + build-args: REF=${{ github.ref_name }} + tags: ${{env.TAG}} + push: true + windows-11-image: needs: setup runs-on: windows-latest env: TAG: ${{ needs.setup.outputs.WINDOWS_IMAGE_TAG }} steps: - - name: Checkout main - uses: actions/checkout@v4 - - - name: Login to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} + - name: Checkout main + uses: actions/checkout@v4 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v4 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build the docker image for ${{ github.repository }} + run: | + cd ./.ci/docker + docker build --build-arg REF=${{ github.ref_name }} -f ./Dockerfile.${{env.DOCKERFILE_WINDOWS}} -t ${{env.TAG}} . + + - name: Push the docker image + run: | + docker push ${{env.TAG}} - - name: Build the docker image for ${{ github.repository }} - run: | - cd ./.ci/docker - docker build --build-arg REF=${{ github.ref_name }} -f ./Dockerfile.${{env.DOCKERFILE_WINDOWS}} -t ${{env.TAG}} . - - - name: Push the docker image - run: | - docker push ${{env.TAG}} - windows-compat-image: # This job uses a different runner and build arg than the other windows job. needs: setup runs-on: windows-2019 env: TAG: ${{ needs.setup.outputs.WINDOWS_COMPAT_IMAGE_TAG }} steps: - - name: Checkout main - uses: actions/checkout@v4 + - name: Checkout main + uses: actions/checkout@v4 - - name: Login to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} + - name: Login to GitHub Container Registry + uses: docker/login-action@v4 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build the docker image for ${{ github.repository }} + run: | + cd ./.ci/docker + docker build --build-arg REF=${{ github.ref_name }} -f ./Dockerfile.${{env.DOCKERFILE_WINDOWS}} -t ${{env.TAG}} --build-arg BASE_IMAGE_TAG=lts-windowsservercore-1809 . + + - name: Push the docker image + run: | + docker push ${{env.TAG}} + - - name: Build the docker image for ${{ github.repository }} - run: | - cd ./.ci/docker - docker build --build-arg REF=${{ github.ref_name }} -f ./Dockerfile.${{env.DOCKERFILE_WINDOWS}} -t ${{env.TAG}} --build-arg BASE_IMAGE_TAG=lts-windowsservercore-1809 . - - - name: Push the docker image - run: | - docker push ${{env.TAG}} - - manifest: - needs: [setup, rocky-image, windows-11-image, windows-compat-image] + needs: [ setup, rocky-image, windows-11-image, windows-compat-image ] runs-on: ubuntu-latest env: IMAGE1: ${{ needs.setup.outputs.ROCKY_IMAGE_TAG }} @@ -151,34 +151,34 @@ jobs: IMAGE3: ${{ needs.setup.outputs.WINDOWS_COMPAT_IMAGE_TAG }} PUB: ${{ needs.setup.outputs.PUBLIC_IMAGE_TAG }} steps: - - name: Print env - run: | - echo IMAGE1=${{env.IMAGE1}} - echo IMAGE2=${{env.IMAGE2}} - echo IMAGE3=${{env.IMAGE3}} - echo PUB=${{env.PUB}} - - - name: Checkout main - uses: actions/checkout@v4 - - - name: Login to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Create a new manifest - run: | - docker manifest create ${{env.PUB}} --amend ${{env.IMAGE1}} --amend ${{env.IMAGE2}} --amend ${{env.IMAGE3}} - - - name: Push the new manifest - run: | - docker manifest push ${{env.PUB}} - - - name: Create and push manifest latest if selected - if: env.TAG_LATEST != 'false' - run: | - docker manifest create $PUBLIC_IMAGE_TAG_LATEST --amend $IMAGE1 --amend $IMAGE2 --amend $IMAGE3 - docker manifest push $PUBLIC_IMAGE_TAG_LATEST + - name: Print env + run: | + echo IMAGE1=${{env.IMAGE1}} + echo IMAGE2=${{env.IMAGE2}} + echo IMAGE3=${{env.IMAGE3}} + echo PUB=${{env.PUB}} + + - name: Checkout main + uses: actions/checkout@v4 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v4 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Create a new manifest + run: | + docker manifest create ${{env.PUB}} --amend ${{env.IMAGE1}} --amend ${{env.IMAGE2}} --amend ${{env.IMAGE3}} + + - name: Push the new manifest + run: | + docker manifest push ${{env.PUB}} + + - name: Create and push manifest latest if selected + if: env.TAG_LATEST != 'false' + run: | + docker manifest create $PUBLIC_IMAGE_TAG_LATEST --amend $IMAGE1 --amend $IMAGE2 --amend $IMAGE3 + docker manifest push $PUBLIC_IMAGE_TAG_LATEST diff --git a/.github/workflows/dotnet_provisioner_unit_tests.yml b/.github/workflows/dotnet_provisioner_unit_tests.yml index 436bca1e..5a561bd6 100644 --- a/.github/workflows/dotnet_provisioner_unit_tests.yml +++ b/.github/workflows/dotnet_provisioner_unit_tests.yml @@ -2,7 +2,7 @@ name: Dotnet Provisioner Unit Tests on: push env: - DOTNET_VERSION: '6.0' + DOTNET_VERSION: '8S.0' jobs: dotnet_provisioner_unit_tests: name: Restore and Run Unit Tests @@ -97,7 +97,7 @@ jobs: Evaluator: name: Evaluate Tests - needs: [dotnet_provisioner_unit_tests] + needs: [ dotnet_provisioner_unit_tests ] runs-on: ubuntu-latest continue-on-error: false steps: @@ -110,7 +110,7 @@ jobs: run: | mkdir artifacts - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: path: artifacts diff --git a/.github/workflows/hirs_package_linux.yml b/.github/workflows/hirs_package_linux.yml index b8f04b06..fe76880d 100644 --- a/.github/workflows/hirs_package_linux.yml +++ b/.github/workflows/hirs_package_linux.yml @@ -8,34 +8,34 @@ on: jobs: # run the package script for HIRS ACA, Provisioners, tcg_rim_tool, and tcg_eventlog_tool - Package_linux: + Package_linux: runs-on: ubuntu-latest permissions: contents: read packages: write steps: - - uses: actions/checkout@v4 - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - java-version: '17' - distribution: 'temurin' - server-id: github # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file - - name: directory setup - run: | - mkdir -p artifacts/jars - mkdir -p artifacts/win - mkdir -p artifacts/win/hirstools - - name: install dependencies - run: | - sudo apt-get update - sudo apt-get install git curl nano cron mariadb-server - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v3 - - name: Execute Gradle build - run: | + - uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + server-id: github # Value of the distributionManagement/repository/id field of the pom.xml + settings-path: ${{ github.workspace }} # location for the settings.xml file + - name: directory setup + run: | + mkdir -p artifacts/jars + mkdir -p artifacts/win + mkdir -p artifacts/win/hirstools + - name: install dependencies + run: | + sudo apt-get update + sudo apt-get install git curl nano cron mariadb-server + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + - name: Execute Gradle build + run: | ./gradlew build; ./gradlew bootWar; ./gradlew buildDeb; @@ -48,35 +48,35 @@ jobs: cp tools/tcg_rim_tool/build/distributions/*.zip artifacts/win cp tools/tcg_eventlog_tool/build/distributions/*.zip artifacts/win cp package/win/tcg-rim-tool/* artifacts/win/hirstools - - name: Archive RPM files - uses: actions/upload-artifact@v4 - with: - name: RPM_Files - path: HIRS_AttestationCAPortal/build/distributions/*.rpm - if-no-files-found: error - - name: Archive DEB files - uses: actions/upload-artifact@v4 - with: - name: DEB_Files - path: HIRS_AttestationCAPortal/build/distributions/*.deb - if-no-files-found: error - - name: War files - uses: actions/upload-artifact@v4 - with: - name: WAR_Files - path: HIRS_AttestationCAPortal/build/libs/HIRS_AttestationCAPortal.war - if-no-files-found: error - - name: JAR_Files - uses: actions/upload-artifact@v4 - with: - name: JAR_Files - path: artifacts/jars/ - if-no-files-found: error - - name: ZIP_Files - uses: actions/upload-artifact@v4 - with: - name: ZIP_Files - path: artifacts/win/ - if-no-files-found: error + - name: Archive RPM files + uses: actions/upload-artifact@v4 + with: + name: RPM_Files + path: HIRS_AttestationCAPortal/build/distributions/*.rpm + if-no-files-found: error + - name: Archive DEB files + uses: actions/upload-artifact@v4 + with: + name: DEB_Files + path: HIRS_AttestationCAPortal/build/distributions/*.deb + if-no-files-found: error + - name: War files + uses: actions/upload-artifact@v4 + with: + name: WAR_Files + path: HIRS_AttestationCAPortal/build/libs/HIRS_AttestationCAPortal.war + if-no-files-found: error + - name: JAR_Files + uses: actions/upload-artifact@v4 + with: + name: JAR_Files + path: artifacts/jars/ + if-no-files-found: error + - name: ZIP_Files + uses: actions/upload-artifact@v4 + with: + name: ZIP_Files + path: artifacts/win/ + if-no-files-found: error diff --git a/.github/workflows/hirs_unit_tests.yml b/.github/workflows/hirs_unit_tests.yml index fc12f3b4..00e9bc47 100644 --- a/.github/workflows/hirs_unit_tests.yml +++ b/.github/workflows/hirs_unit_tests.yml @@ -17,82 +17,82 @@ jobs: ACA_Provisioner_Unit_Tests: runs-on: ubuntu-latest # Configures the job to run on the latest version of an Ubuntu Linux runner steps: - - uses: actions/checkout@v3 # run v3 of actions/checkout action, which checks out your repository onto the runner - # Build will archive build reports and will create a failedFile if build is not successful - - name: Directory setup - run: | - mkdir -p artifacts/githubActionsResults - mkdir -p artifacts/upload_reports/HIRS_AttestationCA - mkdir -p artifacts/upload_reports/HIRS_AttestationCAPortal - mkdir -p artifacts/upload_reports/HIRS_Provisioner - mkdir -p artifacts/upload_reports/HIRS_ProvisionerTPM2 - mkdir -p artifacts/upload_reports/HIRS_Structs - mkdir -p artifacts/upload_reports/HIRS_Utils - mkdir -p artifacts/upload_reports/tcg_rim_tool - mkdir -p artifacts/upload_reports/tcg_eventlog_tool - # Run the provisioner and ACA unit tests via gradle build in a Rocky Docker container - - name: Build HIRS and run unit tests - run: | - - # log into and run docker (note: must set up secrets in github for ghcr username and access_token) - echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u $ --password-stdin - - # docker run options: - # create a mount between curr directory on the runner and the HIRS folder created by the cloning of HIRS repo - # -v $(pwd):/HIRS - # image used for the container, given by <repository>:<tag_name> - # rocky8: ghcr.io/nsacyber/hirs/hirs-rocky8-ci:latest [repo: https://github.com/orgs/nsacyber/packages] - # bash commands to clean/build/test each subproject - # /bin/bash -c '<commands>' - docker run --rm \ - -v $(pwd):/HIRS \ - ghcr.io/nsacyber/hirs/hirs-rocky8-ci:latest /bin/bash -c \ - 'pushd /HIRS - gradle_status=0 - - # git added a feature that gives error if user is not owner of the top-level directory; need to override this - git config --global --add safe.directory /HIRS - - # clean, build and run unit tests on all sub-projects; copy build reports to an artifacts directory - ./gradlew :HIRS_AttestationCA:clean :HIRS_AttestationCA:build :HIRS_AttestationCA:test - if (( $? != "0" )) ; then gradle_status=1; fi - cp -r /HIRS/HIRS_AttestationCA/build/reports/ /HIRS/artifacts/upload_reports/HIRS_AttestationCA/. - ./gradlew :HIRS_AttestationCAPortal:clean :HIRS_AttestationCAPortal:build :HIRS_AttestationCAPortal:test - if (( $? != "0" )) ; then gradle_status=1; fi - cp -r /HIRS/HIRS_AttestationCAPortal/build/reports/ /HIRS/artifacts/upload_reports/HIRS_AttestationCAPortal/. - #./gradlew :HIRS_Provisioner:clean :HIRS_Provisioner:build :HIRS_Provisioner:test - #if (( $? != "0" )) ; then gradle_status=1; fi - #cp -r /HIRS/HIRS_Provisioner/build/reports/ /HIRS/artifacts/upload_reports/HIRS_Provisioner/. - #./gradlew :HIRS_ProvisionerTPM2:clean :HIRS_ProvisionerTPM2:build :HIRS_ProvisionerTPM2:test - #if (( $? != "0" )) ; then gradle_status=1; fi - #cp -r /HIRS/HIRS_ProvisionerTPM2/docs/ /HIRS/artifacts/upload_reports/HIRS_ProvisionerTPM2/. - ./gradlew :HIRS_Structs:clean :HIRS_Structs:build :HIRS_Structs:test - if (( $? != "0" )) ; then gradle_status=1; fi - cp -r /HIRS/HIRS_Structs/build/reports/ /HIRS/artifacts/upload_reports/HIRS_Structs/. - ./gradlew :HIRS_Utils:clean :HIRS_Utils:build :HIRS_Utils:test - if (( $? != "0" )) ; then gradle_status=1; fi - cp -r /HIRS/HIRS_Utils/build/reports/ /HIRS/artifacts/upload_reports/HIRS_Utils/. - #./gradlew :TPM_Utils:clean :TPM_Utils:build :TPM_Utils:test - #if (( $? != "0" )) ; then gradle_status=1; fi - - # Create "fail file" to fail the Build ACA tests if gradle exited with anything other than 0 - if (( $gradle_status == "0" )) ; then - echo "In docker: Build Passed" - else - echo "In docker: Build Failed" - touch /HIRS/artifacts/githubActionsResults/buildFailed.txt - fi; popd;' - # Upload build report files - - name: Archive report files - uses: actions/upload-artifact@v3 - with: - name: HIRS_Build_Reports - path: artifacts/upload_reports/* - if-no-files-found: ignore - # If buildFailed file exists, use that to fail the ACA unit tests - - name: Check if build/test passed or failed - if: ${{ hashFiles('artifacts/githubActionsResults/buildFailed.txt') != '' }} - uses: actions/github-script@v6 - with: - script: | - core.setFailed('Build or Unit Test Failed') \ No newline at end of file + - uses: actions/checkout@v4 # run v4 of actions/checkout action, which checks out your repository onto the runner + # Build will archive build reports and will create a failedFile if build is not successful + - name: Directory setup + run: | + mkdir -p artifacts/githubActionsResults + mkdir -p artifacts/upload_reports/HIRS_AttestationCA + mkdir -p artifacts/upload_reports/HIRS_AttestationCAPortal + mkdir -p artifacts/upload_reports/HIRS_Provisioner + mkdir -p artifacts/upload_reports/HIRS_ProvisionerTPM2 + mkdir -p artifacts/upload_reports/HIRS_Structs + mkdir -p artifacts/upload_reports/HIRS_Utils + mkdir -p artifacts/upload_reports/tcg_rim_tool + mkdir -p artifacts/upload_reports/tcg_eventlog_tool + # Run the provisioner and ACA unit tests via gradle build in a Rocky Docker container + - name: Build HIRS and run unit tests + run: | + + # log into and run docker (note: must set up secrets in github for ghcr username and access_token) + echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u $ --password-stdin + + # docker run options: + # create a mount between curr directory on the runner and the HIRS folder created by the cloning of HIRS repo + # -v $(pwd):/HIRS + # image used for the container, given by <repository>:<tag_name> + # rocky8: ghcr.io/nsacyber/hirs/hirs-rocky8-ci:latest [repo: https://github.com/orgs/nsacyber/packages] + # bash commands to clean/build/test each subproject + # /bin/bash -c '<commands>' + docker run --rm \ + -v $(pwd):/HIRS \ + ghcr.io/nsacyber/hirs/hirs-rocky8-ci:latest /bin/bash -c \ + 'pushd /HIRS + gradle_status=0 + + # git added a feature that gives error if user is not owner of the top-level directory; need to override this + git config --global --add safe.directory /HIRS + + # clean, build and run unit tests on all sub-projects; copy build reports to an artifacts directory + ./gradlew :HIRS_AttestationCA:clean :HIRS_AttestationCA:build :HIRS_AttestationCA:test + if (( $? != "0" )) ; then gradle_status=1; fi + cp -r /HIRS/HIRS_AttestationCA/build/reports/ /HIRS/artifacts/upload_reports/HIRS_AttestationCA/. + ./gradlew :HIRS_AttestationCAPortal:clean :HIRS_AttestationCAPortal:build :HIRS_AttestationCAPortal:test + if (( $? != "0" )) ; then gradle_status=1; fi + cp -r /HIRS/HIRS_AttestationCAPortal/build/reports/ /HIRS/artifacts/upload_reports/HIRS_AttestationCAPortal/. + #./gradlew :HIRS_Provisioner:clean :HIRS_Provisioner:build :HIRS_Provisioner:test + #if (( $? != "0" )) ; then gradle_status=1; fi + #cp -r /HIRS/HIRS_Provisioner/build/reports/ /HIRS/artifacts/upload_reports/HIRS_Provisioner/. + #./gradlew :HIRS_ProvisionerTPM2:clean :HIRS_ProvisionerTPM2:build :HIRS_ProvisionerTPM2:test + #if (( $? != "0" )) ; then gradle_status=1; fi + #cp -r /HIRS/HIRS_ProvisionerTPM2/docs/ /HIRS/artifacts/upload_reports/HIRS_ProvisionerTPM2/. + ./gradlew :HIRS_Structs:clean :HIRS_Structs:build :HIRS_Structs:test + if (( $? != "0" )) ; then gradle_status=1; fi + cp -r /HIRS/HIRS_Structs/build/reports/ /HIRS/artifacts/upload_reports/HIRS_Structs/. + ./gradlew :HIRS_Utils:clean :HIRS_Utils:build :HIRS_Utils:test + if (( $? != "0" )) ; then gradle_status=1; fi + cp -r /HIRS/HIRS_Utils/build/reports/ /HIRS/artifacts/upload_reports/HIRS_Utils/. + #./gradlew :TPM_Utils:clean :TPM_Utils:build :TPM_Utils:test + #if (( $? != "0" )) ; then gradle_status=1; fi + + # Create "fail file" to fail the Build ACA tests if gradle exited with anything other than 0 + if (( $gradle_status == "0" )) ; then + echo "In docker: Build Passed" + else + echo "In docker: Build Failed" + touch /HIRS/artifacts/githubActionsResults/buildFailed.txt + fi; popd;' + # Upload build report files + - name: Archive report files + uses: actions/upload-artifact@v4 + with: + name: HIRS_Build_Reports + path: artifacts/upload_reports/* + if-no-files-found: ignore + # If buildFailed file exists, use that to fail the ACA unit tests + - name: Check if build/test passed or failed + if: ${{ hashFiles('artifacts/githubActionsResults/buildFailed.txt') != '' }} + uses: actions/github-script@v6 + with: + script: | + core.setFailed('Build or Unit Test Failed') \ No newline at end of file diff --git a/.github/workflows/rim_tests.yml b/.github/workflows/rim_tests.yml index 11799391..b0fc9b7b 100644 --- a/.github/workflows/rim_tests.yml +++ b/.github/workflows/rim_tests.yml @@ -28,7 +28,7 @@ jobs: sudo apt-get update sudo apt-get install git curl nano cron mariadb-server - name: Setup Gradle - uses: gradle/actions/setup-gradle@v3 + uses: gradle/actions/setup-gradle@v4 - name: Execute Gradle build run: | ./gradlew build; @@ -37,7 +37,7 @@ jobs: run: | sudo dpkg -i tools/tcg_rim_tool/build/distributions/tcg-rim-tool*.deb - name: RIM tests - run: | + run: | ./.ci/tcg-rim-tool/scripts/run_all_tests.sh --verbose diff --git a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/DevicePageController.java b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/DevicePageController.java index 56dd1982..ec99f9bc 100644 --- a/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/DevicePageController.java +++ b/HIRS_AttestationCAPortal/src/main/java/hirs/attestationca/portal/page/controllers/DevicePageController.java @@ -237,8 +237,8 @@ public class DevicePageController extends PageController<NoPageParams> { List<UUID> deviceIds = new ArrayList<>(); // loop all the devices - for (int i = 0; i < deviceList.size(); i++) { - deviceIds.add(deviceList.get(i).getId()); + for (Device device : deviceList) { + deviceIds.add(device.getId()); } return deviceIds; diff --git a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/certificate-details.jsp b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/certificate-details.jsp index 6550ebab..1cd0a508 100644 --- a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/certificate-details.jsp +++ b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/certificate-details.jsp @@ -959,15 +959,15 @@ </div> <script> $(document).ready(function () { - var type = "${param.type}"; - var signature = ${initialData.signature}; - var serialNumber = '${initialData.serialNumber}'; - var authorityKeyIdentifier = '${initialData.authKeyId}'; - var authoritySerialNumber = '${initialData.authSerialNumber}'; + let type = "${param.type}"; + let signature = ${initialData.signature}; + let serialNumber = '${initialData.serialNumber}'; + let authorityKeyIdentifier = '${initialData.authKeyId}'; + let authoritySerialNumber = '${initialData.authSerialNumber}'; //Format validity time $("#validity span").each(function () { - var dateText = $(this).text(); + let dateText = $(this).text(); return $(this).text(formatCertificateDate(dateText)); }); @@ -993,13 +993,13 @@ </c:if> <c:choose> <c:when test="${not empty initialData.publicKeyValue}"> - var publicKey = '${initialData.publicKeyValue}'; + let publicKey = '${initialData.publicKeyValue}'; $("#encodedPublicKey").html(parseHexString(publicKey)); </c:when> <c:otherwise> <c:if test="${not empty initialData.encodedPublicKey}"> //Change public key byte to hex - var encPublicKey = ${initialData.encodedPublicKey}; + let encPublicKey = ${initialData.encodedPublicKey}; $("#encodedPublicKey").html(byteToHexString(encPublicKey)); </c:if> </c:otherwise> @@ -1008,19 +1008,19 @@ <c:if test="${not empty initialData.subjectKeyIdentifier}"> //Change subject byte to hex only for CACertificate if (type === "certificateauthority") { - var subjectKeyIdentifier = ${initialData.subjectKeyIdentifier}; + let subjectKeyIdentifier = ${initialData.subjectKeyIdentifier}; $("#subjectKeyIdentifier").html(byteToHexString(subjectKeyIdentifier)); } </c:if> <c:if test="${not empty initialData.hwSerialNumHex}"> - var hwSerialNum = '${initialData.hwSerialNum}'; + let hwSerialNum = '${initialData.hwSerialNum}'; $("#hwSerialNum").html(parseHexString(hwSerialNum)); </c:if> <c:if test="${not empty initialData.tcgTpmManufacturer}"> - var ekAKI = '${initialData.ekAuthorityKeyIdentifier};' - var ekCSN = '${initialData.ekCertificateSerialNumber};' + let ekAKI = '${initialData.ekAuthorityKeyIdentifier};' + let ekCSN = '${initialData.ekCertificateSerialNumber};' $("#ekAuthorityKeyIdentifier").html(parseHexString(ekAKI)); $("#ekCertificateSerialNumber").html(parseHexString(ekCSN)); @@ -1038,9 +1038,9 @@ //Change link width $("#headingOne, #headingTwo, #headingThree").each(function (e) { - var width = $(this).width(); + let width = $(this).width(); //Get link width - var linkWidth = $(this).find('a').width(); + let linkWidth = $(this).find('a').width(); //Change width for the link $(this).find('a').css({ diff --git a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/devices.jsp b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/devices.jsp index fd53b6ff..4b83d9a0 100644 --- a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/devices.jsp +++ b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/devices.jsp @@ -43,13 +43,13 @@ </div> <script> $(document).ready(function() { - var url = portal + '/devices/list'; - var columns = [ + let url = portal + '/devices/list'; + let columns = [ { data: 'supplyChainValidationStatus', searchable:false, render: function(data, type, full, meta) { - var html = ''; + let html = ''; switch(full.device.supplyChainValidationStatus){ case "PASS": html= '<img src="${passIcon}" title="${passText}">'; @@ -80,11 +80,11 @@ render: function (data, type, full, meta) { //Display issued attestation certificate if(full.IssuedAttestationCertificate === undefined) return ''; - var size = full.IssuedAttestationCertificate.length; - var html = ''; + let size = full.IssuedAttestationCertificate.length; + let html = ''; - for(var i = 0; i < size; i++) { - var id = full.IssuedAttestationCertificate[i].id; + for(let i = 0; i < size; i++) { + let id = full.IssuedAttestationCertificate[i].id; html += certificateDetailsLink('issued', id, false); } @@ -98,11 +98,11 @@ render: function (data, type, full, meta) { //Display platform credential if(full.PlatformCredential === undefined) return ''; - var size = full.PlatformCredential.length; - var html = ''; + let size = full.PlatformCredential.length; + let html = ''; - for(var i = 0; i < size; i++) { - var id = full.PlatformCredential[i].id; + for(let i = 0; i < size; i++) { + let id = full.PlatformCredential[i].id; html += certificateDetailsLink('platform', id, false) + ' '; } @@ -116,11 +116,11 @@ render: function (data, type, full, meta) { //Display endorsement credential if(full.EndorsementCredential === undefined) return ''; - var size = full.EndorsementCredential.length; - var html = ''; + let size = full.EndorsementCredential.length; + let html = ''; - for(var i = 0; i < size; i++) { - var id = full.EndorsementCredential[i].id; + for(let i = 0; i < size; i++) { + let id = full.EndorsementCredential[i].id; html += certificateDetailsLink('endorsement', id, false) +' '; } diff --git a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/endorsement-key-credentials.jsp b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/endorsement-key-credentials.jsp index 0d0e89c9..427aab41 100644 --- a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/endorsement-key-credentials.jsp +++ b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/endorsement-key-credentials.jsp @@ -46,8 +46,8 @@ </div> <script> $(document).ready(function() { - var url = pagePath +'/list'; - var columns = [ + let url = pagePath +'/list'; + let columns = [ { data: 'deviceName', render: function (data, type, full, meta) { @@ -82,7 +82,7 @@ // Set up a delete icon with link to handleDeleteRequest(). // sets up a hidden input field containing the ID which is // used as a parameter to the REST POST call to delete - var html = ''; + let html = ''; html += certificateDetailsLink('endorsement', full.id, true); html += certificateDownloadLink(full.id, pagePath); html += certificateDeleteLink(full.id, pagePath); diff --git a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/idevid-certificates.jsp b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/idevid-certificates.jsp index 143830a6..e33c06a3 100644 --- a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/idevid-certificates.jsp +++ b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/idevid-certificates.jsp @@ -42,8 +42,8 @@ </div> <script> $(document).ready(function() { - var url = pagePath +'/list'; - var columns = [ + let url = pagePath +'/list'; + let columns = [ {data: 'issuer'}, {data: 'subject'}, { @@ -68,7 +68,7 @@ // Set up a delete icon with link to handleDeleteRequest(). // sets up a hidden input field containing the ID which is // used as a parameter to the REST POST call to delete - var html = ''; + let html = ''; html += certificateDetailsLink('idevid', full.id, true); html += certificateDownloadLink(full.id, pagePath); html += certificateDeleteLink(full.id, pagePath); diff --git a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/issued-certificates.jsp b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/issued-certificates.jsp index 32890436..f0c8642b 100644 --- a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/issued-certificates.jsp +++ b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/issued-certificates.jsp @@ -42,8 +42,8 @@ </div> <script> $(document).ready(function() { - var url = pagePath + '/list'; - var columns = [ + let url = pagePath + '/list'; + let columns = [ { data: 'deviceName', render: function (data, type, full, meta) { @@ -83,10 +83,10 @@ searchable:false, render: function (data, type, full, meta) { //Display endorsement credential - var html = ''; + let html = ''; if (full.endorsementCredential !== undefined && full.endorsementCredential !== null){ - var id = full.endorsementCredential.id; + let id = full.endorsementCredential.id; html += certificateDetailsLink('endorsement', id, false) +' '; } return html; @@ -98,13 +98,13 @@ searchable:false, render: function (data, type, full, meta) { //Display platform credential - var html = ''; + let html = ''; if (full.platformCredentials !== undefined && full.platformCredentials !== null) { - var size = full.platformCredentials.length; + let size = full.platformCredentials.length; - for(var i = 0; i < size; i++) { - var id = full.platformCredentials[i].id; + for(let i = 0; i < size; i++) { + let id = full.platformCredentials[i].id; html += certificateDetailsLink('platform', id, false) +' '; } } @@ -118,7 +118,7 @@ searchable:false, render: function(data, type, full, meta) { // set up link to details page - var html = ''; + let html = ''; html += certificateDetailsLink('issued', full.id, true); html += certificateDownloadLink(full.id, pagePath); html += certificateDeleteLink(full.id, pagePath); diff --git a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/platform-credentials.jsp b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/platform-credentials.jsp index 16d93e31..b8846c6b 100644 --- a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/platform-credentials.jsp +++ b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/platform-credentials.jsp @@ -51,8 +51,8 @@ <script> $(document).ready(function() { - var url = pagePath +'/list'; - var columns = [ + let url = pagePath +'/list'; + let columns = [ { data: 'deviceName', render: function (data, type, full, meta) { @@ -96,9 +96,9 @@ render: function (data, type, full, meta) { //Display endorsement credential if(full.endorsementCredential === null) return ''; - var html = ''; + let html = ''; - var id = full.endorsementCredential.id; + let id = full.endorsementCredential.id; html = certificateDetailsLink('endorsement', id, false) +' '; return html; @@ -112,7 +112,7 @@ // Set up a delete icon with link to handleDeleteRequest(). // sets up a hidden input field containing the ID which is // used as a parameter to the REST POST call to delete - var html = ''; + let html = ''; html += certificateDetailsLink('platform', full.id, true); html += certificateDownloadLink(full.id, pagePath); html += certificateDeleteLink(full.id, pagePath); diff --git a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/reference-manifests.jsp b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/reference-manifests.jsp index 0bc1d0fb..a2417aaa 100644 --- a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/reference-manifests.jsp +++ b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/reference-manifests.jsp @@ -45,8 +45,8 @@ <script> $(document).ready(function() { - var url = pagePath +'/list'; - var columns = [ + let url = pagePath +'/list'; + let columns = [ {data: 'tagId'}, {data: 'rimType'}, {data: 'platformManufacturer'}, @@ -60,7 +60,7 @@ // Set up a delete icon with link to handleDeleteRequest(). // sets up a hidden input field containing the ID which is // used as a parameter to the REST POST call to delete - var html = ''; + let html = ''; html += rimDetailsLink(full.id); html += rimDownloadLink(full.id, pagePath); html += rimDeleteLink(full.id, pagePath); diff --git a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/rim-database.jsp b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/rim-database.jsp index 36e3a10f..df719e15 100644 --- a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/rim-database.jsp +++ b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/rim-database.jsp @@ -34,8 +34,8 @@ <script> $(document).ready(function() { - var url = pagePath +'/list'; - var columns = [ + let url = pagePath +'/list'; + let columns = [ {data: 'manufacturer', orderable: true, searchable:false}, diff --git a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/rim-details.jsp b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/rim-details.jsp index cb4e09bd..0e53c1a9 100644 --- a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/rim-details.jsp +++ b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/rim-details.jsp @@ -597,7 +597,7 @@ <script> function eventSearch(txtInput) { // Declare variables - var input, filter, table, tr, td, i, txtValue, txtFound; + let input, filter, table, tr, td, i, txtValue, txtFound; if (txtInput === null) { input = document.getElementById("eventInput"); @@ -635,14 +635,14 @@ } window.onload = function () { // Constant retrieved from server-side via JSP - var maxRows = 11; + let maxRows = 11; - var table = document.getElementById('eventLog'); - var wrapper = table.parentNode; - var rowsInTable = table.rows.length; - var height = 0; + let table = document.getElementById('eventLog'); + let wrapper = table.parentNode; + let rowsInTable = table.rows.length; + let height = 0; if (rowsInTable > maxRows) { - for (var i = 0; i < maxRows; i++) { + for (let i = 0; i < maxRows; i++) { height += table.rows[i].clientHeight; } wrapper.style.height = height + "px"; diff --git a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/trust-chain.jsp b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/trust-chain.jsp index 06a202e8..4ee0c348 100644 --- a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/trust-chain.jsp +++ b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/trust-chain.jsp @@ -96,8 +96,8 @@ </div> <script> $(document).ready(function() { - var url = pagePath +'/list'; - var signature = ${acaCertData.signature}; + let url = pagePath +'/list'; + let signature = ${acaCertData.signature}; //Format validity time $("#validity span").each(function(){ @@ -109,11 +109,11 @@ <c:if test="${not empty acaCertData.encodedPublicKey}"> //Change publick key byte to hex - var publicKey = ${acaCertData.encodedPublicKey}; + let publicKey = ${acaCertData.encodedPublicKey}; $("#encodedPublicKey").html(byteToHexString(publicKey)); </c:if> - var columns = [ + let columns = [ {data: 'issuer'}, {data: 'subject'}, { @@ -138,7 +138,7 @@ // Set up a delete icon with link to handleDeleteRequest(). // sets up a hidden input field containing the ID which is // used as a parameter to the REST POST call to delete - var html = ''; + let html = ''; html += certificateDetailsLink('certificateauthority', full.id, true); html += certificateDownloadLink(full.id, pagePath); html += certificateDeleteLink(full.id, pagePath); diff --git a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/validation-reports.jsp b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/validation-reports.jsp index c3c82b68..42830f28 100644 --- a/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/validation-reports.jsp +++ b/HIRS_AttestationCAPortal/src/main/webapp/WEB-INF/jsp/validation-reports.jsp @@ -57,18 +57,18 @@ </div> <script> $(document).ready(function () { - var url = portal + '/validation-reports/list'; - var columns = [ + let url = portal + '/validation-reports/list'; + let columns = [ { data: 'overallValidationResult', searchable: false, render: function (data, type, full, meta) { - var html = ''; - var unknownStatus = '<img class="icon" src="${unknownIcon}" title="${unknownText}"/>'; + let html = ''; + let unknownStatus = '<img class="icon" src="${unknownIcon}" title="${unknownText}"/>'; // create status icon - var result = full.overallValidationResult; - var overallMessage = full.message; + let result = full.overallValidationResult; + let overallMessage = full.message; if (result) { switch (result) { case "PASS": @@ -135,21 +135,21 @@ ]; //Set data tables - var dataTable = setDataTables("#reportTable", url, columns); + let dataTable = setDataTables("#reportTable", url, columns); dataTable.order([1, 'desc']).draw(); //order by createTime }); $("#download").submit(function(e) { - var tableLength = $("#reportTable").rows; - var createTimes = ""; - var deviceNames = ""; + let tableLength = $("#reportTable").rows; + let createTimes = ""; + let deviceNames = ""; $('#reportTable tr').not('thead tr').each(function() { createTimes += $(this).find("td").eq(1).html() + ","; deviceNames += $(this).find("td").eq(2).html() + ","; }); createTimes = createTimes.substring(0, createTimes.length - 1); deviceNames = deviceNames.substring(0, deviceNames.length - 1); - var params = [ + let params = [ { name: 'createTimes', value: createTimes @@ -178,16 +178,16 @@ * string is returned (and no icon will be displayed). */ function getValidationDisplayHtml(full, validation_type) { - var html = ''; + let html = ''; // loop through all the validations, looking for the one matching // the validation_type. - for (var i = 0; i < full.validations.length; i++) { - var curValidation = full.validations[i]; - var curResult = curValidation.validationResult; - var curMessage = curValidation.message; + for (let i = 0; i < full.validations.length; i++) { + let curValidation = full.validations[i]; + let curResult = curValidation.validationResult; + let curMessage = curValidation.message; if (curValidation.validationType === validation_type) { - var unknownStatus = '<img class="icon" src="${unknownIcon}" title="${unknownText}"/>'; + let unknownStatus = '<img class="icon" src="${unknownIcon}" title="${unknownText}"/>'; // display appropriate icon based on result if (curResult) { @@ -195,7 +195,7 @@ // if this validation is associated with a certificate, // link to the details page if (curValidation.certificatesUsed.length > 0) { - var certType = ''; + let certType = ''; switch (validation_type) { case "PLATFORM_CREDENTIAL": case "PLATFORM_CREDENTIAL_ATTRIBUTES": diff --git a/package/linux/systemd/hirs-aca.service b/package/linux/systemd/hirs-aca.service index 023e89f8..111fed3d 100644 --- a/package/linux/systemd/hirs-aca.service +++ b/package/linux/systemd/hirs-aca.service @@ -5,7 +5,7 @@ After=network.target [Service] User=root Group=root -ExecStart=/usr/bin/bash /opt/hirs/aca/scripts/aca/aca_bootRun.sh -w +ExecStart=/usr/bin/bash /opt/hirs/aca/scripts/aca/aca_bootRun.sh -d -w SuccessExitStatus=0 Restart=always RestartSec=60