Realmfile creation

This commit is contained in:
Craig Everett 2017-11-29 17:53:15 +09:00
parent 71661e2027
commit e60a5d4191

83
zx
View File

@ -85,11 +85,15 @@ start(["set", "dep", PackageString]) ->
set_dep(PackageID);
start(["set", "version", VersionString]) ->
set_version(VersionString);
start(["add", "realm", RealmFile]) ->
add_realm(RealmFile);
start(["drop", "dep", PackageString]) ->
PackageID = package_id(PackageString),
drop_dep(PackageID);
start(["drop", "key", KeyID]) ->
drop_key(KeyID);
start(["drop", "realm", Realm]) ->
drop_realm(Realm);
start(["verup", Level]) ->
verup(Level);
start(["runlocal" | Args]) ->
@ -115,6 +119,8 @@ start(["create", "plt"]) ->
create_plt();
start(["create", "realm"]) ->
create_realm();
start(["create", "realmfile", Realm]) ->
create_realmfile(Realm);
start(["create", "sysop"]) ->
create_sysop();
start(_) ->
@ -538,6 +544,22 @@ update_version(Realm, Name, OldVersion, NewVersion, OldMeta) ->
%%% Add realm
-spec add_realm(Path) -> no_return()
when Path :: file:filename().
add_realm(Path) ->
case filelib:is_regular(Path) of
true ->
ok = log(info, "I would install this now, were I implemented."),
halt(0);
false ->
ok = log(warning, "Realm file not found at ~ts.", [Path]),
halt(1)
end.
%%% Drop dependency
-spec drop_dep(package_id()) -> no_return().
@ -585,6 +607,15 @@ drop_key({Realm, KeyName}) ->
end.
%%% Drop realm
-spec drop_realm(realm()) -> no_return().
drop_realm(Realm) ->
ok = log(info, "I would totally drop ~ts right now if I could.", [Realm]),
halt(0).
%%% Update version
@ -1695,14 +1726,14 @@ create_realm(ZompConf, Realm, ExAddress, ExPort, InPort, UserName, Email) ->
Timestamp = calendar:now_to_universal_time(erlang:timestamp()),
{ok, RealmPubData} = file:read_file(RealmPub),
RealmPubRecord =
{{Realm, filename:basename(RealmPub)},
{{Realm, filename:basename(RealmPub, ".pub.der")},
realm,
{realm, Realm},
crypto:hash(sha512, RealmPubData),
Timestamp},
{ok, PackagePubData} = file:read_file(PackagePub),
PackagePubRecord =
{{Realm, filename:basename(PackagePub)},
{{Realm, filename:basename(PackagePub, ".pub.der")},
package,
{realm, Realm},
crypto:hash(sha512, PackagePubData),
@ -1719,7 +1750,13 @@ create_realm(ZompConf, Realm, ExAddress, ExPort, InPort, UserName, Email) ->
" The package and sysop keys will need to be copied to the ~~/.zomp/keys/~s/~n"
" directory on your personal or dev machine.~n",
ok = io:format(Message, [Realm]),
UserRecord = {{UserName, Realm}, [SysopPub], Email, RealName, 1, Timestamp},
UserRecord =
{{UserName, Realm},
[filename:basename(SysopPub, ".pub.der")],
Email,
RealName,
1,
Timestamp},
RealmFile = filename:join(zomp_dir(), Realm ++ ".realm"),
RealmMeta =
[{realm, Realm},
@ -1749,6 +1786,42 @@ create_realm(ZompConf, Realm, ExAddress, ExPort, InPort, UserName, Email) ->
halt(0).
-spec create_realmfile(realm()) -> no_return().
create_realmfile(Realm) ->
ConfPath = filename:join(zomp_dir(), realm_file(Realm)),
case file:consult(ConfPath) of
{ok, RealmConf} ->
ok = log(info, "Realm found, creating realm file..."),
{realm_keys, RealmKeys} = lists:keyfind(realm_keys, 1, RealmConf),
{package_keys, PackageKeys} = lists:keyfind(package_keys, 1, RealmConf),
RealmKeyIDs = [element(1, K) || K <- RealmKeys],
PackageKeyIDs = [element(1, K) || K <- PackageKeys],
create_realmfile(Realm, ConfPath, RealmKeyIDs, PackageKeyIDs);
{error, enoent} ->
ok = log(warning, "There is no configured realm called ~ts.", [Realm]),
halt(1)
end.
-spec create_realmfile(Realm, ConfPath, RealmKeyIDs, PackageKeyIDs) -> ok
when Realm :: realm(),
ConfPath :: file:filename(),
RealmKeyIDs :: [key_id()],
PackageKeyIDs :: [key_id()].
create_realmfile(Realm, ConfPath, RealmKeyIDs, PackageKeyIDs) ->
{ok, CWD} = file:get_cwd(),
ok = file:set_cwd(zomp_dir()),
KeyPath = fun({R, K}) -> filename:join(["key", R, K ++ ".pub.der"]) end,
RealmKeyPaths = lists:map(KeyPath, RealmKeyIDs),
PackageKeyPaths = lists:map(KeyPath, PackageKeyIDs),
Targets = [filename:basename(ConfPath) | RealmKeyPaths ++ PackageKeyPaths],
OutFile = filename:join(CWD, Realm ++ ".zrf"),
ok = erl_tar:create(OutFile, Targets, [compressed]),
ok = log(info, "Realm file written to ~ts", [OutFile]),
halt(0).
-spec create_sysop() -> no_return().
create_sysop() ->
@ -2484,8 +2557,10 @@ usage() ->
" zx install PackageID~n"
" zx set dep PackageID~n"
" zx set version Version~n"
" zx add realm RealmFile~n"
" zx drop dep PackageID~n"
" zx drop key Realm KeyName~n"
" zx drop realm Realm~n"
" zx verup Level~n"
" zx runlocal [Args]~n"
" zx package [Path]~n"
@ -2493,6 +2568,7 @@ usage() ->
" zx create keypair~n"
" zx create plt~n"
" zx create realm~n"
" zx create realmfile Realm~n"
" zx create sysop~n"
"~n"
"Where~n"
@ -2500,6 +2576,7 @@ usage() ->
" Args :: Arguments to pass to the application~n"
" Type :: The project type: a standalone \"app\" or a \"lib\"~n"
" Version :: Version string X, X.Y, or X.Y.Z: \"1\", \"1.2\", \"1.2.3\"~n"
" RealmFile :: Path to a valid .zrf realm file~n"
" Realm :: The name of a realm as a string [:a-z:]~n"
" KeyName :: The prefix of a keypair to drop~n"
" Level :: The version level, one of \"major\", \"minor\", or \"patch\"~n"