Add proc files for http server & mdp udp ports

This commit is contained in:
Jeremy Lakeman 2014-02-24 16:47:16 +10:30
parent ae67dd9c56
commit 33cbc98300
7 changed files with 69 additions and 19 deletions

View File

@ -343,6 +343,7 @@ END_ARRAY(5)
STRUCT(mdp)
SUB_STRUCT(mdp_iftypelist, iftype,)
ATOM(bool_t, enable_inet, 0, boolean,, "If true, allow mdp clients to connect over loopback UDP")
END_STRUCT
STRUCT(olsr)

View File

@ -205,6 +205,7 @@ error:
return WHY("Failed to start HTTP server");
success:
server_write_proc_state("http_port", "%d\n", port);
INFOF("HTTP SERVER START port=%"PRIu16" fd=%d services=RESTful%s%s",
port,
httpd_server_socket,

View File

@ -177,25 +177,42 @@ int overlay_mdp_setup_sockets()
watch(&mdp_sock2);
}
if (mdp_sock2_inet.poll.fd == -1) {
const char *port_str = getenv("SERVAL_MDP_INET_PORT");
if (port_str){
int fd = esocket(PF_INET, SOCK_DGRAM, 0);
if (fd>=0){
struct socket_address addr;
addr.addrlen = sizeof(addr.inet);
addr.inet.sin_family = AF_INET;
addr.inet.sin_port = htons(atoi(port_str));
addr.inet.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
if (socket_bind(fd, &addr)==0){
if (mdp_sock2_inet.poll.fd == -1 && config.mdp.enable_inet) {
int fd = esocket(PF_INET, SOCK_DGRAM, 0);
if (fd>=0){
// try to find a free UDP port somewhere between 4210 & 4260
uint16_t start_port = 4210;
struct socket_address addr;
addr.addrlen = sizeof(addr.inet);
addr.inet.sin_family = AF_INET;
addr.inet.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
const char *port_str = getenv("SERVAL_MDP_INET_PORT");
if (port_str)
start_port = atoi(port_str);
uint16_t end_port = start_port+50;
uint16_t port;
for (port = start_port; port<=end_port; port++){
addr.inet.sin_port = htons(port);
if (bind(fd, &addr.addr, addr.addrlen)!=-1){
mdp_sock2_inet.poll.fd = fd;
fd = -1;
mdp_sock2_inet.poll.events = POLLIN;
watch(&mdp_sock2_inet);
server_write_proc_state("mdp_inet_port", "%d\n", port);
INFOF("Socket mdp.2.inet: fd=%d %s", fd, alloca_socket_address(&addr));
}else{
close(fd);
break;
}
if (errno != EADDRINUSE)
WHY_perror("bind");
}
if (fd!=-1)
close(fd);
}
}
return 0;

View File

@ -306,6 +306,7 @@ int server_pid();
void server_save_argv(int argc, const char *const *argv);
int server(const struct cli_parsed *parsed);
int server_write_pid();
int server_write_proc_state(const char *path, const char *fmt, ...);
int server_create_stopfile();
int server_remove_stopfile();
int server_check_stopfile();

View File

@ -20,6 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include <signal.h>
#include <unistd.h>
#include <time.h>
#include <libgen.h>
#include <sys/socket.h>
#include <sys/stat.h>
@ -135,6 +136,34 @@ int server_write_pid()
return 0;
}
int server_write_proc_state(const char *path, const char *fmt, ...)
{
char path_buf[400];
strbuf sbname = strbuf_local(path_buf, sizeof path_buf);
strbuf_path_join(sbname, serval_instancepath(), "proc", path, NULL);
if (strbuf_overrun(sbname))
return WHY("Buffer overrun building proc filename");
char *name = strbuf_str(sbname);
size_t dirsiz = strlen(name) + 1;
char dir_buf[dirsiz];
strcpy(dir_buf, name);
const char *dir = dirname(dir_buf); // modifies dir_buf[]
if (mkdirs(dir, 0700) == -1)
return WHY_perror("mkdirs()");
FILE *f = fopen(name, "w");
va_list ap;
va_start(ap, fmt);
vfprintf(f, fmt, ap);
va_end(ap);
fclose(f);
return 0;
}
/* Called periodically by the server process in its main loop.
*/
void server_config_reload(struct sched_ent *alarm)

View File

@ -347,10 +347,10 @@ rhizome_http_server_started() {
}
get_rhizome_server_port() {
set_instance $2
local _var="$1"
local _logvar=LOG${2#+}
local _port=$($SED -n -e '/HTTP SERVER START/s/.*port=\([0-9]\{1,\}\).*services=[^ ]*\<Rhizome\>.*/\1/p' "${!_logvar}" | $SED -n '$p')
assert --message="instance $2 Rhizome HTTP server port number is known" [ -n "$_port" ]
local _port=$(<"$SERVALINSTANCE_PATH/proc/http_port")
assert --message="instance $instance_name Rhizome HTTP server port number is known" [ -n "$_port" ]
if [ -n "$_var" ]; then
eval "$_var=\$_port"
tfw_log "$_var=$_port"

View File

@ -113,8 +113,9 @@ doc_DnaLookup="DNA Lookup via JNI MDP API"
setup_DnaLookup() {
configure_servald_server() {
add_servald_interface
executeOk_servald config set debug.mdprequests on
export SERVAL_MDP_INET_PORT="411$instance_number"
executeOk_servald config \
set debug.mdprequests on \
set mdp.enable_inet on
}
setup
set_instance +A
@ -123,7 +124,7 @@ setup_DnaLookup() {
set_instance +A
}
test_DnaLookup() {
export SERVAL_MDP_INET_PORT="411$instance_number"
export SERVAL_MDP_INET_PORT=$(<"$SERVALINSTANCE_PATH/proc/mdp_inet_port")
execute --timeout=10 --core-backtrace java "-Djava.library.path=$LD_LIBRARY_PATH" -classpath "$PWD/classes" org.servalproject.test.CommandLine 'lookup'
assertStdoutGrep "$SIDB"
tfw_cat --stdout --stderr