mirror of
https://github.com/uroni/urbackup_backend.git
synced 2025-10-26 11:36:50 +00:00
Backup and restore grub stage 1.5
This commit is contained in:
parent
b2a250d61b
commit
8a40e234bb
@ -29,6 +29,7 @@
|
||||
#include "database.h"
|
||||
#include "../common/data.h"
|
||||
#include "../fsimageplugin/IFilesystem.h"
|
||||
#include "../fsimageplugin/IFSImageFactory.h"
|
||||
#include "../cryptoplugin/ICryptoFactory.h"
|
||||
#include "../urbackupcommon/sha2/sha2.h"
|
||||
#include "ServerIdentityMgr.h"
|
||||
@ -61,6 +62,7 @@
|
||||
#endif
|
||||
|
||||
extern ICryptoFactory *crypto_fak;
|
||||
extern IFSImageFactory* image_fak;
|
||||
extern std::string time_format_str;
|
||||
|
||||
ICustomClient* ClientService::createClient()
|
||||
@ -2189,6 +2191,25 @@ namespace
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool check_partition_used(IFile* dev, int64 offset, int64 length)
|
||||
{
|
||||
bool gpt_style2;
|
||||
std::vector<IFSImageFactory::SPartition> parts = image_fak->readPartitions(dev, gpt_style2);
|
||||
|
||||
for (size_t i = 0; i < parts.size(); ++i)
|
||||
{
|
||||
if ((offset >= parts[i].offset
|
||||
&& offset < parts[i].offset + parts[i].length)
|
||||
|| (offset + length >= parts[i].offset
|
||||
&& offset + length < parts[i].offset + parts[i].length))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void parse_devnum_test()
|
||||
@ -2646,12 +2667,26 @@ bool ClientConnector::sendMBR(std::string dl, std::string &errmsg)
|
||||
mbr.addString(errmsg);
|
||||
|
||||
if (!gpt_style
|
||||
&& mbr_bytes.find("VeraCrypt Boot Loader") != std::string::npos)
|
||||
&& mbr_bytes.find("VeraCrypt Boot Loader") != std::string::npos
|
||||
&& !check_partition_used(dev, 512, 63*512) )
|
||||
{
|
||||
std::string veracrypt_data = dev->Read(512LL, 63 * 512);
|
||||
mbr.addVarInt(512);
|
||||
mbr.addString2(veracrypt_data);
|
||||
}
|
||||
else if (!gpt_style
|
||||
&& mbr_bytes.find("GRUB") != std::string::npos
|
||||
&& !check_partition_used(dev, 512, 63 * 512) )
|
||||
{
|
||||
std::string grub_stage_1_5 = dev->Read(512LL, 63 * 512);
|
||||
if (grub_stage_1_5.find("Geom") != std::string::npos
|
||||
&& grub_stage_1_5.find("Read") != std::string::npos
|
||||
&& grub_stage_1_5.find("Error") != std::string::npos)
|
||||
{
|
||||
mbr.addVarInt(512);
|
||||
mbr.addString2(grub_stage_1_5);
|
||||
}
|
||||
}
|
||||
|
||||
tcpstack.Send(pipe, mbr);
|
||||
|
||||
|
||||
@ -1167,7 +1167,7 @@ void do_restore(void)
|
||||
|
||||
if (mbrdata.extra_data_pos != -1)
|
||||
{
|
||||
Server->Log("Writing extra data...");
|
||||
Server->Log("Writing extra data at position "+convert(mbrdata.extra_data_pos)+" size "+convert(mbrdata.extra_data.size())+" ...");
|
||||
if (dev->Write(mbrdata.extra_data_pos, mbrdata.extra_data) != mbrdata.extra_data.size())
|
||||
{
|
||||
Server->Log("Writing extra data failed. " + os_last_error_str(), LL_ERROR);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user