11 #include <libconfig.h++>
12 #include <boost/asio.hpp>
14 #include "spdlog/async.h"
15 #include "spdlog/spdlog.h"
16 #include "spdlog/sinks/syslog_sink.h"
22 using libconfig::Config;
23 using libconfig::FileIOException;
24 using libconfig::ParseException;
26 using std::placeholders::_1;
27 using std::placeholders::_2;
28 using std::placeholders::_3;
30 static void print_version(FILE *stream,
struct argp_state *state);
33 static char doc[] =
"FLUTE/ALC receiver demo";
35 static struct argp_option
options[] = {
36 {
"interface",
'i',
"IF", 0,
"IP address of the interface to bind flute receivers to (default: 0.0.0.0)", 0},
37 {
"target",
'm',
"IP", 0,
"Multicast address to receive on (default: 238.1.1.95)", 0},
38 {
"port",
'p',
"PORT", 0,
"Multicast port (default: 40085)", 0},
39 {
"ipsec-key",
'k',
"KEY", 0,
"To enable IPSec/ESP decryption of packets, provide a hex-encoded AES key here", 0},
40 {
"log-level",
'l',
"LEVEL", 0,
41 "Log verbosity: 0 = trace, 1 = debug, 2 = info, 3 = warn, 4 = error, 5 = "
42 "critical, 6 = none. Default: 2.",
44 {
nullptr, 0,
nullptr, 0,
nullptr, 0}};
62 static auto parse_opt(
int key,
char *arg,
struct argp_state *state) -> error_t {
63 auto arguments =
static_cast<struct
ft_arguments *
>(state->input);
69 arguments->flute_interface = arg;
72 arguments->aes_key = arg;
73 arguments->enable_ipsec =
true;
76 arguments->mcast_port =
static_cast<unsigned short>(strtoul(arg,
nullptr, 10));
79 arguments->log_level =
static_cast<unsigned>(strtoul(arg,
nullptr, 10));
82 return ARGP_ERR_UNKNOWN;
88 nullptr,
nullptr,
nullptr};
94 fprintf(stream,
"1.0.0\n");
106 auto main(
int argc,
char **argv) ->
int {
113 argp_parse(&
argp, argc, argv, 0,
nullptr, &arguments);
116 std::string ident =
"flute-receiver";
117 auto syslog_logger = spdlog::syslog_logger_mt(
"syslog", ident, LOG_PID | LOG_PERROR | LOG_CONS );
120 static_cast<spdlog::level::level_enum
>(arguments.
log_level));
121 spdlog::set_pattern(
"[%H:%M:%S.%f %z] [%^%l%$] [thr %t] %v");
123 spdlog::set_default_logger(syslog_logger);
124 spdlog::info(
"FLUTE receiver demo starting up");
127 boost::asio::io_service io;
144 [](std::shared_ptr<LibFlute::File> file) {
145 spdlog::info(
"{} (TOI {}) has been received",
146 file->meta().content_location, file->meta().toi);
147 FILE* fd = fopen(file->meta().content_location.c_str(),
"wb");
148 fwrite(file->buffer(), 1, file->length(), fd);
void register_completion_callback(completion_callback_t cb)
Register a callback for file reception notifications.
void enable_ipsec(uint32_t spi, const std::string &aes_key)
Enable IPSEC ESP decryption of FLUTE payloads.
static void print_version(FILE *stream, struct argp_state *state)
Print the program version in MAJOR.MINOR.PATCH format.
auto main(int argc, char **argv) -> int
Main entry point for the program.
const char * argp_program_bug_address
static struct argp_option options[]
void(* argp_program_version_hook)(FILE *, struct argp_state *)
static auto parse_opt(int key, char *arg, struct argp_state *state) -> error_t
Parses the command line options into the arguments struct.
Holds all options passed on the command line.
unsigned log_level
log level
const char * mcast_target
unsigned short mcast_port
const char * flute_interface
file path of the config file.