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