#include <pthread.h>
#include <semaphore.h>
#include <event.h>
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <netinet/tcp.h>
#include <sys/timeb.h>
#include <string.h>
#include <time.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include "Protocol.h"
#include "LocalDB.hpp"
#include "config_reader.hpp"
#include "hashtable.hpp"
#include "types.hpp"
#include "common_functions.hpp"
#include "dst_config.hpp"
#include "config_store.hpp"
#include <list>
#include <set>
#include <sys/stat.h>
#include <fcntl.h>
#include "daemonize.hpp"
#include "file_tokenizer.hpp"
#include "diff_process.hpp"
#include "extern.hpp"
#include <limits>
Typedefs | |
typedef thread_s | thread_t |
Functions | |
void | read_cb (int fd, short event_type, void *arg) |
Reads data from socket and cuts them into packets. | |
void | close_con (client_t *cli) |
Frees connection. Should be used every time there is some error with it. Also, removes all callbacks and events. | |
void | register_proxy (limit_server_register_t *data, client_t *cli) |
Registers proxy server. It will be added to proxy list or updated if already present. | |
void | send_data_cb (int fd, short event_type, void *arg) |
Callback run every time there is something to send in output buffer. It attempts to send next buffer from cli->packets_to_send. | |
void | enqueue_packet (client_s *cli, const buf_el &packet) |
Enqueues packet to be send to client. Also, sets write events if necessary. | |
void | send_packet_to_all_servers (buf_el packet) |
Enqueues packet to all connected servers. | |
void | protocol_limit_server_protocol_register (client_s *cli, char *input_buffer, uint32_t packet_size) |
void | protocol_limit_server_update_diff (client_s *cli, char *input_buffer, uint32_t packet_size) |
void | protocol_limit_server_update_dest_host_send_diff (client_s *cli, char *input_buffer, uint32_t packet_size) |
void | protocol_limit_server_request_uid (client_s *cli, char *input_buffer, uint32_t packet_size) |
uint32_t | protocol_core (client_s *cli, char *input_buffer, uint32_t size) |
Main function to parse the received data and call proper procedure. | |
void | do_accept (int listener_socket, short event_type, void *arg) |
Callback run every time there is new connection. | |
void | update_cb (int fd, short event_type, void *arg) |
Callback run by timer. It starts diff process. Also, changes current mouth variable. | |
void | pipe_cb (int fd, short event_type, void *arg) |
Called each time there is event to add. | |
void * | worker (void *arg) |
Worker thread. Enters libevent loop, and should never leave it. | |
void | insert_to_config (const std::pair< std::string, config_destination_entry > &new_entry) |
Inserts rule entry to server configuration. Creates underlying classes and loads database from disk if necessary. | |
void | init_config () |
Used at server startup. Fetches entire configuration using parse_config(rules_file), then calls insert_to_config() for each row. | |
void | reload_config () |
Reloads configuration. Called if SIGUSR1 was received. Will call parse_config(rules_file) to fetch new configuration, then . | |
void | handler (int signal) |
Parses signals. Two signals are handled: SIGINT will close server saving anything, SIGUSR1 will reload configuration. | |
void | init () |
Main initialization. Sets signals handler, creates socket and worker thread. | |
void | read_local_config (const char *conf_file_name) |
Parses config.txt file. | |
int | main (int argc, char **argv) |
Variables | |
struct timeval | tv |
struct event_base * | thread_loops [RECV_THREAD_AMOUNT] |
pthread_t | thread_ids [RECV_THREAD_AMOUNT] |
int | thread_usage [RECV_THREAD_AMOUNT] |
pthread_mutex_t | thread_usage_guard = PTHREAD_MUTEX_INITIALIZER |
pthread_mutex_t | mutex_queue [RECV_THREAD_AMOUNT] |
int | pipe_queue [RECV_THREAD_AMOUNT][2] |
int | last_thread = 0 |
pthread_mutex_t | parse_synchronization = PTHREAD_MUTEX_INITIALIZER |
const char * | NOTIFY = "1" |
int | curr_month = 0 |
std::list< t_uid > | dest_list |
HashMap< t_uid,dest_config * > | local_config (hashFunction) |
std::list< proxy_server * > | proxies |
std::list< client_t * > | queue [RECV_THREAD_AMOUNT] |
char | rules_file [1024] |
char | db_prefix [1024] |
int | update_interval |
int | main_server_port |
int | daemonize |
char | log_error [1024] |
char | log_common [1024] |
bool | pending_reload = false |
int | listener_socket |
void close_con | ( | client_t * | cli | ) |
Frees connection. Should be used every time there is some error with it. Also, removes all callbacks and events.
[in] | cli | Client to be closed and freed. |
void do_accept | ( | int | listener_socket, | |
short | event_type, | |||
void * | arg | |||
) |
Callback run every time there is new connection.
[in] | listener_socket | |
[in] | event_type | |
[in] | arg |
Enqueues packet to be send to client. Also, sets write events if necessary.
[in] | cli | Client to which data shall be send |
[in] | packet | packet that will be send |
void handler | ( | int | signal | ) |
Parses signals. Two signals are handled: SIGINT will close server saving anything, SIGUSR1 will reload configuration.
void init | ( | ) |
Main initialization. Sets signals handler, creates socket and worker thread.
void init_config | ( | ) |
Used at server startup. Fetches entire configuration using parse_config(rules_file), then calls insert_to_config() for each row.
void insert_to_config | ( | const std::pair< std::string, config_destination_entry > & | new_entry | ) |
Inserts rule entry to server configuration. Creates underlying classes and loads database from disk if necessary.
[in] | new_entry | std::pair<> of host name and it's settings |
int main | ( | int | argc, | |
char ** | argv | |||
) |
void pipe_cb | ( | int | fd, | |
short | event_type, | |||
void * | arg | |||
) |
Called each time there is event to add.
uint32_t protocol_core | ( | client_s * | cli, | |
char * | input_buffer, | |||
uint32_t | size | |||
) |
Main function to parse the received data and call proper procedure.
[in] | cli | client who received something |
[in] | input_buffer | buffer pointer |
[in] | size | total buffer length |
void protocol_limit_server_protocol_register | ( | client_s * | cli, | |
char * | input_buffer, | |||
uint32_t | packet_size | |||
) |
void protocol_limit_server_request_uid | ( | client_s * | cli, | |
char * | input_buffer, | |||
uint32_t | packet_size | |||
) |
void protocol_limit_server_update_dest_host_send_diff | ( | client_s * | cli, | |
char * | input_buffer, | |||
uint32_t | packet_size | |||
) |
void protocol_limit_server_update_diff | ( | client_s * | cli, | |
char * | input_buffer, | |||
uint32_t | packet_size | |||
) |
void read_cb | ( | int | fd, | |
short | event_type, | |||
void * | arg | |||
) |
Reads data from socket and cuts them into packets.
[in] | fd | fd from which data are avialable |
[in] | event_type | unused |
[in] | arg | client related with this event |
void read_local_config | ( | const char * | conf_file_name | ) |
Parses config.txt file.
void register_proxy | ( | limit_server_register_t * | data, | |
client_t * | cli | |||
) |
Registers proxy server. It will be added to proxy list or updated if already present.
[in] | data | Packet, containing server name used to distinguish servers. |
[in] | cli | Client context used by this proxy server. |
void reload_config | ( | ) |
Reloads configuration. Called if SIGUSR1 was received. Will call parse_config(rules_file) to fetch new configuration, then
.
void send_data_cb | ( | int | fd, | |
short | event_type, | |||
void * | arg | |||
) |
Callback run every time there is something to send in output buffer. It attempts to send next buffer from cli->packets_to_send.
[in] | fd | File descriptor on which event occured. |
[in] | event_type | unused |
[in] | arg | Client context used by fd (as void*) |
void send_packet_to_all_servers | ( | buf_el | packet | ) |
Enqueues packet to all connected servers.
[in] | packet | packet that will be send |
void update_cb | ( | int | fd, | |
short | event_type, | |||
void * | arg | |||
) |
Callback run by timer. It starts diff process. Also, changes current mouth variable.
[in] | listener_socket | |
[in] | event_type | |
[in] | arg |
void* worker | ( | void * | arg | ) |
Worker thread. Enters libevent loop, and should never leave it.
[in] | arg | thread Index (converted to pointer type) |
int curr_month = 0 |
Variable identifying current month (1-12)
int daemonize |
char db_prefix[1024] |
int last_thread = 0 |
int listener_socket |
HashMap<t_uid ,dest_config*> local_config(hashFunction) |
char log_common[1024] |
char log_error[1024] |
int main_server_port |
pthread_mutex_t mutex_queue[RECV_THREAD_AMOUNT] |
const char* NOTIFY = "1" |
pthread_mutex_t parse_synchronization = PTHREAD_MUTEX_INITIALIZER |
bool pending_reload = false |
int pipe_queue[RECV_THREAD_AMOUNT][2] |
std::list<proxy_server*> proxies |
char rules_file[1024] |
pthread_t thread_ids[RECV_THREAD_AMOUNT] |
struct event_base* thread_loops[RECV_THREAD_AMOUNT] |
int thread_usage[RECV_THREAD_AMOUNT] |
pthread_mutex_t thread_usage_guard = PTHREAD_MUTEX_INITIALIZER |
struct timeval tv |
int update_interval |