Skip to content
This repository was archived by the owner on Jun 11, 2023. It is now read-only.

Commit cf550ad

Browse files
committed
WIP
1 parent 5567939 commit cf550ad

File tree

18 files changed

+431
-184
lines changed

18 files changed

+431
-184
lines changed

lib/event/dispatcher.ex

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ defmodule Helix.Event.Dispatcher do
144144
##############################################################################
145145

146146
# All
147+
event LogEvent.Forge.Processed
147148
event LogEvent.Log.Created
148149
event LogEvent.Log.Deleted
149150
# event LogEvent.Log.Modified
@@ -209,8 +210,6 @@ defmodule Helix.Event.Dispatcher do
209210
event SoftwareEvent.File.Transfer.Processed
210211
event SoftwareEvent.Firewall.Started
211212
event SoftwareEvent.Firewall.Stopped
212-
event SoftwareEvent.LogForge.LogCreate.Processed
213-
event SoftwareEvent.LogForge.LogEdit.Processed
214213
event SoftwareEvent.Virus.Collect.Processed
215214
event SoftwareEvent.Virus.Collected
216215
event SoftwareEvent.Virus.Installed
@@ -249,14 +248,6 @@ defmodule Helix.Event.Dispatcher do
249248
ProcessHandler.Cracker,
250249
:firewall_stopped
251250

252-
event SoftwareEvent.LogForge.LogCreate.Processed,
253-
LogHandler.Log,
254-
:log_forge_conclusion
255-
256-
event SoftwareEvent.LogForge.LogEdit.Processed,
257-
LogHandler.Log,
258-
:log_forge_conclusion
259-
260251
event SoftwareEvent.Virus.Collect.Processed,
261252
SoftwareHandler.Virus,
262253
:handle_collect

lib/log/event/forge.ex

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
defmodule Helix.Log.Event.Forge do
2+
3+
import Helix.Event
4+
5+
event Processed do
6+
@moduledoc """
7+
`LogForgeProcessedEvent` is fired when the underlying LogForgeProcess has
8+
achieved its objective and finished executing.
9+
"""
10+
11+
alias Helix.Process.Model.Process
12+
alias Helix.Log.Model.Log
13+
alias Helix.Log.Process.Forge, as: LogForgeProcess
14+
15+
@type t ::
16+
%__MODULE__{
17+
action: LogForgeProcess.action,
18+
server_id: Server.id,
19+
entity_id: Entity.id,
20+
target_log_id: Log.id | nil,
21+
log_info: Log.info,
22+
forger_version: pos_integer
23+
}
24+
25+
event_struct [
26+
:action,
27+
:server_id,
28+
:entity_id,
29+
:target_log_id,
30+
:log_info,
31+
:forger_version
32+
]
33+
34+
@spec new(Process.t, LogForgeProcess.t) ::
35+
t
36+
def new(process = %Process{}, data = %LogForgeProcess{}) do
37+
%__MODULE__{
38+
action: get_action(process),
39+
server_id: process.target_id,
40+
entity_id: process.source_entity_id,
41+
target_log_id: process.tgt_log_id,
42+
log_info: {data.log_type, data.log_data},
43+
forger_version: data.forger_version
44+
}
45+
end
46+
47+
defp get_action(%Process{type: :log_forge_create}),
48+
do: :create
49+
defp get_action(%Process{type: :log_forge_edit}),
50+
do: :edit
51+
end
52+
end

lib/log/event/handler/log.ex

Lines changed: 50 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ defmodule Helix.Log.Event.Handler.Log do
22
@moduledoc false
33

44
alias Helix.Event
5-
alias Helix.Log.Action.Log, as: LogAction
65
alias Helix.Event.Loggable
6+
alias Helix.Log.Action.Log, as: LogAction
7+
alias Helix.Log.Model.Log
78
alias Helix.Log.Query.Log, as: LogQuery
89

