1%%
2%% %CopyrightBegin%
3%%
4%% Copyright Ericsson AB 1996-2016. All Rights Reserved.
5%%
6%% Licensed under the Apache License, Version 2.0 (the "License");
7%% you may not use this file except in compliance with the License.
8%% You may obtain a copy of the License at
9%%
10%%     http://www.apache.org/licenses/LICENSE-2.0
11%%
12%% Unless required by applicable law or agreed to in writing, software
13%% distributed under the License is distributed on an "AS IS" BASIS,
14%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15%% See the License for the specific language governing permissions and
16%% limitations under the License.
17%%
18%% %CopyrightEnd%
19%%
20-module(alarm_handler).
21
22%%%-----------------------------------------------------------------
23%%% This is the SASL alarm handler process.
24%%% It is a gen_event process.  When it is started, a simple
25%%% event handler which logs all alarms is installed.
26%%%-----------------------------------------------------------------
27-export([start_link/0, set_alarm/1, clear_alarm/1, get_alarms/0,
28	 add_alarm_handler/1, add_alarm_handler/2,
29	 delete_alarm_handler/1]).
30
31-export([init/1,
32	 handle_event/2, handle_call/2, handle_info/2,
33	 terminate/2]).
34
35start_link() ->
36    case gen_event:start_link({local, alarm_handler}) of
37	{ok, Pid} ->
38	    gen_event:add_handler(alarm_handler, alarm_handler, []),
39	    {ok, Pid};
40	Error -> Error
41    end.
42
43%%-----------------------------------------------------------------
44%% Func: set_alarm/1
45%% Args: Alarm ::= {AlarmId, term()}
46%%       where AlarmId ::= term()
47%%-----------------------------------------------------------------
48set_alarm(Alarm) ->
49    gen_event:notify(alarm_handler, {set_alarm, Alarm}).
50
51%%-----------------------------------------------------------------
52%% Func: clear_alarm/1
53%% Args: AlarmId ::= term()
54%%-----------------------------------------------------------------
55clear_alarm(AlarmId) ->
56    gen_event:notify(alarm_handler, {clear_alarm, AlarmId}).
57
58%%-----------------------------------------------------------------
59%% Func: get_alarms/0
60%% Returns: [{AlarmId, AlarmDesc}]
61%%-----------------------------------------------------------------
62get_alarms() ->
63    gen_event:call(alarm_handler, alarm_handler, get_alarms).
64
65add_alarm_handler(Module) when is_atom(Module) ->
66    gen_event:add_handler(alarm_handler, Module, []).
67
68add_alarm_handler(Module, Args) when is_atom(Module) ->
69    gen_event:add_handler(alarm_handler, Module, Args).
70
71delete_alarm_handler(Module) when is_atom(Module) ->
72    gen_event:delete_handler(alarm_handler, Module, []).
73
74%%-----------------------------------------------------------------
75%% Default Alarm handler
76%%-----------------------------------------------------------------
77init(_) -> {ok, []}.
78
79handle_event({set_alarm, Alarm}, Alarms)->
80    error_logger:info_report([{alarm_handler, {set, Alarm}}]),
81    {ok, [Alarm | Alarms]};
82handle_event({clear_alarm, AlarmId}, Alarms)->
83    error_logger:info_report([{alarm_handler, {clear, AlarmId}}]),
84    {ok, lists:keydelete(AlarmId, 1, Alarms)};
85handle_event(_, Alarms)->
86    {ok, Alarms}.
87
88handle_info(_, Alarms) -> {ok, Alarms}.
89
90handle_call(get_alarms, Alarms) -> {ok, Alarms, Alarms};
91handle_call(_Query, Alarms)     -> {ok, {error, bad_query}, Alarms}.
92
93terminate(swap, Alarms) ->
94    {alarm_handler, Alarms};
95terminate(_, _) ->
96    ok.
97