| /** @file |
| |
| Public RecCore declarations |
| |
| @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. |
| */ |
| |
| #pragma once |
| |
| #include <functional> |
| |
| #include "tscore/Diags.h" |
| |
| #include "I_RecDefs.h" |
| #include "I_RecAlarms.h" |
| #include "I_RecSignals.h" |
| #include "I_RecEvents.h" |
| #include "tscpp/util/MemSpan.h" |
| |
| struct RecRecord; |
| |
| //------------------------------------------------------------------------- |
| // Diagnostic Output |
| //------------------------------------------------------------------------- |
| int RecSetDiags(Diags *diags); |
| |
| //------------------------------------------------------------------------- |
| // Config File Parsing |
| //------------------------------------------------------------------------- |
| typedef void (*RecConfigEntryCallback)(RecT rec_type, RecDataT data_type, const char *name, const char *value, RecSourceT source); |
| |
| void RecConfigFileInit(); |
| int RecConfigFileParse(const char *path, RecConfigEntryCallback handler); |
| |
| // Return a copy of the system's configuration directory. |
| std::string RecConfigReadConfigDir(); |
| |
| // Return a copy of the system's local state directory, taking proxy.config.local_state_dir into account. |
| std::string RecConfigReadRuntimeDir(); |
| |
| // Return a copy of the system's log directory, taking proxy.config.log.logfile_dir into account. |
| std::string RecConfigReadLogDir(); |
| |
| // Return a copy of the system's bin directory, taking proxy.config.bin_path into account. |
| std::string RecConfigReadBinDir(); |
| |
| // Return a copy of the system's plugin directory, taking proxy.config.plugin.plugin_dir into account. |
| std::string RecConfigReadPluginDir(); |
| |
| // Return a copy of a configuration file that is relative to sysconfdir. The relative path to the configuration |
| // file is specified in the configuration variable named by "file_variable". If the configuration variable has no |
| // value, nullptr is returned. |
| std::string RecConfigReadConfigPath(const char *file_variable, const char *default_value = nullptr); |
| |
| // Return a copy of the persistent stats file. This is $RUNTIMEDIR/records.snap. |
| std::string RecConfigReadPersistentStatsPath(); |
| |
| // Test whether the named configuration value is overridden by an environment variable. Return either |
| // the overridden value, or the original value. Caller MUST NOT free the result. |
| const char *RecConfigOverrideFromEnvironment(const char *name, const char *value); |
| |
| //------------------------------------------------------------------------- |
| // Stat Registration |
| //------------------------------------------------------------------------- |
| RecErrT _RecRegisterStatInt(RecT rec_type, const char *name, RecInt data_default, RecPersistT persist_type); |
| #define RecRegisterStatInt(rec_type, name, data_default, persist_type) \ |
| _RecRegisterStatInt((rec_type), (name), (data_default), REC_PERSISTENCE_TYPE(persist_type)) |
| |
| RecErrT _RecRegisterStatFloat(RecT rec_type, const char *name, RecFloat data_default, RecPersistT persist_type); |
| #define RecRegisterStatFloat(rec_type, name, data_default, persist_type) \ |
| _RecRegisterStatFloat((rec_type), (name), (data_default), REC_PERSISTENCE_TYPE(persist_type)) |
| |
| RecErrT _RecRegisterStatString(RecT rec_type, const char *name, RecString data_default, RecPersistT persist_type); |
| #define RecRegisterStatString(rec_type, name, data_default, persist_type) \ |
| _RecRegisterStatString((rec_type), (name), (data_default), REC_PERSISTENCE_TYPE(persist_type)) |
| |
| RecErrT _RecRegisterStatCounter(RecT rec_type, const char *name, RecCounter data_default, RecPersistT persist_type); |
| #define RecRegisterStatCounter(rec_type, name, data_default, persist_type) \ |
| _RecRegisterStatCounter((rec_type), (name), (data_default), REC_PERSISTENCE_TYPE(persist_type)) |
| |
| //------------------------------------------------------------------------- |
| // Config Registration |
| //------------------------------------------------------------------------- |
| |
| RecErrT RecRegisterConfigInt(RecT rec_type, const char *name, RecInt data_default, RecUpdateT update_type, RecCheckT check_type, |
| const char *ccheck_regex, RecSourceT source, RecAccessT access_type = RECA_NULL); |
| |
| RecErrT RecRegisterConfigFloat(RecT rec_type, const char *name, RecFloat data_default, RecUpdateT update_type, RecCheckT check_type, |
| const char *check_regex, RecSourceT source, RecAccessT access_type = RECA_NULL); |
| |
| RecErrT RecRegisterConfigString(RecT rec_type, const char *name, const char *data_default, RecUpdateT update_type, |
| RecCheckT check_type, const char *check_regex, RecSourceT source, |
| RecAccessT access_type = RECA_NULL); |
| |
| RecErrT RecRegisterConfigCounter(RecT rec_type, const char *name, RecCounter data_default, RecUpdateT update_type, |
| RecCheckT check_type, const char *check_regex, RecSourceT source, |
| RecAccessT access_type = RECA_NULL); |
| |
| //------------------------------------------------------------------------- |
| // Config Change Notification |
| //------------------------------------------------------------------------- |
| |
| RecErrT RecLinkConfigInt(const char *name, RecInt *rec_int); |
| RecErrT RecLinkConfigInt32(const char *name, int32_t *p_int32); |
| RecErrT RecLinkConfigUInt32(const char *name, uint32_t *p_uint32); |
| RecErrT RecLinkConfigFloat(const char *name, RecFloat *rec_float); |
| RecErrT RecLinkConfigCounter(const char *name, RecCounter *rec_counter); |
| RecErrT RecLinkConfigString(const char *name, RecString *rec_string); |
| RecErrT RecLinkConfigByte(const char *name, RecByte *rec_byte); |
| RecErrT RecLinkConfigBool(const char *name, RecBool *rec_byte); |
| |
| RecErrT RecRegisterConfigUpdateCb(const char *name, RecConfigUpdateCb update_cb, void *cookie); |
| RecErrT RecRegisterRawStatUpdateFunc(const char *name, RecRawStatBlock *rsb, int id, RecStatUpdateFunc update_func, void *cookie); |
| |
| //------------------------------------------------------------------------- |
| // Record Reading/Writing |
| //------------------------------------------------------------------------- |
| |
| // WARNING! Avoid deadlocks by calling the following set/get calls |
| // with the appropriate locking conventions. If you're calling these |
| // functions from a configuration update callback (RecConfigUpdateCb), |
| // be sure to set 'lock' to 'false' as the hash-table rwlock has |
| // already been taken out for the callback. |
| |
| // RecSetRecordConvert -> WebMgmtUtils.cc::varSetFromStr() |
| RecErrT RecSetRecordConvert(const char *name, const RecString rec_string, RecSourceT source, bool lock = true); |
| RecErrT RecSetRecordInt(const char *name, RecInt rec_int, RecSourceT source, bool lock = true); |
| RecErrT RecSetRecordFloat(const char *name, RecFloat rec_float, RecSourceT source, bool lock = true); |
| RecErrT RecSetRecordString(const char *name, const RecString rec_string, RecSourceT source, bool lock = true); |
| RecErrT RecSetRecordCounter(const char *name, RecCounter rec_counter, RecSourceT source, bool lock = true); |
| |
| RecErrT RecGetRecordInt(const char *name, RecInt *rec_int, bool lock = true); |
| RecErrT RecGetRecordFloat(const char *name, RecFloat *rec_float, bool lock = true); |
| RecErrT RecGetRecordString(const char *name, char *buf, int buf_len, bool lock = true); |
| RecErrT RecGetRecordString_Xmalloc(const char *name, RecString *rec_string, bool lock = true); |
| RecErrT RecGetRecordCounter(const char *name, RecCounter *rec_counter, bool lock = true); |
| // Convenience to allow us to treat the RecInt as a single byte internally |
| RecErrT RecGetRecordByte(const char *name, RecByte *rec_byte, bool lock = true); |
| // Convenience to allow us to treat the RecInt as a bool internally |
| RecErrT RecGetRecordBool(const char *name, RecBool *rec_byte, bool lock = true); |
| |
| //------------------------------------------------------------------------ |
| // Record Attributes Reading |
| //------------------------------------------------------------------------ |
| typedef void (*RecLookupCallback)(const RecRecord *, void *); |
| |
| RecErrT RecLookupRecord(const char *name, RecLookupCallback callback, void *data, bool lock = true); |
| RecErrT RecLookupMatchingRecords(unsigned rec_type, const char *match, RecLookupCallback callback, void *data, bool lock = true); |
| |
| RecErrT RecGetRecordType(const char *name, RecT *rec_type, bool lock = true); |
| RecErrT RecGetRecordDataType(const char *name, RecDataT *data_type, bool lock = true); |
| RecErrT RecGetRecordPersistenceType(const char *name, RecPersistT *persist_type, bool lock = true); |
| RecErrT RecGetRecordOrderAndId(const char *name, int *order, int *id, bool lock = true, bool check_sync_cb = false); |
| RecErrT RecGetRecordUpdateType(const char *name, RecUpdateT *update_type, bool lock = true); |
| RecErrT RecGetRecordCheckType(const char *name, RecCheckT *check_type, bool lock = true); |
| RecErrT RecGetRecordCheckExpr(const char *name, char **check_expr, bool lock = true); |
| RecErrT RecGetRecordDefaultDataString_Xmalloc(char *name, char **buf, bool lock = true); |
| RecErrT RecGetRecordSource(const char *name, RecSourceT *source, bool lock = true); |
| |
| RecErrT RecGetRecordAccessType(const char *name, RecAccessT *secure, bool lock = true); |
| RecErrT RecSetRecordAccessType(const char *name, RecAccessT secure, bool lock = true); |
| |
| //------------------------------------------------------------------------ |
| // Signal and Alarms |
| //------------------------------------------------------------------------ |
| |
| // RecSignalManager always sends a management signal up to traffic_manager. |
| void RecSignalManager(int id, const char *, size_t); |
| |
| static inline void |
| RecSignalManager(int id, const char *str) |
| { |
| RecSignalManager(id, str, strlen(str) + 1); |
| } |
| |
| // Format a message, and send it to the manager and to the Warning diagnostic. |
| void RecSignalWarning(int sig, const char *fmt, ...) TS_PRINTFLIKE(2, 3); |
| |
| /// Generate a warning if any configuration name/value is not registered. |
| void RecConfigWarnIfUnregistered(); |
| |
| //------------------------------------------------------------------------- |
| // Backwards Compatibility Items (REC_ prefix) |
| //------------------------------------------------------------------------- |
| #define REC_ReadConfigInt32(_var, _config_var_name) \ |
| do { \ |
| RecInt tmp = 0; \ |
| RecGetRecordInt(_config_var_name, (RecInt *)&tmp); \ |
| _var = (int32_t)tmp; \ |
| } while (0) |
| |
| #define REC_ReadConfigInteger(_var, _config_var_name) \ |
| do { \ |
| RecInt tmp = 0; \ |
| RecGetRecordInt(_config_var_name, &tmp); \ |
| _var = tmp; \ |
| } while (0) |
| |
| #define REC_ReadConfigFloat(_var, _config_var_name) \ |
| do { \ |
| RecFloat tmp = 0; \ |
| RecGetRecordFloat(_config_var_name, &tmp); \ |
| _var = tmp; \ |
| } while (0) |
| |
| #define REC_ReadConfigStringAlloc(_var, _config_var_name) RecGetRecordString_Xmalloc(_config_var_name, (RecString *)&_var) |
| |
| #define REC_ReadConfigString(_var, _config_var_name, _len) RecGetRecordString(_config_var_name, _var, _len) |
| |
| #define REC_RegisterConfigUpdateFunc(_config_var_name, func, flag) RecRegisterConfigUpdateCb(_config_var_name, func, flag) |
| |
| #define REC_EstablishStaticConfigInteger(_var, _config_var_name) \ |
| do { \ |
| RecLinkConfigInt(_config_var_name, &_var); \ |
| _var = (int64_t)REC_ConfigReadInteger(_config_var_name); \ |
| } while (0) |
| |
| #define REC_EstablishStaticConfigInt32(_var, _config_var_name) \ |
| do { \ |
| RecLinkConfigInt32(_config_var_name, &_var); \ |
| _var = (int32_t)REC_ConfigReadInteger(_config_var_name); \ |
| } while (0) |
| |
| #define REC_EstablishStaticConfigInt32U(_var, _config_var_name) \ |
| do { \ |
| RecLinkConfigUInt32(_config_var_name, &_var); \ |
| _var = (int32_t)REC_ConfigReadInteger(_config_var_name); \ |
| } while (0) |
| |
| /* |
| * RecLinkConfigString allocates the RecString and stores the ptr to it (&var). |
| * So before changing _var (the RecString) we have to free the original one. |
| * Really, we somehow need to know whether RecLinkConfigString allocated _var. |
| * For now, we're using the return value to indicate this, even though it's |
| * not always the case. If we're wrong, we'll leak the RecString. |
| */ |
| #define REC_EstablishStaticConfigStringAlloc(_var, _config_var_name) \ |
| do { \ |
| if (RecLinkConfigString(_config_var_name, &_var) == REC_ERR_OKAY) \ |
| ats_free(_var); \ |
| _var = (RecString)REC_ConfigReadString(_config_var_name); \ |
| } while (0) |
| |
| #define REC_EstablishStaticConfigFloat(_var, _config_var_name) \ |
| do { \ |
| RecLinkConfigFloat(_config_var_name, &_var); \ |
| _var = (RecFloat)REC_ConfigReadFloat(_config_var_name); \ |
| } while (0) |
| |
| // Allow to treat our "INT" configs as a byte type internally. Note |
| // that the byte type is just a wrapper around RECD_INT. |
| #define REC_EstablishStaticConfigByte(_var, _config_var_name) \ |
| do { \ |
| RecLinkConfigByte(_config_var_name, &_var); \ |
| _var = (RecByte)REC_ConfigReadInteger(_config_var_name); \ |
| } while (0) |
| |
| // Allow to treat our "INT" configs as a bool type internally. Note |
| // that the bool type is just a wrapper around RECD_INT. |
| #define REC_EstablishStaticConfigBool(_var, _config_var_name) \ |
| do { \ |
| RecLinkConfigBool(_config_var_name, &_var); \ |
| _var = 0 != REC_ConfigReadInteger(_config_var_name); \ |
| } while (0) |
| |
| RecInt REC_ConfigReadInteger(const char *name); |
| char *REC_ConfigReadString(const char *name); |
| RecFloat REC_ConfigReadFloat(const char *name); |
| RecCounter REC_ConfigReadCounter(const char *name); |
| |
| // MGMT2 Marco's -- converting lmgmt->record_data->readXXX |
| RecInt REC_readInteger(const char *name, bool *found, bool lock = true); |
| RecFloat REC_readFloat(char *name, bool *found, bool lock = true); |
| RecCounter REC_readCounter(char *name, bool *found, bool lock = true); |
| RecString REC_readString(const char *name, bool *found, bool lock = true); |
| |
| //------------------------------------------------------------------------ |
| // Clear Statistics |
| //------------------------------------------------------------------------ |
| RecErrT RecResetStatRecord(const char *name); |
| RecErrT RecResetStatRecord(RecT type = RECT_NULL, bool all = false); |
| |
| //------------------------------------------------------------------------ |
| // Set RecRecord attributes |
| //------------------------------------------------------------------------ |
| RecErrT RecSetSyncRequired(char *name, bool lock = true); |
| |
| //------------------------------------------------------------------------ |
| // Manager Callback |
| //------------------------------------------------------------------------ |
| using RecManagerCb = std::function<void(ts::MemSpan<void>)>; |
| int RecRegisterManagerCb(int _signal, RecManagerCb const &_fn); |