/// <summary>Submits a device report</summary> /// <param name="report">Device report</param> public static void SubmitReport(DeviceReportV2 report) { var submitThread = new Thread(() => { try { #if DEBUG System.Console.WriteLine("Uploading device report"); #else Aaru.Console.AaruConsole.DebugWriteLine("Submit stats", "Uploading device report"); #endif string json = JsonConvert.SerializeObject(report, Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); byte[] jsonBytes = Encoding.UTF8.GetBytes(json); var request = WebRequest.Create("https://www.aaru.app/api/uploadreportv2"); ((HttpWebRequest)request).UserAgent = $"Aaru {typeof(Version).Assembly.GetName().Version}"; request.Method = "POST"; request.ContentLength = jsonBytes.Length; request.ContentType = "application/json"; Stream reqStream = request.GetRequestStream(); reqStream.Write(jsonBytes, 0, jsonBytes.Length); reqStream.Close(); WebResponse response = request.GetResponse(); if (((HttpWebResponse)response).StatusCode != HttpStatusCode.OK) { return; } Stream data = response.GetResponseStream(); var reader = new StreamReader(data ?? throw new InvalidOperationException()); reader.ReadToEnd(); data.Close(); response.Close(); } catch (WebException) { // Can't connect to the server, do nothing } // ReSharper disable once RedundantCatchClause catch { #if DEBUG if (Debugger.IsAttached) { throw; } #endif } }); submitThread.Start(); }
public DeviceDto(DeviceReportV2 report) { ATA = report.ATA; ATAPI = report.ATAPI; CompactFlash = report.CompactFlash; FireWire = report.FireWire; MultiMediaCard = report.MultiMediaCard; PCMCIA = report.PCMCIA; SCSI = report.SCSI; SecureDigital = report.SecureDigital; USB = report.USB; Manufacturer = report.Manufacturer; Model = report.Model; Revision = report.Revision; Type = report.Type; }
public UploadedReport(DeviceReportV2 report) { ATA = report.ATA; ATAPI = report.ATAPI; CompactFlash = report.CompactFlash; FireWire = report.FireWire; UploadedWhen = DateTime.UtcNow; MultiMediaCard = report.MultiMediaCard; PCMCIA = report.PCMCIA; SCSI = report.SCSI; SecureDigital = report.SecureDigital; USB = report.USB; Manufacturer = report.Manufacturer; Model = report.Model; Revision = report.Revision; Type = report.Type; }
public ActionResult Index() { ViewBag.Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); try { if (System.IO.File.Exists(Path.Combine(_env.ContentRootPath ?? throw new InvalidOperationException(), "Statistics", "Statistics.xml"))) { try { var statistics = new Stats(); var xs = new XmlSerializer(statistics.GetType()); FileStream fs = WaitForFile(Path.Combine(_env.ContentRootPath ?? throw new InvalidOperationException(), "Statistics", "Statistics.xml"), FileMode.Open, FileAccess.Read, FileShare.Read); statistics = (Stats)xs.Deserialize(fs); fs.Close(); StatsConverter.Convert(statistics); System.IO.File.Delete(Path.Combine(_env.ContentRootPath ?? throw new InvalidOperationException(), "Statistics", "Statistics.xml")); } catch (XmlException) { // Do nothing } } if (_ctx.OperatingSystems.Any()) { List <NameValueStats> operatingSystems = new(); foreach (OperatingSystem nvs in _ctx.OperatingSystems) { operatingSystems.Add(new NameValueStats { name = $"{DetectOS.GetPlatformName((PlatformID)Enum.Parse(typeof(PlatformID), nvs.Name), nvs.Version)}{(string.IsNullOrEmpty(nvs.Version) ? "" : " ")}{nvs.Version}", Value = nvs.Count }); } ViewBag.repOperatingSystems = operatingSystems.OrderBy(os => os.name).ToList(); } if (_ctx.Versions.Any()) { List <NameValueStats> versions = new(); foreach (Version nvs in _ctx.Versions) { versions.Add(new NameValueStats { name = nvs.Name == "previous" ? "Previous than 3.4.99.0" : nvs.Name, Value = nvs.Count }); } ViewBag.repVersions = versions.OrderBy(ver => ver.name).ToList(); } if (_ctx.Commands.Any()) { ViewBag.repCommands = _ctx.Commands.OrderBy(c => c.Name).ToList(); } if (_ctx.Filters.Any()) { ViewBag.repFilters = _ctx.Filters.OrderBy(filter => filter.Name).ToList(); } if (_ctx.MediaFormats.Any()) { ViewBag.repMediaImages = _ctx.MediaFormats.OrderBy(filter => filter.Name).ToList(); } if (_ctx.Partitions.Any()) { ViewBag.repPartitions = _ctx.Partitions.OrderBy(filter => filter.Name).ToList(); } if (_ctx.Filesystems.Any()) { ViewBag.repFilesystems = _ctx.Filesystems.OrderBy(filter => filter.Name).ToList(); } if (_ctx.Medias.Any()) { List <MediaItem> realMedia = new(); List <MediaItem> virtualMedia = new(); foreach (Media nvs in _ctx.Medias) { try { (string type, string subType)mediaType = MediaType.MediaTypeToString((CommonTypes.MediaType)Enum.Parse(typeof(CommonTypes.MediaType), nvs.Type)); if (nvs.Real) { realMedia.Add(new MediaItem { Type = mediaType.type, SubType = mediaType.subType, Count = nvs.Count }); } else { virtualMedia.Add(new MediaItem { Type = mediaType.type, SubType = mediaType.subType, Count = nvs.Count }); } } catch { if (nvs.Real) { realMedia.Add(new MediaItem { Type = nvs.Type, SubType = null, Count = nvs.Count }); } else { virtualMedia.Add(new MediaItem { Type = nvs.Type, SubType = null, Count = nvs.Count }); } } } if (realMedia.Count > 0) { ViewBag.repRealMedia = realMedia.OrderBy(media => media.Type).ThenBy(media => media.SubType). ToList(); } if (virtualMedia.Count > 0) { ViewBag.repVirtualMedia = virtualMedia.OrderBy(media => media.Type).ThenBy(media => media.SubType). ToList(); } } if (_ctx.DeviceStats.Any()) { List <DeviceItem> devices = new(); foreach (DeviceStat device in _ctx.DeviceStats.ToList()) { string xmlFile; if (!string.IsNullOrWhiteSpace(device.Manufacturer) && !string.IsNullOrWhiteSpace(device.Model) && !string.IsNullOrWhiteSpace(device.Revision)) { xmlFile = device.Manufacturer + "_" + device.Model + "_" + device.Revision + ".xml"; } else if (!string.IsNullOrWhiteSpace(device.Manufacturer) && !string.IsNullOrWhiteSpace(device.Model)) { xmlFile = device.Manufacturer + "_" + device.Model + ".xml"; } else if (!string.IsNullOrWhiteSpace(device.Model) && !string.IsNullOrWhiteSpace(device.Revision)) { xmlFile = device.Model + "_" + device.Revision + ".xml"; } else { xmlFile = device.Model + ".xml"; } xmlFile = xmlFile.Replace('/', '_').Replace('\\', '_').Replace('?', '_'); if (System.IO.File.Exists(Path.Combine(_env.ContentRootPath, "Reports", xmlFile))) { var deviceReport = new DeviceReport(); var xs = new XmlSerializer(deviceReport.GetType()); FileStream fs = WaitForFile(Path.Combine(_env.ContentRootPath ?? throw new InvalidOperationException(), "Reports", xmlFile), FileMode.Open, FileAccess.Read, FileShare.Read); deviceReport = (DeviceReport)xs.Deserialize(fs); fs.Close(); var deviceReportV2 = new DeviceReportV2(deviceReport); device.Report = _ctx.Devices.Add(new Device(deviceReportV2)).Entity; _ctx.SaveChanges(); System.IO.File. Delete(Path.Combine(_env.ContentRootPath ?? throw new InvalidOperationException(), "Reports", xmlFile)); } devices.Add(new DeviceItem { Manufacturer = device.Manufacturer, Model = device.Model, Revision = device.Revision, Bus = device.Bus, ReportId = device.Report != null && device.Report.Id != 0 ? device.Report.Id : 0 }); } ViewBag.repDevices = devices.OrderBy(device => device.Manufacturer).ThenBy(device => device.Model). ThenBy(device => device.Revision).ThenBy(device => device.Bus).ToList(); } } catch (Exception) { #if DEBUG throw; #endif return(Content("Could not read statistics")); } return(View()); }
public ActionResult Index() { ViewBag.Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); try { if ( System.IO.File .Exists(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), "Statistics", "Statistics.xml"))) { try { Stats statistics = new Stats(); XmlSerializer xs = new XmlSerializer(statistics.GetType()); FileStream fs = WaitForFile(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), "Statistics", "Statistics.xml"), FileMode.Open, FileAccess.Read, FileShare.Read); statistics = (Stats)xs.Deserialize(fs); fs.Close(); StatsConverter.Convert(statistics); System.IO.File .Delete(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), "Statistics", "Statistics.xml")); } catch (XmlException) { // Do nothing } } if (ctx.OperatingSystems.Any()) { operatingSystems = new List <NameValueStats>(); foreach (OperatingSystem nvs in ctx.OperatingSystems) { operatingSystems.Add(new NameValueStats { name = $"{DetectOS.GetPlatformName((PlatformID)Enum.Parse(typeof(PlatformID), nvs.Name), nvs.Version)}{(string.IsNullOrEmpty(nvs.Version) ? "" : " ")}{nvs.Version}", Value = nvs.Count }); } ViewBag.repOperatingSystems = operatingSystems.OrderBy(os => os.name).ToList(); List <PieSeriesData> osPieData = new List <PieSeriesData>(); decimal totalOsCount = ctx.OperatingSystems.Sum(o => o.Count); foreach (string os in ctx.OperatingSystems.Select(o => o.Name).Distinct().ToList()) { decimal osCount = ctx.OperatingSystems.Where(o => o.Name == os).Sum(o => o.Count); osPieData.Add(new PieSeriesData { Name = DetectOS.GetPlatformName((PlatformID)Enum.Parse(typeof(PlatformID), os)), Y = (double?)(osCount / totalOsCount), Sliced = os == "Linux", Selected = os == "Linux" }); } ViewData["osPieData"] = osPieData; List <PieSeriesData> linuxPieData = new List <PieSeriesData>(); decimal linuxCount = ctx.OperatingSystems.Where(o => o.Name == PlatformID.Linux.ToString()) .Sum(o => o.Count); foreach (OperatingSystem version in ctx.OperatingSystems.Where(o => o.Name == PlatformID.Linux.ToString())) { linuxPieData.Add(new PieSeriesData { Name = $"{DetectOS.GetPlatformName(PlatformID.Linux, version.Version)}{(string.IsNullOrEmpty(version.Version) ? "" : " ")}{version.Version}", Y = (double?)(version.Count / linuxCount) }); } ViewData["linuxPieData"] = linuxPieData; List <PieSeriesData> macosPieData = new List <PieSeriesData>(); decimal macosCount = ctx.OperatingSystems.Where(o => o.Name == PlatformID.MacOSX.ToString()) .Sum(o => o.Count); foreach (OperatingSystem version in ctx.OperatingSystems.Where(o => o.Name == PlatformID.MacOSX.ToString())) { macosPieData.Add(new PieSeriesData { Name = $"{DetectOS.GetPlatformName(PlatformID.MacOSX, version.Version)}{(string.IsNullOrEmpty(version.Version) ? "" : " ")}{version.Version}", Y = (double?)(version.Count / macosCount) }); } ViewData["macosPieData"] = macosPieData; List <PieSeriesData> windowsPieData = new List <PieSeriesData>(); decimal windowsCount = ctx.OperatingSystems.Where(o => o.Name == PlatformID.Win32NT.ToString()) .Sum(o => o.Count); foreach (OperatingSystem version in ctx.OperatingSystems.Where(o => o.Name == PlatformID.Win32NT.ToString())) { windowsPieData.Add(new PieSeriesData { Name = $"{DetectOS.GetPlatformName(PlatformID.Win32NT, version.Version)}{(string.IsNullOrEmpty(version.Version) ? "" : " ")}{version.Version}", Y = (double?)(version.Count / windowsCount) }); } ViewData["windowsPieData"] = windowsPieData; } if (ctx.Versions.Any()) { versions = new List <NameValueStats>(); foreach (Version nvs in ctx.Versions) { versions.Add(new NameValueStats { name = nvs.Value == "previous" ? "Previous than 3.4.99.0" : nvs.Value, Value = nvs.Count }); } ViewBag.repVersions = versions.OrderBy(ver => ver.name).ToList(); decimal totalVersionCount = ctx.Versions.Sum(o => o.Count); ViewData["versionsPieData"] = ctx.Versions.Select(version => new PieSeriesData { Name = version.Value == "previous" ? "Previous than 3.4.99.0" : version.Value, Y = (double?)(version.Count / totalVersionCount), Sliced = version.Value == "previous", Selected = version.Value == "previous" }).ToList(); } if (ctx.Commands.Any()) { ViewBag.repCommands = ctx.Commands.OrderBy(c => c.Name).ToList(); decimal totalCommandCount = ctx.Commands.Sum(o => o.Count); ViewData["commandsPieData"] = ctx .Commands.Select(command => new PieSeriesData { Name = command.Name, Y = (double?)(command.Count / totalCommandCount), Sliced = command.Name == "analyze", Selected = command.Name == "analyze" }).ToList(); } if (ctx.Filters.Any()) { ViewBag.repFilters = ctx.Filters.OrderBy(filter => filter.Name).ToList(); List <PieSeriesData> filtersPieData = new List <PieSeriesData>(); decimal totalFiltersCount = ctx.Filters.Sum(o => o.Count); foreach (Filter filter in ctx.Filters.ToList()) { filtersPieData.Add(new PieSeriesData { Name = filter.Name, Y = (double?)(filter.Count / totalFiltersCount), Sliced = filter.Name == "No filter", Selected = filter.Name == "No filter" }); } ViewData["filtersPieData"] = filtersPieData; } if (ctx.MediaFormats.Any()) { ViewBag.repMediaImages = ctx.MediaFormats.OrderBy(filter => filter.Name).ToList(); List <PieSeriesData> formatsPieData = new List <PieSeriesData>(); decimal totalFormatsCount = ctx.MediaFormats.Sum(o => o.Count); decimal top10FormatCount = 0; foreach (MediaFormat format in ctx.MediaFormats.OrderByDescending(o => o.Count).Take(10)) { top10FormatCount += format.Count; formatsPieData.Add(new PieSeriesData { Name = format.Name, Y = (double?)(format.Count / totalFormatsCount) }); } formatsPieData.Add(new PieSeriesData { Name = "Other", Y = (double?)((totalFormatsCount - top10FormatCount) / totalFormatsCount), Sliced = true, Selected = true }); ViewData["formatsPieData"] = formatsPieData; } if (ctx.Partitions.Any()) { ViewBag.repPartitions = ctx.Partitions.OrderBy(filter => filter.Name).ToList(); List <PieSeriesData> partitionsPieData = new List <PieSeriesData>(); decimal totalPartitionsCount = ctx.Partitions.Sum(o => o.Count); decimal top10PartitionCount = 0; foreach (Partition partition in ctx.Partitions.OrderByDescending(o => o.Count).Take(10)) { top10PartitionCount += partition.Count; partitionsPieData.Add(new PieSeriesData { Name = partition.Name, Y = (double?)(partition.Count / totalPartitionsCount) }); } partitionsPieData.Add(new PieSeriesData { Name = "Other", Y = (double?)((totalPartitionsCount - top10PartitionCount) / totalPartitionsCount), Sliced = true, Selected = true }); ViewData["partitionsPieData"] = partitionsPieData; } if (ctx.Filesystems.Any()) { ViewBag.repFilesystems = ctx.Filesystems.OrderBy(filter => filter.Name).ToList(); List <PieSeriesData> filesystemsPieData = new List <PieSeriesData>(); decimal totalFilesystemsCount = ctx.Filesystems.Sum(o => o.Count); decimal top10FilesystemCount = 0; foreach (Filesystem filesystem in ctx.Filesystems.OrderByDescending(o => o.Count).Take(10)) { top10FilesystemCount += filesystem.Count; filesystemsPieData.Add(new PieSeriesData { Name = filesystem.Name, Y = (double?)(filesystem.Count / totalFilesystemsCount) }); } filesystemsPieData.Add(new PieSeriesData { Name = "Other", Y = (double?)((totalFilesystemsCount - top10FilesystemCount) / totalFilesystemsCount), Sliced = true, Selected = true }); ViewData["filesystemsPieData"] = filesystemsPieData; } if (ctx.Medias.Any()) { realMedia = new List <MediaItem>(); virtualMedia = new List <MediaItem>(); foreach (Media nvs in ctx.Medias) { try { MediaType .MediaTypeToString((CommonTypes.MediaType)Enum.Parse(typeof(CommonTypes.MediaType), nvs.Type), out string type, out string subtype); if (nvs.Real) { realMedia.Add(new MediaItem { Type = type, SubType = subtype, Count = nvs.Count }); } else { virtualMedia.Add(new MediaItem { Type = type, SubType = subtype, Count = nvs.Count }); } } catch { if (nvs.Real) { realMedia.Add(new MediaItem { Type = nvs.Type, SubType = null, Count = nvs.Count }); } else { virtualMedia.Add(new MediaItem { Type = nvs.Type, SubType = null, Count = nvs.Count }); } } } if (realMedia.Count > 0) { ViewBag.repRealMedia = realMedia.OrderBy(media => media.Type).ThenBy(media => media.SubType).ToList(); List <PieSeriesData> realMediaPieData = new List <PieSeriesData>(); decimal totalRealMediaCount = realMedia.Sum(o => o.Count); decimal top10RealMediaCount = 0; foreach (MediaItem realMediaItem in realMedia.OrderByDescending(o => o.Count).Take(10)) { top10RealMediaCount += realMediaItem.Count; realMediaPieData.Add(new PieSeriesData { Name = $"{realMediaItem.Type} ({realMediaItem.SubType})", Y = (double?)(realMediaItem.Count / totalRealMediaCount) }); } realMediaPieData.Add(new PieSeriesData { Name = "Other", Y = (double?)((totalRealMediaCount - top10RealMediaCount) / totalRealMediaCount), Sliced = true, Selected = true }); ViewData["realMediaPieData"] = realMediaPieData; } if (virtualMedia.Count > 0) { ViewBag.repVirtualMedia = virtualMedia.OrderBy(media => media.Type).ThenBy(media => media.SubType).ToList(); List <PieSeriesData> virtualMediaPieData = new List <PieSeriesData>(); decimal totalVirtualMediaCount = virtualMedia.Sum(o => o.Count); decimal top10VirtualMediaCount = 0; foreach (MediaItem virtualMediaItem in virtualMedia.OrderByDescending(o => o.Count).Take(10)) { top10VirtualMediaCount += virtualMediaItem.Count; virtualMediaPieData.Add(new PieSeriesData { Name = $"{virtualMediaItem.Type} ({virtualMediaItem.SubType})", Y = (double?)(virtualMediaItem.Count / totalVirtualMediaCount) }); } virtualMediaPieData.Add(new PieSeriesData { Name = "Other", Y = (double?) ((totalVirtualMediaCount - top10VirtualMediaCount) / totalVirtualMediaCount), Sliced = true, Selected = true }); ViewData["virtualMediaPieData"] = virtualMediaPieData; } } if (ctx.DeviceStats.Any()) { devices = new List <DeviceItem>(); foreach (DeviceStat device in ctx.DeviceStats.ToList()) { string xmlFile; if (!string.IsNullOrWhiteSpace(device.Manufacturer) && !string.IsNullOrWhiteSpace(device.Model) && !string.IsNullOrWhiteSpace(device.Revision)) { xmlFile = device.Manufacturer + "_" + device.Model + "_" + device.Revision + ".xml"; } else if (!string.IsNullOrWhiteSpace(device.Manufacturer) && !string.IsNullOrWhiteSpace(device.Model)) { xmlFile = device.Manufacturer + "_" + device.Model + ".xml"; } else if (!string.IsNullOrWhiteSpace(device.Model) && !string.IsNullOrWhiteSpace(device.Revision)) { xmlFile = device.Model + "_" + device.Revision + ".xml"; } else { xmlFile = device.Model + ".xml"; } xmlFile = xmlFile.Replace('/', '_').Replace('\\', '_').Replace('?', '_'); if (System.IO.File.Exists(Path.Combine(HostingEnvironment.MapPath("~"), "Reports", xmlFile))) { DeviceReport deviceReport = new DeviceReport(); XmlSerializer xs = new XmlSerializer(deviceReport.GetType()); FileStream fs = WaitForFile(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), "Reports", xmlFile), FileMode.Open, FileAccess.Read, FileShare.Read); deviceReport = (DeviceReport)xs.Deserialize(fs); fs.Close(); DeviceReportV2 deviceReportV2 = new DeviceReportV2(deviceReport); device.Report = ctx.Devices.Add(new Device(deviceReportV2)); ctx.SaveChanges(); System.IO.File .Delete(Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), "Reports", xmlFile)); } devices.Add(new DeviceItem { Manufacturer = device.Manufacturer, Model = device.Model, Revision = device.Revision, Bus = device.Bus, ReportId = device.Report != null && device.Report.Id != 0 ? device.Report.Id : 0 }); } ViewBag.repDevices = devices.OrderBy(device => device.Manufacturer).ThenBy(device => device.Model) .ThenBy(device => device.Revision).ThenBy(device => device.Bus) .ToList(); ViewData["devicesBusPieData"] = (from deviceBus in devices.Select(d => d.Bus).Distinct() let deviceBusCount = devices.Count(d => d.Bus == deviceBus) select new PieSeriesData { Name = deviceBus, Y = deviceBusCount / (double)devices.Count }).ToList(); ViewData["devicesManufacturerPieData"] = (from manufacturer in devices.Where(d => d.Manufacturer != null).Select(d => d.Manufacturer.ToLowerInvariant()) .Distinct() let manufacturerCount = devices.Count(d => d.Manufacturer?.ToLowerInvariant() == manufacturer) select new PieSeriesData { Name = manufacturer, Y = manufacturerCount / (double)devices.Count }) .ToList(); } } catch (Exception) { #if DEBUG throw; #endif return(Content("Could not read statistics")); } return(View()); }
public async Task <IActionResult> UploadReport() { var response = new ContentResult { StatusCode = (int)HttpStatusCode.OK, ContentType = "text/plain" }; try { var newReport = new DeviceReport(); HttpRequest request = HttpContext.Request; var xs = new XmlSerializer(newReport.GetType()); newReport = (DeviceReport)xs.Deserialize(new StringReader(await new StreamReader(request.Body).ReadToEndAsync())); if (newReport == null) { response.Content = "notstats"; return(response); } var reportV2 = new DeviceReportV2(newReport); var jsonSw = new StringWriter(); await jsonSw.WriteAsync(JsonConvert.SerializeObject(reportV2, Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })); string reportV2String = jsonSw.ToString(); jsonSw.Close(); var newUploadedReport = new UploadedReport(reportV2); // Ensure CHS and CurrentCHS are not duplicates if (newUploadedReport.ATA?.ReadCapabilities?.CHS != null && newUploadedReport.ATA?.ReadCapabilities?.CurrentCHS != null) { if (newUploadedReport.ATA.ReadCapabilities.CHS.Cylinders == newUploadedReport.ATA.ReadCapabilities.CurrentCHS.Cylinders && newUploadedReport.ATA.ReadCapabilities.CHS.Heads == newUploadedReport.ATA.ReadCapabilities.CurrentCHS.Heads && newUploadedReport.ATA.ReadCapabilities.CHS.Sectors == newUploadedReport.ATA.ReadCapabilities.CurrentCHS.Sectors) { newUploadedReport.ATA.ReadCapabilities.CHS = newUploadedReport.ATA.ReadCapabilities.CurrentCHS; } } // Check if the CHS or CurrentCHS of this report already exist in the database if (newUploadedReport.ATA?.ReadCapabilities?.CHS != null) { Chs existingChs = _ctx.Chs.FirstOrDefault(c => c.Cylinders == newUploadedReport.ATA.ReadCapabilities.CHS.Cylinders && c.Heads == newUploadedReport.ATA.ReadCapabilities.CHS.Heads && c.Sectors == newUploadedReport.ATA.ReadCapabilities.CHS.Sectors); if (existingChs != null) { newUploadedReport.ATA.ReadCapabilities.CHS = existingChs; } } if (newUploadedReport.ATA?.ReadCapabilities?.CurrentCHS != null) { Chs existingChs = _ctx.Chs.FirstOrDefault(c => c.Cylinders == newUploadedReport.ATA.ReadCapabilities.CurrentCHS. Cylinders && c.Heads == newUploadedReport.ATA.ReadCapabilities.CurrentCHS.Heads && c.Sectors == newUploadedReport.ATA.ReadCapabilities.CurrentCHS.Sectors); if (existingChs != null) { newUploadedReport.ATA.ReadCapabilities.CurrentCHS = existingChs; } } if (newUploadedReport.ATA?.RemovableMedias != null) { foreach (TestedMedia media in newUploadedReport.ATA.RemovableMedias) { if (media.CHS != null && media.CurrentCHS != null) { if (media.CHS.Cylinders == media.CurrentCHS.Cylinders && media.CHS.Heads == media.CurrentCHS.Heads && media.CHS.Sectors == media.CurrentCHS.Sectors) { media.CHS = media.CurrentCHS; } } if (media.CHS != null) { Chs existingChs = _ctx.Chs.FirstOrDefault(c => c.Cylinders == media.CHS.Cylinders && c.Heads == media.CHS.Heads && c.Sectors == media.CHS.Sectors); if (existingChs != null) { media.CHS = existingChs; } } if (media.CHS != null) { Chs existingChs = _ctx.Chs.FirstOrDefault(c => c.Cylinders == media.CurrentCHS.Cylinders && c.Heads == media.CurrentCHS.Heads && c.Sectors == media.CurrentCHS.Sectors); if (existingChs != null) { media.CurrentCHS = existingChs; } } } } await _ctx.Reports.AddAsync(newUploadedReport); await _ctx.SaveChangesAsync(); var pgpIn = new MemoryStream(Encoding.UTF8.GetBytes(reportV2String)); var pgpOut = new MemoryStream(); var pgp = new ChoPGPEncryptDecrypt(); await pgp.EncryptAsync(pgpIn, pgpOut, Path.Combine(_environment.ContentRootPath ?? throw new InvalidOperationException(), "public.asc")); pgpOut.Position = 0; reportV2String = Encoding.UTF8.GetString(pgpOut.ToArray()); var message = new MimeMessage { Subject = "New device report (old version)", Body = new TextPart("plain") { Text = reportV2String } }; message.From.Add(new MailboxAddress("Aaru Server", "*****@*****.**")); message.To.Add(new MailboxAddress("Natalia Portillo", "*****@*****.**")); using (var client = new SmtpClient()) { await client.ConnectAsync("mail.claunia.com", 25, false); await client.SendAsync(message); await client.DisconnectAsync(true); } response.Content = "ok"; return(response); } // ReSharper disable once RedundantCatchClause catch { #if DEBUG if (Debugger.IsAttached) { throw; } #endif response.Content = "error"; return(response); } }
public async Task <IActionResult> UploadReport() { var response = new ContentResult { StatusCode = (int)HttpStatusCode.OK, ContentType = "text/plain" }; try { var newReport = new DeviceReport(); HttpRequest request = HttpContext.Request; var xs = new XmlSerializer(newReport.GetType()); newReport = (DeviceReport) xs.Deserialize(new StringReader(await new StreamReader(request.Body).ReadToEndAsync())); if (newReport == null) { response.Content = "notstats"; return(response); } var reportV2 = new DeviceReportV2(newReport); var jsonSw = new StringWriter(); jsonSw.Write(JsonConvert.SerializeObject(reportV2, Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })); string reportV2String = jsonSw.ToString(); jsonSw.Close(); ctx.Reports.Add(new UploadedReport(reportV2)); ctx.SaveChanges(); var pgpIn = new MemoryStream(Encoding.UTF8.GetBytes(reportV2String)); var pgpOut = new MemoryStream(); var pgp = new ChoPGPEncryptDecrypt(); pgp.Encrypt(pgpIn, pgpOut, Path.Combine(_environment.ContentRootPath ?? throw new InvalidOperationException(), "public.asc")); pgpOut.Position = 0; reportV2String = Encoding.UTF8.GetString(pgpOut.ToArray()); var message = new MimeMessage { Subject = "New device report (old version)", Body = new TextPart("plain") { Text = reportV2String } }; message.From.Add(new MailboxAddress("DiscImageChef", "*****@*****.**")); message.To.Add(new MailboxAddress("Natalia Portillo", "*****@*****.**")); using (var client = new SmtpClient()) { client.Connect("mail.claunia.com", 25, false); client.Send(message); client.Disconnect(true); } response.Content = "ok"; return(response); } // ReSharper disable once RedundantCatchClause catch { #if DEBUG if (Debugger.IsAttached) { throw; } #endif response.Content = "error"; return(response); } }
public void ReportScsiModes(ref DeviceReportV2 report, out byte[] cdromMode, out MediumTypes mediumType) { Modes.DecodedMode? decMode = null; PeripheralDeviceTypes devType = _dev.ScsiType; byte[] mode10Buffer; byte[] mode6Buffer; bool sense; mediumType = 0; AaruConsole.WriteLine("Querying all mode pages and subpages using SCSI MODE SENSE (10)..."); foreach (ScsiModeSensePageControl pageControl in new[] { ScsiModeSensePageControl.Default, ScsiModeSensePageControl.Current, ScsiModeSensePageControl.Changeable }) { bool saveBuffer = false; sense = _dev.ModeSense10(out mode10Buffer, out _, false, true, pageControl, 0x3F, 0xFF, _dev.Timeout, out _); if (sense || _dev.Error) { sense = _dev.ModeSense10(out mode10Buffer, out _, false, false, pageControl, 0x3F, 0xFF, _dev.Timeout, out _); if (sense || _dev.Error) { sense = _dev.ModeSense10(out mode10Buffer, out _, false, true, pageControl, 0x3F, 0x00, _dev.Timeout, out _); if (sense || _dev.Error) { sense = _dev.ModeSense10(out mode10Buffer, out _, false, false, pageControl, 0x3F, 0x00, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.SupportsModeSense10 = true; decMode ??= Modes.DecodeMode10(mode10Buffer, devType); saveBuffer = true; } } else { report.SCSI.SupportsModeSense10 = true; decMode ??= Modes.DecodeMode10(mode10Buffer, devType); saveBuffer = true; } } else { report.SCSI.SupportsModeSense10 = true; report.SCSI.SupportsModeSubpages = true; decMode ??= Modes.DecodeMode10(mode10Buffer, devType); saveBuffer = true; } } else { report.SCSI.SupportsModeSense10 = true; report.SCSI.SupportsModeSubpages = true; decMode ??= Modes.DecodeMode10(mode10Buffer, devType); saveBuffer = true; } if (!saveBuffer) { continue; } switch (pageControl) { case ScsiModeSensePageControl.Default: report.SCSI.ModeSense10Data = mode10Buffer; break; case ScsiModeSensePageControl.Changeable: report.SCSI.ModeSense10ChangeableData = mode10Buffer; break; case ScsiModeSensePageControl.Current: report.SCSI.ModeSense10CurrentData = mode10Buffer; break; } } AaruConsole.WriteLine("Querying all mode pages and subpages using SCSI MODE SENSE (6)..."); foreach (ScsiModeSensePageControl pageControl in new[] { ScsiModeSensePageControl.Default, ScsiModeSensePageControl.Current, ScsiModeSensePageControl.Changeable }) { bool saveBuffer = false; sense = _dev.ModeSense6(out mode6Buffer, out _, true, pageControl, 0x3F, 0xFF, _dev.Timeout, out _); if (sense || _dev.Error) { sense = _dev.ModeSense6(out mode6Buffer, out _, false, pageControl, 0x3F, 0xFF, _dev.Timeout, out _); if (sense || _dev.Error) { sense = _dev.ModeSense6(out mode6Buffer, out _, true, pageControl, 0x3F, 0x00, _dev.Timeout, out _); if (sense || _dev.Error) { sense = _dev.ModeSense6(out mode6Buffer, out _, false, pageControl, 0x3F, 0x00, _dev.Timeout, out _); if (sense || _dev.Error) { sense = _dev.ModeSense6(out mode6Buffer, out _, true, pageControl, 0x00, 0x00, _dev.Timeout, out _); if (sense || _dev.Error) { sense = _dev.ModeSense6(out mode6Buffer, out _, false, pageControl, 0x00, 0x00, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.SupportsModeSense6 = true; decMode ??= Modes.DecodeMode6(mode6Buffer, devType); saveBuffer = true; } } else { report.SCSI.SupportsModeSense6 = true; decMode ??= Modes.DecodeMode6(mode6Buffer, devType); saveBuffer = true; } } else { report.SCSI.SupportsModeSense6 = true; decMode ??= Modes.DecodeMode6(mode6Buffer, devType); saveBuffer = true; } } else { report.SCSI.SupportsModeSense6 = true; decMode ??= Modes.DecodeMode6(mode6Buffer, devType); saveBuffer = true; } } else { report.SCSI.SupportsModeSense10 = true; report.SCSI.SupportsModeSubpages = true; decMode ??= Modes.DecodeMode6(mode6Buffer, devType); saveBuffer = true; } } else { report.SCSI.SupportsModeSense6 = true; report.SCSI.SupportsModeSubpages = true; decMode ??= Modes.DecodeMode6(mode6Buffer, devType); saveBuffer = true; } if (!saveBuffer) { continue; } switch (pageControl) { case ScsiModeSensePageControl.Default: report.SCSI.ModeSense6Data = mode6Buffer; break; case ScsiModeSensePageControl.Changeable: report.SCSI.ModeSense6ChangeableData = mode6Buffer; break; case ScsiModeSensePageControl.Current: report.SCSI.ModeSense6CurrentData = mode6Buffer; break; } } cdromMode = null; if (!decMode.HasValue) { return; } mediumType = decMode.Value.Header.MediumType; report.SCSI.ModeSense = new ScsiMode { BlankCheckEnabled = decMode.Value.Header.EBC, DPOandFUA = decMode.Value.Header.DPOFUA, WriteProtected = decMode.Value.Header.WriteProtected }; if (decMode.Value.Header.BufferedMode > 0) { report.SCSI.ModeSense.BufferedMode = decMode.Value.Header.BufferedMode; } if (decMode.Value.Header.Speed > 0) { report.SCSI.ModeSense.Speed = decMode.Value.Header.Speed; } if (decMode.Value.Pages == null) { return; } List <ScsiPage> modePages = new List <ScsiPage>(); foreach (Modes.ModePage page in decMode.Value.Pages) { var modePage = new ScsiPage { page = page.Page, subpage = page.Subpage, value = page.PageResponse }; modePages.Add(modePage); if (modePage.page == 0x2A && modePage.subpage == 0x00) { cdromMode = page.PageResponse; } } if (modePages.Count > 0) { report.SCSI.ModeSense.ModePages = modePages; } }
public void ReportScsiModes(ref DeviceReportV2 report, out byte[] cdromMode) { Modes.DecodedMode? decMode = null; PeripheralDeviceTypes devType = _dev.ScsiType; byte[] mode10CurrentBuffer; byte[] mode10ChangeableBuffer; byte[] mode6CurrentBuffer; byte[] mode6ChangeableBuffer; DicConsole.WriteLine("Querying all mode pages and subpages using SCSI MODE SENSE (10)..."); bool sense = _dev.ModeSense10(out byte[] mode10Buffer, out _, false, true, ScsiModeSensePageControl.Default, 0x3F, 0xFF, _dev.Timeout, out _); if (sense || _dev.Error) { DicConsole.WriteLine("Querying all mode pages using SCSI MODE SENSE (10)..."); sense = _dev.ModeSense10(out mode10Buffer, out _, false, true, ScsiModeSensePageControl.Default, 0x3F, 0x00, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.SupportsModeSense10 = true; report.SCSI.SupportsModeSubpages = false; decMode = Modes.DecodeMode10(mode10Buffer, devType); { sense = _dev.ModeSense10(out mode10CurrentBuffer, out _, false, true, ScsiModeSensePageControl.Current, 0x3F, 0x00, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.ModeSense10CurrentData = mode10CurrentBuffer; } sense = _dev.ModeSense10(out mode10ChangeableBuffer, out _, false, true, ScsiModeSensePageControl.Changeable, 0x3F, 0x00, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.ModeSense10ChangeableData = mode10ChangeableBuffer; } } } } else { report.SCSI.SupportsModeSense10 = true; report.SCSI.SupportsModeSubpages = true; decMode = Modes.DecodeMode10(mode10Buffer, devType); { sense = _dev.ModeSense10(out mode10CurrentBuffer, out _, false, true, ScsiModeSensePageControl.Current, 0x3F, 0xFF, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.ModeSense10CurrentData = mode10CurrentBuffer; } sense = _dev.ModeSense10(out mode10ChangeableBuffer, out _, false, true, ScsiModeSensePageControl.Changeable, 0x3F, 0xFF, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.ModeSense10ChangeableData = mode10ChangeableBuffer; } } } DicConsole.WriteLine("Querying all mode pages and subpages using SCSI MODE SENSE (6)..."); sense = _dev.ModeSense6(out byte[] mode6Buffer, out _, false, ScsiModeSensePageControl.Default, 0x3F, 0xFF, _dev.Timeout, out _); if (sense || _dev.Error) { DicConsole.WriteLine("Querying all mode pages using SCSI MODE SENSE (6)..."); sense = _dev.ModeSense6(out mode6Buffer, out _, false, ScsiModeSensePageControl.Default, 0x3F, 0x00, _dev.Timeout, out _); if (sense || _dev.Error) { DicConsole.WriteLine("Querying SCSI MODE SENSE (6)..."); sense = _dev.ModeSense(out mode6Buffer, out _, _dev.Timeout, out _); } else { sense = _dev.ModeSense6(out mode6CurrentBuffer, out _, false, ScsiModeSensePageControl.Current, 0x3F, 0x00, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.ModeSense6CurrentData = mode6CurrentBuffer; } sense = _dev.ModeSense6(out mode6ChangeableBuffer, out _, false, ScsiModeSensePageControl.Changeable, 0x3F, 0x00, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.ModeSense6ChangeableData = mode6ChangeableBuffer; } } } else { report.SCSI.SupportsModeSubpages = true; { sense = _dev.ModeSense6(out mode6CurrentBuffer, out _, false, ScsiModeSensePageControl.Current, 0x3F, 0xFF, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.ModeSense6CurrentData = mode6CurrentBuffer; } sense = _dev.ModeSense6(out mode6ChangeableBuffer, out _, false, ScsiModeSensePageControl.Changeable, 0x3F, 0xFF, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.ModeSense6ChangeableData = mode6ChangeableBuffer; } } } if (!sense && !_dev.Error && !decMode.HasValue) { decMode = Modes.DecodeMode6(mode6Buffer, devType); } report.SCSI.SupportsModeSense6 |= !sense && !_dev.Error; cdromMode = null; if (report.SCSI.SupportsModeSense6) { report.SCSI.ModeSense6Data = mode6Buffer; } if (report.SCSI.SupportsModeSense10) { report.SCSI.ModeSense10Data = mode10Buffer; } if (!decMode.HasValue) { return; } report.SCSI.ModeSense = new ScsiMode { BlankCheckEnabled = decMode.Value.Header.EBC, DPOandFUA = decMode.Value.Header.DPOFUA, WriteProtected = decMode.Value.Header.WriteProtected }; if (decMode.Value.Header.BufferedMode > 0) { report.SCSI.ModeSense.BufferedMode = decMode.Value.Header.BufferedMode; } if (decMode.Value.Header.Speed > 0) { report.SCSI.ModeSense.Speed = decMode.Value.Header.Speed; } if (decMode.Value.Pages == null) { return; } List <ScsiPage> modePages = new List <ScsiPage>(); foreach (Modes.ModePage page in decMode.Value.Pages) { var modePage = new ScsiPage { page = page.Page, subpage = page.Subpage, value = page.PageResponse }; modePages.Add(modePage); if (modePage.page == 0x2A && modePage.subpage == 0x00) { cdromMode = page.PageResponse; } } if (modePages.Count > 0) { report.SCSI.ModeSense.ModePages = modePages; } }
public DeviceDto(DeviceReportV2 report, int id, int optimalMultipleSectorsRead) { ATA = report.ATA; ATAPI = report.ATAPI; CompactFlash = report.CompactFlash; FireWire = report.FireWire; MultiMediaCard = report.MultiMediaCard; PCMCIA = report.PCMCIA; SCSI = report.SCSI; SecureDigital = report.SecureDigital; USB = report.USB; Manufacturer = report.Manufacturer; Model = report.Model; Revision = report.Revision; Type = report.Type; if (ATA != null) { ATA.Identify = null; ATA.ReadCapabilities = ClearBinaries(ATA.ReadCapabilities); if (ATA.RemovableMedias != null) { TestedMedia[] medias = ATA.RemovableMedias.ToArray(); ATA.RemovableMedias = new List <TestedMedia>(); foreach (TestedMedia media in medias) { ATA.RemovableMedias.Add(ClearBinaries(media)); } } } if (ATAPI != null) { ATAPI.Identify = null; ATAPI.ReadCapabilities = ClearBinaries(ATAPI.ReadCapabilities); if (ATAPI.RemovableMedias != null) { TestedMedia[] medias = ATAPI.RemovableMedias.ToArray(); ATAPI.RemovableMedias = new List <TestedMedia>(); foreach (TestedMedia media in medias) { ATAPI.RemovableMedias.Add(ClearBinaries(media)); } } } if (PCMCIA != null) { PCMCIA.AdditionalInformation = null; PCMCIA.CIS = null; } MultiMediaCard = null; SecureDigital = null; if (SCSI != null) { SCSI.EVPDPages = null; SCSI.InquiryData = null; SCSI.ModeSense6Data = null; SCSI.ModeSense10Data = null; SCSI.ModeSense6CurrentData = null; SCSI.ModeSense10CurrentData = null; SCSI.ModeSense6ChangeableData = null; SCSI.ModeSense10ChangeableData = null; SCSI.ReadCapabilities = ClearBinaries(SCSI.ReadCapabilities); if (SCSI.ModeSense != null) { SCSI.ModeSense.BlockDescriptors = null; SCSI.ModeSense.ModePages = null; } if (SCSI.RemovableMedias != null) { TestedMedia[] medias = SCSI.RemovableMedias.ToArray(); SCSI.RemovableMedias = new List <TestedMedia>(); foreach (TestedMedia media in medias) { SCSI.RemovableMedias.Add(ClearBinaries(media)); } } if (SCSI.MultiMediaDevice != null) { SCSI.MultiMediaDevice.ModeSense2AData = null; if (SCSI.MultiMediaDevice.Features != null) { SCSI.MultiMediaDevice.Features.BinaryData = null; } if (SCSI.MultiMediaDevice.TestedMedia != null) { TestedMedia[] medias = SCSI.MultiMediaDevice.TestedMedia.ToArray(); SCSI.MultiMediaDevice.TestedMedia = new List <TestedMedia>(); foreach (TestedMedia media in medias) { SCSI.MultiMediaDevice.TestedMedia.Add(ClearBinaries(media)); } } } SCSI.SequentialDevice = null; } if (USB != null) { USB.Descriptors = null; } Id = id; OptimalMultipleSectorsRead = optimalMultipleSectorsRead; }
public HttpResponseMessage UploadReport() { HttpResponseMessage response = new HttpResponseMessage { StatusCode = HttpStatusCode.OK }; try { DeviceReport newReport = new DeviceReport(); HttpRequest request = HttpContext.Current.Request; XmlSerializer xs = new XmlSerializer(newReport.GetType()); newReport = (DeviceReport)xs.Deserialize(request.InputStream); if (newReport == null) { response.Content = new StringContent("notstats", Encoding.UTF8, "text/plain"); return(response); } DeviceReportV2 reportV2 = new DeviceReportV2(newReport); StringWriter jsonSw = new StringWriter(); jsonSw.Write(JsonConvert.SerializeObject(reportV2, Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })); string reportV2String = jsonSw.ToString(); jsonSw.Close(); ctx.Reports.Add(new UploadedReport(reportV2)); ctx.SaveChanges(); MemoryStream pgpIn = new MemoryStream(Encoding.UTF8.GetBytes(reportV2String)); MemoryStream pgpOut = new MemoryStream(); ChoPGPEncryptDecrypt pgp = new ChoPGPEncryptDecrypt(); pgp.Encrypt(pgpIn, pgpOut, Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), "public.asc"), true); pgpOut.Position = 0; reportV2String = Encoding.UTF8.GetString(pgpOut.ToArray()); MimeMessage message = new MimeMessage { Subject = "New device report (old version)", Body = new TextPart("plain") { Text = reportV2String } }; message.From.Add(new MailboxAddress("DiscImageChef", "*****@*****.**")); message.To.Add(new MailboxAddress("Natalia Portillo", "*****@*****.**")); using (SmtpClient client = new SmtpClient()) { client.Connect("mail.claunia.com", 25, false); client.Send(message); client.Disconnect(true); } response.Content = new StringContent("ok", Encoding.UTF8, "text/plain"); return(response); } // ReSharper disable once RedundantCatchClause catch { #if DEBUG if (Debugger.IsAttached) { throw; } #endif response.Content = new StringContent("error", Encoding.UTF8, "text/plain"); return(response); } }
public HttpResponseMessage UploadReportV2() { HttpResponseMessage response = new HttpResponseMessage { StatusCode = HttpStatusCode.OK }; try { HttpRequest request = HttpContext.Current.Request; StreamReader sr = new StreamReader(request.InputStream); string reportJson = sr.ReadToEnd(); DeviceReportV2 newReport = JsonConvert.DeserializeObject <DeviceReportV2>(reportJson); if (newReport == null) { response.Content = new StringContent("notstats", Encoding.UTF8, "text/plain"); return(response); } ctx.Reports.Add(new UploadedReport(newReport)); ctx.SaveChanges(); MemoryStream pgpIn = new MemoryStream(Encoding.UTF8.GetBytes(reportJson)); MemoryStream pgpOut = new MemoryStream(); ChoPGPEncryptDecrypt pgp = new ChoPGPEncryptDecrypt(); pgp.Encrypt(pgpIn, pgpOut, Path.Combine(HostingEnvironment.MapPath("~") ?? throw new InvalidOperationException(), "public.asc"), true); pgpOut.Position = 0; reportJson = Encoding.UTF8.GetString(pgpOut.ToArray()); MimeMessage message = new MimeMessage { Subject = "New device report", Body = new TextPart("plain") { Text = reportJson } }; message.From.Add(new MailboxAddress("DiscImageChef", "*****@*****.**")); message.To.Add(new MailboxAddress("Natalia Portillo", "*****@*****.**")); using (SmtpClient client = new SmtpClient()) { client.Connect("mail.claunia.com", 25, false); client.Send(message); client.Disconnect(true); } response.Content = new StringContent("ok", Encoding.UTF8, "text/plain"); return(response); } // ReSharper disable once RedundantCatchClause catch { #if DEBUG if (Debugger.IsAttached) { throw; } #endif response.Content = new StringContent("error", Encoding.UTF8, "text/plain"); return(response); } }