Current section
Files
Jump to
Current section
Files
lib/shell/shell.ex
defmodule Consolex.Shell do
def start_port(task, websocket_handler) do
port = Port.open({:spawn, "#{task}"}, [:stream, :exit_status])
loop(port, websocket_handler)
end
def loop(port, websocket_handler) do
receive do
{:send, input, options} ->
execute_inputs(port, input, options)
{:terminate} ->
exit(:shutdown)
{port, {:data, output}} ->
case should_reply?(output) do
true -> Consolex.reply(websocket_handler, "#{output}")
false -> :ok
end
data->
Consolex.reply(websocket_handler, "#{inspect data}")
end
loop(port, websocket_handler)
end
defp should_reply?(output) do
IO.inspect output
!String.match?(to_string(output), ~r/(\W){3,}[\(](\d)*[\)]>/)
end
defp execute_inputs(port, input, options) do
command = Regex.replace(~r/(\n)*/, input, "\\g{1}" )
case Map.get(options, "inputType") do
"multiple" ->
send_input(command, port)
_ ->
single_command = Regex.replace(~r/\n/, command, ";" )
Regex.replace(~r/(;)*/, single_command, "\\g{1}" )
|> String.replace(";|>", "|>")
|> send_input(port)
end
end
defp send_input(command, port) do
command
|> String.split("\n")
|> Enum.map(&String.strip/1)
|> Enum.filter(&(&1 != ""))
|> Enum.each(fn expr -> Port.command(port, "#{expr}\r\n");:timer.sleep(50) end)
end
end