diff --git a/zx b/zx index 437f0cd..e4a7dc8 100755 --- a/zx +++ b/zx @@ -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() -> @@ -1835,7 +1908,7 @@ fetch(Socket, PackageID) -> -spec request_zrp(Socket, PackageID) -> Result - when Socket :: gen_tcp:socket(), + when Socket :: gen_tcp:socket(), PackageID :: package_id(), Result :: {ok, Latest :: package_id()} | {error, Reason :: timeout | term()}. @@ -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"