ADAPT / src / attack_step_execution.c
attack_step_execution.c
Raw
#include <stdio.h>

#include "attack_step_execution.h"
#include "executor.h"
#include "mape_k.h"
#include "pentest_state.h"



void attack_step_exec_init(struct attack_step_exec_ctx *ase_c,
			   struct attack_step *a_s,
			   struct active_attack *a_a)
{
    ase_c->a_s = a_s;
    ase_c->a_a = a_a;
}

static void attack_step_run(struct task *t);
static void attack_step_ctrl(struct task *t);

void attack_step_exec(struct exec_cmd *cmd)
{
    struct task *t_as_run = task_engine_create_task(attack_step_run,attack_step_ctrl,cmd,cmd);   
    task_engine_add_task(t_as_run,0);
}

static void attack_step_run(struct task *t)    
{

    struct exec_cmd *cmd = task_get_ctx(t);
    struct attack_step_exec_ctx *ase_c= cmd_get_ctx(cmd);
    struct executor *ex = cmd_get_executor(cmd);
    struct arc_model *a_m = ex->mape_k->k_b.model;
    
    struct attack_step *a_s = ase_c->a_s;
	struct active_attack *a_a = ase_c->a_a;
    char *target = ase_c->a_a->target;

    bool res = false;
    printf("[%s:%s] Initializing\n",ase_c->a_s->name,ase_c->a_a->target); 
    if(a_s->guard(a_m,target))
    {
		pthread_mutex_lock(&cmd->lock);
		//set the state to running
		a_a->cur_step_state = AAS_RUN;
		pthread_mutex_unlock(&cmd->lock);
		res = a_s->run(a_m,target);
		if(res)
		{
			printf("[%s:%s] Success\n",ase_c->a_s->name,ase_c->a_a->target);
		}
		else
		{
			printf("[%s:%s] Failed\n",ase_c->a_s->name,ase_c->a_a->target);
		}
		
    }
	pthread_mutex_lock(&cmd->lock);
    a_a->cur_res = res;
	pthread_mutex_unlock(&cmd->lock);
    
}

static void attack_step_ctrl(struct task *t)
{
    struct exec_cmd *cmd = task_get_ctx(t);
    struct attack_step_exec_ctx *ase_c= cmd_get_ctx(cmd);
    struct active_attack *a_a = ase_c->a_a;
    a_a->cur_step_state = AAS_DONE;    
    cmd_set_status(cmd,CMD_DONE);
    cmd->done(cmd);
}