blob: 64725b620a74ac59b71a4551de62f028366ef35c [file] [log] [blame]
/** @file
Interface for class to manage configuration updates
@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 "tscore/ink_mutex.h"
#include "tscore/List.h"
#include <unordered_map>
class ExpandingArray;
class ConfigManager;
typedef void (*FileCallbackFunc)(char *, char *);
struct callbackListable {
public:
FileCallbackFunc func;
LINK(callbackListable, link);
};
enum lockAction_t {
ACQUIRE_LOCK,
RELEASE_LOCK,
};
// class FileManager
//
// public functions:
//
// addFile(char*, char *, bool, configFileInfo*) - adds a new config file to be
// managed. A ConfigManager object is created for the file.
// if the file_info ptr is not NULL, a WebFileEdit object
// is also created
//
// getRollbckObj(char* , ConfigManagerPtr**) - sets *rbPtr to ConfigManager
// object bound to fileName. Returns true if there is
// a binding and false otherwise
//
// getWFEObj(char*, WebFileEdit**) - sets *wfePtr to WebFileEdit
// object bound to fileName. Returns true if there is
// a binding and false otherwise
//
// registerCallback(FileCallbackFunc) - registers a callback function
// which will get called every time a managed file changes. The
// callback function should NOT use the calling thread to
// access any ConfigManager objects or block for a long time
//
// fileChanged(const char* fileName, const char *configName) - called by ConfigManager objects
// when their contents change. Triggers callbacks to FileCallbackFuncs
//
// isConfigStale() - returns whether the in-memory files might be stale
// compared to what is on disk.
//
// rereadConfig() - Checks all managed files to see if they have been
// updated
// addConfigFileGroup(char* data_str, int data_size) - update config file group infos
class FileManager
{
public:
FileManager();
~FileManager();
void addFile(const char *fileName, const char *configName, bool root_access_needed, bool isRequired,
ConfigManager *parentConfig = nullptr);
bool getConfigObj(const char *fileName, ConfigManager **rbPtr);
void registerCallback(FileCallbackFunc func);
void fileChanged(const char *fileName, const char *configName);
void rereadConfig();
bool isConfigStale();
void configFileChild(const char *parent, const char *child);
private:
ink_mutex accessLock; // Protects bindings hashtable
ink_mutex cbListLock; // Protects the CallBack List
DLL<callbackListable> cblist;
std::unordered_map<std::string_view, ConfigManager *> bindings;
void addFileHelper(const char *fileName, const char *configName, bool root_access_needed, bool isRequired,
ConfigManager *parentConfig);
};
void initializeRegistry(); // implemented in AddConfigFilesHere.cc