From 99a2953e84d10306ff5c0b61a97ba87b7008c2e5 Mon Sep 17 00:00:00 2001 From: an7s <an7s@git.zephyr-software.com> Date: Fri, 22 Aug 2014 18:11:47 +0000 Subject: [PATCH] Optionally keep track of job statistics Copy correct libappfw.so for 32 or 64 bit (from appfw/lib/32 or appfw/lib/64) Former-commit-id: e9b80511dc584e11691ec528f0f8f7c787ef1eef --- .gitattributes | 5 +++ tools/db/job.create.tbl | 23 ++++++++++++ tools/db/job.drop.tbl | 2 ++ tools/db/job_spec_register.sh | 9 +++++ tools/db/job_spec_update.sh | 14 ++++++++ tools/db/job_status_report.sh | 66 ++++++++++++++++++++++++++++++++++ tools/db/pdb.drop.tbl | 4 +-- tools/db/pdb_setup.sh | 1 + tools/db/pdb_teardown.sh | 1 + tools/do_appfw.sh | 4 +-- tools/ps_analyze.sh | 68 ++++++++++++++++++++++++++++++++--- 11 files changed, 189 insertions(+), 8 deletions(-) create mode 100644 tools/db/job.create.tbl create mode 100644 tools/db/job.drop.tbl create mode 100755 tools/db/job_spec_register.sh create mode 100755 tools/db/job_spec_update.sh create mode 100755 tools/db/job_status_report.sh diff --git a/.gitattributes b/.gitattributes index 0405eb530..b434e937d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -393,6 +393,11 @@ tools/bed_blackbox.sh -text tools/bed_manual.sh -text tools/cover.sh -text tools/db/drop_my_tables.sh -text +tools/db/job.create.tbl -text +tools/db/job.drop.tbl -text +tools/db/job_spec_register.sh -text +tools/db/job_spec_update.sh -text +tools/db/job_status_report.sh -text tools/db/pdb.create.tbl -text tools/db/pdb.createprogram.tbl -text tools/db/pdb.drop.tbl -text diff --git a/tools/db/job.create.tbl b/tools/db/job.create.tbl new file mode 100644 index 000000000..97bca29e6 --- /dev/null +++ b/tools/db/job.create.tbl @@ -0,0 +1,23 @@ +CREATE TABLE job_spec +( + job_id text PRIMARY KEY, + job_name text, + variant_id integer DEFAULT -1, + submitted_ts timestamp, + start_ts timestamp, + stop_ts timestamp, + configuration text, + status text, + installer text +); + +CREATE TABLE job_status +( + job_id text, + step text, + step_num integer DEFAULT -1, + log text, + start_ts timestamp, + stop_ts timestamp, + status text +); diff --git a/tools/db/job.drop.tbl b/tools/db/job.drop.tbl new file mode 100644 index 000000000..e2c7e0320 --- /dev/null +++ b/tools/db/job.drop.tbl @@ -0,0 +1,2 @@ +DROP TABLE job_spec; +DROP TABLE job_status; diff --git a/tools/db/job_spec_register.sh b/tools/db/job_spec_register.sh new file mode 100755 index 000000000..b9466d96b --- /dev/null +++ b/tools/db/job_spec_register.sh @@ -0,0 +1,9 @@ +#!/bin/sh -x + +JOB_ID=$1 +NAME=$2 +VARIANT_ID=$3 +STATUS=$4 +SUBMITTED_TS=$5 + +psql -q -t -c "INSERT INTO job_spec (job_id, job_name, variant_id, status, submitted_ts) VALUES ('$JOB_ID', '$NAME', '$VARIANT_ID', '$STATUS', '$SUBMITTED_TS')" diff --git a/tools/db/job_spec_update.sh b/tools/db/job_spec_update.sh new file mode 100755 index 000000000..6c6b4b3ad --- /dev/null +++ b/tools/db/job_spec_update.sh @@ -0,0 +1,14 @@ +#!/bin/sh -x + +JOB_ID=$1 +STATUS=$2 +TIMESTAMP=$3 +INSTALLER=$4 + +if [ $STATUS = 'pending' ]; then + psql -q -t -c "UPDATE job_spec SET status='$STATUS', start_ts='$TIMESTAMP' WHERE job_id='$JOB_ID'" +elif [ $STATUS = 'error' ]; then + psql -q -t -c "UPDATE job_spec SET status='$STATUS', stop_ts='$TIMESTAMP' WHERE job_id='$JOB_ID'" +else + psql -q -t -c "UPDATE job_spec SET status='$STATUS', stop_ts='$TIMESTAMP', installer='$INSTALLER' WHERE job_id='$JOB_ID'" +fi diff --git a/tools/db/job_status_report.sh b/tools/db/job_status_report.sh new file mode 100755 index 000000000..a77f6cc6a --- /dev/null +++ b/tools/db/job_status_report.sh @@ -0,0 +1,66 @@ +#!/bin/sh -x + +JOB_ID=$1 +STEP=$2 +STEP_NUM=$3 +STATE=$4 +TIMESTAMP=$5 +STATUS=$6 +LOGFILE=$7 + +##################################################### + +usage() +{ + echo "report_job_status <job_id> <step_name> <step_num> [ started | completed ] <timestamp> <status> <logFile>" +} + +log_error() +{ + echo "report_job_status: ERROR: $1" + exit -1 +} + +log_message() +{ + echo "report_job_status: MESSAGE: $1" +} + +##################################################### + +if [ -z $JOB_ID ]; then + usage +fi + +if [ -z $STEP ]; then + usage +fi + +if [ -z $STEP_NUM ]; then + usage +fi + +if [ -z $TIMESTAMP ]; then + usage +fi + +if [ -z $STATUS ]; then + usage +fi + +if [ $STATE = "started" ]; then + psql -q -t -c "INSERT INTO job_status (job_id, step, step_num, status, start_ts) VALUES ('$JOB_ID', '$STEP', '$STEP_NUM', '$STATUS', '$TIMESTAMP')" +else + if [ -z $LOGFILE ]; then + psql -q -t -c "UPDATE job_status SET status='$STATUS', stop_ts='$TIMESTAMP' WHERE job_id = '$JOB_ID' AND step='$STEP'" + else + attributes=$(grep ATTRIBUTE $LOGFILE | cut -d' ' -f3-) + psql -q -t -c "UPDATE job_status SET status='$STATUS', stop_ts='$TIMESTAMP', log='$attributes' WHERE job_id = '$JOB_ID' AND step='$STEP'" + fi +fi + +if [ ! $? -eq 0 ]; then + log_error "Failed to register job status" +fi + +exit 0 diff --git a/tools/db/pdb.drop.tbl b/tools/db/pdb.drop.tbl index e75fc9e4c..b42f9199e 100644 --- a/tools/db/pdb.drop.tbl +++ b/tools/db/pdb.drop.tbl @@ -1,3 +1,3 @@ -DROP TABLE program_dependency; -DROP TABLE program_info; +DROP TABLE variant_dependency; +DROP TABLE variant_info; DROP TABLE file_info; diff --git a/tools/db/pdb_setup.sh b/tools/db/pdb_setup.sh index 7d489a046..5aadc308a 100755 --- a/tools/db/pdb_setup.sh +++ b/tools/db/pdb_setup.sh @@ -1,3 +1,4 @@ #!/bin/sh psql -f $PEASOUP_HOME/tools/db/pdb.create.tbl +psql -f $PEASOUP_HOME/tools/db/job.create.tbl diff --git a/tools/db/pdb_teardown.sh b/tools/db/pdb_teardown.sh index 4c48331df..5ebe4aa2b 100755 --- a/tools/db/pdb_teardown.sh +++ b/tools/db/pdb_teardown.sh @@ -1,3 +1,4 @@ #!/bin/sh psql -f $PEASOUP_HOME/tools/db/pdb.drop.tbl +psql -f $PEASOUP_HOME/tools/db/job.drop.tbl diff --git a/tools/do_appfw.sh b/tools/do_appfw.sh index 889aa6cca..ab0e196ec 100755 --- a/tools/do_appfw.sh +++ b/tools/do_appfw.sh @@ -11,7 +11,7 @@ $PEASOUP_HOME/tools/generate_string_signatures.sh "$program" "$program.sigs" $fi cp $program.sigs $program.sigs.orig # copy application firewall library -# for now, it's only SQL -cp $SECURITY_TRANSFORMS_HOME/appfw/lib/libappfw.so${bits} libappfw.so +cp $SECURITY_TRANSFORMS_HOME/appfw/lib/${bits}/libappfw.so libappfw.so +#cp $SECURITY_TRANSFORMS_HOME/appfw/lib/${bits}/libappfw.so libappfw.so $PEASOUP_HOME/tools/update_env_var.sh DO_APPFW 1 diff --git a/tools/ps_analyze.sh b/tools/ps_analyze.sh index 0e4e49326..92ce4c36b 100755 --- a/tools/ps_analyze.sh +++ b/tools/ps_analyze.sh @@ -14,6 +14,9 @@ ulimit -s unlimited watchdog_val=30 errors=0 +# record statistics in database? +record_stats=0 + # DEFAULT TIMEOUT VALUE INTEGER_TRANSFORM_TIMEOUT_VALUE=1800 TWITCHER_TRANSFORM_TIMEOUT_VALUE=1800 @@ -23,7 +26,7 @@ PN_TIMEOUT_VALUE=21600 # # set default values for # -initial_off_phases="isr ret_shadow_stack determine_program" +initial_off_phases="isr ret_shadow_stack determine_program stats" #non-zero to use canaries in PN/P1, 0 to turn off canaries #DO_CANARIES=1 @@ -36,6 +39,9 @@ intxform_detect_fp=1 # default: detect benign false positives is on # but if determine_program is off, it's a no-op intxform_instrument_idioms=0 # default: do not instrument instructions marked as IDIOM by STARS +# JOBID + +JOBID="$(basename $1)-$$" # # By default, big data approach is off @@ -158,7 +164,7 @@ check_options() # Note that we use `"$@"' to let each command-line parameter expand to a # separate word. The quotes around `$@' are essential! # We need TEMP as the `eval set --' would nuke the return value of getopt. - TEMP=`getopt -o s:t:w: --long step-option: --long integer_warnings_only --long integer_instrument_idioms --long integer_detect_fp --long no_integer_detect_fp --long step: --long timeout: --long manual_test_script: --long manual_test_coverage_file: --long watchdog: -n 'ps_analyze.sh' -- "$@"` + TEMP=`getopt -o s:t:w: --long step-option: --long integer_warnings_only --long integer_instrument_idioms --long integer_detect_fp --long no_integer_detect_fp --long step: --long timeout: --long id: --long manual_test_script: --long manual_test_coverage_file: --long watchdog: -n 'ps_analyze.sh' -- "$@"` # error check # if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit -1 ; fi @@ -214,6 +220,10 @@ check_options() set_timer $2 & TIMER_PID=$! shift 2 ;; + --id) + JOBID=$2 + shift 2 + ;; --) shift break ;; @@ -257,6 +267,14 @@ check_options() if [[ $? = 1 && "$TWITCHER_HOME" != "" ]]; then phases_off="$phases_off heaprand=off double_free=off" fi + + # + # turn on/off recording of statistics + # + is_step_on stats + if [[ $? = 1 ]]; then + record_stats=1 + fi } @@ -342,6 +360,10 @@ perform_step() echo -n Performing step "$step" [dependencies=$mandatory] ... starttime=`date --iso-8601=seconds` + if [ $record_stats -eq 1 ]; then + $PEASOUP_HOME/tools/db/job_status_report.sh "$JOBID" "$step" "$stepnum" started "$starttime" inprogress + fi + # If verbose is on, tee to a file if [ ! -z "$DEBUG_STEPS" ]; then $command @@ -353,14 +375,27 @@ perform_step() $command > $logfile 2>&1 command_exit=$? fi + + endtime=`date --iso-8601=seconds` echo "# ATTRIBUTE start_time=$starttime" >> $logfile - echo "# ATTRIBUTE end_time=`date --iso-8601=seconds`" >> $logfile + echo "# ATTRIBUTE end_time=$endtime" >> $logfile echo "# ATTRIBUTE peasoup_step_name=$step" >> $logfile echo "# ATTRIBUTE peasoup_step_number=$stepnum" >> $logfile echo "# ATTRIBUTE peasoup_step_command=$command " >> $logfile echo "# ATTRIBUTE peasoup_step_exitcode=$command_exit" >> $logfile + # report job status + if [ $command_exit -eq 0 ]; then + if [ $record_stats -eq 1 ]; then + $PEASOUP_HOME/tools/db/job_status_report.sh "$JOBID" "$step" "$stepnum" completed "$endtime" success $logfile + fi + else + if [ $record_stats -eq 1 ]; then + $PEASOUP_HOME/tools/db/job_status_report.sh "$JOBID" "$step" "$stepnum" completed "$endtime" error $logfile + fi + fi + is_step_error $step $command_exit if [ $? -ne 0 ]; then echo "Done. Command failed! ***************************************" @@ -393,7 +428,7 @@ report_logs() logfile=logs/ps_analyze.log echo "# ATTRIBUTE start_time=$ps_starttime" >> $logfile - echo "# ATTRIBUTE end_time=`date --iso-8601=seconds`" >> $logfile + echo "# ATTRIBUTE end_time=$ps_endtime" >> $logfile echo "# ATTRIBUTE peasoup_step_name=all_peasoup" >> $logfile for i in $all_logs @@ -666,6 +701,8 @@ DB_PROGRAM_NAME=`basename $orig_exe.$$ | sed "s/[^a-zA-Z0-9]/_/g"` DB_PROGRAM_NAME="psprog_$DB_PROGRAM_NAME" MD5HASH=`md5sum $newname.ncexe | cut -f1 -d' '` +INSTALLER=`pwd` + # # register the program # @@ -675,6 +712,16 @@ if [ ! $varid -gt 0 ]; then fail_gracefully "Failed to write Variant into database. Exiting early. Is postgres running? Can $PGUSER access the db?" fi +if [ $record_stats -eq 1 ]; then + $PEASOUP_HOME/tools/db/job_spec_register.sh "$JOBID" "$DB_PROGRAM_NAME" "$varid" 'submitted' "$ps_starttime" +fi + +sleep 30 + +if [ $record_stats -eq 1 ]; then + $PEASOUP_HOME/tools/db/job_spec_update.sh "$JOBID" 'pending' "$ps_starttime" +fi + # build basic IR perform_step fill_in_cfg mandatory $SECURITY_TRANSFORMS_HOME/libIRDB/test/fill_in_cfg.exe $varid perform_step fill_in_indtargs mandatory $SECURITY_TRANSFORMS_HOME/libIRDB/test/fill_in_indtargs.exe $varid @@ -813,8 +860,10 @@ fi # # create a report for all of ps_analyze. # +ps_endtime=`date --iso-8601=seconds` report_logs + # go back to original directory cd - > /dev/null 2>&1 @@ -833,8 +882,19 @@ if [ -f $stratafied_exe ]; then echo "*****************************" echo "*Warning: Some steps failed!*" echo "*****************************" + if [ $record_stats -eq 1 ]; then + $PEASOUP_HOME/tools/db/job_spec_update.sh "$JOBID" 'partial' "$ps_endtime" "$INSTALLER" + fi + else + if [ $record_stats -eq 1 ]; then + $PEASOUP_HOME/tools/db/job_spec_update.sh "$JOBID" 'success' "$ps_endtime" "$INSTALLER" + fi fi + exit 0; else + if [ $record_stats -eq 1 ]; then + $PEASOUP_HOME/tools/db/job_spec_update.sh "$JOBID" 'error' "$ps_endtime" + fi exit 255; fi -- GitLab