private void SaveConfig(Store s) { var lookup = s.GetMatching(e => (StoreRecordId)e[0] == StoreRecordId.StoreIdConfig, 1); var str2ix = new Dictionary <I2PString, int>(); foreach (var one in lookup) { var reader = new BufRefLen(one.Value); reader.Read32(); var key = new I2PString(reader); str2ix[key] = one.Key; } AccessConfig(delegate(Dictionary <I2PString, I2PString> settings) { foreach (var one in settings) { var rec = new BufLen[] { BufUtils.To32BL((int)StoreRecordId.StoreIdConfig), new BufLen(one.Key.ToByteArray()), new BufLen(one.Value.ToByteArray()) }; if (str2ix.ContainsKey(one.Key)) { s.Write(rec, str2ix[one.Key]); } else { s.Write(rec); } } }); }
public GetDateMessage(BufRefLen reader) : base(ProtocolMessageType.GetDate) { Version = new I2PString(reader); // As of release 0.9.11, the authentication [Mapping] may be included, with the keys i2cp.username and i2cp.password. if (reader.Length > 0) { Mapping = new I2PMapping(reader); } }
public GetDateMessage(BufRef reader) : base(ProtocolMessageType.GetDate) { reader.Seek(4); if ((ProtocolMessageType)reader.Read8() != MessageType) { throw new ArgumentException("GetDateMessage( reader ) Wrong message type."); } Version = new I2PString(reader); Mapping = new I2PMapping(reader); }
public HostLookupMessage(BufRefLen reader) : base(ProtocolMessageType.HostLookup) { SessionId = reader.ReadFlip16(); RequestId = reader.ReadFlip32(); TimeoutMilliseconds = reader.ReadFlip32(); RequestType = (HostLookupTypes)reader.Read8(); switch (RequestType) { case HostLookupTypes.Hash: Hash = new I2PIdentHash(reader); break; case HostLookupTypes.HostName: HostName = new I2PString(reader); break; } }
void Save(bool onlyupdated) { var deleted = 0; var saved = 0; var sw = new Stopwatch(); sw.Start(); var inactive = Statistics.GetInactive(); if (RouterInfos.Count - inactive.Count() <= RouterInfoCountLowWaterMark) { inactive = inactive.Take(RouterInfos.Count - RouterInfoCountLowWaterMark); } RemoveRouterInfo(inactive); using (var s = GetStore()) { lock ( RouterInfos ) { foreach (var one in RouterInfos.ToArray()) { try { if (one.Value.Value.Deleted) { if (one.Value.Value.StoreIx > 0) { s.Delete(one.Value.Value.StoreIx); } RouterInfos.Remove(one.Key); ++deleted; continue; } if (!onlyupdated || (onlyupdated && one.Value.Value.Updated)) { var rec = new BufLen[] { (BufLen)(int)StoreRecordId.StoreIdRouterInfo, new BufLen(one.Value.Key.ToByteArray()) }; if (one.Value.Value.StoreIx > 0) { s.Write(rec, one.Value.Value.StoreIx); } else { one.Value.Value.StoreIx = s.Write(rec); } one.Value.Value.Updated = false; ++saved; } } catch (Exception ex) { DebugUtils.LogDebug("NetDb: Save: Store exception: " + ex.ToString()); one.Value.Value.StoreIx = -1; } } } var lookup = s.GetMatching(e => (StoreRecordId)e[0] == StoreRecordId.StoreIdConfig, 1); Dictionary <I2PString, int> str2ix = new Dictionary <I2PString, int>(); foreach (var one in lookup) { var reader = new BufRefLen(one.Value); reader.Read32(); var key = new I2PString(reader); str2ix[key] = one.Key; } AccessConfig(delegate(Dictionary <I2PString, I2PString> settings) { foreach (var one in settings) { var rec = new BufLen[] { (BufLen)(int)StoreRecordId.StoreIdConfig, new BufLen(one.Key.ToByteArray()), new BufLen(one.Value.ToByteArray()) }; if (str2ix.ContainsKey(one.Key)) { s.Write(rec, str2ix[one.Key]); } else { s.Write(rec); } } }); } DebugUtils.Log(string.Format("NetDb.Save( {1} ): {0} entries saved, {2} deleted.", saved, onlyupdated ? "updated" : "all", deleted)); Statistics.Save(); UpdateSelectionProbabilities(); sw.Stop(); DebugUtils.Log("NetDB: Save: " + sw.Elapsed.ToString()); }
void Load() { using (var s = GetStore()) { var sw2 = new Stopwatch(); sw2.Start(); var ix = 0; while (s != null && (ix = s.Next(ix)) > 0) { var reader = new BufRefLen(s.Read(ix)); var recordtype = (StoreRecordId)reader.Read32(); try { switch (recordtype) { case StoreRecordId.StoreIdRouterInfo: var one = new I2PRouterInfo(reader, false); var known = RouterInfos.ContainsKey(one.Identity.IdentHash); if (!ValidateRI(one) && known) { s.Delete(RouterInfos[one.Identity.IdentHash].Value.StoreIx); RouterInfos.Remove(one.Identity.IdentHash); Statistics.DestinationInformationFaulty(one.Identity.IdentHash); continue; } RouterInfos[one.Identity.IdentHash] = new KeyValuePair <I2PRouterInfo, RouterInfoMeta>( one, new RouterInfoMeta(ix)); break; case StoreRecordId.StoreIdConfig: AccessConfig(delegate(Dictionary <I2PString, I2PString> settings) { var key = new I2PString(reader); settings[key] = new I2PString(reader); }); break; default: s.Delete(ix); break; } } catch (Exception ex) { DebugUtils.LogDebug($"NetDb: Load: Store exception, ix [{ix}] removed. {ex}"); s.Delete(ix); } } sw2.Stop(); DebugUtils.Log($"Store: {sw2.Elapsed}"); } var files = GetNetDbFiles(); foreach (var file in files) { AddRouterInfo(file); } lock (RouterInfos) if (RouterInfos.Count == 0) { DebugUtils.LogWarning($"WARNING: NetDB database contains no routers. Add router files to {NetDbPath}."); } Statistics.Load(); UpdateSelectionProbabilities(); Save(true); foreach (var file in files) { File.Delete(file); } }
void Load() { using (var s = GetStore()) { var sw2 = new Stopwatch(); sw2.Start(); var ix = 0; while (s != null && (ix = s.Next(ix)) > 0) { var reader = new BufRefLen(s.Read(ix)); var recordtype = (StoreRecordId)reader.Read32(); try { switch (recordtype) { case StoreRecordId.StoreIdRouterInfo: var one = new I2PRouterInfo(reader, false); if (!ValidateRI(one)) { s.Delete(ix); RouterInfos.TryRemove(one.Identity.IdentHash, out _); FloodfillInfos.TryRemove(one.Identity.IdentHash, out _); Statistics.DestinationInformationFaulty(one.Identity.IdentHash); continue; } if (!RouterContext.Inst.UseIpV6) { if (!one.Adresses.Any(a => a.Options.ValueContains("host", "."))) { Logging.LogDebug($"NetDb: RouterInfo have no IPV4 address: {one.Identity.IdentHash.Id32}"); s.Delete(ix); continue; } } var re = new RouterEntry( one, new RouterInfoMeta(ix)); RouterInfos[one.Identity.IdentHash] = re; if (re.IsFloodfill) { FloodfillInfos[one.Identity.IdentHash] = re; } break; case StoreRecordId.StoreIdConfig: AccessConfig(delegate(Dictionary <I2PString, I2PString> settings) { var key = new I2PString(reader); settings[key] = new I2PString(reader); }); break; default: s.Delete(ix); break; } } catch (Exception ex) { Logging.LogDebug($"NetDb: Load: Store exception, ix [{ix}] removed. {ex}"); s.Delete(ix); } } sw2.Stop(); Logging.Log($"Store: {sw2.Elapsed}"); } ImportNetDbFiles(); if (RouterInfos.Count < 20) { Logging.LogWarning($"WARNING: NetDB database contains " + $"{RouterInfos.Count} routers. Add router files to {NetDbPath}."); DoBootstrap(); } Statistics.Load(); IsFirewalledUpdate(); #if DEBUG ShowDebugDatabaseInfo(); #endif UpdateSelectionProbabilities(); Save(true); }
public SetDateMessage(BufRef data) : base(ProtocolMessageType.SetDate) { Date = new I2PDate(data); Version = new I2PString(data); }
public SetDateMessage(I2PDate date, I2PString ver) : base(ProtocolMessageType.SetDate) { Date = date; Version = ver; }
void Save(bool onlyupdated) { var created = 0; var updated = 0; var deleted = 0; var sw = new Stopwatch(); sw.Start(); var inactive = Statistics.GetInactive(); RemoveRouterInfo(inactive); using (var s = GetStore()) { lock ( RouterInfos ) { foreach (var one in RouterInfos.ToArray()) { try { if (one.Value.Value.Deleted) { if (one.Value.Value.StoreIx > 0) { s.Delete(one.Value.Value.StoreIx); } RouterInfos.Remove(one.Key); ++deleted; continue; } if (!onlyupdated || (onlyupdated && one.Value.Value.Updated)) { var rec = new BufLen[] { (BufLen)(int)StoreRecordId.StoreIdRouterInfo, new BufLen(one.Value.Key.ToByteArray()) }; if (one.Value.Value.StoreIx > 0) { s.Write(rec, one.Value.Value.StoreIx); ++updated; } else { one.Value.Value.StoreIx = s.Write(rec); ++created; } one.Value.Value.Updated = false; } } catch (Exception ex) { Logging.LogDebug("NetDb: Save: Store exception: " + ex.ToString()); one.Value.Value.StoreIx = -1; } } } var lookup = s.GetMatching(e => (StoreRecordId)e[0] == StoreRecordId.StoreIdConfig, 1); Dictionary <I2PString, int> str2ix = new Dictionary <I2PString, int>(); foreach (var one in lookup) { var reader = new BufRefLen(one.Value); reader.Read32(); var key = new I2PString(reader); str2ix[key] = one.Key; } AccessConfig(delegate(Dictionary <I2PString, I2PString> settings) { foreach (var one in settings) { var rec = new BufLen[] { (BufLen)(int)StoreRecordId.StoreIdConfig, new BufLen(one.Key.ToByteArray()), new BufLen(one.Value.ToByteArray()) }; if (str2ix.ContainsKey(one.Key)) { s.Write(rec, str2ix[one.Key]); } else { s.Write(rec); } } }); } Logging.Log($"NetDb.Save( {( onlyupdated ? "updated" : "all" )} ): " + $"{created} created, {updated} updated, {deleted} deleted."); Statistics.RemoveOldStatistics(); UpdateSelectionProbabilities(); sw.Stop(); Logging.Log($"NetDB: Save: {sw.Elapsed}"); }
public GetDateMessage(string ver, I2PMapping map) : base(ProtocolMessageType.GetDate) { Version = new I2PString(ver); Mapping = map; }