From 891eff09deca8a32bb47357dc27aaa3556bfd88f Mon Sep 17 00:00:00 2001 From: Jeffrey Townsend Date: Wed, 2 Mar 2016 01:58:47 +0000 Subject: [PATCH] Platform Manager Enhancements - Run onlpd in platform manager mode. - onlpd service init. - Add onlpd service to rfs builds. --- packages/base/any/onlp/APKG.yml | 2 + packages/base/any/onlp/builds/onlp/Makefile | 2 + packages/base/any/onlp/builds/onlpd/Makefile | 5 +- .../any/onlp/src/onlp/module/inc/onlp/sys.h | 21 +++-- .../any/onlp/src/onlp/module/src/onlp_main.c | 91 ++++++++++++++++++- .../src/onlp/module/src/platform_manager.c | 25 ++++- 6 files changed, 130 insertions(+), 16 deletions(-) diff --git a/packages/base/any/onlp/APKG.yml b/packages/base/any/onlp/APKG.yml index c9e3fbb4..b0d91c6a 100644 --- a/packages/base/any/onlp/APKG.yml +++ b/packages/base/any/onlp/APKG.yml @@ -26,6 +26,8 @@ packages: builds/onlp-platform-defaults/$BUILD_DIR/${TOOLCHAIN}/bin/libonlp-platform-defaults.so : $libdir/ builds/onlpd/$BUILD_DIR/${TOOLCHAIN}/bin/onlpd : $bindir/ + init: $ONL/packages/base/any/onlp/src/onlpd.init + changelog: Change changes changes., diff --git a/packages/base/any/onlp/builds/onlp/Makefile b/packages/base/any/onlp/builds/onlp/Makefile index f2918840..fb0df874 100644 --- a/packages/base/any/onlp/builds/onlp/Makefile +++ b/packages/base/any/onlp/builds/onlp/Makefile @@ -44,6 +44,8 @@ GLOBAL_CFLAGS += -DAIM_CONFIG_INCLUDE_CTOR_DTOR=1 GLOBAL_CFLAGS += -DAIM_CONFIG_INCLUDE_MODULES_INIT=1 GLOBAL_CFLAGS += -DONLP_CONFIG_API_LOCK_GLOBAL_SHARED=1 GLOBAL_CFLAGS += -DONLP_CONFIG_INCLUDE_SHLOCK_GLOBAL_INIT=1 +GLOBAL_CFLAGS += -DAIM_CONFIG_INCLUDE_PVS_SYSLOG=1 +GLOBAL_CFLAGS += -DAIM_CONFIG_INCLUDE_DAEMONIZE=1 GLOBAL_CFLAGS += -fPIC GLOBAL_LINK_LIBS += -lpthread $(LIBONLP_PLATFORM) $(LIBONLP_PLATFORM_DEFAULTS) diff --git a/packages/base/any/onlp/builds/onlpd/Makefile b/packages/base/any/onlp/builds/onlpd/Makefile index 0a3a9d49..258bd9f7 100644 --- a/packages/base/any/onlp/builds/onlpd/Makefile +++ b/packages/base/any/onlp/builds/onlpd/Makefile @@ -40,8 +40,11 @@ LIBONLP_SO := ../onlp/$(BUILD_DIR)/bin/libonlp.so GLOBAL_CFLAGS += -DAIM_CONFIG_AIM_MAIN_FUNCTION=onlpdump_main GLOBAL_CFLAGS += -DAIM_CONFIG_INCLUDE_MODULES_INIT=1 GLOBAL_CFLAGS += -DAIM_CONFIG_INCLUDE_MAIN=1 +GLOBAL_CFLAGS += -DAIM_CONFIG_INCLUDE_DAEMONIZE=1 +GLOBAL_CFLAGS += -DAIM_CONFIG_INCLUDE_PVS_SYSLOG=1 + GLOBAL_LINK_LIBS += $(LIBONLP_SO) -Wl,--unresolved-symbols=ignore-in-shared-libs -GLOBAL_LINK_LIBS += -lpthread -lm +GLOBAL_LINK_LIBS += -lpthread -lm -lrt include $(BUILDER)/targets.mk diff --git a/packages/base/any/onlp/src/onlp/module/inc/onlp/sys.h b/packages/base/any/onlp/src/onlp/module/inc/onlp/sys.h index 1d9029ee..8d12781f 100644 --- a/packages/base/any/onlp/src/onlp/module/inc/onlp/sys.h +++ b/packages/base/any/onlp/src/onlp/module/inc/onlp/sys.h @@ -1,21 +1,21 @@ /************************************************************ * - * - * Copyright 2014, 2015 Big Switch Networks, Inc. - * + * + * Copyright 2014, 2015 Big Switch Networks, Inc. + * * Licensed under the Eclipse Public License, Version 1.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.eclipse.org/legal/epl-v10.html - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific * language governing permissions and limitations under the * License. - * + * * ************************************************************ * @@ -96,12 +96,17 @@ int onlp_sys_vioctl(int code, va_list vargs); /** * @brief Start the platform management thread. */ -int onlp_sys_platform_manage_start(void); +int onlp_sys_platform_manage_start(int block); /** * @brief Stop the platform management thread. */ -int onlp_sys_platform_manage_stop(void); +int onlp_sys_platform_manage_stop(int block); + +/** + * @brief Join the platform management thread. + */ +int onlp_sys_platform_manage_join(void); /** * @brief Perform any pending platform management activities. diff --git a/packages/base/any/onlp/src/onlp/module/src/onlp_main.c b/packages/base/any/onlp/src/onlp/module/src/onlp_main.c index f1343487..990d8a54 100644 --- a/packages/base/any/onlp/src/onlp/module/src/onlp_main.c +++ b/packages/base/any/onlp/src/onlp/module/src/onlp_main.c @@ -28,6 +28,10 @@ #include #include #include +#include +#include + +static void platform_manager_daemon__(const char* pidfile); /** * Human-readable SFP inventory. @@ -165,10 +169,12 @@ onlpdump_main(int argc, char* argv[]) int x = 0; int S = 0; int l = 0; + int M = 0; + char* pidfile = NULL; const char* O = NULL; const char* t = NULL; - while( (c = getopt(argc, argv, "srehdojmipxlSt:O:")) != -1) { + while( (c = getopt(argc, argv, "srehdojmM:ipxlSt:O:")) != -1) { switch(c) { case 's': show=1; break; @@ -180,6 +186,7 @@ onlpdump_main(int argc, char* argv[]) case 'o': o=1; break; case 'x': x=1; break; case 'm': m=1; break; + case 'M': M=1; pidfile = optarg; break; case 'i': i=1; break; case 'p': p=1; show=-1; break; case 't': t = optarg; break; @@ -190,6 +197,11 @@ onlpdump_main(int argc, char* argv[]) } } + if(M) { + platform_manager_daemon__(pidfile); + exit(0); + } + if(help) { printf("Usage: %s [OPTIONS]\n", argv[0]); printf(" -d Use dump(). This is the default.\n"); @@ -200,6 +212,7 @@ onlpdump_main(int argc, char* argv[]) printf(" -x Dump Platform Info only.\n"); printf(" -j Dump ONIE data in JSON format.\n"); printf(" -m Run platform manager.\n"); + printf(" -M Run as platform manager daemon.\n"); printf(" -i Iterate OIDs.\n"); printf(" -p Show SFP presence.\n"); printf(" -t Decode TlvInfo data.\n"); @@ -302,10 +315,10 @@ onlpdump_main(int argc, char* argv[]) if(m) { printf("Running the platform manager for 600 seconds...\n"); - onlp_sys_platform_manage_start(); + onlp_sys_platform_manage_start(0); sleep(600); printf("Stopping the platform manager.\n"); - onlp_sys_platform_manage_stop(); + onlp_sys_platform_manage_stop(1); } if(p) { @@ -323,3 +336,75 @@ onlpdump_main(int argc, char* argv[]) return 0; } + +#if AIM_CONFIG_INCLUDE_DAEMONIZE == 1 + +#include +#include +#include +#include + +void +sighandler__(int signal) +{ + onlp_sys_platform_manage_stop(0); +} + +static void +platform_manager_daemon__(const char* pidfile) +{ + aim_pvs_t* aim_pvs_syslog = NULL; + aim_daemon_restart_config_t rconfig; + aim_daemon_config_t config; + + memset(&config, 0, sizeof(config)); + aim_daemon_restart_config_init(&rconfig, 1, 1); + AIM_BITMAP_CLR(&rconfig.signal_restarts, SIGTERM); + AIM_BITMAP_CLR(&rconfig.exit_restarts, 0); + rconfig.maximum_restarts=50; + rconfig.pvs = NULL; + config.wd = "/"; + + aim_daemonize(&config, &rconfig); + aim_log_handler_basic_init_all("onlpd", + "/var/log/onlpd.log", + 1024*1024, + 99); + if(pidfile) { + FILE* fp = fopen(pidfile, "w"); + if(fp == NULL) { + int e = errno; + aim_printf(aim_pvs_syslog, "fatal: open(%s): %s\n", + pidfile, strerror(e)); + aim_printf(&aim_pvs_stderr, "fatal: open(%s): %s\n", + pidfile, strerror(e)); + + /* Don't attempt restart */ + raise(SIGTERM); + } + fprintf(fp, "%d\n", getpid()); + fclose(fp); + } + + /** Signal handler for terminating the platform manager */ + signal(SIGTERM, sighandler__); + + /** Start and block in platform manager. */ + onlp_sys_platform_manage_start(1); + + /** Terminated via signal. Cleanup and exit. */ + onlp_sys_platform_manage_stop(1); + + aim_log_handler_basic_denit_all(); + exit(0); +} + + +#else +static void +platform_manager_daemon__(const char* pidfile) +{ + fprintf(stderr, "Daemon mode not supported in this build."); + exit(1); +} +#endif diff --git a/packages/base/any/onlp/src/onlp/module/src/platform_manager.c b/packages/base/any/onlp/src/onlp/module/src/platform_manager.c index a2a884b2..16684832 100644 --- a/packages/base/any/onlp/src/onlp/module/src/platform_manager.c +++ b/packages/base/any/onlp/src/onlp/module/src/platform_manager.c @@ -228,7 +228,7 @@ onlp_sys_platform_manage_thread__(void* vctrl) } int -onlp_sys_platform_manage_start(void) +onlp_sys_platform_manage_start(int block) { onlp_sys_platform_manage_init(); @@ -250,22 +250,39 @@ onlp_sys_platform_manage_start(void) return -1; } + if(block) { + onlp_sys_platform_manage_join(); + } + return 0; } int -onlp_sys_platform_manage_stop(void) +onlp_sys_platform_manage_stop(int block) { if(control__.eventfd > 0) { uint64_t zero = 1; /* Tell the thread to exit */ write(control__.eventfd, &zero, sizeof(zero)); - /* Wait for the thread to terminate */ - pthread_join(control__.thread, NULL); + + if(block) { + onlp_sys_platform_manage_join(); + } } return 0; } +int +onlp_sys_platform_manage_join(void) +{ + if(control__.eventfd > 0) { + /* Wait for the thread to terminate */ + pthread_join(control__.thread, NULL); + close(control__.eventfd); + control__.eventfd = -1; + } + return 0; +} static int platform_psus_notify__(void)