diff --git a/include/logger.h b/include/logger.h new file mode 100644 index 0000000000000000000000000000000000000000..c4b28989929b635ecf49fb54d1d9888fa8e47111 --- /dev/null +++ b/include/logger.h @@ -0,0 +1,19 @@ +/* + * File: logger.h + * Author: Eckl Máté <ecklm94@gmail.com> + * + * Created on 2016. május 24., 13:50 + */ + +#ifndef LOGGER_H +#define LOGGER_H + +#include <syslog.h> + +#define LOGGER_FUNCTION_HEADER(func_name) void (func_name)(int __pri, const char *__fmt, ...) + +typedef LOGGER_FUNCTION_HEADER(*logger); + +LOGGER_FUNCTION_HEADER(syslog_on_demand); +LOGGER_FUNCTION_HEADER(stdlog_on_demand); +#endif /* LOGGER_H */ diff --git a/main.cpp b/main.cpp index 9aa132aebbd525966b563ba37d121148fbbee2b1..805ed071d55cec2175cad7b167bcb40c8304f437 100644 --- a/main.cpp +++ b/main.cpp @@ -5,16 +5,66 @@ * Created on 2016. április 19., 12:59 */ -#include <stdio.h> #include <string.h> #include <string> +#include <unistd.h> +#include <errno.h> +#include <sys/types.h> +#include <pwd.h> #include "include/general_sockaddr_wp.h" #include "include/dns_server.h" #include "include/exceptions/db_exception.h" +#include "include/logger.h" + +#define WORKING_DIR "/home/mate/Dokumentumok/Egyetem/Tárgyak/2016 tavasz/Linux programozás/HF/DNS_server" + +logger log_on_demand; + +bool run_as_daemon = false; + +void parse_options(int argc, char *argv[]); +void print_help(); int main(int argc, char *argv[]) { + parse_options(argc, argv); + if(!run_as_daemon) + { + log_on_demand = stdlog_on_demand; + } + else + { + openlog("ecklm-dns", LOG_PID, LOG_DAEMON); + log_on_demand = syslog_on_demand; +#ifdef DEBUG // ezt az egész mókát parancssori paraméterektől kell majd függővé tenni + if(daemon(0,1) < 0) +#else + if(daemon(0,0) < 0) +#endif + { + log_on_demand(LOG_ERR, "%s: %s\n", "daemon", strerror(errno)); + exit(EXIT_FAILURE); + } + } + log_on_demand(LOG_INFO, "Server started on pid %d\n", getpid()); // Enélkül nem hajlandó sudo után logolni. + + struct passwd *new_uid = getpwnam("dnsuser"); + + if(chroot(WORKING_DIR) < 0) + { + log_on_demand(LOG_ERR, "%s: %s\n", "chroot", strerror(errno)); + exit(EXIT_SUCCESS); + } + log_on_demand(LOG_INFO, "Chrooted to \"%s\"\n", WORKING_DIR); + if(chdir("/") < 0) + { + log_on_demand(LOG_ERR, "%s: %s\n", "chdir", strerror(errno)); + exit(EXIT_FAILURE); + } + setgid(new_uid->pw_gid); + setuid(new_uid->pw_uid); + // --------------- INIT --------------------- dns_server server; try @@ -23,12 +73,12 @@ int main(int argc, char *argv[]) } catch(db_exception ex) { - printf(ex.what()); + log_on_demand(LOG_ERR, "%s\n", ex.what()); exit(EXIT_FAILURE); } // Init server - struct in6_addr in6_addr_any = IN6ADDR_LOOPBACK_INIT; + struct in6_addr in6_addr_any = IN6ADDR_ANY_INIT; //IN6ADDR_LOOPBACK_INIT; struct sockaddr_in6 server_address; memset(&server_address, 0, sizeof(server_address)); server_address.sin6_family = AF_INET6; @@ -37,17 +87,65 @@ int main(int argc, char *argv[]) #ifdef DEBUG static char addr[INET6_ADDRSTRLEN]; inet_ntop(server_address.sin6_family, &server_address.sin6_addr, addr, INET6_ADDRSTRLEN); - printf("%s\n",addr); + log_on_demand(LOG_DEBUG, "Server started serving on: %s\n",addr); #endif server.init(general_sockaddr_wp((sockaddr *) &server_address, sizeof(server_address))); // ----------------- INIT END -------------------------- // ------------------ SERVE ---------------------------- server.serve_one_request(); -// ------------------ SERVE END ------------------------- +// ---------------- SERVE END ------------------------- // ------------------- SHUTDOWN ------------------------- server.shutdown(); // ----------------- SHUTDOWN END ----------------------- exit(EXIT_SUCCESS); } + +void parse_options(int argc, char *argv[]) { + int o; + while((o = getopt (argc, argv, "dmskvh")) != -1) + { + switch(o) + { + case 'd': + run_as_daemon = true; + break; + case 'm': + throw "Not implemented"; + break; + case 's': + throw "Not implemented"; + break; + case 'k': + throw "Not implemented"; + break; + case 'v': + throw "Not implemented"; + break; + case 'h': + print_help(); + exit(EXIT_SUCCESS); + case '?': + print_help(); + exit(EXIT_FAILURE); + break; + default: + break; + } + } +} + +void print_help() { + printf(R"(Usage: Runs in foreground mode by default. +For more info look at the man page. + +Options: + -d Run as daemon + -m Monitor daemon + -s Statistics from daemon + -k Kill daemon + -v Verbose + -h help +)"); +} diff --git a/nbproject/Makefile-Debug.mk b/nbproject/Makefile-Debug.mk index 1ac0a6a39740c6163dd900386610344410f7adbf..aac2278f7be95696e1df5b823c2b480069a4ec21 100644 --- a/nbproject/Makefile-Debug.mk +++ b/nbproject/Makefile-Debug.mk @@ -43,6 +43,7 @@ OBJECTFILES= \ ${OBJECTDIR}/src/dns_server.o \ ${OBJECTDIR}/src/dns_types.o \ ${OBJECTDIR}/src/general_sockaddr_wp.o \ + ${OBJECTDIR}/src/logger.o \ ${OBJECTDIR}/src/udp_packet_wp.o \ ${OBJECTDIR}/src/udp_socket_wp.o @@ -74,52 +75,57 @@ ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/dns_server: ${OBJECTFILES} ${OBJECTDIR}/main.o: main.cpp ${MKDIR} -p ${OBJECTDIR} ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/main.o main.cpp + $(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/main.o main.cpp ${OBJECTDIR}/src/dns_answer.o: src/dns_answer.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_answer.o src/dns_answer.cpp + $(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_answer.o src/dns_answer.cpp ${OBJECTDIR}/src/dns_db.o: src/dns_db.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_db.o src/dns_db.cpp + $(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_db.o src/dns_db.cpp ${OBJECTDIR}/src/dns_message.o: src/dns_message.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_message.o src/dns_message.cpp + $(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_message.o src/dns_message.cpp ${OBJECTDIR}/src/dns_question.o: src/dns_question.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_question.o src/dns_question.cpp + $(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_question.o src/dns_question.cpp ${OBJECTDIR}/src/dns_server.o: src/dns_server.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_server.o src/dns_server.cpp + $(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_server.o src/dns_server.cpp ${OBJECTDIR}/src/dns_types.o: src/dns_types.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_types.o src/dns_types.cpp + $(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_types.o src/dns_types.cpp ${OBJECTDIR}/src/general_sockaddr_wp.o: src/general_sockaddr_wp.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/general_sockaddr_wp.o src/general_sockaddr_wp.cpp + $(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/general_sockaddr_wp.o src/general_sockaddr_wp.cpp + +${OBJECTDIR}/src/logger.o: src/logger.cpp + ${MKDIR} -p ${OBJECTDIR}/src + ${RM} "$@.d" + $(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/logger.o src/logger.cpp ${OBJECTDIR}/src/udp_packet_wp.o: src/udp_packet_wp.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/udp_packet_wp.o src/udp_packet_wp.cpp + $(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/udp_packet_wp.o src/udp_packet_wp.cpp ${OBJECTDIR}/src/udp_socket_wp.o: src/udp_socket_wp.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" - $(COMPILE.cc) -g -Wall -DDEBUG -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/udp_socket_wp.o src/udp_socket_wp.cpp + $(COMPILE.cc) -g -Wall -DDEBUG -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/udp_socket_wp.o src/udp_socket_wp.cpp # Subprojects .build-subprojects: diff --git a/nbproject/Makefile-Release.mk b/nbproject/Makefile-Release.mk index 3d303271de39de10cdf03b969ee5e7691e25dd70..2f2dbcb807fdb495da55266d559448a4fcddff45 100644 --- a/nbproject/Makefile-Release.mk +++ b/nbproject/Makefile-Release.mk @@ -43,6 +43,7 @@ OBJECTFILES= \ ${OBJECTDIR}/src/dns_server.o \ ${OBJECTDIR}/src/dns_types.o \ ${OBJECTDIR}/src/general_sockaddr_wp.o \ + ${OBJECTDIR}/src/logger.o \ ${OBJECTDIR}/src/udp_packet_wp.o \ ${OBJECTDIR}/src/udp_socket_wp.o @@ -74,52 +75,57 @@ ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/dns_server: ${OBJECTFILES} ${OBJECTDIR}/main.o: main.cpp ${MKDIR} -p ${OBJECTDIR} ${RM} "$@.d" - $(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/main.o main.cpp + $(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/main.o main.cpp ${OBJECTDIR}/src/dns_answer.o: src/dns_answer.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" - $(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_answer.o src/dns_answer.cpp + $(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_answer.o src/dns_answer.cpp ${OBJECTDIR}/src/dns_db.o: src/dns_db.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" - $(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_db.o src/dns_db.cpp + $(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_db.o src/dns_db.cpp ${OBJECTDIR}/src/dns_message.o: src/dns_message.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" - $(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_message.o src/dns_message.cpp + $(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_message.o src/dns_message.cpp ${OBJECTDIR}/src/dns_question.o: src/dns_question.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" - $(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_question.o src/dns_question.cpp + $(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_question.o src/dns_question.cpp ${OBJECTDIR}/src/dns_server.o: src/dns_server.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" - $(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_server.o src/dns_server.cpp + $(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_server.o src/dns_server.cpp ${OBJECTDIR}/src/dns_types.o: src/dns_types.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" - $(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_types.o src/dns_types.cpp + $(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/dns_types.o src/dns_types.cpp ${OBJECTDIR}/src/general_sockaddr_wp.o: src/general_sockaddr_wp.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" - $(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/general_sockaddr_wp.o src/general_sockaddr_wp.cpp + $(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/general_sockaddr_wp.o src/general_sockaddr_wp.cpp + +${OBJECTDIR}/src/logger.o: src/logger.cpp + ${MKDIR} -p ${OBJECTDIR}/src + ${RM} "$@.d" + $(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/logger.o src/logger.cpp ${OBJECTDIR}/src/udp_packet_wp.o: src/udp_packet_wp.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" - $(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/udp_packet_wp.o src/udp_packet_wp.cpp + $(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/udp_packet_wp.o src/udp_packet_wp.cpp ${OBJECTDIR}/src/udp_socket_wp.o: src/udp_socket_wp.cpp ${MKDIR} -p ${OBJECTDIR}/src ${RM} "$@.d" - $(COMPILE.cc) -O2 -w -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/udp_socket_wp.o src/udp_socket_wp.cpp + $(COMPILE.cc) -O2 -w -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/src/udp_socket_wp.o src/udp_socket_wp.cpp # Subprojects .build-subprojects: diff --git a/src/dns_db.cpp b/src/dns_db.cpp index 66f28265818c2b4a477c6e3ddf88d99f7ca29805..31062449b5c480a0c7047bb933ef1183ddf8f2de 100644 --- a/src/dns_db.cpp +++ b/src/dns_db.cpp @@ -9,10 +9,13 @@ #include "../include/dns_types.h" #include "../include/exceptions/db_exception.h" #include "../include/exceptions/dns_exception.h" +#include "../include/logger.h" #include <string.h> #include <string> +extern logger log_on_demand; + using namespace std; bool dns_db::map_initialized = false; map<uint16_t, const char*> dns_db::readable_DNS_types; @@ -87,9 +90,9 @@ static int callback(void *param, int argc, char **argv, char **azColName) { strncpy(ret->content, argv[2], sizeof(ret->content)); ret->ttl = atoi(argv[3]); #ifdef DEBUG + log_on_demand(LOG_DEBUG, "Database hit:\n"); for(int i=0;i<argc;i++) - printf("%s = %s\n", azColName[i], argv[i]); - printf("\n"); + log_on_demand(LOG_DEBUG, "%s = %s\n", azColName[i], argv[i]); #endif return 0; } diff --git a/src/dns_server.cpp b/src/dns_server.cpp index a4efeb47bebe4331878caf032561812ab12135ed..bbdc969bab76dd57eeb6295805b49e668a62a1a8 100644 --- a/src/dns_server.cpp +++ b/src/dns_server.cpp @@ -9,6 +9,9 @@ #include "../include/dns_types.h" #include "../include/exceptions/db_exception.h" #include "../include/exceptions/dns_exception.h" +#include "../include/logger.h" + +extern logger log_on_demand; dns_server::dns_server(const general_sockaddr_wp& addr) { init(addr); @@ -52,7 +55,7 @@ void dns_server::serve_one_request() { #ifdef DEBUG static char buf[INET6_ADDRSTRLEN]; dns_label_sequence_to_str(query.question_body.get_name(), buf, INET6_ADDRSTRLEN); - printf("%s\n", buf); + log_on_demand(LOG_DEBUG, "DNS query received from %s\n", buf); #endif //dns response @@ -73,7 +76,7 @@ void dns_server::serve_one_request() { } catch(db_exception ex) { - printf("%s\n", ex.what()); + log_on_demand(LOG_ERR, "%s\n", ex.what()); } //--- diff --git a/src/logger.cpp b/src/logger.cpp new file mode 100644 index 0000000000000000000000000000000000000000..63866cb4a2f1e95ef6779f455390866899e3cc95 --- /dev/null +++ b/src/logger.cpp @@ -0,0 +1,25 @@ +#include "../include/logger.h" +#include <stdarg.h> +#include <stdio.h> + +LOGGER_FUNCTION_HEADER(syslog_on_demand) { + va_list args; + va_start(args, __fmt); + vsyslog(__pri, __fmt, args); + va_end(args); +} + +LOGGER_FUNCTION_HEADER(stdlog_on_demand) { + va_list args; + va_start(args, __fmt); + switch(__pri) + { + case LOG_INFO: + case LOG_DEBUG: + vprintf(__fmt, args); + break; + default: + vfprintf(stderr, __fmt, args); + } + va_end(args); +} \ No newline at end of file