connecting using aliased hostname
Raimo Niskanen
raimo@REDACTED
Thu Dec 1 17:44:01 CET 2005
It should work without any change to the distribution if you force
the nodename to be an aliased name; in your example start with
-sname n@REDACTED
ulf.wiger@REDACTED (Ulf Wiger AL/EAB) writes:
> We played around a little with the -kernel inetrc
> option, and tried to use a user-defined alias
> to connect to a node on another machine
>
> E.g. if the official hostname is, say "gandalf",
> but we want to use the alias "saruman", we
> specify in our inetrc file
>
> {lookup, [file,native]}.
> {host, {10,10,10,10}, "gandalf", ["saruman"]}.
>
> and then start an erlang node with
>
> erl -kernel inetrc '"./myinetrc"' -sname n -setcookie frodo
>
> and try net:ping(n@REDACTED), it doesn't work.
> It seems to go wrong in recv_challenge, since
> the other node calls himself 'n@REDACTED'.
>
> The patch to dist_util.erl below makes us lookup
> the hostent record and proceed if the hostname
> given by the other node is either the official
> name (most likely) or a known alias.
>
> I admit that it is usually not terribly useful,
> and perhaps sometimes quite confusing to allow
> aliased hostnames, but on occasion, I think it
> can be quite nice to have.
>
> Say, for example that we have a node that connects
> to a system under test ("sut"). We can consistently
> use the nodename thenode@REDACTED in our test program.
> Wonderfully convenient!
>
> (Ok, crummy example. Mostly, I was curious to see if
> it could be made to work, after having satisfied my
> initial curiosity in establishing that it didn't in
> fact work.)
>
> /Uffe
> BTW, the patch isn't quite generic. It assumes 'inet'.
>
>
> *** $OTP_ROOT/lib/kernel-2.10.10/src/dist_util.erl Tue Aug 30
> 05:05:28 2005
> --- dist_util.erl Thu Dec 1 15:29:31 2005
> ***************
> *** 33,38 ****
> --- 33,40 ----
>
> -include("dist_util.hrl").
> -include("dist.hrl").
> + -include("inet.hrl").
> +
>
> -define(to_port(FSend, Socket, Data),
> case FSend(Socket, Data) of
> ***************
> *** 324,332 ****
> send_name(HSData),
> recv_status(HSData),
> {PreOtherFlags, NodeA, VersionA, ChallengeA} =
> recv_challenge(HSData),
> ! if Node =/= NodeA -> ?shutdown(no_node);
> ! Version =/= VersionA -> ?shutdown(no_node);
> ! true -> true
> end,
> {ThisFlags, OtherFlags} = adjust_flags(PreThisFlags,
> PreOtherFlags),
> --- 326,340 ----
> send_name(HSData),
> recv_status(HSData),
> {PreOtherFlags, NodeA, VersionA, ChallengeA} =
> recv_challenge(HSData),
> ! GoodNode =
> ! if Node =/= NodeA ->
> ! is_alias(NodeA);
> ! true -> true
> ! end,
> ! GoodVsn = (Version == VersionA),
> ! if (GoodNode and GoodVsn) -> true;
> ! true ->
> ! ?shutdown(no_node)
> end,
> {ThisFlags, OtherFlags} = adjust_flags(PreThisFlags,
> PreOtherFlags),
> ***************
> *** 341,346 ****
> --- 349,375 ----
> reset_timer(NewHSData#hs_data.timer),
> recv_challenge_ack(NewHSData, MyChallenge, MyCookie),
> connection(NewHSData).
> +
> + is_alias(Node) ->
> + case split_node(atom_to_list(Node), $@, []) of
> + [Name|Tail] ->
> + Host = lists:append(Tail),
> + case inet:gethostbyname(Host, inet) of
> + {ok, #hostent{h_name = OfficialName,
> + h_aliases = Aliases}} ->
> + lists:member(Host, [OfficialName|Aliases]);
> + _ ->
> + false
> + end;
> + _ ->
> + false
> + end.
> +
> +
> + split_node([Chr|T], Chr, Ack) -> [lists:reverse(Ack)|split_node(T,
> Chr, [])];
> + split_node([H|T], Chr, Ack) -> split_node(T, Chr, [H|Ack]);
> + split_node([], _, Ack) -> [lists:reverse(Ack)].
> +
>
> %% --------------------------------------------------------------
> %% The connection has been established.
--
/ Raimo Niskanen, Erlang/OTP, Ericsson AB
More information about the erlang-questions
mailing list