%%%------------------------------------------------------------------- %%% @author cheese %%% @copyright (C) 2016, %%% @doc %%% %%% @end %%% Created : 04. Jul 2016 4:30 PM %%%------------------------------------------------------------------- -module(diint_openssl). -author("cheese"). -include_lib("kernel/include/logger.hrl"). %% API -export([execute/2, wait_for_port/1, mk_args/1, mk_val/1, pem_2_der/1]). execute(Command, ArgsIn) -> OpenSSL = os:find_executable("openssl"), ?LOG_INFO("OpenSSL: ~p~n", [OpenSSL]), Args = [atom_to_list(Command) | mk_args(ArgsIn)], Port = open_port({spawn_executable, OpenSSL}, [use_stdio, binary, {line, 1000}, {args, Args}, stderr_to_stdout, exit_status]), wait_for_port(Port). wait_for_port(Port) -> wait_for_port(Port, <<>>). wait_for_port(Port, Reply) -> receive {Port, {data, {eol, Data}}} -> ?LOG_INFO("wait eol~n", []), wait_for_port(Port, <>); {Port, {data, Data}} -> ?LOG_INFO("wait data: ~p~n", [Data]), wait_for_port(Port, <>); {Port, {exit_status, 0}} -> ?LOG_INFO("wait exit_status: 0~n", []), {ok, Reply}; {Port, {exit_status, S}} -> ?LOG_INFO("wait exit_status: ~p~n", [S]), {error, S, Reply} end. mk_args([]) -> []; mk_args([{K, V} | R]) -> [mk_val(K), mk_val(V) | mk_args(R)]; mk_args([K | R]) -> [mk_val(K) | mk_args(R)]. mk_val(I) when is_integer(I) -> integer_to_list(I); mk_val(A) when is_atom(A) -> [$- | atom_to_list(A)]; mk_val(L) when is_list(L) -> L; mk_val(B) when is_binary(B) -> binary_to_list(B). pem_2_der(PemBin) -> FromFile = lib:nonl(os:cmd("mktemp")), file:write_file(FromFile, PemBin), ToFile = lib:nonl(os:cmd("mktemp")), case diint_openssl:execute(x509, [{in, FromFile}, {out, ToFile}, {outform, "DER"}]) of {ok, Reply} -> ?LOG_INFO("openssl res or: ~s~n", [Reply]), file:read_file(ToFile); {error, S, Reply} -> ?LOG_INFO("openssl res error: ~p # ~s~n", [S, Reply]), {error, {openssl, {S, Reply}}} end.