Packages
erlcloud
3.1.11
3.8.3
3.8.2
3.8.1
3.7.6
3.7.4
3.7.3
3.7.2
3.7.1
3.7.0
3.6.8
3.6.7
3.6.5
3.6.4
3.6.3
3.6.2
3.6.1
3.6.0
3.5.16
3.5.15
3.5.14
3.5.13
3.5.12
3.5.11
3.5.10
3.5.9
3.5.8
3.5.7
3.5.6
3.5.5
3.5.4
3.5.3
3.5.2
3.5.1
3.5.0
3.4.5
3.4.3
3.4.1
3.4.0
3.3.9
3.3.8
3.3.7
3.3.6
3.3.5
3.3.4
3.3.3
3.3.2
3.3.1
3.3.0
3.2.18
3.2.17
3.2.16
3.2.15
3.2.14
3.2.13
3.2.12
3.2.11
3.2.10
3.2.7
3.2.6
3.2.5
3.2.4
3.2.3
3.2.2
3.2.1
3.2.0
3.1.17
3.1.16
3.1.14
3.1.13
3.1.12
3.1.11
3.1.9
3.1.8
3.1.7
3.1.6
3.1.5
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
2.2.16
2.2.15
2.2.14
2.2.13
2.2.12
2.2.11
2.2.10
2.2.9
2.2.8
2.2.7
2.2.6
2.2.5
2.2.4
2.2.2
2.2.1
2.2.0
2.1.0
2.0.5
2.0.4
2.0.3
2.0.0
0.13.10
0.13.9
0.13.8
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.0
0.12.0
0.11.0
0.9.2
0.9.2-rc.1
0.9.1
0.9.0
AWS APIs library for Erlang
Current section
Files
Jump to
Current section
Files
src/erlcloud_cloudtrail.erl
-module(erlcloud_cloudtrail).
-include("erlcloud.hrl").
-include("erlcloud_aws.hrl").
%% Library initialization.
-export([configure/2, configure/3, new/2, new/3]).
%% EC2 API Functions
-export([
%% Users
create_trail/3, create_trail/4, create_trail/5, create_trail/6,
delete_trail/1, delete_trail/2,
describe_trails/0, describe_trails/1, describe_trails/2, describe_trails/3,
get_trail_status/1, get_trail_status/2,
start_logging/1, start_logging/2,
stop_logging/1, stop_logging/2,
update_trail/4, update_trail/5, update_trail/6,
ct_request/3
]).
-define(API_VERSION, "2013-11-01").
-define(CLOUD_TRAIL_API_PREFIX, "CloudTrail_20131101.").
-define(SERVICE_NAME, "cloudtrail").
-type headers() :: [{string(), string()}].
-type ct_return() :: {ok, proplist()} | {error, term()}.
-spec new(string(), string()) -> aws_config().
new(AccessKeyID, SecretAccessKey) ->
#aws_config{access_key_id=AccessKeyID,
secret_access_key=SecretAccessKey}.
-spec new(string(), string(), string()) -> aws_config().
new(AccessKeyID, SecretAccessKey, Host) ->
#aws_config{access_key_id=AccessKeyID,
secret_access_key=SecretAccessKey,
cloudtrail_host=Host}.
-spec configure(string(), string()) -> ok.
configure(AccessKeyID, SecretAccessKey) ->
erlcloud_config:configure(AccessKeyID, SecretAccessKey, fun new/2).
-spec configure(string(), string(), string()) -> ok.
configure(AccessKeyID, SecretAccessKey, Host) ->
erlcloud_config:configure(AccessKeyID, SecretAccessKey, Host, fun new/3).
%%
%% API
%%
-spec create_trail(string(), string(), aws_config()) -> ct_return().
create_trail(Trail, S3BucketName, Config) ->
Json = [{<<"Name">>, list_to_binary(Trail)},
{<<"S3BucketName">>, list_to_binary(S3BucketName)}
],
ct_request("CreateTrail", Json, Config).
-spec create_trail(string(), string(), string(), aws_config()) -> ct_return().
create_trail(Trail, S3BucketName, SnsTopicName, Config) ->
Json = [{<<"Name">>, list_to_binary(Trail)},
{<<"S3BucketName">>, list_to_binary(S3BucketName)},
{<<"SnsTopicName">>, list_to_binary(SnsTopicName)}
],
ct_request("CreateTrail", Json, Config).
-spec create_trail(string(), string(), string(), boolean(), aws_config()) -> ct_return().
create_trail(Trail, S3BucketName, SnsTopicName, IncludeGlobalServiceEvents, Config) ->
Json = [{<<"Name">>, list_to_binary(Trail)},
{<<"S3BucketName">>, list_to_binary(S3BucketName)},
{<<"SnsTopicName">>, list_to_binary(SnsTopicName)},
{<<"IncludeGlobalServiceEvents">>, list_to_binary(atom_to_list(IncludeGlobalServiceEvents))}
],
ct_request("CreateTrail", Json, Config).
-spec create_trail(string(), string(), string(), string(), boolean(), aws_config()) -> ct_return().
create_trail(Trail, S3BucketName, S3KeyPrefix, SnsTopicName, IncludeGlobalServiceEvents, Config) ->
Json = [{<<"Name">>, list_to_binary(Trail)},
{<<"S3BucketName">>, list_to_binary(S3BucketName)},
{<<"S3KeyPrefix">>, list_to_binary(S3KeyPrefix)},
{<<"SnsTopicName">>, list_to_binary(SnsTopicName)},
{<<"IncludeGlobalServiceEvents">>, list_to_binary(atom_to_list(IncludeGlobalServiceEvents))}
],
ct_request("CreateTrail", Json, Config).
-spec delete_trail(string() ) -> ct_return().
delete_trail(Trail) ->
delete_trail(Trail, default_config()).
-spec delete_trail(string(), aws_config()) -> ct_return().
delete_trail(Trail, Config) ->
Json = [{<<"Name">>, list_to_binary(Trail)}],
ct_request("DeleteTrail", Json, Config).
-spec describe_trails() -> ct_return().
describe_trails() -> describe_trails([]).
-spec describe_trails([] | aws_config()) -> ct_return().
describe_trails(Config) when is_record(Config, aws_config) ->
describe_trails([], Config);
describe_trails(Trails) ->
describe_trails(Trails, default_config()).
-spec describe_trails([string()], aws_config()) -> ct_return().
describe_trails(Trails, Config) ->
Json = trail_name_list(Trails),
ct_request("DescribeTrails", Json, Config).
-spec describe_trails([string()], boolean(), aws_config()) -> ct_return().
describe_trails(Trails, IncludeShadowTrails, Config) ->
TrailNameList = trail_name_list(Trails),
Json =
case IncludeShadowTrails of
true -> TrailNameList;
false -> [{<<"includeShadowTrails">>, false} | TrailNameList]
end,
ct_request("DescribeTrails", Json, Config).
-spec get_trail_status([string()] ) -> ct_return().
get_trail_status(Trail) ->
get_trail_status(Trail, default_config()).
-spec get_trail_status([string()], aws_config()) -> ct_return().
get_trail_status(Trail, Config) ->
Json = [{<<"Name">>, list_to_binary(Trail)}],
ct_request("GetTrailStatus", Json, Config).
-spec start_logging([string()] ) -> ct_return().
start_logging(Trail) ->
start_logging(Trail, default_config()).
-spec start_logging([string()], aws_config()) -> ct_return().
start_logging(Trail, Config) ->
Json = [{<<"Name">>, list_to_binary(Trail)}],
ct_request("StartLogging", Json, Config).
-spec stop_logging([string()] ) -> ct_return().
stop_logging(Trail) ->
stop_logging(Trail, default_config()).
-spec stop_logging([string()], aws_config()) -> ct_return().
stop_logging(Trail, Config) ->
Json = [{<<"Name">>, list_to_binary(Trail)}],
ct_request("StopLogging", Json, Config).
-spec update_trail(string(), string(), string(), aws_config()) -> ct_return().
update_trail(Trail, S3BucketName, SnsTopicName, Config) ->
Json = [{<<"Name">>, list_to_binary(Trail)},
{<<"S3BucketName">>, list_to_binary(S3BucketName)},
{<<"SnsTopicName">>, list_to_binary(SnsTopicName)}
],
ct_request("UpdateTrail", Json, Config).
-spec update_trail(string(), string(), string(), boolean(), aws_config()) -> ct_return().
update_trail(Trail, S3BucketName, SnsTopicName, IncludeGlobalServiceEvents, Config) ->
Json = [{<<"Name">>, list_to_binary(Trail)},
{<<"S3BucketName">>, list_to_binary(S3BucketName)},
{<<"SnsTopicName">>, list_to_binary(SnsTopicName)},
{<<"IncludeGlobalServiceEvents">>, list_to_binary(atom_to_list(IncludeGlobalServiceEvents))}
],
ct_request("UpdateTrail", Json, Config).
-spec update_trail(string(), string(), string(), string(), boolean(), aws_config()) -> ct_return().
update_trail(Trail, S3BucketName, S3KeyPrefix, SnsTopicName, IncludeGlobalServiceEvents, Config) ->
Json = [{<<"Name">>, list_to_binary(Trail)},
{<<"S3BucketName">>, list_to_binary(S3BucketName)},
{<<"S3KeyPrefix">>, list_to_binary(S3KeyPrefix)},
{<<"SnsTopicName">>, list_to_binary(SnsTopicName)},
{<<"IncludeGlobalServiceEvents">>, list_to_binary(atom_to_list(IncludeGlobalServiceEvents))}
],
ct_request("UpdateTrail", Json, Config).
% Json parameter must be a list of binary key/value tuples.
ct_request(Operation, [], Config) ->
#aws_config{cloudtrail_scheme = Scheme,
cloudtrail_host = Host} = Config,
request_impl(post, Scheme, Host, port_spec(Config), "/", Operation, [], "{}", Config);
ct_request(Operation, Body, Config) ->
#aws_config{cloudtrail_scheme = Scheme,
cloudtrail_host = Host} = Config,
request_impl(post, Scheme, Host, port_spec(Config), "/", Operation, [], jsx:encode(Body), Config).
request_impl(Method, Scheme, Host, Port, Path, Operation, Params, Body, #aws_config{} = Config) ->
%% TODO: Make api prefix a part of aws_config
Api_Operation = lists:flatten(?CLOUD_TRAIL_API_PREFIX, Operation),
Headers = headers(Config, Api_Operation, Params, Body, ?SERVICE_NAME),
case erlcloud_aws:aws_request_form_raw(
Method, Scheme, Host, Port, Path, Body,
[{"content-type", "application/x-amz-json-1.1"} | Headers],
Config) of
{ok, RespBody} ->
case Config#aws_config.cloudtrail_raw_result of
true -> {ok, RespBody};
_ -> {ok, jsx:decode(RespBody)}
end;
{error, Reason} ->
{error, Reason}
end.
-spec headers(aws_config(), string(), proplist(), string() | binary(), string()) -> headers().
headers(Config, Operation, _Params, Body, Service) ->
Headers = [
{"host", Config#aws_config.cloudtrail_host},
{"x-amz-target", Operation}
],
erlcloud_aws:sign_v4_headers(Config, Headers, Body, erlcloud_aws:aws_region_from_host(Config#aws_config.cloudtrail_host), Service).
default_config() -> erlcloud_aws:default_config().
port_spec(#aws_config{cloudtrail_port=80}) ->
undefined;
port_spec(#aws_config{cloudtrail_port=Port}) ->
Port.
trail_name_list([]) ->
[];
trail_name_list(Trails) ->
[{<<"trailNameList">>, [list_to_binary(T) || T <- Trails]}].