ostensibly, working

ready for updates from franz, and needs to be tested. But other than that this is where the fun starts
This commit is contained in:
Adam R. Grey 2021-07-23 01:51:40 -04:00
parent 4aa3162f06
commit 5b77672ac7
2 changed files with 120 additions and 18 deletions

View File

@ -1,11 +1,14 @@
using franz; using franz;
using Newtonsoft.Json; using Newtonsoft.Json;
using silver_messages.directorial;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -18,28 +21,127 @@ namespace directors_assistant
static async Task Main(string[] args) static async Task Main(string[] args)
{ {
conf = JsonConvert.DeserializeObject<Config>(File.ReadAllText("appsettings.json")); conf = JsonConvert.DeserializeObject<Config>(File.ReadAllText("appsettings.json"));
telefranz = new Telefranz(conf.name, conf.bootstrap_servers, conf.kafka_location, telefranz = new Telefranz(conf.name, conf.bootstrap_servers, new List<string>() { "proof_of_concept" });
new List<string>(){"proof_of_concept"}); telefranz.addHandler((silver_messages.directorial.execute_command ec) =>
telefranz.addHandler((silver_messages.directorial.execute_command ec) => { {
Console.WriteLine("for FUCK'S sake");
Console.WriteLine(JsonConvert.SerializeObject(ec)); Console.WriteLine(JsonConvert.SerializeObject(ec));
if(ec.command == "proof_of_concept") var matchedCommands = conf.commands.Where(c => c.name == ec.command)?.ToList();
//I swear I have a vague memory of foreach in linq'd query throwing an exception when results empty.
if (matchedCommands != null && matchedCommands.Count > 0)
{ {
Console.WriteLine("it's a POC"); foreach (var cmd in matchedCommands)
var content = new StringContent("{\"username\": \"" + conf.name +"\", \"content\": \"hi\"}"); {
var client = new HttpClient(); Console.WriteLine($"executing {cmd.name}, given args {ec.args}" + cmd.name);
client.DefaultRequestHeaders.Add("Content-Type", "application/json");
client.PostAsync("super secret url", var cmdAndArgs = cmd.shell.Split(' ');
content); var justArgs = cmdAndArgs.Skip(1).ToList();
Console.WriteLine("I'm P-O-C, I'm dyn-o-mite"); justArgs.AddRange(ec.args);
var commandPath = cmdAndArgs[0];
var commandArguments = String.Join(' ', justArgs);
if (ec.timeout > 0)
{
executeTimed(cmd.name, commandPath, commandArguments, ec.timeout);
}
else
{
Task.Run(() =>
{
executeUntimed(cmd.name, commandPath, commandArguments);
});
}
}
} }
Console.WriteLine("it's not a proof of concept call");
}); });
Console.WriteLine("off we go"); Console.WriteLine("off we go");
telefranz.StartListening(); await Task.Delay(1000);
Console.WriteLine("im a strong independent director's assistant who don't need no director");
telefranz.ProduceMessage(new silver_messages.global.sound_off());
await Task.Delay(20000); await Task.Delay(120000);
Console.WriteLine("alright fuck it"); Console.WriteLine("alright fuck it");
} }
private static void executeTimed(string commandName, string commandPath, string commandArguments, int timeout)
{
var process = readableProcess(commandPath, commandArguments);
var outputs = new List<string>();
var errors = new List<string>();
process.OutputDataReceived += new DataReceivedEventHandler((s, e) => { outputs.Add(e.Data); });
process.ErrorDataReceived += new DataReceivedEventHandler((s, e) => { errors.Add(e.Data); });
var stopwatch = new Stopwatch();
stopwatch.Start();
process.Start();
process.BeginErrorReadLine();
process.BeginOutputReadLine();
Task.WaitAny(
Task.Run(() =>
{
process.WaitForExit();
}),
Task.Delay(new TimeSpan(0, 0, timeout))
);
if (process.HasExited)
{
stopwatch.Stop();
telefranz.ProduceMessage(new silver_messages.directorial.command_completed()
{
command = commandName,
runtime = (uint)stopwatch.ElapsedMilliseconds,
exit_code = process.ExitCode,
stdout = string.Join('\n', outputs),
stderr = string.Join('\n', errors)
});
}
else
{
process.Kill();
telefranz.ProduceMessage(new silver_messages.directorial.command_expired()
{
command = commandName,
runtime = (uint)timeout
});
}
}
private static void executeUntimed(string commandName, string commandPath, string commandArguments)
{
var process = readableProcess(commandPath, commandArguments);
process.OutputDataReceived += new DataReceivedEventHandler((s, e) => {
telefranz.ProduceMessage(new silver_messages.directorial.command_output() {
stdout = e.Data
});
});
process.ErrorDataReceived += new DataReceivedEventHandler((s, e) => {
telefranz.ProduceMessage(new silver_messages.directorial.command_error() {
stderr = e.Data
});
});
var stopwatch = new Stopwatch();
stopwatch.Start();
process.Start();
process.BeginErrorReadLine();
process.BeginOutputReadLine();
process.WaitForExit();
telefranz.ProduceMessage(new silver_messages.directorial.command_completed()
{
command = commandName,
runtime = (uint)stopwatch.ElapsedMilliseconds,
exit_code = process.ExitCode
});
}
private static Process readableProcess(string commandPath, string commandArguments)
{
var pi = new ProcessStartInfo(commandPath, commandArguments);
pi.UseShellExecute = false;
pi.CreateNoWindow = true;
pi.RedirectStandardError = true;
pi.RedirectStandardOutput = true;
var process = new Process();
process.StartInfo = pi;
return process;
}
} }
} }

View File

@ -4,7 +4,7 @@
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework> <TargetFramework>net5.0</TargetFramework>
<RootNamespace>directors_assistant</RootNamespace> <RootNamespace>directors_assistant</RootNamespace>
<RestoreSources>$(RestoreSources);../pkgs while i procastinate on a feed;https://api.nuget.org/v3/index.json</RestoreSources> <RestoreSources>$(RestoreSources);../packages/nuget/;https://api.nuget.org/v3/index.json</RestoreSources>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@ -13,7 +13,7 @@
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="5.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="5.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="5.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="silvermeddlists.franz" Version="0.0.1" /> <PackageReference Include="silvermeddlists.franz" Version="0.0.2" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>