Commit 9ae4c05b authored by Alberto Miranda's avatar Alberto Miranda ♨️
Browse files

Resolve "Add support for sending remote commands to urd daemon"

parent cc0b925f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -143,7 +143,6 @@ test:ubuntu:latest:
        - NORNS_DEBUG_CONFIG_FILE_OVERRIDE=1 ./api -as "[api::nornsctl_register_job]"
        - NORNS_DEBUG_CONFIG_FILE_OVERRIDE=1 ./api -as "[api::nornsctl_update_job]"
        - NORNS_DEBUG_CONFIG_FILE_OVERRIDE=1 ./api -as "[api::nornsctl_unregister_job]"
        - NORNS_DEBUG_CONFIG_FILE_OVERRIDE=1 ./api -as "[api::nornsctl_ping]"
        - NORNS_DEBUG_CONFIG_FILE_OVERRIDE=1 ./api -as "[api::nornsctl_add_process]"
        - NORNS_DEBUG_CONFIG_FILE_OVERRIDE=1 ./api -as "[api::nornsctl_remove_process]"
        - NORNS_DEBUG_CONFIG_FILE_OVERRIDE=1 ./api -as "[api::norns_resource_init]"
@@ -156,6 +155,7 @@ test:ubuntu:latest:
        - NORNS_DEBUG_CONFIG_FILE_OVERRIDE=1 ./api -as "[api::norns_submit]"
        - NORNS_DEBUG_CONFIG_FILE_OVERRIDE=1 ./api -as "[api::norns_status]"
        - NORNS_DEBUG_CONFIG_FILE_OVERRIDE=1 ./api -as "[api::nornsctl_status]"
        - NORNS_DEBUG_CONFIG_FILE_OVERRIDE=1 ./api -as "[api::nornsctl_send_command]"
    after_script:
        - pwd
        - if [[ -e tests.log ]]; 
