mirror of
https://github.com/uroni/urbackup_backend.git
synced 2025-10-26 11:36:50 +00:00
121 lines
2.7 KiB
C++
121 lines
2.7 KiB
C++
/*************************************************************************
|
|
* UrBackup - Client/Server backup system
|
|
* Copyright (C) 2011-2016 Martin Raiber
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
**************************************************************************/
|
|
|
|
#include "DataplanDb.h"
|
|
#include "../Interface/Server.h"
|
|
#include <fstream>
|
|
#include "../stringtools.h"
|
|
#include "../urbackupcommon/glob.h"
|
|
|
|
DataplanDb* DataplanDb::instance = NULL;
|
|
|
|
DataplanDb::DataplanDb()
|
|
: mutex(Server->createMutex())
|
|
{
|
|
}
|
|
|
|
DataplanDb * DataplanDb::getInstance()
|
|
{
|
|
return instance;
|
|
}
|
|
|
|
void DataplanDb::init()
|
|
{
|
|
instance = new DataplanDb;
|
|
instance->read("urbackup/dataplan_db.txt");
|
|
}
|
|
|
|
bool DataplanDb::read(const std::string & fn)
|
|
{
|
|
std::fstream in(fn.c_str(), std::ios::in | std::ios::binary);
|
|
|
|
if (!in.is_open())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
IScopedLock lock(mutex.get());
|
|
|
|
items.clear();
|
|
cache.clear();
|
|
|
|
std::string line;
|
|
while (std::getline(in, line))
|
|
{
|
|
size_t sep = line.find(" ");
|
|
if (sep == std::string::npos
|
|
|| sep+1>=line.size())
|
|
continue;
|
|
|
|
SDataplanItem item;
|
|
item.hostname_glob = trim(line.substr(0, sep));
|
|
item.limit = watoi64(line.substr(sep + 1));
|
|
items.push_back(item);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool DataplanDb::getLimit(const std::string & hostname, std::string& pattern, int64& limit)
|
|
{
|
|
IScopedLock lock(mutex.get());
|
|
|
|
SDataplanItem* item = cache.get(hostname);
|
|
if (item != NULL)
|
|
{
|
|
if (item->limit < 0)
|
|
{
|
|
return false;
|
|
}
|
|
limit = item->limit;
|
|
pattern = item->hostname_glob;
|
|
return true;
|
|
}
|
|
|
|
for (size_t i = 0; i < items.size(); ++i)
|
|
{
|
|
if (amatch(hostname.c_str(), items[i].hostname_glob.c_str()))
|
|
{
|
|
limit = items[i].limit*1024*1024;
|
|
pattern = items[i].hostname_glob;
|
|
|
|
SDataplanItem ldi = items[i];
|
|
|
|
cache.put(hostname, ldi);
|
|
|
|
while (cache.size() > 100)
|
|
{
|
|
cache.evict_one();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
SDataplanItem di;
|
|
di.limit = -1;
|
|
cache.put(hostname, di);
|
|
|
|
while (cache.size() > 100)
|
|
{
|
|
cache.evict_one();
|
|
}
|
|
|
|
return false;
|
|
}
|