Skip to content

Commit

Permalink
Update StatisticsHandler.cs
Browse files Browse the repository at this point in the history
  • Loading branch information
2dust committed Aug 29, 2019
1 parent 3cdff62 commit 3154df1
Showing 1 changed file with 111 additions and 61 deletions.
172 changes: 111 additions & 61 deletions v2rayN/v2rayN/Handler/StatisticsHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class StatisticsHandler
Action<ulong, ulong, ulong, ulong, List<Mode.ServerStatistics>> updateFunc_;

private bool enabled_;
public bool Enable
public bool Enable
{
get { return enabled_; }
set { enabled_ = value; }
Expand All @@ -33,10 +33,10 @@ public bool Enable
public bool UpdateUI;

public ulong TotalUp { get; private set; }

public ulong TotalDown { get; private set; }

public List<Mode.ServerStatistics> Statistic{ get; set; }
public List<Mode.ServerStatistics> Statistic { get; set; }

public ulong Up { get; private set; }

Expand Down Expand Up @@ -71,7 +71,7 @@ public StatisticsHandler(Mode.Config config, Action<ulong, ulong, ulong, ulong,
workThread_.Start();
}

private void grpcInit ()
private void grpcInit()
{
channel_ = new Channel($"127.0.0.1:{Global.InboundAPIPort}", ChannelCredentials.Insecure);
channel_.ConnectAsync();
Expand All @@ -80,8 +80,16 @@ private void grpcInit ()

public void Close()
{
exitFlag_ = true;
channel_.ShutdownAsync();
try
{

exitFlag_ = true;
channel_.ShutdownAsync();
}
catch (Exception ex)
{
Utils.SaveLog(ex.Message, ex);
}
}

public void run()
Expand All @@ -92,75 +100,98 @@ public void run()
{
if (enabled_ && channel_.State == ChannelState.Ready)
{
var res = client_.QueryStats(new QueryStatsRequest() { Pattern = "", Reset = true });
QueryStatsResponse res = null;
try
{
res = client_.QueryStats(new QueryStatsRequest() { Pattern = "", Reset = true });
}
catch (Exception ex)
{
Utils.SaveLog(ex.Message, ex);
}

var addr = config_.address();
var port = config_.port();
var cur = Statistic.FindIndex(item => item.address == addr && item.port == port);
ulong up = 0,
down = 0;
if (res != null)
{
var addr = config_.address();
var port = config_.port();
var path = config_.path();
var cur = Statistic.FindIndex(item => item.address == addr && item.port == port && item.path == path);
ulong up = 0,
down = 0;

//TODO: parse output
parseOutput(res.Stat, out up, out down);
//TODO: parse output
parseOutput(res.Stat, out up, out down);

Up = up;
Down = down;
Up = up;
Down = down;

TotalUp += up;
TotalDown += down;
TotalUp += up;
TotalDown += down;

if(cur != -1)
{
Statistic[cur].todayUp += up;
Statistic[cur].todayDown += down;
Statistic[cur].totalUp += up;
Statistic[cur].totalDown += down;
if (cur != -1)
{
Statistic[cur].todayUp += up;
Statistic[cur].todayDown += down;
Statistic[cur].totalUp += up;
Statistic[cur].totalDown += down;
}

if (UpdateUI)
updateFunc_(TotalUp, TotalDown, Up, Down, Statistic);
}

if (UpdateUI)
updateFunc_(TotalUp, TotalDown, Up, Down, Statistic);
Thread.Sleep(config_.statisticsFreshRate);
channel_.ConnectAsync();
}
}
catch { }
catch (Exception ex)
{
Utils.SaveLog(ex.Message, ex);
}
}
}

public void parseOutput(Google.Protobuf.Collections.RepeatedField<Stat> source, out ulong up, out ulong down)
{

up = 0; down = 0;

foreach(var stat in source)
try
{
var name = stat.Name;
var value = stat.Value;
var nStr = name.Split(">>>".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var type = "";

name = name.Trim();
foreach (var stat in source)
{
var name = stat.Name;
var value = stat.Value;
var nStr = name.Split(">>>".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var type = "";

name = nStr[1];
type = nStr[3];
name = name.Trim();

if (name == Global.InboundProxyTagName)
{
if (type == "uplink")
{
up = (ulong)value;
}
else if (type == "downlink")
name = nStr[1];
type = nStr[3];

if (name == Global.InboundProxyTagName)
{
down = (ulong)value;
if (type == "uplink")
{
up = (ulong)value;
}
else if (type == "downlink")
{
down = (ulong)value;
}
}
}
}
catch (Exception ex)
{
Utils.SaveLog(ex.Message, ex);
}
}

public void saveToFile()
{
if(!Directory.Exists(logPath_))
if (!Directory.Exists(logPath_))
{
Directory.CreateDirectory(logPath_);
}
Expand All @@ -184,13 +215,16 @@ public void saveToFile()
overallWriter.WriteLine($"LastUpdate {DateTime.Now.ToLongDateString()} {DateTime.Now.ToLongTimeString()}");
overallWriter.WriteLine($"UP {string.Format("{0:f2}", up_amount)}{up_unit} {TotalUp}");
overallWriter.WriteLine($"DOWN {string.Format("{0:f2}", down_amount)}{down_unit} {TotalDown}");
foreach(var s in Statistic)
foreach (var s in Statistic)
{
overallWriter.WriteLine($"* {s.name} {s.address} {s.port} {s.path} {s.host} {s.totalUp} {s.totalDown}");
}
}
}
catch { }
catch (Exception ex)
{
Utils.SaveLog(ex.Message, ex);
}

// 当天流量记录文件
var dailyPath = Path.Combine(logPath_, $"{DateTime.Now.ToLongDateString()}.txt");
Expand All @@ -209,7 +243,10 @@ public void saveToFile()
}
}
}
catch { }
catch (Exception ex)
{
Utils.SaveLog(ex.Message, ex);
}
}

public void loadFromFile()
Expand Down Expand Up @@ -278,7 +315,10 @@ public void loadFromFile()
}
}
}
catch { }
catch (Exception ex)
{
Utils.SaveLog(ex.Message, ex);
}
}

// 当天流量记录文件
Expand Down Expand Up @@ -324,28 +364,38 @@ public void loadFromFile()
}
}
}
catch { }
catch (Exception ex)
{
Utils.SaveLog(ex.Message, ex);
}
}
}


private void DeleteExpiredLog()
{
if (!Directory.Exists(logPath_)) return;
var dirInfo = new DirectoryInfo(logPath_);
var files = dirInfo.GetFiles();
foreach (var file in files)
try
{
if (file.Name == "overall.txt") continue;
var name = file.Name.Split('.')[0];
var ft = DateTime.Parse(name);
var ct = DateTime.Now;
var dur = ct - ft;
if(dur.Days > config_.CacheDays)
if (!Directory.Exists(logPath_)) return;
var dirInfo = new DirectoryInfo(logPath_);
var files = dirInfo.GetFiles();
foreach (var file in files)
{
file.Delete();
if (file.Name == "overall.txt") continue;
var name = file.Name.Split('.')[0];
var ft = DateTime.Parse(name);
var ct = DateTime.Now;
var dur = ct - ft;
if (dur.Days > config_.CacheDays)
{
file.Delete();
}
}
}
catch (Exception ex)
{
Utils.SaveLog(ex.Message, ex);
}
}
}
}

0 comments on commit 3154df1

Please sign in to comment.