forked from hauleth/erlang-systemd
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsystemd_watchdog.erl
78 lines (67 loc) · 2.35 KB
/
systemd_watchdog.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
%% Licensed to the Apache Software Foundation (ASF) under one
%% or more contributor license agreements. See the NOTICE file
%% distributed with this work for additional information
%% regarding copyright ownership. The ASF licenses this file
%% to you under the Apache License, Version 2.0 (the
%% "License"); you may not use this file except in compliance
%% with the License. You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing,
%% software distributed under the License is distributed on an
%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
%% KIND, either express or implied. See the License for the
%% specific language governing permissions and limitations
%% under the License.
%%
%% @hidden
-module(systemd_watchdog).
-behaviour(gen_server).
-include_lib("kernel/include/logger.hrl").
-include("systemd_internal.hrl").
-export([start_link/1,
init/1,
handle_call/3,
handle_cast/2,
handle_info/2]).
-record(state, {timeout, enabled=true}).
start_link(Config) ->
gen_server:start_link({local, ?WATCHDOG}, ?MODULE, Config, []).
init({Enabled, Timeout}) ->
State = #state{enabled=Enabled, timeout=Timeout},
notify(State),
{ok, State}.
handle_call(trigger, _Ref, State) ->
systemd:notify(watchdog_trigger),
{reply, ok, State};
handle_call(enable, _Ref, #state{timeout=T}=State)
when is_integer(T), T > 0 ->
NewState = State#state{enabled=true},
notify(NewState),
{reply, ok, NewState};
handle_call(enable, _Ref, State) ->
{reply, ok, State};
handle_call(disable, _Ref, State) ->
{reply, ok, State#state{enabled=false}};
handle_call(state, _Ref, State) ->
case State of
#state{enabled=true, timeout=Timeout} ->
{reply, Timeout, State};
_ ->
{reply, false, State}
end;
handle_call(ping, _Ref, State) ->
systemd:notify(watchdog),
{reply, ok, State}.
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(keepalive, State) ->
notify(State),
{noreply, State}.
notify(#state{enabled=true, timeout=Timeout}) when is_integer(Timeout), Timeout > 2 ->
{ok, Scale} = application:get_env(systemd, watchdog_scale),
systemd:notify(watchdog),
erlang:send_after(Timeout div Scale, self(), keepalive);
notify(_State) ->
ok.