+1 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ extern "C" {
#define NORNS_ECONNFAILED         -5
#define NORNS_ERPCSENDFAILED      -6
#define NORNS_ERPCRECVFAILED      -7
#define NORNS_EACCEPTPAUSED       -8

/* errors about jobs */
#define NORNS_EJOBEXISTS         -10
+0 −4
Original line number Diff line number Diff line
@@ -120,10 +120,6 @@ nornsctl_job_init(nornsctl_job_t* job,
                  nornsctl_job_limit_t** limits, 
                  size_t nlimits) __THROW;

/* Check if the service daemon is running */
norns_error_t 
nornsctl_ping(void) __THROW;

/* Send a command to the service daemon */
norns_error_t
nornsctl_send_command(nornsctl_command_t command, 
+10 −2
Original line number Diff line number Diff line
@@ -34,9 +34,17 @@ extern "C" {

#include "norns_types.h"

/* Types */
/* Additional administrative types */
typedef uint32_t nornsctl_backend_flags_t;
typedef uint32_t nornsctl_command_t;
//typedef uint32_t nornsctl_command_t;

/* Administrative command IDs valid for nornsctl_send_command() */
typedef enum {
    NORNSCTL_COMMAND_PING = 1000,
    NORNSCTL_COMMAND_PAUSE_ACCEPT,
    NORNSCTL_COMMAND_RESUME_ACCEPT,
} nornsctl_command_t;


#ifdef __cplusplus
};
+45 −31
Original line number Diff line number Diff line
@@ -47,12 +47,12 @@
#include "log.h"

static int connect_to_daemon(const char* socket_path);
static int send_message(int conn, const msgbuffer_t* buffer);
static int recv_message(int conn, msgbuffer_t* buffer);
static int send_message(int conn, const norns_msgbuffer_t* buffer);
static int recv_message(int conn, norns_msgbuffer_t* buffer);
static ssize_t recv_data(int conn, void* data, size_t size);
static ssize_t send_data(int conn, const void* data, size_t size);
static void print_hex(void* buffer, size_t bytes) __attribute__((unused));
static norns_error_t send_request(norns_rpc_type_t type, norns_response_t* resp, ...);
static norns_error_t send_request(norns_msgtype_t type, norns_response_t* resp, ...);

norns_error_t
send_submit_request(norns_iotask_t* task) {
@@ -81,6 +81,25 @@ send_submit_request(norns_iotask_t* task) {
    return resp.r_error_code;
}

norns_error_t
send_control_command_request(nornsctl_command_t cmd, void* args) {

    int res;
    norns_response_t resp;

    if((res = send_request(NORNSCTL_COMMAND, &resp, cmd, args)) 
            != NORNS_SUCCESS) {
        return res;
    }

    if(resp.r_type != NORNSCTL_COMMAND) {
        return NORNS_ESNAFU;
    }

    return NORNS_SUCCESS;
}


norns_error_t
send_status_request(norns_iotask_t* task, norns_stat_t* stats) {

@@ -113,12 +132,12 @@ send_control_status_request(nornsctl_stat_t* stats) {
    int res;
    norns_response_t resp;

    if((res = send_request(NORNSCTL_STATUS, &resp)) 
    if((res = send_request(NORNSCTL_GLOBAL_STATUS, &resp)) 
            != NORNS_SUCCESS) {
        return res;
    }

    if(resp.r_type != NORNSCTL_STATUS) {
    if(resp.r_type != NORNSCTL_GLOBAL_STATUS) {
        return NORNS_ESNAFU;
    }

@@ -130,24 +149,7 @@ send_control_status_request(nornsctl_stat_t* stats) {
}

norns_error_t
send_ping_request() {

    int res;
    norns_response_t resp;

    if((res = send_request(NORNS_PING, &resp)) != NORNS_SUCCESS) {
        return res;
    }

    if(resp.r_type != NORNS_PING) {
        return NORNS_ESNAFU;
    }

    return resp.r_error_code;
}

norns_error_t
send_job_request(norns_rpc_type_t type, uint32_t jobid, nornsctl_job_t* job) {
send_job_request(norns_msgtype_t type, uint32_t jobid, nornsctl_job_t* job) {

    int res;
    norns_response_t resp;
@@ -166,7 +168,7 @@ send_job_request(norns_rpc_type_t type, uint32_t jobid, nornsctl_job_t* job) {


norns_error_t
send_process_request(norns_rpc_type_t type, uint32_t jobid, 
send_process_request(norns_msgtype_t type, uint32_t jobid, 
                     uid_t uid, gid_t gid, pid_t pid) {

    int res;
@@ -185,7 +187,7 @@ send_process_request(norns_rpc_type_t type, uint32_t jobid,
}

norns_error_t
send_namespace_request(norns_rpc_type_t type, const char* nsid, 
send_namespace_request(norns_msgtype_t type, const char* nsid, 
                       nornsctl_backend_t* ns) {

    int res;
@@ -204,12 +206,12 @@ send_namespace_request(norns_rpc_type_t type, const char* nsid,
}

static int
send_request(norns_rpc_type_t type, norns_response_t* resp, ...) {
send_request(norns_msgtype_t type, norns_response_t* resp, ...) {

    int res;
    int conn = -1;
    msgbuffer_t req_buf = MSGBUFFER_INIT();
    msgbuffer_t resp_buf = MSGBUFFER_INIT();
    norns_msgbuffer_t req_buf = MSGBUFFER_INIT();
    norns_msgbuffer_t resp_buf = MSGBUFFER_INIT();

    libcontext_t* ctx = get_context();

@@ -245,7 +247,19 @@ send_request(norns_rpc_type_t type, norns_response_t* resp, ...) {
            break;
        }

        case NORNSCTL_STATUS:
        case NORNSCTL_COMMAND:
        {
            const nornsctl_command_t cmd = va_arg(ap, nornsctl_command_t);
            const void* args = va_arg(ap, const void*);

            if((res = pack_to_buffer(type, &req_buf, cmd, args)) 
                    != NORNS_SUCCESS) {
                return res;
            }
            break;
        }

        case NORNSCTL_GLOBAL_STATUS:
        case NORNS_PING:
        {
            if((res = pack_to_buffer(type, &req_buf)) != NORNS_SUCCESS) {
@@ -384,7 +398,7 @@ connect_to_daemon(const char* socket_path) {
}

static int
send_message(int conn, const msgbuffer_t* buffer) {
send_message(int conn, const norns_msgbuffer_t* buffer) {

    if(buffer == NULL || buffer->b_data == NULL || buffer->b_size == 0) {
        return -1;
@@ -412,7 +426,7 @@ send_message(int conn, const msgbuffer_t* buffer) {
}

static int 
recv_message(int conn, msgbuffer_t* buffer) {
recv_message(int conn, norns_msgbuffer_t* buffer) {

    // first of all read the message prefix and decode it 
    // so that we know how much data to receive
Loading