This commit is contained in:
Craig Everett 2017-11-24 08:15:09 +09:00
parent ccd1fd1095
commit 7b3fc3f3a9

51
zx
View File

@ -32,7 +32,7 @@
-type state() :: #s{}. -type state() :: #s{}.
%-type serial() :: pos_integer(). %-type serial() :: pos_integer().
-type package_id() :: {realm(), name(), version()}. -type package_id() :: {realm(), name(), version()}.
%-type package() :: {realm(), name()}. -type package() :: {realm(), name()}.
-type realm() :: lower0_9(). -type realm() :: lower0_9().
-type name() :: lower0_9(). -type name() :: lower0_9().
-type version() :: {Major :: non_neg_integer() | z, -type version() :: {Major :: non_neg_integer() | z,
@ -306,6 +306,17 @@ ensure_installed(PackageID = {Realm, Name, Version}) ->
end. end.
-spec ensure_installed(Realm, Name, Version) -> Result
when Realm :: realm(),
Name :: name(),
Version :: version(),
Result :: exact
| {ok, version()}
| not_found.
%% @private
%% Fetch and install the latest compatible version of the given package ID, whether
%% the version indicator is complete, partial or blank.
ensure_installed(Realm, Name, Version) -> ensure_installed(Realm, Name, Version) ->
Socket = connect_user(Realm), Socket = connect_user(Realm),
case query_latest(Socket, {Realm, Name, Version}) of case query_latest(Socket, {Realm, Name, Version}) of
@ -329,6 +340,18 @@ ensure_installed(Realm, Name, Version) ->
end. end.
-spec query_latest(Socket, Object) -> Result
when Socket :: gen_tcp:socket(),
Object :: package() | package_id(),
Result :: {ok, version()}
| {error, Reason},
Reason :: bad_realm
| bad_package
| bad_version.
%% @private
%% Queries the connected zomp node for the latest version of a package or package
%% version (complete or incomplete version number).
query_latest(Socket, {Realm, Name}) -> query_latest(Socket, {Realm, Name}) ->
ok = send(Socket, {latest, Realm, Name}), ok = send(Socket, {latest, Realm, Name}),
receive receive
@ -848,7 +871,7 @@ connect_user(Realm) ->
connect_user(Realm, []) -> connect_user(Realm, []) ->
{Host, Port} = get_prime(Realm), {Host, Port} = get_prime(Realm),
ok = log(info, "Realm host at ~ts:~tp", [inet:ntoa(Host), Port]), ok = log(info, "Trying prime at ~ts:~tp", [inet:ntoa(Host), Port]),
case gen_tcp:connect(Host, Port, connect_options(), 5000) of case gen_tcp:connect(Host, Port, connect_options(), 5000) of
{ok, Socket} -> {ok, Socket} ->
confirm_user(Realm, Socket, []); confirm_user(Realm, Socket, []);
@ -857,6 +880,7 @@ connect_user(Realm, []) ->
halt(0) halt(0)
end; end;
connect_user(Realm, Hosts = [Node = {Host, Port} | Rest]) -> connect_user(Realm, Hosts = [Node = {Host, Port} | Rest]) ->
ok = log(info, "Trying node at ~ts:~tp", [inet:ntoa(Host), Port]),
case gen_tcp:connect(Host, Port, connect_options(), 5000) of case gen_tcp:connect(Host, Port, connect_options(), 5000) of
{ok, Socket} -> {ok, Socket} ->
confirm_user(Realm, Socket, Hosts); confirm_user(Realm, Socket, Hosts);
@ -1105,10 +1129,13 @@ realm_meta(Realm) ->
prompt_keygen() -> prompt_keygen() ->
Message = Message =
" Enter a name for your new keys.~n" "~n Enter a name for your new keys.~n~n"
" Valid names must start with a lower-case letter, and can include~n" " Valid names must start with a lower-case letter, and can include~n"
" only lower-case letters, numbers, and periods, but no series of~n" " only lower-case letters, numbers, and periods, but no series of~n"
" consecutive periods.~n", " consecutive periods. (That is: [a-z0-9\\.])~n~n"
" To designate the key as realm-specific, enter the realm name and~n"
" key name separated by a space.~n~n"
" Example: some.realm my.key~n",
ok = io:format(Message), ok = io:format(Message),
Input = string:trim(io:get_line("(^C to quit): ")), Input = string:trim(io:get_line("(^C to quit): ")),
{Realm, KeyName} = {Realm, KeyName} =
@ -1136,10 +1163,8 @@ keygen() ->
ok = file:set_cwd(zomp_dir()), ok = file:set_cwd(zomp_dir()),
KeyID = prompt_keygen(), KeyID = prompt_keygen(),
case generate_rsa(KeyID) of case generate_rsa(KeyID) of
ok -> ok -> halt(0);
halt(0); Error -> error_exit("keygen failed with ~tp", [Error], ?FILE, ?LINE)
Error ->
error_exit("keygen failed with ~tp", [Error], ?FILE, ?LINE)
end. end.
@ -1733,10 +1758,12 @@ package_id(String) ->
true = valid_lower0_9(Name), true = valid_lower0_9(Name),
Version = string_to_version(VersionString), Version = string_to_version(VersionString),
{Realm, Name, Version}; {Realm, Name, Version};
[Realm, Name] -> [A, B] ->
true = valid_lower0_9(Realm), true = valid_lower0_9(A),
true = valid_lower0_9(Name), case valid_lower0_9(B) of
{Realm, Name, {z, z, z}}; true -> {A, B, {z, z, z}};
false -> {"otpr", A, string_to_version(B)}
end;
[Name] -> [Name] ->
true = valid_lower0_9(Name), true = valid_lower0_9(Name),
{"otpr", Name, {z, z, z}} {"otpr", Name, {z, z, z}}