aboutsummaryrefslogtreecommitdiffstats
path: root/lib/common_test/src/unix_telnet.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/common_test/src/unix_telnet.erl')
-rw-r--r--lib/common_test/src/unix_telnet.erl152
1 files changed, 152 insertions, 0 deletions
diff --git a/lib/common_test/src/unix_telnet.erl b/lib/common_test/src/unix_telnet.erl
new file mode 100644
index 0000000000..14a70e9d22
--- /dev/null
+++ b/lib/common_test/src/unix_telnet.erl
@@ -0,0 +1,152 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%% @doc Callback module for ct_telnet for talking telnet
+%%% to a unix host.
+%%%
+%%% <p>It requires the following entry in the config file:</p>
+%%% <pre>
+%%% {unix,[{telnet,HostNameOrIpAddress},
+%%% {port,PortNum},
+%%% {username,UserName},
+%%% {password,Password}]}.
+%%% </pre>
+%%%
+%%% <p>To talk telnet to the host specified by
+%%% <code>HostNameOrIpAddress</code>, use the interface functions in
+%%% <code>ct</code>, e.g. <code>open(Name), cmd(Name,Cmd), ...</code>.</p>
+%%%
+%%% <p><code>Name</code> is the name you allocated to the unix host in
+%%% your <code>require</code> statement. E.g.</p>
+%%% <pre> suite() -> [{require,Name,{unix,[telnet,username,password]}}].</pre>
+%%% <p>or</p>
+%%% <pre> ct:require(Name,{unix,[telnet,username,password]}).</pre>
+%%%
+%%% <p>Note that the <code>{port,PortNum}</code> tuple is optional and if
+%%% omitted, default telnet port 23 will be used.</p>
+%%%
+%%% @see ct
+%%% @see ct_telnet
+-module(unix_telnet).
+
+-compile(export_all).
+
+%% Callbacks for ct_telnet.erl
+-export([connect/4,get_prompt_regexp/0]).
+-import(ct_telnet,[start_log/1,cont_log/2,end_log/0]).
+
+-define(username,"login: ").
+-define(password,"Password: ").
+-define(prx,"login: |Password: |\\\$ |> ").
+
+%%%-----------------------------------------------------------------
+%%% @hidden
+%%% @spec get_prompt_regexp() -> PromptRegexp
+%%% PromptRegexp = ct_telnet:prompt_regexp()
+%%%
+%%% @doc Callback for ct_telnet.erl.
+%%%
+%%% <p>Return the prompt regexp for telnet connections to the
+%%% interwatch instrument.</p>
+get_prompt_regexp() ->
+ ?prx.
+
+
+%%%-----------------------------------------------------------------
+%%% @hidden
+%%% @spec connect(Ip,Port,Timeout,Extra) -> {ok,Handle} | {error,Reason}
+%%% Ip = string() | {integer(),integer(),integer(),integer()}
+%%% Port = integer()
+%%% Timeout = integer()
+%%% Extra = {Username,Password}
+%%% Username = string()
+%%% Password = string()
+%%% Handle = ct_telnet:handle()
+%%%
+%%% @doc Callback for ct_telnet.erl.
+%%%
+%%% <p>Setup telnet connection to a UNIX host.</p>
+connect(Ip,Port,Timeout,Extra) ->
+ case Extra of
+ {Username,Password} ->
+ connect(Ip,Port,Timeout,Username,Password);
+ Name ->
+ case get_username_and_password(Name) of
+ {ok,{Username,Password}} ->
+ connect(Ip,Port,Timeout,Username,Password);
+ Error ->
+ Error
+ end
+ end.
+
+connect(Ip,Port,Timeout,Username,Password) ->
+ start_log("unix_telnet:connect"),
+ Result =
+ case ct_telnet_client:open(Ip,Port,Timeout) of
+ {ok,Pid} ->
+ case ct_telnet:silent_teln_expect(Pid,[],[prompt],?prx,[]) of
+ {ok,{prompt,?username},_} ->
+ ok = ct_telnet_client:send_data(Pid,Username),
+ cont_log("Username: ~s",[Username]),
+ case ct_telnet:silent_teln_expect(Pid,[],prompt,?prx,[]) of
+ {ok,{prompt,?password},_} ->
+ ok = ct_telnet_client:send_data(Pid,Password),
+ Stars = lists:duplicate(length(Password),$*),
+ cont_log("Password: ~s",[Stars]),
+ ok = ct_telnet_client:send_data(Pid,""),
+ case ct_telnet:silent_teln_expect(Pid,[],prompt,
+ ?prx,[]) of
+ {ok,{prompt,Prompt},_}
+ when Prompt=/=?username, Prompt=/=?password ->
+ {ok,Pid};
+ Error ->
+ cont_log("Password failed\n~p\n",
+ [Error]),
+ {error,Error}
+ end;
+ Error ->
+ cont_log("Login failed\n~p\n",[Error]),
+ {error,Error}
+ end;
+ {ok,[{prompt,_OtherPrompt1},{prompt,_OtherPrompt2}],_} ->
+ {ok,Pid};
+ Error ->
+ cont_log("Did not get expected prompt\n~p\n",[Error]),
+ {error,Error}
+ end;
+ Error ->
+ cont_log("Could not open telnet connection\n~p\n",[Error]),
+ Error
+ end,
+ end_log(),
+ Result.
+
+get_username_and_password(Name) ->
+ case ct:get_config({Name,username}) of
+ undefined ->
+ {error,{no_username,Name}};
+ Username ->
+ case ct:get_config({Name,password}) of
+ undefined ->
+ {error,{no_password,Name}};
+ Password ->
+ {ok,{Username,Password}}
+ end
+ end.
+