diff --git a/build/Makefile b/build/Makefile index 1bf9deb..e178478 100644 --- a/build/Makefile +++ b/build/Makefile @@ -1,5 +1,5 @@ # CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.22 +# Generated by "Unix Makefiles" Generator, CMake Version 3.23 # Default target executed when no arguments are given to make. default_target: all diff --git a/build/ag_gen b/build/ag_gen index 7f0deae..6d97e0d 100755 Binary files a/build/ag_gen and b/build/ag_gen differ diff --git a/build/run.sh b/build/run.sh index 0cd4e02..be23b04 100755 --- a/build/run.sh +++ b/build/run.sh @@ -1,24 +1,59 @@ #!/usr/bin/env bash -#Optional Arguments for running batches of tests +#Optional Arguments for running batches of tests. +# These are meant to be specified by command line, but the :-{VAL} specifies the default to use. +# Can change the default here as desired. Ex: Changing to 2 Services would be: NUM_SERV=${1:-2} NUM_SERV=${1:-1} -TYPE=${2:-sync} -CARS=${3:-2} -DBNAME=${4:-ag} -NUM_THREADS=${5:-1} -NODES=${6:-2} -MPI_TYPE=${7-serial} -ESIZE=${8:-6} +TYPE=${2:-sync} # sync or non-sync. Use sync unless you are specifically testing non-sync. +CARS=${3:-2} # used for network model scripting. Can ignore. +DBNAME=${4:-ag} # name of database table. can leave as default or change to whatever you prefer +NUM_THREADS=${5:-1} # number of OMP threads to use +NODES=${6:-1} # number of MPI nodes to use (for tasking or subgraphing) +MPI_TYPE=${7-serial} # tasking or subgraphing. Put serial or OMP if you do not wish to use MPI. +ESIZE=${8:-6} # exploit file scripting. Can ignore. -ITFC="eth0" +### AG Gen Network Model and Exploit File settings - adjust as desired. +NM="../Oct_2021/nm_files/${CARS}_car_timeline_maintenance.nm" +XP="../Oct_2021/Non_Sync/4_Exploits/${NUM_SERV}_Serv/generic_timeline_maintenance.xp" +SYNC_XP="../Oct_2021/Sync/4_Exploits/${NUM_SERV}_Serv/sync_timeline_maintenance.xp" -strval1="sync" -strval2="non-sync" +### MPI Parameters - adjust as desired. +MPI_PARAMS="mpiexec --mca btl_openib_allow_ib 1 --mca opal_warn_on_missing_libcuda 0 -np ${NODES} --timeout 129600" +# Common Hammer parameters +MPI_HAMMER_PARAMS="mpiexec --mca btl_openib_allow_ib 1 --mca btl openib,self,vader --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np ${NODES} --timeout 129600" -#Change these to match your desired network model and exploit file paths -NM=../Oct_2021/nm_files/"$CARS"_car_timeline_maintenance.nm -XP=../Oct_2021/Sync/4_Exploits/"$NUM_SERV"_Serv/sync_timeline_maintenance.xp +### AG Gen Parameters. Please run the AG generator with the '-h' parameter to see all options. Adjust as desired. +AG_PARAMS="-t ${NUM_THREADS} -q 1 -p -a 0.6 -z ${DBNAME}" +AG_SUBG_PARAMS="-t ${NUM_THREADS} -q 1 -p -a 0.6 -z ${DBNAME} -l 200 -s" +AG_TASK_PARAMS="-t ${NUM_THREADS} -q 1 -p -a 0.6 -z ${DBNAME} -e" +# Do you want to create an SVG from the DOTFILE? Uncomment/comment to select +CREATE_SVG="true" +#CREATE_SVG="false" + +# If using MPI Subgraphing, do you want to use a DHT? Uncomment to select, and please adjust the BCL Hash Size +#DHT="true" +DHT="false" +BCLHASH=2300 + +### Running +# Var concats +if [ "$DHT" == "true" ]; then + AG_SUBG_PARAMS+=" -uf " + AG_SUBG_PARAMS+=${BCLHASH} +fi + +if [ "$CREATE_SVG" == "true" ]; then + AG_PARAMS+=" -g DOTFILE.dot" + AG_SUBG_PARAMS+=" -g DOTFILE.dot" + AG_TASK_PARAMS+=" -g DOTFILE.dot" +fi + +if [ "$TYPE" == "sync" ]; then + XP="$SYNC_XP" +fi + +## Database Work #Hammer if [ "$(dnsdomainname)" = "hammer.esg.utulsa.edu" ]; then #Database stored on node with port @@ -51,89 +86,61 @@ else fi fi -if [[ "$NUM_SERV" -eq 1 ]]; then - BCLHASH=450 -elif [[ "$NUM_SERV" -eq 2 ]]; then - BCLHASH=800 -elif [[ "$NUM_SERV" -eq 3 ]]; then - BCLHASH=1700 +## Running the scripts +# NOTE: Do not use 'bash -c' or 'eval' unless you fully understand shell parsing. We are building an array +# of arguments dynamically to avoid wordsplitting and wildcard expansions +CMD=() +if [ "$(dnsdomainname)" = "hammer.esg.utulsa.edu" ]; then + CMD+=$MPI_HAMMER_PARAMS + CMD+=" ./ag_gen -n " + CMD+=${NM} + CMD+=" -x " + CMD+=${XP} + CMD+=" " + + if [ "$MPI_TYPE" == subgraphing ]; then + CMD+=${AG_SUBG_PARAMS} + ${CMD} + elif [ "$MPI_TYPE" == tasking ]; then + CMD+=${AG_TASK_PARAMS} + ${CMD} + elif [ "$MPI_TYPE" == testing ]; then + CMD+=${AG_PARAMS} + ${CMD} + else + CMD+=${AG_PARAMS} + ${CMD} + #Serial/OMP + fi #Subg/Task/Serial/OMP + +#Local else - BCLHASH=2300 -fi - -if [ "$TYPE" == "$strval1" ]; then - if [ "$(dnsdomainname)" = "hammer.esg.utulsa.edu" ]; then - if [ "$MPI_TYPE" == subgraphing ]; then - #4 Exploit Option - mpiexec --mca btl_openib_allow_ib 1 --mca btl openib,self,vader --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np "$NODES" --timeout 129600 ./ag_gen -n ../Oct_2021/nm_files/"$CARS"_car_timeline_maintenance.nm -x ../Oct_2021/Sync/4_Exploits/"$NUM_SERV"_Serv/sync_timeline_maintenance.xp -t "$NUM_THREADS" -q 1 -p -a 0.6 -z "$DBNAME" -l 200 -s -f "$BCLHASH" - elif [ "$MPI_TYPE" == tasking ]; then - #4 Exploit Option - mpiexec --mca btl_openib_allow_ib 1 --mca btl openib,self,vader --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np "$NODES" --timeout 129600 ./ag_gen -n ../Oct_2021/nm_files/"$CARS"_car_timeline_maintenance.nm -x ../Oct_2021/Sync/4_Exploits/"$NUM_SERV"_Serv/sync_timeline_maintenance.xp -t "$NUM_THREADS" -q 1 -p -a 0.6 -z "$DBNAME" -l 200 -e - elif [ "$MPI_TYPE" == testing ]; then - mpiexec --mca btl_openib_allow_ib 1 --mca btl openib,self,vader --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np "$NODES" --timeout 129600 ./ag_gen -n ../esize_test/generic_timeline_maintenance.nm -x ../esize_test/"$ESIZE"/sync_timeline_maintenance.xp -t "$NUM_THREADS" -q 1 -p -a 0.6 -z "$DBNAME" -l 200 -e - else - #Serial/OMP - #4 Exploit Option - mpiexec --mca btl_openib_allow_ib 1 --mca btl openib,self,vader --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np "$NODES" --timeout 129600 ./ag_gen -n ../Oct_2021/nm_files/"$CARS"_car_timeline_maintenance.nm -x ../Oct_2021/Sync/4_Exploits/"$NUM_SERV"_Serv/sync_timeline_maintenance.xp -t "$NUM_THREADS" -q 1 -p -a 0.6 -z "$DBNAME" -l 200 - fi #END Hammer - - #Local - else - if [ "$MPI_TYPE" == subgraphing ]; then - #4 Exploit Option - mpiexec --mca btl_openib_allow_ib 1 --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np "$NODES" --timeout 129600 ./ag_gen -n ../Oct_2021/nm_files/"$CARS"_car_timeline_maintenance.nm -x ../Oct_2021/Sync/4_Exploits/"$NUM_SERV"_Serv/sync_timeline_maintenance.xp -t "$NUM_THREADS" -q 1 -p -a 0.6 -z "$DBNAME" -l 80 -s -f "$BCLHASH" - elif [ "$MPI_TYPE" == tasking ]; then - #4 Exploit Option - mpiexec --mca btl_openib_allow_ib 1 --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np "$NODES" --timeout 129600 ./ag_gen -n ../Oct_2021/nm_files/"$CARS"_car_timeline_maintenance.nm -x ../Oct_2021/Sync/4_Exploits/"$NUM_SERV"_Serv/sync_timeline_maintenance.xp -t "$NUM_THREADS" -q 1 -p -a 0.6 -z "$DBNAME" -l 200 -e - elif [ "$MPI_TYPE" == testing ]; then - mpiexec --mca btl_openib_allow_ib 1 --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np "$NODES" --timeout 129600 ./ag_gen -n ../esize_test/generic_timeline_maintenance.nm -x ../esize_test/"$ESIZE"/sync_timeline_maintenance.xp -t "$NUM_THREADS" -q 1 -p -a 0.6 -z "$DBNAME" -l 200 - else - #Serial/OMP - #4 Exploit Option - mpiexec --mca btl_openib_allow_ib 1 --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np "$NODES" --timeout 129600 ./ag_gen -n "$NM" -x "$XP" -t "$NUM_THREADS" -q 1 -p -a 0.6 -z "$DBNAME" -g DOTFILE.dot - fi #END Non-Hammer - fi #END Sync - - -elif [ "$TYPE" == "$strval2" ]; then - if [ "$(dnsdomainname)" = "hammer.esg.utulsa.edu" ]; then - if [ "$MPI_TYPE" == subgraphing ]; then - #4 Exploit Option - mpiexec --mca btl_openib_allow_ib 1 --mca btl openib,self,vader --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np "$NODES" --timeout 129600 ./ag_gen -n ../Oct_2021/nm_files/"$CARS"_car_timeline_maintenance.nm -x ../Oct_2021/Non_Sync/4_Exploits/"$NUM_SERV"_Serv/generic_timeline_maintenance.xp -t "$NUM_THREADS" -q 1 -p -a 0.6 -z "$DBNAME" -l 200 -s - elif [ "$MPI_TYPE" == tasking ]; then - #4 Exploit Option - mpiexec --mca btl_openib_allow_ib 1 --mca btl openib,self,vader --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np "$NODES" --timeout 129600 ./ag_gen -n ../Oct_2021/nm_files/"$CARS"_car_timeline_maintenance.nm -x ../Oct_2021/Non_Sync/4_Exploits/"$NUM_SERV"_Serv/generic_timeline_maintenance.xp -t "$NUM_THREADS" -q 1 -p -a 0.6 -z "$DBNAME" -l 200 -e - else - #OMP/Serial - #4 Exploit Option - mpiexec --mca btl_openib_allow_ib 1 --mca btl openib,self,vader --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np "$NODES" --timeout 129600 ./ag_gen -n ../Oct_2021/nm_files/"$CARS"_car_timeline_maintenance.nm -x ../Oct_2021/Non_Sync/4_Exploits/"$NUM_SERV"_Serv/generic_timeline_maintenance.xp -t "$NUM_THREADS" -q 1 -p -a 0.6 -z "$DBNAME" -g DOTFILE.dot - fi #END Hammer - - #Local - else - if [ "$MPI_TYPE" == subgraphing ]; then - #4 Exploit Option - mpiexec --mca btl_openib_allow_ib 1 --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np "$NODES" --timeout 129600 ./ag_gen -n ../Oct_2021/nm_files/"$CARS"_car_timeline_maintenance.nm -x ../Oct_2021/Non_Sync/4_Exploits/"$NUM_SERV"_Serv/generic_timeline_maintenance.xp -t "$NUM_THREADS" -q 1 -p -a 0.6 -z "$DBNAME" -l 200 -s - elif [ "$MPI_TYPE" == tasking ]; then - #4 Exploit Option - mpiexec --mca btl_openib_allow_ib 1 --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np "$NODES" --timeout 129600 ./ag_gen -n ../Oct_2021/nm_files/"$CARS"_car_timeline_maintenance.nm -x ../Oct_2021/Non_Sync/4_Exploits/"$NUM_SERV"_Serv/generic_timeline_maintenance.xp -t "$NUM_THREADS" -q 1 -p -a 0.6 -z "$DBNAME" -l 200 -e - else - #OMP/Serial - #4 Exploit Option - mpiexec --mca btl_openib_allow_ib 1 --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa -np "$NODES" --timeout 129600 ./ag_gen -n "$NM" -x "$XP" -t "$NUM_THREADS" -q 1 -p -a 0.6 -z "$DBNAME" -l 200 - fi #END Non-Hammer - fi #END Non-Sync - -else - echo "Running default." - mpiexec --mca btl_openib_allow_ib 1 --mca btl openib,self,vader --mca opal_warn_on_missing_libcuda 0 --bind-to numa --map-by numa --timeout 129600 ./ag_gen -n ../Oct_2021/nm_files/1_car_timeline_maintenance.nm -x ../Oct_2021/Sync/10_Exploits/1_Serv/sync_timeline_maintenance.xp -t "$NUM_THREADS" -q 1 -p -a 0.6 -z "$DBNAME" - -fi #END Sync/Non-Sync/Default + CMD+=${MPI_PARAMS} + CMD+=" ./ag_gen -n " + CMD+=${NM} + CMD+=" -x " + CMD+=${XP} + CMD+=" " + if [ "$MPI_TYPE" == subgraphing ]; then + CMD+=${AG_SUBG_PARAMS} + ${CMD} + elif [ "$MPI_TYPE" == tasking ]; then + CMD+=${AG_TASK_PARAMS} + ${CMD} + elif [ "$MPI_TYPE" == testing ]; then + CMD+=${AG_PARAMS} + ${CMD} + else + #Serial/OMP + CMD+=${AG_PARAMS} + ${CMD} + fi +fi #END Hammer/Non-Hammer #Graphviz Strict graphing to avoid duplicate nodes and edges -echo -n 'strict ' | cat - DOTFILE.dot > temp && mv temp DOTFILE.dot - -#dot -Tsvg new.dot > ag.svg - -dot -Tsvg DOTFILE.dot > ag.svg +if [ "$CREATE_SVG" = "true" ]; then + echo -n 'strict ' | cat - DOTFILE.dot > temp && mv temp DOTFILE.dot + #dot -Tsvg new.dot > ag.svg + dot -Tsvg DOTFILE.dot > ag.svg +fi diff --git a/src/ag_gen/ag_gen.cpp b/src/ag_gen/ag_gen.cpp index 276daa6..9d45aae 100755 --- a/src/ag_gen/ag_gen.cpp +++ b/src/ag_gen/ag_gen.cpp @@ -1022,11 +1022,12 @@ int initQSize, double mem_threshold, mpi::communicator &world) return instance; } -AGGenInstance &AGGen::sg_generate(bool batch_process, int batch_num, int numThrd,\ +AGGenInstance &AGGen::sg_generate(bool use_bcl, bool batch_process, int batch_num, int numThrd,\ int initQSize, double mem_threshold, mpi::communicator &world, int state_limit, int bclhash_size) { //Init all Nodes with these variables std::vector exploit_list = instance.exploits; + //Distributed Hash maps for factbase hashes and explored hashes //NOTE: At this time, BCL does not support realloc or resizing its containers. This should ideally be changed once support is added. BCL::HashMap BCLmap(bclhash_size); @@ -1062,7 +1063,10 @@ int initQSize, double mem_threshold, mpi::communicator &world, int state_limit, bool save_queued = false; if (world.rank() == 0){ - std::cout << "Generating Attack Graph Using Subgraphing" << std::endl; + if (use_bcl) + std::cout << "Generating Attack Graph Using MPI Subgraphing with a DHT" << std::endl; + else + std::cout << "Generating Attack Graph Using MPI Subgraphing without a DHT" << std::endl; } std::unordered_map> od_map; @@ -1171,8 +1175,10 @@ int initQSize, double mem_threshold, mpi::communicator &world, int state_limit, auto current_state = localFrontier.front(); auto current_hash = current_state.get_hash(instance.facts); localFrontier.pop_front(); - if (BCLexpl.find(current_hash) != BCLexpl.end()) - continue; + if (use_bcl){ + if (BCLexpl.find(current_hash) != BCLexpl.end()) + continue; + } std::vector> appl_exploits; for (size_t i = 0; i < esize; i++) {//for loop for applicable exploits starts auto e = exploit_list.at(i); @@ -1326,28 +1332,48 @@ int initQSize, double mem_threshold, mpi::communicator &world, int state_limit, #pragma omp critical //although local frontier is updated, the global hash is also updated to avoid testing on explored states. //if (hash_map.find(hash_num) == hash_map.end()) { - if (BCLmap.find(hash_num) == BCLmap.end()) { - //new_state.set_id(); - new_state.force_set_id(BCLmap.capacity()); - instance.factbases.push_back(new_state.get_factbase()); - //hash_map.insert(std::make_pair(new_state.get_hash(instance.facts), new_state.get_id())); - BCLmap[hash_num] = new_state.get_id(); + if (use_bcl){ + if (BCLmap.find(hash_num) == BCLmap.end()) { + //new_state.set_id(); + new_state.force_set_id(BCLmap.capacity()); + instance.factbases.push_back(new_state.get_factbase()); + //hash_map.insert(std::make_pair(new_state.get_hash(instance.facts), new_state.get_id())); + BCLmap[hash_num] = new_state.get_id(); - localFrontier.emplace_front(new_state); - //Edge ed(current_state.get_id(), new_state.get_id(), exploit, assetGroup); - Edge ed(current_hash, hash_num, exploit, assetGroup); - ed.set_id(); - instance.edges.push_back(ed); - } //END if (hash_map.find(hash_num) == hash_map.end()) - - else { - //auto id = hash_map[hash_num]; - //Edge ed(current_state.get_id(), id, exploit, assetGroup); - Edge ed(current_hash, hash_num, exploit, assetGroup); - ed.set_id(); - instance.edges.push_back(ed); + localFrontier.emplace_front(new_state); + //Edge ed(current_state.get_id(), new_state.get_id(), exploit, assetGroup); + Edge ed(current_hash, hash_num, exploit, assetGroup); + ed.set_id(); + instance.edges.push_back(ed); + } //END if (hash_map.find(hash_num) == hash_map.end()) + else { + //auto id = hash_map[hash_num]; + //Edge ed(current_state.get_id(), id, exploit, assetGroup); + Edge ed(current_hash, hash_num, exploit, assetGroup); + ed.set_id(); + instance.edges.push_back(ed); + } + BCLexpl[current_hash] = BCLexpl.capacity(); + } + else{ + if (hash_map.find(hash_num) == hash_map.end()) { + new_state.set_id(); + instance.factbases.push_back(new_state.get_factbase()); + hash_map.insert(std::make_pair(new_state.get_hash(instance.facts), new_state.get_id())); + + localFrontier.emplace_front(new_state); + Edge ed(current_hash, hash_num, exploit, assetGroup); + ed.set_id(); + instance.edges.push_back(ed); + } //END if (hash_map.find(hash_num) == hash_map.end()) + else { + //auto id = hash_map[hash_num]; + //Edge ed(current_state.get_id(), id, exploit, assetGroup); + Edge ed(current_hash, hash_num, exploit, assetGroup); + ed.set_id(); + instance.edges.push_back(ed); + } } - BCLexpl[current_hash] = BCLexpl.capacity(); } //sync fire if else continue; diff --git a/src/ag_gen/ag_gen.h b/src/ag_gen/ag_gen.h index f6c5e68..84bd520 100755 --- a/src/ag_gen/ag_gen.h +++ b/src/ag_gen/ag_gen.h @@ -95,7 +95,7 @@ class AGGen { AGGen(AGGenInstance &_instance, RedisManager &_rman); #endif - AGGenInstance &sg_generate(bool batch_process, int batch_num, int numThrd,\ + AGGenInstance &sg_generate(bool use_bcl, bool batch_process, int batch_num, int numThrd,\ int initQSize, double mem_threshold, boost::mpi::communicator &world, int state_limit, int bclhash_size); AGGenInstance &tasking_generate(bool batch_process, int batch_num, int numThrd,\ diff --git a/src/main.cpp b/src/main.cpp index c947946..2e41cdc 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -393,22 +393,25 @@ void tokenize(std::string const &str, const char delim, std::vector void print_usage() { std::cout << "Usage: ag_gen [OPTION...]" << std::endl << std::endl; std::cout << "Flags:" << std::endl; - std::cout << "\t-c\tConfig section in config.ini" << std::endl; - std::cout << "\t-b\tEnables batch processing. The argument is the size of batches." << std::endl; - std::cout << "\t-g\tGenerate visual graph using graphviz, dot file for saving" << std::endl; - std::cout << "\t-d\tPerform a depth first search to remove cycles" << std::endl; - std::cout << "\t-n\tNetwork model file used for generation" << std::endl; - std::cout << "\t-x\tExploit pattern file used for generation" << std::endl; - std::cout << "\t-r\tUse redis for generation" << std::endl; - std::cout << "\t-h\tThis help menu." << std::endl; - std::cout << "\t-p\tUse PostgreSQL" << std::endl; - std::cout << "\t-e\tUse MPI Tasking" << std::endl; - std::cout << "\t-s\tUse MPI Subgraphing" << std::endl; - std::cout << "\t-l\tDepth Limit param for MPI Subgraphing" << std::endl; std::cout << "\t-a\tDecimal value for specifiying maximum amount of system memory to use" << std::endl; - std::cout << "\t-m\tNumber of MPI Nodes to use" << std::endl; - std::cout << "\t-z\tDatabase name for overriding config.ini file" << std::endl; + std::cout << "\t-b\tEnables batch processing. The argument is the size of batches." << std::endl; + std::cout << "\t-c\tConfig section in config.ini" << std::endl; + std::cout << "\t-d\tPerform a depth first search to remove cycles" << std::endl; + std::cout << "\t-e\tUse MPI Tasking" << std::endl; std::cout << "\t-f\tBCL Hash Size" << std::endl; + std::cout << "\t-g\tGenerate visual graph using graphviz, dot file for saving" << std::endl; + std::cout << "\t-h\tThis help menu." << std::endl; + std::cout << "\t-l\tDepth Limit param for MPI Subgraphing" << std::endl; + std::cout << "\t-m\tNumber of MPI Nodes to use" << std::endl; + std::cout << "\t-n\tNetwork model file used for generation" << std::endl; + std::cout << "\t-p\tUse PostgreSQL" << std::endl; + std::cout << "\t-q\tInitial QSize" << std::endl; + std::cout << "\t-r\tUse redis for generation" << std::endl; + std::cout << "\t-s\tUse MPI Subgraphing" << std::endl; + std::cout << "\t-t\tOpenMP Thread count" << std::endl; + std::cout << "\t-u\tUse a DHT provided by BCL" << std::endl; + std::cout << "\t-x\tExploit pattern file used for generation" << std::endl; + std::cout << "\t-z\tDatabase name for overriding config.ini file" << std::endl; } inline bool file_exists(const std::string &name) { @@ -453,7 +456,7 @@ int main(int argc, char *argv[]) { int init_qsize; int mpi_nodes; int depth_limit; - int bclhash_size; + int bclhash_size = 1; bool should_graph = false; bool no_cycles = false; @@ -462,12 +465,33 @@ int main(int argc, char *argv[]) { bool use_postgres = false; bool mpi_subgraphing = false; bool mpi_tasking = false; + bool use_bcl = false; double alpha = 0.5; int opt; - while ((opt = getopt(argc, argv, "rb:g:dhc:l:n:x:t:q:pa:f:sem:z:")) != -1) { + while ((opt = getopt(argc, argv, "rb:g:dhc:l:n:x:t:q:pa:f:setum:z:")) != -1) { switch (opt) { + case 'a': + //Save a 10% buffer for PSQL ops + alpha = atof(optarg) - 0.1; + break; + case 'b': + batch_process = true; + opt_batch = optarg; + break; + case 'c': + opt_config = optarg; + break; + case 'd': + no_cycles = true; + break; + case 'e': + mpi_tasking = true; + break; + case 'f': + bclhash_size = atoi(optarg); + break; case 'g': should_graph = true; opt_graph = optarg; @@ -475,52 +499,35 @@ int main(int argc, char *argv[]) { case 'h': print_usage(); return 0; - case 'n': - opt_nm = optarg; //read in the path of the .nm file from the command line arguments - break; - case 'x': - opt_xp = optarg; //read in the path of the .xp file from the command line arguments - break; - case 'c': - opt_config = optarg; - break; case 'l': depth_limit = atoi(optarg); break; - case 'd': - no_cycles = true; + case 'm': + mpi_nodes = atoi(optarg); + break; + case 'n': + opt_nm = optarg; //read in the path of the .nm file from the command line arguments + break; + case 'p': + use_postgres = true; + break; + case 'q': + init_qsize = atoi(optarg); break; case 'r': use_redis = true; break; - case 'b': - batch_process = true; - opt_batch = optarg; - break; - case 't': - thread_count =atoi(optarg); - break; - case 'q': - init_qsize = atoi(optarg); - break; - case 'p': - use_postgres = true; - break; - case 'a': - //Save a 10% buffer for PSQL ops - alpha = atof(optarg) - 0.1; - break; - case 'f': - bclhash_size = atoi(optarg); - break; case 's': mpi_subgraphing = true; + break; + case 't': + thread_count =atoi(optarg); break; - case 'e': - mpi_tasking = true; - break; - case 'm': - mpi_nodes = atoi(optarg); + case 'u': + use_bcl = true; + break; + case 'x': + opt_xp = optarg; //read in the path of the .xp file from the command line arguments break; case 'z': db_name = optarg; @@ -708,7 +715,7 @@ int main(int argc, char *argv[]) { AGGen gen(_instance);//use AGGen class to instantiate an obj with the name gen! _instance obj as the parameter! constructor defined in ag_gen.cpp if (mpi_subgraphing) - postinstance = gen.sg_generate(batch_process, batch_size, thread_count, init_qsize, alpha, world, depth_limit, bclhash_size); //The method call to generate the attack graph, defined in ag_gen.cpp. + postinstance = gen.sg_generate(use_bcl, batch_process, batch_size, thread_count, init_qsize, alpha, world, depth_limit, bclhash_size); //The method call to generate the attack graph, defined in ag_gen.cpp. else if (mpi_tasking) postinstance = gen.tasking_generate(batch_process, batch_size, thread_count, init_qsize, alpha, world); //The method call to generate the attack graph, defined in ag_gen.cpp. else diff --git a/tools/e_gen.py b/tools/e_gen.py new file mode 100644 index 0000000..69f1441 --- /dev/null +++ b/tools/e_gen.py @@ -0,0 +1,8 @@ + +file1 = open("sync_timeline_maintenance.xp", "w") +s = "preconditions:\nquality:a,can_fly=true;\npostconditions:\ninsert quality:a,flying_car=true;\n.\n" +for i in range(1, 98294): + s1 = "exploit dummy_" + str(i) + "(a)=\n" + file1.write(s1) + file1.write(s) +