Skip to content

Commit 38c471f

Browse files
committed
Update to support monitorng
1 parent 9a4b704 commit 38c471f

32 files changed

Lines changed: 410 additions & 175 deletions

src/Wikiled.YiScanner.Tests/Monitoring/MonitoringInstanceTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Wikiled.YiScanner.Client;
88
using Wikiled.YiScanner.Client.Archive;
99
using Wikiled.YiScanner.Monitoring;
10+
using Wikiled.YiScanner.Monitoring.Config;
1011
using Wikiled.YiScanner.Monitoring.Source;
1112

1213
namespace Wikiled.YiScanner.Tests.Monitoring
@@ -18,7 +19,7 @@ public class MonitoringInstanceTests : ReactiveTest
1819

1920
private Mock<ISourceFactory> mockDestinationFactory;
2021

21-
private Mock<IFtpDownloader> ftpDownloader;
22+
private Mock<IDownloader> ftpDownloader;
2223

2324
private Mock<IDeleteArchiving> archiving;
2425

@@ -34,7 +35,7 @@ public void SetUp()
3435
monitoringConfig.Scan = 1;
3536
archiving = new Mock<IDeleteArchiving>();
3637
mockDestinationFactory = new Mock<ISourceFactory>();
37-
ftpDownloader = new Mock<IFtpDownloader>();
38+
ftpDownloader = new Mock<IDownloader>();
3839

3940
mockDestinationFactory.Setup(item => item.GetSources(It.IsAny<IHostManager>()))
4041
.Returns(new[] { ftpDownloader.Object });

src/Wikiled.YiScanner.Tests/Monitoring/Source/SourceFactoryTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Wikiled.YiScanner.Client;
77
using Wikiled.YiScanner.Client.Predicates;
88
using Wikiled.YiScanner.Monitoring;
9+
using Wikiled.YiScanner.Monitoring.Config;
910
using Wikiled.YiScanner.Monitoring.Source;
1011

1112
namespace Wikiled.YiScanner.Tests.Monitoring.Source
@@ -41,7 +42,7 @@ public void GetSources()
4142
var result = instance.GetSources(manager).ToArray();
4243
Assert.AreEqual(0, result.Length);
4344

44-
scanConfig.Cameras = "Test";
45+
scanConfig.Known = "Test";
4546
result = instance.GetSources(manager).ToArray();
4647
Assert.AreEqual(0, result.Length);
4748

src/Wikiled.YiScanner.Tests/Wikiled.YiScanner.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<PackageReference Include="Microsoft.Reactive.Testing" Version="3.1.1" />
1212
<PackageReference Include="Moq" Version="4.8.1" />
1313
<PackageReference Include="NETStandard.Library" Version="2.0.1" />
14-
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
14+
<PackageReference Include="Newtonsoft.Json" Version="11.0.1" />
1515
<PackageReference Include="NLog" Version="4.4.12" />
1616
<PackageReference Include="NUnit" Version="3.9.0" />
1717
<PackageReference Include="System.Reactive.Linq" Version="3.1.1" />

src/YiScanner/Commands/BaseCommand.cs

Lines changed: 102 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,59 +3,139 @@
33
using NLog;
44
using Wikiled.Common.Arguments;
55
using Wikiled.Console.Arguments;
6-
using Wikiled.YiScanner.Client;
76
using Wikiled.YiScanner.Client.Predicates;
8-
using Wikiled.YiScanner.Destinations;
9-
using Wikiled.YiScanner.Monitoring;
7+
using Wikiled.YiScanner.Monitoring.Config;
108
using Wikiled.YiScanner.Monitoring.Source;
119

