153c3577eSopenharmony_ci/*
253c3577eSopenharmony_ci* Copyright (c) 2022 Huawei Device Co., Ltd.
353c3577eSopenharmony_ci* Licensed under the Apache License, Version 2.0 (the "License");
453c3577eSopenharmony_ci* you may not use this file except in compliance with the License.
553c3577eSopenharmony_ci* You may obtain a copy of the License at
653c3577eSopenharmony_ci*
753c3577eSopenharmony_ci*     http://www.apache.org/licenses/LICENSE-2.0
853c3577eSopenharmony_ci*
953c3577eSopenharmony_ci* Unless required by applicable law or agreed to in writing, software
1053c3577eSopenharmony_ci* distributed under the License is distributed on an "AS IS" BASIS,
1153c3577eSopenharmony_ci* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1253c3577eSopenharmony_ci* See the License for the specific language governing permissions and
1353c3577eSopenharmony_ci* limitations under the License.
1453c3577eSopenharmony_ci*/
1553c3577eSopenharmony_ci#define LOG_TAG "Bootstrap"
1653c3577eSopenharmony_ci#include "bootstrap.h"
1753c3577eSopenharmony_ci
1853c3577eSopenharmony_ci#include <dlfcn.h>
1953c3577eSopenharmony_ci
2053c3577eSopenharmony_ci#include "backup_manager.h"
2153c3577eSopenharmony_ci#include "backuprule/backup_rule_manager.h"
2253c3577eSopenharmony_ci#include "checker/checker_manager.h"
2353c3577eSopenharmony_ci#include "cloud/cloud_config_manager.h"
2453c3577eSopenharmony_ci#include "config_factory.h"
2553c3577eSopenharmony_ci#include "directory/directory_manager.h"
2653c3577eSopenharmony_ci#include "log_print.h"
2753c3577eSopenharmony_ci#include "app_id_mapping/app_id_mapping_config_manager.h"
2853c3577eSopenharmony_cinamespace OHOS {
2953c3577eSopenharmony_cinamespace DistributedData {
3053c3577eSopenharmony_ciBootstrap &Bootstrap::GetInstance()
3153c3577eSopenharmony_ci{
3253c3577eSopenharmony_ci    static Bootstrap bootstrap;
3353c3577eSopenharmony_ci    return bootstrap;
3453c3577eSopenharmony_ci}
3553c3577eSopenharmony_ci
3653c3577eSopenharmony_cistd::string Bootstrap::GetProcessLabel()
3753c3577eSopenharmony_ci{
3853c3577eSopenharmony_ci    auto *global = ConfigFactory::GetInstance().GetGlobalConfig();
3953c3577eSopenharmony_ci    if (global == nullptr || global->processLabel.empty()) {
4053c3577eSopenharmony_ci        return DEFAULT_LABEL;
4153c3577eSopenharmony_ci    }
4253c3577eSopenharmony_ci    return global->processLabel;
4353c3577eSopenharmony_ci}
4453c3577eSopenharmony_ci
4553c3577eSopenharmony_cistd::string Bootstrap::GetMetaDBName()
4653c3577eSopenharmony_ci{
4753c3577eSopenharmony_ci    auto *global = ConfigFactory::GetInstance().GetGlobalConfig();
4853c3577eSopenharmony_ci    if (global == nullptr || global->metaData.empty()) {
4953c3577eSopenharmony_ci        return DEFAULT_META;
5053c3577eSopenharmony_ci    }
5153c3577eSopenharmony_ci    return global->metaData;
5253c3577eSopenharmony_ci}
5353c3577eSopenharmony_ci
5453c3577eSopenharmony_civoid Bootstrap::LoadComponents()
5553c3577eSopenharmony_ci{
5653c3577eSopenharmony_ci    auto *comps = ConfigFactory::GetInstance().GetComponentConfig();
5753c3577eSopenharmony_ci    if (comps == nullptr) {
5853c3577eSopenharmony_ci        return;
5953c3577eSopenharmony_ci    }
6053c3577eSopenharmony_ci    for (auto &comp : *comps) {
6153c3577eSopenharmony_ci        if (comp.lib.empty()) {
6253c3577eSopenharmony_ci            continue;
6353c3577eSopenharmony_ci        }
6453c3577eSopenharmony_ci        // no need to close the component, so we don't keep the handles
6553c3577eSopenharmony_ci        auto handle = dlopen(comp.lib.c_str(), RTLD_LAZY);
6653c3577eSopenharmony_ci        if (handle == nullptr) {
6753c3577eSopenharmony_ci            ZLOGE("dlopen(%{public}s) failed(%{public}d)!", comp.lib.c_str(), errno);
6853c3577eSopenharmony_ci            continue;
6953c3577eSopenharmony_ci        }
7053c3577eSopenharmony_ci
7153c3577eSopenharmony_ci        if (comp.constructor.empty()) {
7253c3577eSopenharmony_ci            continue;
7353c3577eSopenharmony_ci        }
7453c3577eSopenharmony_ci
7553c3577eSopenharmony_ci        auto ctor = reinterpret_cast<Constructor>(dlsym(handle, comp.constructor.c_str()));
7653c3577eSopenharmony_ci        if (ctor == nullptr) {
7753c3577eSopenharmony_ci            ZLOGE("dlsym(%{public}s) failed(%{public}d)!", comp.constructor.c_str(), errno);
7853c3577eSopenharmony_ci            continue;
7953c3577eSopenharmony_ci        }
8053c3577eSopenharmony_ci        ctor(comp.params.c_str());
8153c3577eSopenharmony_ci    }
8253c3577eSopenharmony_ci}
8353c3577eSopenharmony_ci
8453c3577eSopenharmony_civoid Bootstrap::LoadCheckers()
8553c3577eSopenharmony_ci{
8653c3577eSopenharmony_ci    auto *checkers = ConfigFactory::GetInstance().GetCheckerConfig();
8753c3577eSopenharmony_ci    if (checkers == nullptr) {
8853c3577eSopenharmony_ci        return;
8953c3577eSopenharmony_ci    }
9053c3577eSopenharmony_ci    CheckerManager::GetInstance().LoadCheckers(checkers->checkers);
9153c3577eSopenharmony_ci    for (const auto &trust : checkers->trusts) {
9253c3577eSopenharmony_ci        auto *checker = CheckerManager::GetInstance().GetChecker(trust.checker);
9353c3577eSopenharmony_ci        if (checker == nullptr) {
9453c3577eSopenharmony_ci            continue;
9553c3577eSopenharmony_ci        }
9653c3577eSopenharmony_ci        checker->SetTrustInfo(trust);
9753c3577eSopenharmony_ci    }
9853c3577eSopenharmony_ci    for (const auto &distrust : checkers->distrusts) {
9953c3577eSopenharmony_ci        auto *checker = CheckerManager::GetInstance().GetChecker(distrust.checker);
10053c3577eSopenharmony_ci        if (checker == nullptr) {
10153c3577eSopenharmony_ci            continue;
10253c3577eSopenharmony_ci        }
10353c3577eSopenharmony_ci        checker->SetDistrustInfo(distrust);
10453c3577eSopenharmony_ci    }
10553c3577eSopenharmony_ci    for (const auto &switches : checkers->switches) {
10653c3577eSopenharmony_ci        auto *checker = CheckerManager::GetInstance().GetChecker(switches.checker);
10753c3577eSopenharmony_ci        if (checker == nullptr) {
10853c3577eSopenharmony_ci            continue;
10953c3577eSopenharmony_ci        }
11053c3577eSopenharmony_ci        checker->SetSwitchesInfo(switches);
11153c3577eSopenharmony_ci    }
11253c3577eSopenharmony_ci    for (const auto &dynamicStore : checkers->dynamicStores) {
11353c3577eSopenharmony_ci        auto *checker = CheckerManager::GetInstance().GetChecker(dynamicStore.checker);
11453c3577eSopenharmony_ci        if (checker == nullptr) {
11553c3577eSopenharmony_ci            continue;
11653c3577eSopenharmony_ci        }
11753c3577eSopenharmony_ci        checker->AddDynamicStore(dynamicStore);
11853c3577eSopenharmony_ci    }
11953c3577eSopenharmony_ci    for (const auto &staticStore : checkers->staticStores) {
12053c3577eSopenharmony_ci        auto *checker = CheckerManager::GetInstance().GetChecker(staticStore.checker);
12153c3577eSopenharmony_ci        if (checker == nullptr) {
12253c3577eSopenharmony_ci            continue;
12353c3577eSopenharmony_ci        }
12453c3577eSopenharmony_ci        checker->AddStaticStore(staticStore);
12553c3577eSopenharmony_ci    }
12653c3577eSopenharmony_ci}
12753c3577eSopenharmony_ci
12853c3577eSopenharmony_civoid Bootstrap::LoadBackup(std::shared_ptr<ExecutorPool> executors)
12953c3577eSopenharmony_ci{
13053c3577eSopenharmony_ci    auto *backupRules = ConfigFactory::GetInstance().GetBackupConfig();
13153c3577eSopenharmony_ci    if (backupRules == nullptr) {
13253c3577eSopenharmony_ci        return;
13353c3577eSopenharmony_ci    }
13453c3577eSopenharmony_ci    BackupRuleManager::GetInstance().LoadBackupRules(backupRules->rules);
13553c3577eSopenharmony_ci
13653c3577eSopenharmony_ci    BackupManager::BackupParam backupParam = { backupRules->schedularDelay,
13753c3577eSopenharmony_ci        backupRules->schedularInternal, backupRules->backupInternal, backupRules->backupNumber};
13853c3577eSopenharmony_ci    BackupManager::GetInstance().SetBackupParam(backupParam);
13953c3577eSopenharmony_ci    BackupManager::GetInstance().Init();
14053c3577eSopenharmony_ci    BackupManager::GetInstance().BackSchedule(std::move(executors));
14153c3577eSopenharmony_ci}
14253c3577eSopenharmony_ci
14353c3577eSopenharmony_civoid Bootstrap::LoadNetworks()
14453c3577eSopenharmony_ci{
14553c3577eSopenharmony_ci}
14653c3577eSopenharmony_civoid Bootstrap::LoadDirectory()
14753c3577eSopenharmony_ci{
14853c3577eSopenharmony_ci    auto *config = ConfigFactory::GetInstance().GetDirectoryConfig();
14953c3577eSopenharmony_ci    if (config == nullptr) {
15053c3577eSopenharmony_ci        return;
15153c3577eSopenharmony_ci    }
15253c3577eSopenharmony_ci    std::vector<DirectoryManager::Strategy> strategies(config->strategy.size());
15353c3577eSopenharmony_ci    for (size_t i = 0; i < config->strategy.size(); ++i) {
15453c3577eSopenharmony_ci        strategies[i] = config->strategy[i];
15553c3577eSopenharmony_ci    }
15653c3577eSopenharmony_ci    DirectoryManager::GetInstance().Initialize(strategies);
15753c3577eSopenharmony_ci}
15853c3577eSopenharmony_ci
15953c3577eSopenharmony_civoid Bootstrap::LoadCloud()
16053c3577eSopenharmony_ci{
16153c3577eSopenharmony_ci    auto *config = ConfigFactory::GetInstance().GetCloudConfig();
16253c3577eSopenharmony_ci    if (config == nullptr) {
16353c3577eSopenharmony_ci        return;
16453c3577eSopenharmony_ci    }
16553c3577eSopenharmony_ci    std::vector<CloudConfigManager::Info> infos;
16653c3577eSopenharmony_ci    for (auto &info : config->mapper) {
16753c3577eSopenharmony_ci        infos.push_back({ info.localBundle, info.cloudBundle });
16853c3577eSopenharmony_ci    }
16953c3577eSopenharmony_ci    CloudConfigManager::GetInstance().Initialize(infos);
17053c3577eSopenharmony_ci}
17153c3577eSopenharmony_ci
17253c3577eSopenharmony_civoid Bootstrap::LoadAppIdMappings()
17353c3577eSopenharmony_ci{
17453c3577eSopenharmony_ci    auto *appIdMapping = ConfigFactory::GetInstance().GetAppIdMappingConfig();
17553c3577eSopenharmony_ci    if (appIdMapping == nullptr) {
17653c3577eSopenharmony_ci        return;
17753c3577eSopenharmony_ci    }
17853c3577eSopenharmony_ci    std::vector<AppIdMappingConfigManager::AppMappingInfo> infos;
17953c3577eSopenharmony_ci    for (auto &info : *appIdMapping) {
18053c3577eSopenharmony_ci        infos.push_back({ info.srcAppId, info.dstAppId });
18153c3577eSopenharmony_ci    }
18253c3577eSopenharmony_ci    AppIdMappingConfigManager::GetInstance().Initialize(infos);
18353c3577eSopenharmony_ci}
18453c3577eSopenharmony_ci} // namespace DistributedData
18553c3577eSopenharmony_ci} // namespace OHOS
186