mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-02-08 22:13:48 +01:00
reseed from SU3
This commit is contained in:
parent
96851ab2fd
commit
3643d2f1da
4 changed files with 142 additions and 94 deletions
|
@ -165,6 +165,13 @@ namespace data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NetDb::AddRouterInfo (const uint8_t * buf, int len)
|
||||||
|
{
|
||||||
|
IdentityEx identity;
|
||||||
|
identity.FromBuffer (buf, len);
|
||||||
|
AddRouterInfo (identity.GetIdentHash (), buf, len);
|
||||||
|
}
|
||||||
|
|
||||||
void NetDb::AddRouterInfo (const IdentHash& ident, const uint8_t * buf, int len)
|
void NetDb::AddRouterInfo (const IdentHash& ident, const uint8_t * buf, int len)
|
||||||
{
|
{
|
||||||
DeleteRequestedDestination (ident);
|
DeleteRequestedDestination (ident);
|
||||||
|
|
1
NetDb.h
1
NetDb.h
|
@ -62,6 +62,7 @@ namespace data
|
||||||
void Start ();
|
void Start ();
|
||||||
void Stop ();
|
void Stop ();
|
||||||
|
|
||||||
|
void AddRouterInfo (const uint8_t * buf, int len);
|
||||||
void AddRouterInfo (const IdentHash& ident, const uint8_t * buf, int len);
|
void AddRouterInfo (const IdentHash& ident, const uint8_t * buf, int len);
|
||||||
void AddLeaseSet (const IdentHash& ident, const uint8_t * buf, int len, i2p::tunnel::InboundTunnel * from);
|
void AddLeaseSet (const IdentHash& ident, const uint8_t * buf, int len, i2p::tunnel::InboundTunnel * from);
|
||||||
std::shared_ptr<RouterInfo> FindRouter (const IdentHash& ident) const;
|
std::shared_ptr<RouterInfo> FindRouter (const IdentHash& ident) const;
|
||||||
|
|
62
Reseed.cpp
62
Reseed.cpp
|
@ -1,5 +1,5 @@
|
||||||
#include <iostream>
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <sstream>
|
||||||
#include <boost/regex.hpp>
|
#include <boost/regex.hpp>
|
||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
#include <cryptopp/zinflate.h>
|
#include <cryptopp/zinflate.h>
|
||||||
|
@ -7,6 +7,7 @@
|
||||||
#include "Reseed.h"
|
#include "Reseed.h"
|
||||||
#include "Log.h"
|
#include "Log.h"
|
||||||
#include "Identity.h"
|
#include "Identity.h"
|
||||||
|
#include "NetDb.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -122,21 +123,52 @@ namespace data
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Reseeder::ReseedNowSU3 ()
|
||||||
|
{
|
||||||
|
std::string reseedHost = httpReseedHostList[(rand() % httpReseedHostList.size())];
|
||||||
|
return ReseedFromSU3 (reseedHost);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Reseeder::ReseedFromSU3 (const std::string& host)
|
||||||
|
{
|
||||||
|
std::string url = host + "i2pseeds.su3";
|
||||||
|
LogPrint (eLogInfo, "Dowloading SU3 from ", host);
|
||||||
|
std::string su3 = i2p::util::http::httpRequest (url);
|
||||||
|
if (su3.length () > 0)
|
||||||
|
{
|
||||||
|
std::stringstream s(su3);
|
||||||
|
return ProcessSU3Stream (s);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogPrint (eLogWarning, "SU3 download failed");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int ProcessSU3File (const char * filename)
|
||||||
|
{
|
||||||
|
std::ifstream s(filename, std::ifstream::binary);
|
||||||
|
if (s.is_open ())
|
||||||
|
return ProcessSU3Stream (s);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogPrint (eLogError, "Can't open file ", filename);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const char SU3_MAGIC_NUMBER[]="I2Psu3";
|
const char SU3_MAGIC_NUMBER[]="I2Psu3";
|
||||||
void ProcessSU3File (const char * filename)
|
int ProcessSU3Stream (std::istream& s)
|
||||||
{
|
{
|
||||||
static uint32_t headerSignature = htole32 (0x04034B50);
|
static uint32_t headerSignature = htole32 (0x04034B50);
|
||||||
|
|
||||||
std::ifstream s(filename, std::ifstream::binary);
|
|
||||||
if (s.is_open ())
|
|
||||||
{
|
|
||||||
char magicNumber[7];
|
char magicNumber[7];
|
||||||
s.read (magicNumber, 7); // magic number and zero byte 6
|
s.read (magicNumber, 7); // magic number and zero byte 6
|
||||||
if (strcmp (magicNumber, SU3_MAGIC_NUMBER))
|
if (strcmp (magicNumber, SU3_MAGIC_NUMBER))
|
||||||
{
|
{
|
||||||
LogPrint (eLogError, "Unexpected SU3 magic number");
|
LogPrint (eLogError, "Unexpected SU3 magic number");
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
s.seekg (1, std::ios::cur); // su3 file format version
|
s.seekg (1, std::ios::cur); // su3 file format version
|
||||||
SigningKeyType signatureType;
|
SigningKeyType signatureType;
|
||||||
|
@ -160,7 +192,7 @@ namespace data
|
||||||
if (fileType != 0x00) // zip file
|
if (fileType != 0x00) // zip file
|
||||||
{
|
{
|
||||||
LogPrint (eLogError, "Can't handle file type ", (int)fileType);
|
LogPrint (eLogError, "Can't handle file type ", (int)fileType);
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
s.seekg (1, std::ios::cur); // unused
|
s.seekg (1, std::ios::cur); // unused
|
||||||
uint8_t contentType;
|
uint8_t contentType;
|
||||||
|
@ -168,7 +200,7 @@ namespace data
|
||||||
if (contentType != 0x03) // reseed data
|
if (contentType != 0x03) // reseed data
|
||||||
{
|
{
|
||||||
LogPrint (eLogError, "Unexpected content type ", (int)contentType);
|
LogPrint (eLogError, "Unexpected content type ", (int)contentType);
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
s.seekg (12, std::ios::cur); // unused
|
s.seekg (12, std::ios::cur); // unused
|
||||||
|
|
||||||
|
@ -176,6 +208,7 @@ namespace data
|
||||||
s.seekg (signerIDLength, std::ios::cur); // skip signer ID
|
s.seekg (signerIDLength, std::ios::cur); // skip signer ID
|
||||||
|
|
||||||
// handle content
|
// handle content
|
||||||
|
int numFiles = 0;
|
||||||
size_t contentPos = s.tellg ();
|
size_t contentPos = s.tellg ();
|
||||||
while (!s.eof ())
|
while (!s.eof ())
|
||||||
{
|
{
|
||||||
|
@ -206,11 +239,13 @@ namespace data
|
||||||
CryptoPP::Inflator decompressor;
|
CryptoPP::Inflator decompressor;
|
||||||
decompressor.Put (compressed, compressedSize);
|
decompressor.Put (compressed, compressedSize);
|
||||||
delete[] compressed;
|
delete[] compressed;
|
||||||
if (decompressor.MaxRetrievable () <= uncompressedSize)
|
size_t len = decompressor.MaxRetrievable ();
|
||||||
|
if (len <= uncompressedSize)
|
||||||
{
|
{
|
||||||
uint8_t * uncompressed = new uint8_t[uncompressedSize];
|
uint8_t * uncompressed = new uint8_t[uncompressedSize];
|
||||||
decompressor.Get (uncompressed, decompressor.MaxRetrievable ());
|
decompressor.Get (uncompressed, len);
|
||||||
// TODO: save file
|
i2p::data::netdb.AddRouterInfo (uncompressed, len);
|
||||||
|
numFiles++;
|
||||||
delete[] uncompressed;
|
delete[] uncompressed;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -222,11 +257,8 @@ namespace data
|
||||||
if (end - contentPos >= contentLength)
|
if (end - contentPos >= contentLength)
|
||||||
break; // we are beyond contentLength
|
break; // we are beyond contentLength
|
||||||
}
|
}
|
||||||
|
return numFiles;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
LogPrint (eLogError, "Can't open file ", filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
12
Reseed.h
12
Reseed.h
|
@ -1,6 +1,7 @@
|
||||||
#ifndef RESEED_H
|
#ifndef RESEED_H
|
||||||
#define RESEED_H
|
#define RESEED_H
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
@ -12,12 +13,19 @@ namespace data
|
||||||
class Reseeder
|
class Reseeder
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Reseeder();
|
Reseeder();
|
||||||
~Reseeder();
|
~Reseeder();
|
||||||
bool reseedNow();
|
bool reseedNow(); // depreacted
|
||||||
|
int ReseedNowSU3 ();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
int ReseedFromSU3 (const std::string& host);
|
||||||
};
|
};
|
||||||
|
|
||||||
void ProcessSU3File (const char * filename);
|
int ProcessSU3File (const char * filename);
|
||||||
|
int ProcessSU3Stream (std::istream& s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue