http://git-wip-us.apache.org/repos/asf/trafficserver/blob/8197736c/mgmt/api/remote/CoreAPIRemote.cc ---------------------------------------------------------------------- diff --git a/mgmt/api/remote/CoreAPIRemote.cc b/mgmt/api/remote/CoreAPIRemote.cc deleted file mode 100644 index cb2ae5c..0000000 --- a/mgmt/api/remote/CoreAPIRemote.cc +++ /dev/null @@ -1,843 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 - - 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. - */ - -/***************************************************************************** - * Filename: CoreAPIRemote.cc - * Purpose: Implementation of CoreAPI.h interface but from remote client - * perspective, so must also add networking calls. Basically, any - * TSMgmtAPI calls which are "special" for remote clients - * need to be implemented here. - * Note: For remote implementation of this interface, most functions will: - * 1) marshal: create the message to send across network - * 2) connect and send request - * 3) unmarshal: parse the reply (checking for TSError) - * - * Created: lant - * - ***************************************************************************/ - -#include "ink_config.h" -#include "ink_defs.h" -#include <strings.h> -#include "ink_string.h" -#include "I_Layout.h" -#include "ParseRules.h" -#include "CoreAPI.h" -#include "CoreAPIShared.h" -#include "CfgContextUtils.h" -#include "NetworkUtilsRemote.h" -#include "NetworkUtilsDefs.h" -#include "EventRegistration.h" -#include "EventCallback.h" - -// extern variables -extern CallbackTable *remote_event_callbacks; // from EventRegistration -extern int main_socket_fd; // from NetworkUtils -extern int event_socket_fd; - -// forward declarations -TSError send_and_parse_basic(OpType op); -TSError send_and_parse_list(OpType op, LLQ * list); -TSError send_and_parse_name(OpType op, char *name); -TSError mgmt_record_set(const char *rec_name, const char *rec_val, TSActionNeedT * action_need); -bool start_binary(const char *abs_bin_path); - -// global variables -// need to store the thread id associated with socket_test_thread -// in case we want to explicitly stop/cancel the testing thread -ink_thread ts_test_thread; -ink_thread ts_event_thread; -TSInitOptionT ts_init_options; - -/*************************************************************************** - * Helper Functions - ***************************************************************************/ -/*------------------------------------------------------------------------- - * send_and_parse_basic (helper function) - *------------------------------------------------------------------------- - * helper function used by operations which only require sending a simple - * operation type and parsing a simple error return value - */ -TSError -send_and_parse_basic(OpType op) -{ - TSError err; - - err = send_request(main_socket_fd, op); - if (err != TS_ERR_OKAY) - return err; // networking error - - err = parse_reply(main_socket_fd); - - return err; -} - -/*------------------------------------------------------------------------- - * send_and_parse_list (helper function) - *------------------------------------------------------------------------- - * helper function used by operations which only require sending a simple - * operation type and parsing a string delimited list - * (delimited with REMOTE_DELIM_STR) and storing the tokens in the list - * parameter - */ -TSError -send_and_parse_list(OpType op, LLQ * list) -{ - TSError ret; - char *list_str; - const char *tok; - Tokenizer tokens(REMOTE_DELIM_STR); - tok_iter_state i_state; - - if (!list) - return TS_ERR_PARAMS; - - // create and send request - ret = send_request(main_socket_fd, op); - if (ret != TS_ERR_OKAY) - return ret; - - // parse the reply = delimited list of ids of active event names - ret = parse_reply_list(main_socket_fd, &list_str); - if (ret != TS_ERR_OKAY) - return ret; - - // tokenize the list_str and put into LLQ; use Tokenizer - if (!list_str) - return TS_ERR_FAIL; - - tokens.Initialize(list_str, COPY_TOKS); - tok = tokens.iterFirst(&i_state); - while (tok != NULL) { - enqueue(list, ats_strdup(tok)); // add token to LLQ - tok = tokens.iterNext(&i_state); - } - - ats_free(list_str); - return TS_ERR_OKAY; -} - -/*------------------------------------------------------------------------- - * send_and_parse_name (helper function) - *------------------------------------------------------------------------- - * helper function used by operations which only require sending a simple - * operation type with one string name argument and then parsing a simple - * TSError reply - * NOTE: name can be a NULL parameter! - */ -TSError -send_and_parse_name(OpType op, char *name) -{ - TSError ret; - - // create and send request - ret = send_request_name(main_socket_fd, op, name); - if (ret != TS_ERR_OKAY) - return ret; - - // parse the reply - ret = parse_reply(main_socket_fd); - - return ret; -} - - -/*------------------------------------------------------------------------- - * mgmt_record_set (helper function) - *------------------------------------------------------------------------- - * Helper function for all Set functions: - * NOTE: regardless of the type of the record being set, - * it is converted to a string. Then on the local side, the - * CoreAPI::MgmtRecordSet function will do the appropriate type - * converstion from the string to the record's type (eg. MgmtInt, MgmtString..) - * Hence, on the local side, don't have to worry about typecasting a - * void*. Just read out the string from socket and pass it MgmtRecordSet. - */ -TSError -mgmt_record_set(const char *rec_name, const char *rec_val, TSActionNeedT * action_need) -{ - TSError err; - - if (!rec_name || !rec_val || !action_need) - return TS_ERR_PARAMS; - - // create and send request - err = send_request_name_value(main_socket_fd, RECORD_SET, rec_name, rec_val); - if (err != TS_ERR_OKAY) - return err; - - // parse the reply to get TSError response and TSActionNeedT - err = parse_record_set_reply(main_socket_fd, action_need); - - return err; -} - - -/*------------------------------------------------------------------------- - * start_binary - *------------------------------------------------------------------------- - * helper function which calls the executable specified by abs_bin_path; - * used by HardRestart to call the stop/start_traffic_server scripts - * Output: returns false if fail, true if successful - */ -bool -start_binary(const char *abs_bin_path) -{ - TSDiags(TS_DIAG_NOTE, "[start_binary] abs_bin_path = %s", abs_bin_path); - // before doing anything, check for existence of binary and its execute - // permissions - if (access(abs_bin_path, F_OK) < 0) { - // ERROR: can't find binary - TSDiags(TS_DIAG_ERROR, "Cannot find executable %s", abs_bin_path); - return false; - } - // binary exists, check permissions - else if (access(abs_bin_path, R_OK | X_OK) < 0) { - // ERROR: doesn't have proper permissions - TSDiags(TS_DIAG_ERROR, "Cannot execute %s", abs_bin_path); - return false; - } - - if (system(abs_bin_path) == -1) { - TSDiags(TS_DIAG_ERROR, "Cannot system(%s)", abs_bin_path); - return false; - } - - return true; -} - - -/*************************************************************************** - * SetUp Operations - ***************************************************************************/ -TSError -Init(const char *socket_path, TSInitOptionT options) -{ - TSError err = TS_ERR_OKAY; - - ts_init_options = options; - - if (!socket_path) { - Layout::create(); - socket_path = Layout::get()->runtimedir; - } - - // store socket_path - set_socket_paths(socket_path); - - // need to ignore SIGPIPE signal; in the case that TM is restarted - signal(SIGPIPE, SIG_IGN); - - // EVENT setup - initialize callback queue - if (0 == (ts_init_options & TS_MGMT_OPT_NO_EVENTS)) { - remote_event_callbacks = create_callback_table("remote_callbacks"); - if (!remote_event_callbacks) - return TS_ERR_SYS_CALL; - } else { - remote_event_callbacks = NULL; - } - - // try to connect to traffic manager - // do this last so that everything else on client side is set up even if - // connection fails; this might happen if client is set up and running - // before TM - err = ts_connect(); - if (err != TS_ERR_OKAY) - goto END; - - // if connected, create event thread that listens for events from TM - if (0 == (ts_init_options & TS_MGMT_OPT_NO_EVENTS)) { - ts_event_thread = ink_thread_create(event_poll_thread_main, &event_socket_fd, 0, DEFAULT_STACK_SIZE); - } else { - ts_event_thread = static_cast<ink_thread>(NULL); - } - -END: - - // create thread that periodically checks the socket connection - // with TM alive - reconnects if not alive - if (0 == (ts_init_options & TS_MGMT_OPT_NO_SOCK_TESTS)) { - ts_test_thread = ink_thread_create(socket_test_thread, NULL, 0, DEFAULT_STACK_SIZE); - } else { - ts_test_thread = static_cast<ink_thread>(NULL); - } - - return err; - -} - -// does clean up for remote API client; destroy structures and disconnects -TSError -Terminate() -{ - TSError err; - - if (remote_event_callbacks) - delete_callback_table(remote_event_callbacks); - - // be sure to do this before reset socket_fd's - err = disconnect(); - if (err != TS_ERR_OKAY) - return err; - - // cancel the listening socket thread - // it's important to call this before setting paths to NULL because the - // socket_test_thread actually will try to reconnect() and this funntion - // will seg fault if the socket paths are NULL while it is connecting; - // the thread will be cancelled at a cancellation point in the - // socket_test_thread, eg. sleep - if (ts_test_thread) - ink_thread_cancel(ts_test_thread); - if (ts_event_thread) - ink_thread_cancel(ts_event_thread); - - // Before clear, we should confirm these - // two threads have finished. Or the clear - // operation may lead them crash. - if (ts_test_thread) - ink_thread_join(ts_test_thread); - if (ts_event_thread) - ink_thread_join(ts_event_thread); - - // Clear operation - ts_test_thread = static_cast<ink_thread>(NULL); - ts_event_thread = static_cast<ink_thread>(NULL); - set_socket_paths(NULL); // clear the socket_path - - return TS_ERR_OKAY; -} - -// ONLY have very basic diag functionality for remote cliets. -// When a remote client tries to use diags (wants to output runtime -// diagnostics, the diagnostics will be outputted to the machine -// the remote client is logged into (the one TM is running on) -void -Diags(TSDiagsT mode, const char *fmt, va_list ap) -{ - char diag_msg[MAX_BUF_SIZE]; - - // format the diag message now so it can be sent - // vsnprintf does not compile on DEC - vsnprintf(diag_msg, MAX_BUF_SIZE - 1, fmt, ap); - TSError ret = send_diags_msg(main_socket_fd, mode, diag_msg); - if (ret != TS_ERR_OKAY) { - //fprintf(stderr, "[Diags] error sending diags message\n"); - } -} - -/*************************************************************************** - * Control Operations - ***************************************************************************/ -TSProxyStateT -ProxyStateGet() -{ - TSError ret; - TSProxyStateT state; - - ret = send_request(main_socket_fd, PROXY_STATE_GET); - if (ret != TS_ERR_OKAY) // Networking error - return TS_PROXY_UNDEFINED; - - ret = parse_proxy_state_get_reply(main_socket_fd, &state); - if (ret != TS_ERR_OKAY) // Newtorking error - return TS_PROXY_UNDEFINED; - - return state; -} - -TSError -ProxyStateSet(TSProxyStateT state, TSCacheClearT clear) -{ - TSError ret; - - ret = send_proxy_state_set_request(main_socket_fd, state, clear); - if (ret != TS_ERR_OKAY) - return ret; // networking error - - ret = parse_reply(main_socket_fd); - - return ret; -} - -TSError -Reconfigure() -{ - return send_and_parse_basic(RECONFIGURE); -} - -/*------------------------------------------------------------------------- - * Restart - *------------------------------------------------------------------------- - * if restart of TM is successful, need to reconnect to TM; - * it's possible that the SUCCESS msg is received before the - * restarting of TM is totally complete(?) b/c the core Restart call - * only signals the event putting it in a msg queue; - * so keep trying to reconnect until successful or for MAX_CONN_TRIES - */ -TSError -Restart(bool cluster) -{ - TSError ret; - - ret = send_request_bool(main_socket_fd, RESTART, cluster); - if (ret != TS_ERR_OKAY) - return ret; // networking error - - ret = parse_reply(main_socket_fd); - - if (ret == TS_ERR_OKAY) { - ret = reconnect_loop(MAX_CONN_TRIES); - } - - return ret; -} - - -/*------------------------------------------------------------------------- - * HardRestart - *------------------------------------------------------------------------- - * Restarts Traffic Cop by using the stop_traffic_server, start_traffic_server script - */ -TSError -HardRestart() -{ - char start_path[1024]; - char stop_path[1024]; - - if (!Layout::get() || !Layout::get()->bindir) - return TS_ERR_FAIL; - // determine the path of where start and stop TS scripts stored - TSDiags(TS_DIAG_NOTE, "Root Directory: %s", Layout::get()->bindir); - - Layout::relative_to(start_path, sizeof(start_path), Layout::get()->bindir, "start_traffic_server"); - Layout::relative_to(stop_path, sizeof(stop_path), Layout::get()->bindir, "stop_traffic_server"); - - TSDiags(TS_DIAG_NOTE, "[HardRestart] start_path = %s", start_path); - TSDiags(TS_DIAG_NOTE, "[HardRestart] stop_path = %s", stop_path); - - if (!start_binary(stop_path)) // call stop_traffic_server script - return TS_ERR_FAIL; - - if (!start_binary(start_path)) // call start_traffic_server script - return TS_ERR_FAIL; - - return TS_ERR_OKAY; -} - -/*------------------------------------------------------------------------- - * Bounce - *------------------------------------------------------------------------- - * Restart the traffic_server process(es) only. - */ -TSError -Bounce(bool cluster) -{ - TSError ret; - - ret = send_request_bool(main_socket_fd, BOUNCE, cluster); - if (ret != TS_ERR_OKAY) - return ret; // networking error - - return parse_reply(main_socket_fd); -} - - -/*************************************************************************** - * Record Operations - ***************************************************************************/ -// note that the record value is being sent as chunk of memory, regardless of -// record type; it's not being converted to a string!! -TSError -MgmtRecordGet(const char *rec_name, TSRecordEle * rec_ele) -{ - TSError ret; - void *val; - - if (!rec_name || !rec_ele) - return TS_ERR_PARAMS; - - rec_ele->rec_name = ats_strdup(rec_name); - - // create and send request - ret = send_record_get_request(main_socket_fd, rec_ele->rec_name); - if (ret != TS_ERR_OKAY) - return ret; - - // parse the reply to get record value and type - ret = parse_record_get_reply(main_socket_fd, &(rec_ele->rec_type), &val); - if (ret != TS_ERR_OKAY) - return ret; - - // convert the record value to appropriate type - switch (rec_ele->rec_type) { - case TS_REC_INT: - rec_ele->int_val = *(TSInt *) val; - break; - case TS_REC_COUNTER: - rec_ele->counter_val = *(TSCounter *) val; - break; - case TS_REC_FLOAT: - rec_ele->float_val = *(TSFloat *) val; - break; - case TS_REC_STRING: - rec_ele->string_val = ats_strdup((char *) val); - break; - default: // ERROR - invalid record type - return TS_ERR_FAIL; - } - - ats_free(val); - return TS_ERR_OKAY; -} - - -TSError -MgmtRecordSet(const char *rec_name, const char *val, TSActionNeedT * action_need) -{ - TSError ret; - - if (!rec_name || !val || !action_need) - return TS_ERR_PARAMS; - - ret = mgmt_record_set(rec_name, val, action_need); - return ret; -} - -// first convert the MgmtInt into a string -// NOTE: use long long, not just long, MgmtInt = int64_t -TSError -MgmtRecordSetInt(const char *rec_name, MgmtInt int_val, TSActionNeedT * action_need) -{ - char str_val[MAX_RECORD_SIZE]; - TSError ret; - - if (!rec_name || !action_need) - return TS_ERR_PARAMS; - - bzero(str_val, MAX_RECORD_SIZE); - snprintf(str_val, sizeof(str_val), "%" PRId64 "", int_val); - ret = mgmt_record_set(rec_name, str_val, action_need); - - return ret; -} - -// first convert the MgmtIntCounter into a string -TSError -MgmtRecordSetCounter(const char *rec_name, MgmtIntCounter counter_val, TSActionNeedT * action_need) -{ - char str_val[MAX_RECORD_SIZE]; - TSError ret; - - if (!rec_name || !action_need) - return TS_ERR_PARAMS; - - bzero(str_val, MAX_RECORD_SIZE); - snprintf(str_val, sizeof(str_val), "%" PRId64 "", counter_val); - ret = mgmt_record_set(rec_name, str_val, action_need); - - return ret; -} - -// first convert the MgmtFloat into string -TSError -MgmtRecordSetFloat(const char *rec_name, MgmtFloat float_val, TSActionNeedT * action_need) -{ - char str_val[MAX_RECORD_SIZE]; - TSError ret; - - bzero(str_val, MAX_RECORD_SIZE); - if (snprintf(str_val, sizeof(str_val), "%f", float_val) < 0) - return TS_ERR_SYS_CALL; - ret = mgmt_record_set(rec_name, str_val, action_need); - - return ret; -} - - -TSError -MgmtRecordSetString(const char *rec_name, const char *string_val, TSActionNeedT * action_need) -{ - TSError ret; - - if (!rec_name || !action_need) - return TS_ERR_PARAMS; - - ret = mgmt_record_set(rec_name, string_val, action_need); - return ret; -} - - -/*************************************************************************** - * File Operations - ***************************************************************************/ -/*------------------------------------------------------------------------- - * ReadFile - *------------------------------------------------------------------------- - * Purpose: returns copy of the most recent version of the file - * Input: file - the config file to read - * text - a buffer is allocated on the text char* pointer - * size - the size of the buffer is returned - * Output: - * - * Marshals a read file request that can be sent over the unix domain socket. - * Connects to the socket and sends request over. Parses the response from - * Traffic Manager. - */ -TSError -ReadFile(TSFileNameT file, char **text, int *size, int *version) -{ - TSError ret; - - // marshal data into message request to be sent over socket - // create connection and send request - ret = send_file_read_request(main_socket_fd, file); - if (ret != TS_ERR_OKAY) - return ret; - - // read response from socket and unmarshal the response - ret = parse_file_read_reply(main_socket_fd, version, size, text); - - return ret; -} - -/*------------------------------------------------------------------------- - * WriteFile - *------------------------------------------------------------------------- - * Purpose: replaces the current file with the file passed in; - * does forceUpdate for Rollback and FileManager so correct file - * versioning is maintained - * Input: file - the config file to write - * text - text buffer to write - * size - the size of the buffer to write - * - * Marshals a write file request that can be sent over the unix domain socket. - * Connects to the socket and sends request over. Parses the response from - * Traffic Manager. - */ -TSError -WriteFile(TSFileNameT file, char *text, int size, int version) -{ - TSError ret; - - ret = send_file_write_request(main_socket_fd, file, version, size, text); - if (ret != TS_ERR_OKAY) - return ret; - - ret = parse_reply(main_socket_fd); - - return ret; -} - - -/*************************************************************************** - * Events - ***************************************************************************/ -/*------------------------------------------------------------------------- - * EventSignal - *------------------------------------------------------------------------- - * LAN - need to implement - */ -TSError -EventSignal(char */* event_name ATS_UNUSED */, va_list /* ap ATS_UNUSED */) -{ - return TS_ERR_FAIL; -} - -/*------------------------------------------------------------------------- - * EventResolve - *------------------------------------------------------------------------- - * purpose: Resolves the event of the specified name - * note: when sending the message request, actually sends the event name, - * not the event id - */ -TSError -EventResolve(char *event_name) -{ - if (!event_name) - return TS_ERR_PARAMS; - - return (send_and_parse_name(EVENT_RESOLVE, event_name)); -} - -/*------------------------------------------------------------------------- - * ActiveEventGetMlt - *------------------------------------------------------------------------- - * purpose: Retrieves a list of active(unresolved) events - * note: list of event names returned in network msg which must be tokenized - */ -TSError -ActiveEventGetMlt(LLQ * active_events) -{ - if (!active_events) - return TS_ERR_PARAMS; - - return (send_and_parse_list(EVENT_GET_MLT, active_events)); -} - -/*------------------------------------------------------------------------- - * EventIsActive - *------------------------------------------------------------------------- - * determines if the event_name is active; sets result in is_current - */ -TSError -EventIsActive(char *event_name, bool * is_current) -{ - TSError ret; - - if (!event_name || !is_current) - return TS_ERR_PARAMS; - - // create and send request - ret = send_request_name(main_socket_fd, EVENT_ACTIVE, event_name); - if (ret != TS_ERR_OKAY) - return ret; - - // parse the reply - ret = parse_event_active_reply(main_socket_fd, is_current); - if (ret != TS_ERR_OKAY) - return ret; - - return ret; -} - -/*------------------------------------------------------------------------- - * EventSignalCbRegister - *------------------------------------------------------------------------- - * Adds the callback function in appropriate places in the remote side - * callback table. - * If this is the first callback to be registered for a certain event type, - * then sends a callback registration notification to TM so that TM will know - * which events have remote callbacks registered on it. - */ -TSError -EventSignalCbRegister(char *event_name, TSEventSignalFunc func, void *data) -{ - bool first_time = 0; - TSError err; - - if (func == NULL) - return TS_ERR_PARAMS; - if (!remote_event_callbacks) - return TS_ERR_FAIL; - - err = cb_table_register(remote_event_callbacks, event_name, func, data, &first_time); - if (err != TS_ERR_OKAY) - return err; - - // if we need to notify traffic manager of the event then send msg - if (first_time) { - err = send_request_name(event_socket_fd, EVENT_REG_CALLBACK, event_name); - if (err != TS_ERR_OKAY) - return err; - } - - return TS_ERR_OKAY; -} - -/*------------------------------------------------------------------------- - * EventSignalCbUnregister - *------------------------------------------------------------------------- - * Removes the callback function from the remote side callback table. - * After removing the callback function, needs to check which events now - * no longer have any callbacks registered at all; sends an unregister callback - * notification to TM so that TM knows that that event doesn't have any - * remote callbacks registered for it - * Input: event_name - the event to unregister the callback from; if NULL, - * unregisters the specified func from all events - * func - the callback function to unregister; if NULL, then - * unregisters all callback functions for the event_name - * specified - */ -TSError -EventSignalCbUnregister(char *event_name, TSEventSignalFunc func) -{ - TSError err; - - if (!remote_event_callbacks) - return TS_ERR_FAIL; - - // remove the callback function from the table - err = cb_table_unregister(remote_event_callbacks, event_name, func); - if (err != TS_ERR_OKAY) - return err; - - // check if we need to notify traffic manager of the event (notify TM - // only if the event has no callbacks) - err = send_unregister_all_callbacks(event_socket_fd, remote_event_callbacks); - if (err != TS_ERR_OKAY) - return err; - - return TS_ERR_OKAY; -} - -/*************************************************************************** - * Snapshots - ***************************************************************************/ -TSError -SnapshotTake(char *snapshot_name) -{ - if (!snapshot_name) - return TS_ERR_PARAMS; - - return send_and_parse_name(SNAPSHOT_TAKE, snapshot_name); -} - -TSError -SnapshotRestore(char *snapshot_name) -{ - if (!snapshot_name) - return TS_ERR_PARAMS; - - return send_and_parse_name(SNAPSHOT_RESTORE, snapshot_name); -} - -TSError -SnapshotRemove(char *snapshot_name) -{ - if (!snapshot_name) - return TS_ERR_PARAMS; - - return send_and_parse_name(SNAPSHOT_REMOVE, snapshot_name); -} - -TSError -SnapshotGetMlt(LLQ * snapshots) -{ - return send_and_parse_list(SNAPSHOT_GET_MLT, snapshots); -} - -TSError -StatsReset(bool cluster, const char* name) -{ - TSError ret; - - if (cluster) { - ret = send_request_name(main_socket_fd, STATS_RESET_CLUSTER, name); - } else { - ret = send_request_name(main_socket_fd, STATS_RESET_NODE, name); - } - if (ret != TS_ERR_OKAY) - return ret; // networking error - - return parse_reply(main_socket_fd); -}
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/8197736c/mgmt/api/remote/EventRegistration.cc ---------------------------------------------------------------------- diff --git a/mgmt/api/remote/EventRegistration.cc b/mgmt/api/remote/EventRegistration.cc deleted file mode 100644 index 2a3d7fb..0000000 --- a/mgmt/api/remote/EventRegistration.cc +++ /dev/null @@ -1,166 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 - - 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. - */ - -/***************************************************************************** - * Filename: EventRegistration.cc - * Purpose: This file contains functions and structures used in event - * notification and callbacks for remote clients; also has the - * thread that services event notification. - * Created: 2/15/01 - * - * - ***************************************************************************/ - -#include "libts.h" -#include <stdio.h> -#include <sys/time.h> -#include <sys/socket.h> -#include <string.h> - -#include "ink_thread.h" - -#include "MgmtSocket.h" - -#include "mgmtapi.h" -#include "EventRegistration.h" -#include "CoreAPIShared.h" -#include "NetworkUtilsDefs.h" -#include "NetworkUtilsRemote.h" -#include "EventCallback.h" - -CallbackTable *remote_event_callbacks; - -/********************************************************************** - * event_poll_thread_main - * - * purpose: thread listens on the client's event socket connection; - * only reads from the event_socket connection and - * processes EVENT_NOTIFY messages; each time client - * makes new event-socket connection to TM, must launch - * a new event_poll_thread_main thread - * input: arg - contains the socket_fd to listen on - * output: NULL - if error - * notes: each time the client's socket connection to TM is reset - * a new thread will be launched as old one dies; there are - * only two places where a new thread is created: - * 1) when client first connects (TSInit call) - * 2) client reconnects() due to a TM restart - * Uses blocking socket; so blocks until receives an event notification. - * Shouldn't need to use select since only waiting for a notification - * message from event_callback_main thread! - **********************************************************************/ -void * -event_poll_thread_main(void *arg) -{ - TSError err; - int sock_fd; - TSEvent *event_notice = NULL; - - sock_fd = *((int *) arg); // should be same as event_socket_fd - - // the sock_fd is going to be the one we listen for events on - while (1) { - // possible sock_fd is invalid if TM restarts and client reconnects - if (sock_fd < 0) { - break; - } - - // read the entire message, so create TSEvent for the callback - event_notice = TSEventCreate(); - err = parse_event_notification(sock_fd, event_notice); - if (err == TS_ERR_NET_READ || err == TS_ERR_NET_EOF) { - break; - } else if (err != TS_ERR_OKAY) { - TSEventDestroy(event_notice); - continue; // skip the message - } - // got event notice; spawn new thread to handle the event's callback functions - ink_thread_create(event_callback_thread, (void *) event_notice, 0, DEFAULT_STACK_SIZE); - } - - if (event_notice) - TSEventDestroy(event_notice); - ink_thread_exit(NULL); - return NULL; -} - -/********************************************************************** - * event_callback_thread - * - * purpose: Given an event, determines and calls the registered cb functions - * in the CallbackTable for remote events - * input: arg - should be an TSEvent with the event info sent from TM msg - * output: returns when done calling all the callbacks - * notes: None - **********************************************************************/ -void * -event_callback_thread(void *arg) -{ - TSEvent *event_notice; - EventCallbackT *event_cb; - int index; - - event_notice = (TSEvent *) arg; - index = (int) event_notice->id; - LLQ *func_q; // list of callback functions need to call - - func_q = create_queue(); - if (!func_q) { - if (event_notice) - TSEventDestroy(event_notice); - return NULL; - } - - // obtain lock - ink_mutex_acquire(&remote_event_callbacks->event_callback_lock); - - TSEventSignalFunc cb; - - // check if we have functions to call - if (remote_event_callbacks->event_callback_l[index] && (!queue_is_empty(remote_event_callbacks->event_callback_l[index]))) { - int queue_depth = queue_len(remote_event_callbacks->event_callback_l[index]); - - for (int i = 0; i < queue_depth; i++) { - event_cb = (EventCallbackT *) dequeue(remote_event_callbacks->event_callback_l[index]); - cb = event_cb->func; - enqueue(remote_event_callbacks->event_callback_l[index], event_cb); - enqueue(func_q, (void *) cb); // add callback function only to list - } - } - // release lock - ink_mutex_release(&remote_event_callbacks->event_callback_lock); - - // execute the callback function - while (!queue_is_empty(func_q)) { - cb = (TSEventSignalFunc) dequeue(func_q); - (*cb) (event_notice->name, event_notice->description, event_notice->priority, NULL); - } - - // clean up event notice - TSEventDestroy(event_notice); - delete_queue(func_q); - - // all done! - ink_thread_exit(NULL); - return NULL; -} http://git-wip-us.apache.org/repos/asf/trafficserver/blob/8197736c/mgmt/api/remote/EventRegistration.h ---------------------------------------------------------------------- diff --git a/mgmt/api/remote/EventRegistration.h b/mgmt/api/remote/EventRegistration.h deleted file mode 100644 index fe4bb89..0000000 --- a/mgmt/api/remote/EventRegistration.h +++ /dev/null @@ -1,49 +0,0 @@ -/** @file - - A brief file description - - @section license License - - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 - - 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. - */ - -/***************************************************************************** - * Filename: EventRegistration.h - * Purpose: This file contains sturctures intended for event notification - * Created: 8/8/00 - * Created by: Stephanie Song - * - ***************************************************************************/ - -#ifndef _EVENT_REGISTRATION_H -#define _EVENT_REGISTRATION_H - -#include <stdio.h> - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -void *event_callback_thread(void *arg); -void *event_poll_thread_main(void *arg); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _EVENT_REGISTRATION_H */ http://git-wip-us.apache.org/repos/asf/trafficserver/blob/8197736c/mgmt/api/remote/Makefile.am ---------------------------------------------------------------------- diff --git a/mgmt/api/remote/Makefile.am b/mgmt/api/remote/Makefile.am deleted file mode 100644 index c9a3213..0000000 --- a/mgmt/api/remote/Makefile.am +++ /dev/null @@ -1,59 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 -# -# 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. - -AM_CPPFLAGS = \ - $(iocore_include_dirs) \ - -I$(top_srcdir)/lib \ - -I$(top_srcdir)/lib/ts \ - -I$(top_srcdir)/mgmt \ - -I$(top_srcdir)/mgmt/utils \ - -I$(top_srcdir)/mgmt/api \ - -I$(top_srcdir)/mgmt/api/include - -MGMT_DEFS = @MGMT_DEFS@ -DEFS += $(MGMT_DEFS) - -if BUILD_TESTS - noinst_PROGRAMS = traffic_api_cli_remote -endif - -lib_LTLIBRARIES = libtsmgmt.la - -libtsmgmt_la_LDFLAGS = -version-info @TS_LIBTOOL_VERSION@ -libtsmgmt_la_LIBADD = @LIBOBJS@ $(top_builddir)/lib/ts/libtsutil.la - -libtsmgmt_la_SOURCES = \ - ../CfgContextImpl.cc \ - ../CfgContextManager.cc \ - ../CfgContextUtils.cc \ - ../CoreAPIShared.cc \ - ../EventCallback.cc \ - ../GenericParser.cc \ - ../INKMgmtAPI.cc \ - CoreAPIRemote.cc \ - EventRegistration.cc \ - EventRegistration.h \ - NetworkUtilsRemote.cc \ - NetworkUtilsRemote.h - -if BUILD_TESTS - traffic_api_cli_remote_SOURCES = APITestCliRemote.cc -endif - -traffic_api_cli_remote_LDADD = \ - libtsmgmt.la \ - $(top_builddir)/lib/ts/libtsutil.la \ - @LIBTCL@ @LIBSSL@