10+
alias Helix.Log.Event.Forge.Processed, as: LogForgeProcessedEvent
11+
912
alias Helix.Software.Event.LogForge.LogCreate.Processed,
1013
as: LogForgeCreateComplete
1114
alias Helix.Software.Event.LogForge.LogEdit.Processed,
@@ -28,24 +31,56 @@ defmodule Helix.Log.Event.Handler.Log do
2831
end
2932

3033
@doc """
31-
Forges a revision onto a log or creates a fake new log
34+
Handler called right after a `LogForgeProcess` has completed. It will then
35+
either create a new log out of thin air, or edit an existing log.
36+
37+
Emits: `LogCreatedEvent`, `LogRevisedEvent`
3238
"""
33-
def log_forge_conclusion(event = %LogForgeEditComplete{}) do
34-
{:ok, _, events} =
35-
event.target_log_id
36-
|> LogQuery.fetch()
37-
|> LogAction.revise(event.entity_id, event.message, event.version)
39+
def log_forge_processed(event = %LogForgeProcessedEvent{action: :create}) do
40+
result =
41+
LogAction.create(
42+
event.server_id, event.entity_id, event.log_info, event.forger_version
43+
)
3844

39-
Event.emit(events, from: event)
45+
with {:ok, _, events} <- result do
46+
Event.emit(events)
47+
end
4048
end
4149

42-
def log_forge_conclusion(event = %LogForgeCreateComplete{}) do
43-
{:ok, _, events} = LogAction.create(
44-
event.target_id,
45-
event.entity_id,
46-
event.message,
47-
event.version)
50+
def log_forge_processed(event = %LogForgeProcessedEvent{action: :edit}) do
51+
revise = fn log ->
52+
LogAction.revise(
53+
log, event.entity_id, event.log_info, event.forger_version
54+
)
55+
end
4856

49-
Event.emit(events, from: event)
57+
with \
58+
log = %Log{} <- LogQuery.fetch(event.target_log_id),
59+
{:ok, _, events} <- revise.(log)
60+
do
61+
Event.emit(events)
62+
end
5063
end
64+
65+
# @doc """
66+
# Forges a revision onto a log or creates a fake new log
67+
# """
68+
# def log_forge_conclusion(event = %LogForgeEditComplete{}) do
69+
# {:ok, _, events} =
70+
# event.target_log_id
71+
# |> LogQuery.fetch()
72+
# |> LogAction.revise(event.entity_id, event.message, event.version)
73+
74+
# Event.emit(events, from: event)
75+
# end
76+
77+
# def log_forge_conclusion(event = %LogForgeCreateComplete{}) do
78+
# {:ok, _, events} = LogAction.create(
79+
# event.target_id,
80+
# event.entity_id,
81+
# event.message,
82+
# event.version)
83+
84+
# Event.emit(events, from: event)
85+
# end
5186
end

