skyscraper8/skyscraper8/Skyscraper/Scraper/Storage/StorageConnectionManager.cs

216 lines
7.0 KiB
C#

using log4net;
using skyscraper5.Skyscraper;
using skyscraper5.Skyscraper.Plugins;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using skyscraper5.Skyscraper.Net;
using skyscraper5.Skyscraper.Scraper.Storage;
using skyscraper8.Skyscraper.Net;
using skyscraper8.Skyscraper.Net.Pcap;
namespace skyscraper8.Skyscraper.Scraper.Storage
{
public class StorageConnectionManager
{
private StorageConnectionManager()
{
plugins = PluginManager.GetInstance();
ini = plugins.Ini;
}
private readonly PluginManager plugins;
private static StorageConnectionManager _instance;
private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name);
private static Type storageNameAttributeType = typeof(StorageNameAttribute);
private readonly Ini ini;
public static StorageConnectionManager GetInstance()
{
if (_instance == null)
_instance = new StorageConnectionManager();
return _instance;
}
public IEnumerable<Tuple<int,bool,string>> GetAllKnownFactoryNames()
{
ReadOnlyDictionary<int, DataStorageFactory> dataStorages = plugins.GetDataStorages();
foreach (KeyValuePair<int, DataStorageFactory> dataStorageFactory in dataStorages)
{
yield return new Tuple<int, bool, string>(dataStorageFactory.Key, true, GetName(dataStorageFactory.Value));
}
ReadOnlyDictionary<int, ObjectStorageFactory> objectStorages = plugins.GetObjectStorages();
foreach (KeyValuePair<int, ObjectStorageFactory> objectStorageFactory in objectStorages)
{
yield return new Tuple<int, bool, string>(objectStorageFactory.Key, false, GetName(objectStorageFactory.Value));
}
}
public string GetName(object o)
{
Type type = o.GetType();
Attribute attribute = type.GetCustomAttribute(storageNameAttributeType);
StorageNameAttribute storageNameAttribute = attribute as StorageNameAttribute;
if (storageNameAttribute == null)
{
logger.WarnFormat("{0} does not have a {1}.", type.Name, storageNameAttributeType.Name);
return type.Name;
}
return storageNameAttribute.Name;
}
public DataStorageFactory GetDefaultDataStorageFactory()
{
int requiredDataStorageId = ini.ReadValue("startup", "dataStorage", -1);
if (requiredDataStorageId == -1)
{
throw new ScraperStorageException("Could not determine the data storage factory from ini file. Configure it using the UI!");
}
string iniCategoryName = String.Format("dataStorage{0}", requiredDataStorageId);
if (!ini.ContainsKey(iniCategoryName))
{
throw new ScraperStorageException("Could not find configuration for the storage factory. Configure it using the UI!");
}
ReadOnlyDictionary<int, DataStorageFactory> dataStorages = plugins.GetDataStorages();
KeyValuePair<int, DataStorageFactory> valuePair = dataStorages.First(x => x.Key == requiredDataStorageId);
if (valuePair.Value == null)
{
throw new ScraperStorageException(String.Format("Storage Factory {0} was not loaded. Reconfigure with the UI!", requiredDataStorageId));
}
string factoryCname = String.Format("dataStorage{0}", requiredDataStorageId);
PluginManager.GetInstance().AutoconfigureObject(factoryCname, valuePair.Value);
return valuePair.Value;
}
public ObjectStorageFactory GetDefaultObjectStorageFactory()
{
int requiredObjectStorageId = ini.ReadValue("startup", "objectStorage", -1);
if (requiredObjectStorageId == -1)
{
throw new ScraperStorageException("Could not determine the object storage factory from ini file. Configure it using the UI!");
}
string iniCategoryName = String.Format("objectStorage{0}", requiredObjectStorageId);
if (!ini.ContainsKey(iniCategoryName))
{
throw new ScraperStorageException("Could not find configuration for the object storage factory. Configure it using the UI!");
}
ReadOnlyDictionary<int, ObjectStorageFactory> dataStorages = plugins.GetObjectStorages();
KeyValuePair<int, ObjectStorageFactory> valuePair = dataStorages.First(x => x.Key == requiredObjectStorageId);
if (valuePair.Value == null)
{
throw new ScraperStorageException(String.Format("Object Storage Factory {0} was not loaded. Reconfigure with the UI!", requiredObjectStorageId));
}
string factoryCname = String.Format("objectStorage{0}", requiredObjectStorageId);
PluginManager.GetInstance().AutoconfigureObject(factoryCname, valuePair.Value);
return valuePair.Value;
}
public static object[] GetPluginConnectors(DataStorage dataStorage, ObjectStorage objectStorage)
{
object[] dataConnector = dataStorage.GetPluginConnector();
object[] objectConnector = objectStorage.GetPluginConnector();
object[] result = new object[dataConnector.Length + objectConnector.Length];
Array.Copy(dataConnector, 0, result, 0, dataConnector.Length);
Array.Copy(objectConnector, 0, result, dataConnector.Length, objectConnector.Length);
return result;
}
public bool IniExists()
{
return ini != null;
}
public ReadOnlyDictionary<int, ObjectStorageFactory> GetObjectStorages()
{
return plugins.GetObjectStorages();
}
public ReadOnlyDictionary<int, DataStorageFactory> GetDataStorages()
{
return plugins.GetDataStorages();
}
private bool IsIpTafficHandlerConfigured()
{
if (ini == null)
return false;
if (!ini.ContainsKey("ip_handler"))
return false;
if (!ini["ip_handler"].ContainsKey("type"))
return false;
return true;
}
internal IpTrafficHandler GetDefaultIpTrafficHandler()
{
Type targetType;
if (IsIpTafficHandlerConfigured())
{
ReadOnlyDictionary<int, Type> handlers = plugins.GetIpTrafficHandlers();
int type = Int32.Parse(ini["ip_handler"]["type"]);
if (!handlers.ContainsKey(type))
{
logger.WarnFormat("The IP traffic handler with ID {0} was not found. I'm gonna assume you want the pcap files.", type);
targetType = typeof(PcapIpTrafficHandler);
}
else
{
targetType = handlers[type];
}
}
else
{
logger.WarnFormat("You didn't call \"pcapon\" or \"pcapoff\" before. I'm gonna assume you want the pcap files.");
targetType = typeof(PcapIpTrafficHandler);
}
ConstructorInfo constructorInfo = targetType.GetConstructor(new Type[] { });
if (constructorInfo == null)
{
throw new ScraperStorageException(String.Format("The type {0} doesn't contain a parameterless constructor.", targetType.Name));
}
object invoke = constructorInfo.Invoke(new object[] { });
return (IpTrafficHandler) invoke;
}
private bool IsSubTsDumpingConfigured()
{
if (ini == null)
return false;
if (!ini.ContainsKey("subts"))
return false;
if (!ini["subts"].ContainsKey("dump"))
return false;
return true;
}
internal bool IsSubTsDumpingEnabled()
{
if (IsSubTsDumpingConfigured())
{
return ini.ReadValue("subts", "dump", true);
}
else
{
logger.WarnFormat("You didn't call the subts option before. I'm gonna assume you want me to dump inner TS packets.");
return true;
}
}
}
}