summaryrefslogtreecommitdiffstats
path: root/src/rest.h
blob: d586ef686abe12d6c6245efd74f608c24f7fcbbe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#ifndef OG_REST_H
#define OG_REST_H

#include <ev.h>
#include <sys/time.h>

extern struct ev_loop *og_loop;

enum og_client_state {
	OG_CLIENT_RECEIVING_HEADER	= 0,
	OG_CLIENT_RECEIVING_PAYLOAD,
	OG_CLIENT_PROCESSING_REQUEST,
};

enum og_client_status {
	OG_CLIENT_STATUS_OGLIVE,
	OG_CLIENT_STATUS_BUSY,
	OG_CLIENT_STATUS_VIRTUAL,
	OG_CLIENT_STATUS_LINUX,
	OG_CLIENT_STATUS_LINUX_SESSION,
	OG_CLIENT_STATUS_WIN,
	OG_CLIENT_STATUS_WIN_SESSION,
};

enum og_cmd_type {
	OG_CMD_UNSPEC,
	OG_CMD_WOL,
	OG_CMD_PROBE,
	OG_CMD_SHELL_RUN,
	OG_CMD_SESSION,
	OG_CMD_POWEROFF,
	OG_CMD_REFRESH,
	OG_CMD_REBOOT,
	OG_CMD_STOP,
	OG_CMD_HARDWARE,
	OG_CMD_SOFTWARE,
	OG_CMD_IMAGE_CREATE,
	OG_CMD_IMAGE_RESTORE,
	OG_CMD_SETUP,
	OG_CMD_RUN_SCHEDULE,
	OG_CMD_IMAGES,
	OG_CMD_MAX
};

#define OG_MSG_REQUEST_MAXLEN	131072

struct og_client {
	struct list_head	list;
	struct ev_io		io;
	struct ev_timer		timer;
	struct sockaddr_in	addr;
	enum og_client_state	state;
	char			buf[OG_MSG_REQUEST_MAXLEN];
	unsigned int		buf_len;
	unsigned int		msg_len;
	bool			agent;
	int			content_length;
	char			auth_token[64];
	enum og_client_status	status;
	enum og_cmd_type	last_cmd;
	unsigned int		last_cmd_id;
	bool			autorun;
	uint32_t		speed;
	const char		*shell_output;
};

void og_client_add(struct og_client *cli);
struct og_client *__og_client_find(const struct in_addr *addr);

static inline int og_client_socket(const struct og_client *cli)
{
	return cli->io.fd;
}

#include "json.h"

int og_client_state_process_payload_rest(struct og_client *cli);

enum og_rest_method {
	OG_METHOD_GET	= 0,
	OG_METHOD_POST,
	OG_METHOD_NO_HTTP
};

int og_send_request(enum og_rest_method method, enum og_cmd_type type,
		    const struct og_msg_params *params,
		    const json_t *data);

struct og_cmd {
	uint32_t		id;
	struct list_head	list;
	uint32_t		client_id;
	const char		*ip;
	const char		*mac;
	enum og_cmd_type	type;
	enum og_rest_method	method;
	struct og_msg_params	params;
	json_t			*json;
	struct timeval		tv;
};

const struct og_cmd *og_cmd_find(const char *client_ip);
void og_cmd_free(const struct og_cmd *cmd);

#endif