lib/log/process/forge.ex

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
import Helix.Process
2+
3+
process Helix.Log.Process.Forge do
4+
@moduledoc """
5+
`LogForgeProcess` is launched when the user wants to edit an existing log, or
6+
create a new one from scratch.
7+
"""
8+
9+
alias Helix.Software.Model.File
10+
alias Helix.Log.Model.Log
11+
alias __MODULE__, as: LogForgeProcess
12+
13+
process_struct [:log_type, :log_data, :forger_version]
14+
15+
@type t ::
16+
%__MODULE__{
17+
log_type: Log.type,
18+
log_data: Log.data,
19+
forger_version: pos_integer
20+
}
21+
22+
@type action :: :create | :edit
23+
@type process_type :: :log_forge_create | :log_forge_edit
24+
25+
@type creation_params :: %{log_info: Log.info}
26+
27+
@type executable_meta ::
28+
%{
29+
forger: File.t_of_type(:log_forger),
30+
action: LogForgeProcess.action,
31+
log: Log.t | nil,
32+
ssh: Connection.t | nil
33+
}
34+
35+
@type resources_params ::
36+
%{
37+
action: action,
38+
log: Log.t | nil,
39+
forger: File.t_of_type(:log_forger)
40+
}
41+
42+
@type resources ::
43+
%{
44+
objective: objective,
45+
static: map,
46+
l_dynamic: [:cpu],
47+
r_dynamic: []
48+
}
49+
50+
@type objective :: %{cpu: resource_usage}
51+
52+
@spec new(creation_params, executable_meta) ::
53+
t
54+
def new(
55+
%{log_info: {log_type, log_data}},
56+
%{action: action, forger: forger = %File{type: :log_forger}}
57+
) do
58+
%__MODULE__{
59+
log_type: log_type,
60+
log_data: log_data,
61+
forger_version: get_forger_version(forger, action)
62+
}
63+
end
64+
65+
@spec resources(resources_params) ::
66+
resources
67+
def resources(params),
68+
do: get_resources params
69+
70+
@spec get_forger_version(File.t, action) ::
71+
pos_integer
72+
defp get_forger_version(forger = %File{}, :create),
73+
do: forger.modules.log_create.version
74+
defp get_forger_version(forger = %File{}, :edit),
75+
do: forger.modules.log_edit.version
76+
77+
processable do
78+
79+
alias HELL.MapUtils
80+
alias Helix.Log.Event.Forge.Processed, as: LogForgeProcessedEvent
81+
82+
on_completion(process, data) do
83+
event = LogForgeProcessedEvent.new(process, data)
84+
85+
{:delete, [event]}
86+
end
87+
88+
@doc false
89+
def after_read_hook(data) do
90+
%LogForgeProcess{
91+
log_type: String.to_existing_atom(data.log_type),
92+
log_data: MapUtils.atomize_keys(data.log_data),
93+
forger_version: data.forger_version
94+
}
95+
end
96+
end
97+
98+
resourceable do
99+
100+
@type params :: LogForgeProcess.resources_params
101+
@type factors ::
102+
%{
103+
:forger => %{version: FileFactor.fact_version},
104+
optional(:log) => term
105+
}
106+
107+
get_factors(_) do
108+
109+
end
110+
111+
# get_factors(%{action: :edit, log: log, forger: forger}) do
112+
# factor FileFactor, %{file: forger},
113+
# only: [:version], as: :forger
114+
# factor LogFactor, %{log: log},
115+
# only: [:total_revisions]
116+
# end
117+
118+
# get_factors(%{action: :create, forger: forger}) do
119+
# factor FileFactor, %{file: forger},
120+
# only: [:version], as: :forger
121+
# end
122+
123+
# TODO: time resource (for minimum duration)
124+
125+
cpu(%{action: :edit}) do
126+
f.forger.version.log_edit * f.log.revisions.total
127+
end
128+
129+
cpu(%{action: :create}) do
130+
f.forger.version.log_create
131+
end
132+
133+
dynamic do
134+
[:cpu]
135+
end
136+
137+
static do
138+
%{
139+
paused: %{ram: 100},
140+
running: %{ram: 200}
141+
}
142+
end
143+
end
144+
145+
executable do
146+
147+
resources(_gateway, _target, _params, meta) do
148+
%{
149+
log: meta.log,
150+
forger: meta.forger,
151+
action: meta.action
152+
}
153+
end
154+
155+
source_file(_gateway, _target, _params, %{forger: forger}) do
156+
forger.file_id
157+
end
158+
159+
source_connection(_gateway, _target, _params, %{ssh: ssh}) do
160+
ssh.connection_id
161+
end
162+
163+
target_log(_gateway, _target, _params, %{action: :edit, log: log}) do
164+
log.log_id
165+
end
166+
end
167+
end

lib/log/process/recover.ex

Whitespace-only changes.

0 commit comments

Comments
 (0)