Modified:
trunk/osp_admin.erl
Log:
Fixed a bug in the quit command, and added the migrate and stop commands,
this pretty much does it for OSP 0.3!
Modified: trunk/osp_admin.erl
==============================================================================
--- trunk/osp_admin.erl (original)
+++ trunk/osp_admin.erl Thu Apr 9 19:11:27 2009
@@ -37,14 +37,14 @@
String3 = string:strip(String2, right, $\r),
case String3 of
"help" -> % Print out the help message
- send(Sock, <<"OSP Admin Console\n\tquit - Quits the console\n\tstats
- Prints general stats about the OSP cluster\n\tstart <appname> <port>
<node> - Starts appname on node\n\tadd-diskless-ip <ip> - Adds IP to the
allowed diskless server pool\n\tshutdown - Shutdown OSP on all
nodes\n\tadd-backup-server <node> <type> - Makes node a backup server
keeping an up-to-date copy of all the shared state in the cluster; type may
be ram for faster, non-persistant storage, or disk for data
persistance\n">>);
+ send(Sock, <<"OSP Admin Console\n\tquit - Quits the console\n\tstats
- Prints general stats about the OSP cluster\n\tstart <appname> <port>
<node> - Starts appname on node\n\tadd-diskless-ip <ip> - Adds IP to the
allowed diskless server pool\n\tshutdown - Shutdown OSP on all
nodes\n\tadd-backup-server <node> <type> - Makes node a backup server
keeping an up-to-date copy of all the shared state in the cluster; type may
be ram for faster, non-persistant storage, or disk for data
persistance\n\tstop <appname> <node> - Stops the servlet on the given
node\r\nmigrate <appname> <fromnode> <tonode> <port> - Migrates a servlet
from fromnode to tonode, starting it on the given port\n">>);
"stats" -> % Display some stats
F = fun(Node) -> sendf(Sock, "~p: ~f~n", [Node, round(100 *
rpc:call(Node, cpu_sup, avg1, []) / 256) / 100]) end,
sendf(Sock, "Nodes in the cluster and their CPU Utilization: ~n", []),
lists:map(F, [node() | nodes()]),
sendf(Sock, "The following IPs: ~p are allowed to be diskless~n",
[erl_boot_server:which_slaves()]);
"quit" ->
- gen_tcp:close(Sock),
+ close(Sock),
exit(normal);
"shutdown" ->
F = fun(Node) ->
@@ -70,6 +70,14 @@
App = erlang:list_to_atom(AppList),
Node = erlang:list_to_atom(NodeList),
start_servlet(App, Port, Node, Sock);
+ "migrate" ->
+ [Comm, AppList, FromNodeList, NodeList, PortList ] = Split,
+ Port = erlang:list_to_integer(PortList),
+ From = erlang:list_to_atom(FromNodeList),
+ App = erlang:list_to_atom(AppList),
+ Node = erlang:list_to_atom(NodeList),
+ start_servlet(App, Port, Node, Sock),
+ stop_servlet(App, From, Sock);
"add-diskless-ip" ->
[Comm, IPList] = Split,
IP = erlang:list_to_atom(IPList),
@@ -91,6 +99,11 @@
_ ->
send(Sock, "Sorry, unknown backup type: " ++ TypeL ++ "\r\n")
end;
+ "stop" ->
+ [Comm, AppL, NodeL] = Split,
+ App = erlang:list_to_atom(AppL),
+ Node = erlang:list_to_atom(NodeL),
+ stop_servlet(App, Node, Sock);
_ ->
send(Sock, "Sorry, unknown command " ++ Unknown ++ "\r\n")
end
@@ -124,6 +137,19 @@
rpc:call(Node, mnesia, wait_for_tables, [[TableName], 1000]),
ok.
+stop_servlet(App, Node, Sock) ->
+ case lists:member(Node, [node() | nodes()]) of
+ true ->
+ if
+ Node =:= node() ->
+ osp_broker:stop(App);
+ true ->
+ rpc:call(Node, osp_broker, stop, [App])
+ end,
+ sendf(Sock, "Stopped ~p on ~p ~n", [App, Node]);
+ false ->
+ send(Sock, "Sorry, the node you requested couldn't be found\r\n")
+ end.
start_servlet(App, Port, Node, Sock) ->
case lists:member(Node, [node() | nodes()]) of