1210
namespace Wikiled.YiScanner.Commands
1311
{
14-
public abstract class BaseCommand : Command, IScanConfig
12+
public abstract class BaseCommand : Command
1513
{
1614
private static readonly Logger log = LogManager.GetCurrentClassLogger();
1715

18-
private readonly FtpConfig ftpConfig;
19-
20-
protected BaseCommand(FtpConfig ftpConfig)
16+
protected BaseCommand(MonitoringConfig config)
2117
{
22-
Guard.NotNull(() => ftpConfig, ftpConfig);
23-
this.ftpConfig = ftpConfig;
18+
Guard.NotNull(() => config, config);
19+
Config = config;
2420
}
2521

26-
public ActionConfig Action { get; set; }
22+
[Description("Archive video after days")]
23+
public int? Archive { get => Config.Archive; set => Config.Archive = value; }
2724

2825
[Description("Auto discover cameras")]
29-
public bool? AutoDiscover { get; set; }
26+
public bool? AutoDiscover
27+
{
28+
get => Config.AutoDiscovery?.On;
29+
set
30+
{
31+
if (Config.AutoDiscovery == null)
32+
{
33+
Config.AutoDiscovery = new AutoDiscoveryConfig();
34+
}
3035

31-
[Description("Discovery network mask")]
32-
public string NetworkMask { get; set; }
36+
Config.AutoDiscovery.On = value;
37+
}
38+
}
3339

3440
[Required]
3541
[Description("List of camera names")]
36-
public string Cameras { get; set; }
42+
public string Cameras
43+
{
44+
get => Config.Known?.Cameras;
45+
set
46+
{
47+
if (Config.Known == null)
48+
{
49+
Config.Known = new PredefinedCameraConfig();
50+
}
51+
52+
Config.Known.Cameras = value;
53+
}
54+
}
55+
56+
[Description("Compress video files")]
57+
public bool? Compress
58+
{
59+
get => Config.Output?.Compress;
60+
set
61+
{
62+
if (Config.Output == null)
63+
{
64+
Config.Output = new OutputConfig();
65+
}
66+
67+
Config.Output.Compress = value.Value;
68+
}
69+
}
70+
71+
public MonitoringConfig Config { get; }
3772

3873
[Required]
3974
[Description("List of camera hosts")]
40-
public string Hosts { get; set; }
75+
public string Hosts
76+
{
77+
get => Config.Known?.Hosts;
78+
set
79+
{
80+
if (Config.Known == null)
81+
{
82+
Config.Known = new PredefinedCameraConfig();
83+
}
4184

42-
[Description("Compress video files")]
43-
public bool Compress { get; set; }
85+
Config.Known.Hosts = value;
86+
}
87+
}
4488

4589
[Description("Do you want to save it as image")]
46-
public bool Images { get; }
90+
public bool? Images
91+
{
92+
get => Config.Output?.Images;
93+
set
94+
{
95+
if (Config.Output == null)
96+
{
97+
Config.Output = new OutputConfig();
98+
}
99+
100+
Config.Output.Images = value.Value;
101+
}
102+
}
103+
104+
[Description("Discovery network mask")]
105+
public string NetworkMask
106+
{
107+
get => Config.AutoDiscovery?.NetworkMask;
108+
set
109+
{
110+
if (Config.AutoDiscovery == null)
111+
{
112+
Config.AutoDiscovery = new AutoDiscoveryConfig();
113+
}
114+
115+
Config.AutoDiscovery.NetworkMask = value;
116+
}
117+
}
47118

48119
[Required]
49120
[Description("File destination")]
50-
public string Out { get; set; }
121+
public string Out
122+
{
123+
get => Config.Output?.Out;
124+
set
125+
{
126+
if (Config.Output == null)
127+
{
128+
Config.Output = new OutputConfig();
129+
}
51130

52-
[Description("Archive video after days")]
53-
public int? Archive { get; set; }
131+
Config.Output.Out = value;
132+
}
133+
}
54134

55135
public override void Execute()
56136
{
57137
log.Info("Starting camera download...");
58-
SourceFactory factory = new SourceFactory(ftpConfig, this, ConstructPredicate());
138+
SourceFactory factory = new SourceFactory(Config, ConstructPredicate());
59139
ProcessFtp(factory);
60140
}
61141

src/YiScanner/Commands/DownloadCommand.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Wikiled.YiScanner.Client;
99
using Wikiled.YiScanner.Client.Archive;
1010
using Wikiled.YiScanner.Client.Predicates;
11+
using Wikiled.YiScanner.Monitoring.Config;
1112
using Wikiled.YiScanner.Monitoring.Source;
1213
using Wikiled.YiScanner.Network;
1314

@@ -21,8 +22,8 @@ public class DownloadCommand : BaseCommand
2122
{
2223
private static readonly Logger log = LogManager.GetCurrentClassLogger();
2324

24-
public DownloadCommand(FtpConfig ftpConfig)
25-
: base(ftpConfig)
25+
public DownloadCommand(MonitoringConfig config)
26+
: base(config)
2627
{
2728
}
2829

@@ -34,8 +35,8 @@ protected override IPredicate ConstructPredicate()
3435
protected override void ProcessFtp(ISourceFactory factory)
3536
{
3637
using (var hostManager = AutoDiscover == true ?
37-
new DynamicHostManager(this, new NetworkScanner(TaskPoolScheduler.Default), TaskPoolScheduler.Default)
38-
: (IHostManager)new StaticHostManager(this))
38+
new DynamicHostManager(Config, new NetworkScanner(TaskPoolScheduler.Default), TaskPoolScheduler.Default)
39+
: (IHostManager)new StaticHostManager(Config.Known))
3940
{
4041
var downloaders = factory.GetSources(hostManager);
4142
var tasks = downloaders.Select(ftpDownloader => ftpDownloader.Download());

src/YiScanner/Commands/MonitorCommand.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Wikiled.YiScanner.Client.Archive;
77
using Wikiled.YiScanner.Client.Predicates;
88
using Wikiled.YiScanner.Monitoring;
9+
using Wikiled.YiScanner.Monitoring.Config;
910
using Wikiled.YiScanner.Monitoring.Source;
1011

1112
namespace Wikiled.YiScanner.Commands
@@ -14,12 +15,12 @@ namespace Wikiled.YiScanner.Commands
1415
/// Monitor -Cameras=1080i -Hosts=192.168.0.202 [-Compress] -Out=c:\out -Scan=10 [-Archive=2]
1516
/// </summary>
1617
[Description("Monitor new video from cameras")]
17-
public class MonitorCommand : BaseCommand, IMonitoringConfig
18+
public class MonitorCommand : BaseCommand
1819
{
1920
private static readonly Logger log = LogManager.GetCurrentClassLogger();
2021

21-
public MonitorCommand(FtpConfig ftpConfig)
22-
: base(ftpConfig)
22+
public MonitorCommand(MonitoringConfig config)
23+
: base(config)
2324
{
2425
}
2526

@@ -34,7 +35,7 @@ protected override IPredicate ConstructPredicate()
3435

3536
protected override void ProcessFtp(ISourceFactory downloaders)
3637
{
37-
var instance = new MonitoringInstance(TaskPoolScheduler.Default, this, downloaders, new DeleteArchiving());
38+
var instance = new MonitoringInstance(TaskPoolScheduler.Default, Config, downloaders, new DeleteArchiving());
3839
if (instance.Start())
3940
{
4041
log.Info("Press enter to stop monitoring...");
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
using System;
2+
using System.IO;
3+
using System.Net;
4+
using System.Threading.Tasks;
5+
using NLog;
6+
using Wikiled.Common.Arguments;
7+
using Wikiled.YiScanner.Client;
8+
using Wikiled.YiScanner.Client.Predicates;
9+
using Wikiled.YiScanner.Destinations;
10+
using Wikiled.YiScanner.Monitoring.Config;
11+
using Wikiled.YiScanner.Monitoring.Source;
12+
13+
namespace Wikiled.YiScanner.Downloader
14+
{
15+
public class FileDownloader : IDownloader
16+
{
17+
private static readonly Logger log = LogManager.GetCurrentClassLogger();
18+
19+
private readonly IDestination destination;
20+
21+
private readonly ServerConfig config;
22+
23+
private readonly IPredicate predicate;
24+
25+
private DateTime? lastScanned;
26+
27+
public FileDownloader(ServerConfig config, IDestination destination, IPredicate predicate)
28+
{
29+
Guard.NotNull(() => config, config);
30+
Guard.NotNull(() => destination, destination);
31+
Guard.NotNull(() => predicate, predicate);
32+
this.config = config;
33+
this.predicate = predicate;
34+
this.destination = destination;
35+
}
36+
37+
public async Task<DateTime> Download()
38+
{
39+
var path = Path.Combine(Environment.CurrentDirectory, config.Path);
40+
log.Info("Checking files: {0}", path);
41+
foreach (var file in Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories))
42+
{
43+
if (predicate.CanDownload(lastScanned, file, File.GetLastWriteTime(file)))
44+
{
45+
await ProcessFile(file).ConfigureAwait(false);
46+
}
47+
}
48+
49+
log.Info("Completed: {0}", path);
50+
var now = DateTime.Now;
51+
lastScanned = now;
52+
return now;
53+
}
54+
55+
private async Task ProcessFile(string file)
56+
{
57+
StreamReader stream = null;
58+
try
59+
{
60+
var tracking = new Host("FTP", IPAddress.Loopback);
61+
var header = new VideoHeader(tracking, file);
62+
if (!destination.IsDownloaded(header))
63+
{
64+
log.Info("Copy <{0}>", file);
65+
stream = new StreamReader(file);
66+
await destination.Transfer(header, stream.BaseStream).ConfigureAwait(false);
67+
}
68+
else
69+
{
70+
log.Info("File is already copied <{0}", file);
71+
}
72+
}
73+
catch (Exception ex)
74+
{
75+
log.Error(ex);
76+
}
77+
finally
78+
{
79+
stream?.Dispose();
80+
}
81+
}
82+
}
83+
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
namespace Wikiled.YiScanner.Client
1414
{
15-
public class FtpDownloader : IFtpDownloader
15+
public class FtpDownloader : IDownloader
1616
{
1717
private static readonly Logger log = LogManager.GetCurrentClassLogger();
1818

@@ -64,7 +64,7 @@ private async Task ProcessFile(FtpClient client, FtpListItem item)
6464
{
6565
var header = new VideoHeader(tracking.Host, item.FullName);
6666
if (!destination.IsDownloaded(header))
67-
{
67+
{
6868
log.Info("Downloading <{0}> from [{1}]", item.FullName, tracking.Host.Name);
6969
stream = await client.OpenReadAsync(item.FullName).ConfigureAwait(false);
7070
await destination.Transfer(header, stream).ConfigureAwait(false);
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace Wikiled.YiScanner.Client
55
{
6-
public interface IFtpDownloader
6+
public interface IDownloader
77
{
88
Task<DateTime> Download();
99
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace Wikiled.YiScanner.Monitoring.Config
2+
{
3+
public class AutoDiscoveryConfig
4+
{
5+
public bool? On { get; set; }
6+
7+
public string NetworkMask { get; set; }
8+
}
9+
}

0 commit comments

Comments
 (0)