{"id":3136,"date":"2020-04-09T17:09:31","date_gmt":"2020-04-09T08:09:31","guid":{"rendered":"\/blog\/?p=3136"},"modified":"2023-09-21T09:26:42","modified_gmt":"2023-09-21T00:26:42","slug":"fortify-fpr-%ed%8c%8c%ec%9d%bc%ec%97%90%ec%84%9c-%ec%8a%a4%ec%ba%94-%ec%8b%9c%ea%b0%84-%ec%b6%94%ec%b6%9c-%ec%8a%a4%ed%81%ac%eb%a6%bd%ed%8a%b8","status":"publish","type":"post","link":"https:\/\/hasu0707.duckdns.org\/blog\/?p=3136","title":{"rendered":"[Fortify] FPR \ud30c\uc77c\uc5d0\uc11c \uc2a4\uce94 \uc2dc\uac04 \ucd94\ucd9c \uc2a4\ud06c\ub9bd\ud2b8"},"content":{"rendered":"\n<div class=\"wp-block-file\"><a href=\"\/blog\/wp-content\/uploads\/2020\/04\/get_fpr_scantime.sh\">get_fpr_scantime<\/a><a href=\"\/blog\/wp-content\/uploads\/2020\/04\/get_fpr_scantime.sh\" class=\"wp-block-file__button\" download>\ub2e4\uc6b4\ub85c\ub4dc<\/a><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#!\/bin\/bash\n#####################################################################\n#\n# Fortify SCA Scan \uc2dc\uac04 \ucd94\ucd9c \uc2a4\ud06c\ub9bd\ud2b8\n#\n# \uc774 \uc2a4\ud06c\ub9bd\ud2b8\ub294 FPR\ud30c\uc77c\uc744 \ubd84\uc11d\ud558\uc5ec \uc544\ub798\uc758 \ud30c\uc77c\uc744 \ucd9c\ub825\ud55c\ub2e4.\n# - CSV\ud3ec\ub9f7\uc758 \uc2a4\uce94 \uc2dc\uac04 \uc815\ub9ac\n# - \uc2a4\ucf00\uc904\ub9c1\uc744 \ucd94\uac00\ud558\ub294 \uc708\ub3c4\uc6b0 \ubc30\uce58\ud30c\uc77c \uc791\uc131\n#\n# \uc708\ub3c4\uc6b0\uc5d0\uc11c \uc2e4\ud589 \uc2dc:\n# bash -c \".\/get_fpr_scantime.sh .\/fpr\/*.fpr\"\n#\n# by \uc774\uc874\uc11d(hasu0707@esvali.com)\n#\n#####################################################################\nDEBUG_ON=0\nVERSION=0.1\nWIN_MINGW_DIR=\"\/cygdrive\/c\/PortableApps\/cmd_cygwin_x86_64\"\nCSV_FILENAME=\"fpr_scantime_list.csv\"\nBAT_FILENAME=\"set_schedule.bat\"\nSCA_SCRIPT_DIR=\"D:\\fortify_work\\scripts\"\nSCHTASKS_FOLDER_NAME=\"Fortify_SCA\"\nSTART_TIME=32400  # 3600*9 (09:00\ubd80\ud130 \uc2dc\uc791\uc2dc\uac04\uae4c\uc9c0 \ucd08) = 18:00\nEND_SEC=46800     # 3600*13 (09:00\ubd80\ud130 \ub05d\uc2dc\uac04\uae4c\uc9c0 \ucd08) = 07:00\nTMP_DIR1=\".\/fpr_tmp\"\nTMP_FILE1=\"tmp_file001.txt\"\nTMP_FILE2=\"tmp_file002.txt\"\n\n#####################################################################\n#\n# \uc0ac\uc6a9\ubc29\ubc95 \ucd9c\ub825\n#\n#####################################################################\nfunc_usage() {\n  echo \"$0 ver.${VERSION}\"\n  echo\n  echo \"usage: $0 &lt;wildcard>\"\n  echo \"  example: $0 .\/fpr\/*.fpr\"\n}\n\n#####################################################################\n#\n# \ucd08\uae30\ud654\n# $1 : FPR \ud30c\uc77c\uba85\n#\n#####################################################################\nfunc_init() {\n  if [ ${DEBUG_ON} -eq 1 ]\n  then\n    echo \">> func_init()\"\n  fi\n\n  if [ -z \"${WINDIR}\" ]; then\n    IS_WINDOWS=0\n  else\n    IS_WINDOWS=1\n  fi\n\n  if [ ${IS_WINDOWS} -eq 1 ]; then\n    DEVNULL=null.dev\n    WINCMD=\"\/cygdrive\/c\/Windows\/System32\/cmd.exe \/C\"\n    PATH=${WIN_MINGW_DIR}\/bin:${PATH}\n  else\n    DEVNULL=\/dev\/null\n    WINCMD=\"\"\n    PATH=${PATH}\n  fi\n\n  BUILD_ID=$(basename $1 .fpr)\n}\n\n#####################################################################\n#\n# \ud544\uc694\ud55c \uc720\ud2f8\ub9ac\ud2f0\uac00 \uc788\ub294\uc9c0 \uac80\uc0ac\n#\n#####################################################################\nfunc_check_utils() {\n  if [ ${DEBUG_ON} -eq 1 ]\n  then\n    echo \">> func_check_utils()\"\n  fi\n\n  local IS_EXIT=0;\n  UTILNAMES=(\"grep\" \"unzip\" \"ls\" \"sort\" \"date\")\n\n  # \uc708\ub3c4\uc6b0 \uc720\ud2f8\ub9ac\ud2f0 \uccb4\ud0b9\n  if [ ${IS_WINDOWS} -eq 1 ]; then\n    if [ ! -x ${WIN_MINGW_DIR}\/bin\/grep ] || [ ! -x ${WIN_MINGW_DIR}\/bin\/unzip ] || [ ! -x ${WIN_MINGW_DIR}\/bin\/ls ] || [ ! -x ${WIN_MINGW_DIR}\/bin\/sort ] || [ ! -x ${WIN_MINGW_DIR}\/bin\/date ]; then\n      echo \"ERROR: ${WIN_MINGW_DIR} not found !\"\n      IS_EXIT=1\n    fi\n\n    if [ ${IS_EXIT} -ne 0 ]; then\n      exit 1\n    fi\n    return\n\n  fi\n\n  # \ub9ac\ub205\uc2a4 \uc720\ud2f8\ub9ac\ud2f0 \uccb4\ud0b9\n  for LOOP1 in \"${UTILNAMES[@]}\"\n  do\n    which ${LOOP1} > ${DEVNULL}\n    if [ $? -ne 0 ]; then\n      echo \"ERROR: ${LOOP1} not found !\"\n      IS_EXIT=1\n    fi\n  done\n\n  # \uc5c6\ub294 \uc720\ud2f8\ub9ac\ud2f0\uac00 \uc788\uc73c\uba74 \uc2a4\ud06c\ub9bd\ud2b8 \uc885\ub8cc\n  if [ ${IS_EXIT} -ne 0 ]; then\n    exit 1\n  fi\n\n  unset UTILNAMES\n}\n\n#####################################################################\n#\n# \ucd08\ub97c HH:MM:SS \ud615\ud0dc\ub85c \uacc4\uc0b0\ud558\uc5ec TIMESTAMP \ubcc0\uc218\uc5d0 \ub300\uc785\ud55c\ub2e4.\n# $1 : \ucd08\n#\n#####################################################################\nfunc_conv_sec2timestamp() {\n  SEC_VAL=${1}\n\n  ((h=${SEC_VAL}\/3600))\n  ((m=(${SEC_VAL}%3600)\/60))\n  ((s=${SEC_VAL}%60))\n  TIMESTAMP=$(printf \"%02d:%02d:%02d\\n\" $h $m $s)\n}\n\n#####################################################################\n#\n# FPR\ud30c\uc77c unzip\n# $1 : fpr \ud30c\uc77c\uba85\n#\n#####################################################################\nfunc_unzip() {\n  if [ ${DEBUG_ON} -eq 1 ]\n  then\n    echo \">> func_unzip()\"\n  fi\n\n  if [ -d ${TMP_DIR1} ]\n  then\n    rm -rf ${TMP_DIR1}\n  fi\n  mkdir ${TMP_DIR1}\n  unzip $1 -d ${TMP_DIR1} audit.fvdl &amp;> ${DEVNULL}\n}\n\n#####################################################################\n#\n# audit.fvdl\uc5d0\uc11c scantime\uc744 \ubf51\uc544\ub0b8\ub2e4.\n#\n#####################################################################\nfunc_get_scantime() {\n  if [ ${DEBUG_ON} -eq 1 ]\n  then\n    echo \">> func_get_scantime()\"\n  fi\n\n  if [ ! -f ${TMP_DIR1}\/audit.fvdl ]; then\n    echo \"ERROR: ${TMP_DIR1}\/audit.fvdl not found !\"\n    func_usage\n    exit 2\n  fi\n\n  SCANTIME=$(grep -Po '&lt;ScanTime value=\\\"\\K.*?(?=\")' ${TMP_DIR1}\/audit.fvdl)\n\n  # \ube4c\ub4dc \uc2dc\uac04\uc744 \uc2a4\uce94\uc2dc\uac04\uc758 1\/6\ub85c \uc7a1\uc544\uc11c \ub354\ud55c\ub2e4.\n  ((ADD_BUILD_SEC=${SCANTIME}\/6))\n  ((SCANTIME=${SCANTIME}+${ADD_BUILD_SEC}))\n\n  func_conv_sec2timestamp ${SCANTIME}\n  echo \"${1},${SCANTIME},${TIMESTAMP}\" >> ${TMP_FILE1}\n}\n\n#####################################################################\n#\n# \ucd08\ub97c \uc2dc:\ubd84\uc73c\ub85c \ubcc0\ud658\n#\n#####################################################################\nfunc_sec_to_formatstring() {\n  if [ ${DEBUG_ON} -eq 1 ]\n  then\n    echo \">> func_sec_to_formatstring()\"\n  fi\n\n  local NUM=${1}\n  local SECVAL=$((START_TIME+NUM))\n\n  if [ ${IS_WINDOWS} -eq 1 ]; then\n    DATE_FMT_STR=$(${WIN_MINGW_DIR}\/bin\/date +'%H:%M' -d @${SECVAL})\n  else\n    DATE_FMT_STR=$(date +'%H:%M' -d @${SECVAL})\n  fi\n}\n\n#####################################################################\n#\n# \uc22b\uc790\ub97c \uc8fc \uc774\ub984\uc73c\ub85c \ub300\uc785\n#\n#####################################################################\nfunc_get_weekname() {\n  if [ ${DEBUG_ON} -eq 1 ]\n  then\n    echo \">> func_get_weekname()\"\n  fi\n\n  local WEEKVAL=${1}\n\n  WEEKNAME=\"SUN\"\n  if [ ${WEEKVAL} -eq 1 ]; then\n    WEEKNAME=\"MON\"\n  elif [ ${WEEKVAL} -eq 2 ]; then\n    WEEKNAME=\"TUE\"\n  elif [ ${WEEKVAL} -eq 3 ]; then\n    WEEKNAME=\"WED\"\n  elif [ ${WEEKVAL} -eq 4 ]; then\n    WEEKNAME=\"THU\"\n  elif [ ${WEEKVAL} -eq 5 ]; then\n    WEEKNAME=\"FRI\"\n  elif [ ${WEEKVAL} -eq 6 ]; then\n    WEEKNAME=\"SAT\"\n  elif [ ${WEEKVAL} -eq 7 ]; then\n    WEEKNAME=\"SUN\"\n  fi\n}\n\n#####################################################################\n#\n# SCHTASKS \ubc30\uce58 \ud30c\uc77c \uc4f0\uae30\n#\n#####################################################################\nfunc_write_schtasks_bat() {\n  if [ ${DEBUG_ON} -eq 1 ]\n  then\n    echo \">> func_write_schtasks_bat() $1 $2 $3 $4\"\n  fi\n\n  echo -n \"SCHTASKS \/CREATE \/F \" >> ${TMP_FILE2}\n  echo -n \"\/TN \\\"${SCHTASKS_FOLDER_NAME}\\\\${1}\\\" \" >> ${TMP_FILE2}\n  echo -n \"\/TR \\\"${2}\\\" \" >> ${TMP_FILE2}\n  echo -n \"\/SC WEEKLY \" >> ${TMP_FILE2}\n\n  func_get_weekname ${3}\n  echo -n \"\/D ${WEEKNAME} \" >> ${TMP_FILE2}\n\n  func_sec_to_formatstring ${4}\n  echo -n \"\/ST ${DATE_FMT_STR} \" >> ${TMP_FILE2}\n\n  echo \"\/MO 1\" >> ${TMP_FILE2}\n}\n\n#####################################################################\n#\n# CSV\ub97c \ubd84\uc11d\ud574\uc11c SCHTASKS \ubc30\uce58 \ud30c\uc77c\uc744 \ub9cc\ub4e0\ub2e4\n#\n#####################################################################\nfunc_parse_csv() {\n  if [ ${DEBUG_ON} -eq 1 ]\n  then\n    echo \">> func_parse_csv()\"\n  fi\n\n  local LINE_CNT=0\n  local SEC_TOTAL=0\n  local WEEK_NO=1\n\n  rm -f ${TMP_FILE2}\n\n  OLDIFS=${IFS}\n  IFS=','\n  while read FPR SEC TIMESTAMP\n  do\n    SCH_NAME=$(basename -s .fpr ${FPR})\n    SH_FILENAME=\"${SCA_SCRIPT_DIR}\\\\$(basename -s .fpr ${FPR}).bat\"\n\n    func_write_schtasks_bat ${SCH_NAME} ${SH_FILENAME} ${WEEK_NO} ${SEC_TOTAL}\n\n    SEC_TOTAL=$((SEC_TOTAL+SEC))\n\n    # \uc2dc\uac04 \uccb4\ud06c\n    if [ ${SEC_TOTAL} -gt ${END_SEC} ]; then\n      SEC_TOTAL=0\n      WEEK_NO=$((WEEK_NO+1))\n    fi\n\n    # \uc77c\uc694\uc77c\uc774 \uc9c0\ub098\uba74 \ub2e4\uc2dc \uc6d4\uc694\uc77c\n    if [ ${WEEK_NO} -gt 7 ]; then\n      WEEK_NO=1\n    fi\n\n    # \ud1a0\uc694\uc77c, \uc77c\uc694\uc77c\uc740 24\uc2dc\uac04\n    if [ ${WEEK_NO} -eq 6 -o ${WEEK_NO} -eq 7 ]\n    then\n      START_TIME=0\n      END_SEC=86400\n    fi\n\n  done &lt; ${CSV_FILENAME}\n  IFS=${OLDIFS}\n}\n\n#####################################################################\n#\n# \uc784\uc2dc \ubc0f \ubd88\ud544\uc694\ud55c \ud30c\uc77c \uc0ad\uc81c\n#\n#####################################################################\nfunc_clean() {\n  if [ ${DEBUG_ON} -eq 1 ]\n  then\n    echo \">> func_clean()\"\n  fi\n\n  if [ ${IS_WINDOWS} -eq 1 ]; then\n    rm -f ${DEVNULL}\n  fi\n\n  rm -f ${TMP_FILE1}\n  rm -f ${TMP_FILE2}\n  rm -rf ${TMP_DIR1}\n  rm -f ${BUILD_ID}.xml\n}\n\n#####################################################################\n#\n# main\n#\n#####################################################################\n\n# \uba85\ub839\ud589 \uc778\uc218\uac00 \uc5c6\uc73c\uba74 \uc0ac\uc6a9\ubc29\ubc95 \ucd9c\ub825\ud558\uace0 \ub05d\ub0c4\nif [ $# -lt 1 ]; then\n  func_usage\n  exit 3\nfi\n\nif [ -f ${CSV_FILENAME} ]; then\n  rm -f ${CSV_FILENAME}\nfi\n\nfunc_init\nfunc_check_utils\n\n#####################################################################\n# wildcard\uc5d0 \ubd80\ud569\ud558\ub294 \ud30c\uc77c\ub4e4\uc5d0 \ub300\ud55c \ucc98\ub9ac\n#####################################################################\nfor LOOP1 in $(ls -1 -SS $*)\ndo\n  if [ -f ${LOOP1} ]\n    then\n      echo ${LOOP1}\n      func_unzip ${LOOP1}\n      func_get_scantime ${LOOP1}\n    else\n      break\n  fi\ndone\n\n#####################################################################\n# CSV \ud0c0\uc774\ud2c0 \ucd9c\ub825\n#####################################################################\n#echo \"Filename,Second,Timestamp(HH:MM:SS)\" > ${CSV_FILENAME}\n\n#####################################################################\n# \uc2a4\uce94 \uc2dc\uac04\uc5d0 \ub530\ub77c \uc5ed\uc21c Sort\n#####################################################################\nif [ ${IS_WINDOWS} -eq 1 ]; then\n  ${WIN_MINGW_DIR}\/bin\/sort -t, -r -k3 ${TMP_FILE1} >> ${CSV_FILENAME}\nelse\n  sort -t, -r -k3 ${TMP_FILE1} >> ${CSV_FILENAME}\nfi\n\nfunc_parse_csv\n\n#####################################################################\n# \uc708\ub3c4\uc6b0 \ubc30\uce58\ud30c\uc77c\uc758 \uac1c\ud589\ubb38\uc790 \ubc0f \ucf54\ub4dc\uc14b \ubcc0\uacbd\n#####################################################################\nsed -i 's\/$\/\\r\/' ${TMP_FILE2}\niconv -f utf8 -t euc-kr ${TMP_FILE2} > ${BAT_FILENAME}\n\nfunc_clean<\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[66],"tags":[],"class_list":["post-3136","post","type-post","status-publish","format-standard","hentry","category-computing_fortify"],"_links":{"self":[{"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/posts\/3136","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3136"}],"version-history":[{"count":0,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=\/wp\/v2\/posts\/3136\/revisions"}],"wp:attachment":[{"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3136"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3136"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hasu0707.duckdns.org\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3136"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}