1%%
2%% %CopyrightBegin%
3%%
4%% Copyright Ericsson AB 2004-2018. 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
21-module(unix_telnet).
22
23%% Callbacks for ct_telnet.erl
24-export([connect/7,get_prompt_regexp/0]).
25-import(ct_telnet,[start_gen_log/1,log/4,end_gen_log/0]).
26
27-define(username,"login: ").
28-define(password,"Password: ").
29-define(prx,"login: |Password: |\\\$ |> ").
30
31get_prompt_regexp() ->
32    ?prx.
33
34connect(ConnName,Ip,Port,Timeout,KeepAlive,TCPNoDelay,Extra) ->
35    case Extra of
36	{Username,Password} ->
37	    connect1(ConnName,Ip,Port,Timeout,KeepAlive,TCPNoDelay,
38		     Username,Password);
39	KeyOrName ->
40	    case get_username_and_password(KeyOrName) of
41		{ok,{Username,Password}} ->
42		    connect1(ConnName,Ip,Port,Timeout,KeepAlive,TCPNoDelay,
43			     Username,Password);
44		Error ->
45		    Error
46	    end
47    end.
48
49connect1(Name,Ip,Port,Timeout,KeepAlive,TCPNoDelay,Username,Password) ->
50    start_gen_log("unix_telnet connect"),
51    Result =
52	case ct_telnet_client:open(Ip,Port,Timeout,KeepAlive,TCPNoDelay,Name) of
53	    {ok,Pid} ->
54		case ct_telnet:silent_teln_expect(Name,Pid,[],
55						  [prompt],?prx,[]) of
56		    {ok,{prompt,?username},_} ->
57			log(Name,send,"Logging in to ~p:~p", [Ip,Port]),
58			ok = ct_telnet_client:send_data(Pid,Username),
59			log(Name,send,"Username: ~ts",[Username]),
60			case ct_telnet:silent_teln_expect(Name,Pid,[],
61							  prompt,?prx,[]) of
62			    {ok,{prompt,?password},_} ->
63				ok = ct_telnet_client:send_data(Pid,Password),
64				Stars =
65                                    lists:duplicate(string:length(Password),$*),
66				log(Name,send,"Password: ~s",[Stars]),
67%				ok = ct_telnet_client:send_data(Pid,""),
68				case ct_telnet:silent_teln_expect(Name,Pid,[],
69								  prompt,
70								  ?prx,[]) of
71				    {ok,{prompt,Prompt},_}
72				    when Prompt=/=?username,
73					 Prompt=/=?password ->
74					{ok,Pid};
75				    Error ->
76					log(Name,recv,"Password failed\n~tp\n",
77					    [Error]),
78					{error,Error}
79				end;
80			    Error ->
81				log(Name,recv,"Login to ~p:~p failed\n~tp\n",[Ip,Port,Error]),
82				{error,Error}
83			end;
84		    {ok,[{prompt,_OtherPrompt1},{prompt,_OtherPrompt2}],_} ->
85			{ok,Pid};
86		    Error ->
87			log(Name,conn_error,
88			    "Did not get expected prompt from ~p:~p\n~tp\n",
89			    [Ip,Port,Error]),
90			{error,Error}
91		end;
92	    Error ->
93		log(Name,conn_error,
94		    "Could not open telnet connection to ~p:~p\n~tp\n",
95		    [Ip,Port,Error]),
96		Error
97	end,
98    end_gen_log(),
99    Result.
100
101get_username_and_password(Name) ->
102    case ct:get_config({Name,username}) of
103	undefined ->
104	    {error,{no_username,Name}};
105	Username ->
106	    case ct:get_config({Name,password}) of
107		undefined ->
108		    {error,{no_password,Name}};
109		Password ->
110		    {ok,{Username,Password}}
111	    end
112    end.
113
114