aboutsummaryrefslogtreecommitdiffstats
path: root/lib/cosFileTransfer/src/cosFileTransferApp.erl
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
committerErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
commit84adefa331c4159d432d22840663c38f155cd4c1 (patch)
treebff9a9c66adda4df2106dfd0e5c053ab182a12bd /lib/cosFileTransfer/src/cosFileTransferApp.erl
downloadotp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz
otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2
otp-84adefa331c4159d432d22840663c38f155cd4c1.zip
The R13B03 release.OTP_R13B03
Diffstat (limited to 'lib/cosFileTransfer/src/cosFileTransferApp.erl')
-rw-r--r--lib/cosFileTransfer/src/cosFileTransferApp.erl469
1 files changed, 469 insertions, 0 deletions
diff --git a/lib/cosFileTransfer/src/cosFileTransferApp.erl b/lib/cosFileTransfer/src/cosFileTransferApp.erl
new file mode 100644
index 0000000000..443c917a97
--- /dev/null
+++ b/lib/cosFileTransfer/src/cosFileTransferApp.erl
@@ -0,0 +1,469 @@
+%%--------------------------------------------------------------------
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%
+%%----------------------------------------------------------------------
+%% File : cosFileTransferApp.erl
+%% Purpose :
+%% Created : 25 Aug 2000
+%%----------------------------------------------------------------------
+-module(cosFileTransferApp).
+
+
+%%--------------- INCLUDES -----------------------------------
+-include("cosFileTransferApp.hrl").
+
+%%--------------- EXPORTS-------------------------------------
+%% cosFileTransferApp API external
+-export([start/0, stop/0, install/0, uninstall/0, create_VFS/4, create_VFS/5,
+ get_buffert_size/0]).
+
+%% cosFileTransferApp API internal
+-export([create_link/3, get_option/3, type_check/2, configure/2]).
+
+%% Application callbacks
+-export([start/2, init/1, stop/1]).
+
+%% INTERNAL EXPORTS!! DO NOT USE THESE!!
+-export([create_dir/2, create_dir/3, create_file/2, create_file/3, split_paths/1,
+ create_name/1]).
+
+-export([ssl_server_certfile/0, ssl_client_certfile/0, ssl_port/0,
+ ssl_server_verify/0,
+ ssl_client_verify/0,
+ ssl_server_depth/0, ssl_client_depth/0,
+ ssl_server_cacertfile/0,
+ ssl_client_cacertfile/0]).
+
+
+%%--------------- DEFINES ------------------------------------
+-define(SUPERVISOR_NAME, oe_cosFileTransferSup).
+-define(SUP_FLAG, {simple_one_for_one,50,10}).
+-define(SUP_DIRECTORY_SPEC(Name, Args),
+ ['CosFileTransfer_Directory',Args,
+ [{sup_child, true}, {regname, {global, Name}}]]).
+-define(SUP_CHILD,
+ {"oe_FileTransferChild",
+ {cosFileTransfer,create_link, []},
+ transient,100000,worker,
+ []}).
+
+%%------------------------------------------------------------
+%% function : install
+%% Arguments: -
+%% Returns : ok | EXIT | EXCEPTION
+%% Effect : Install necessary data in the IFR DB
+%%------------------------------------------------------------
+install() ->
+ oe_CosFileTransfer:oe_register().
+
+%%------------------------------------------------------------
+%% function : uninstall
+%% Arguments: -
+%% Returns : ok | EXIT | EXCEPTION
+%% Effect : Remove data related to cosFileTransfer from the IFR DB
+%%------------------------------------------------------------
+uninstall() ->
+ oe_CosFileTransfer:oe_unregister().
+
+
+%%------------------------------------------------------------
+%% function : start/stop
+%% Arguments:
+%% Returns :
+%% Effect : Starts or stops the cosFileTransfer application.
+%%------------------------------------------------------------
+start() ->
+ application:start(cosFileTransfer).
+stop() ->
+ application:stop(cosFileTransfer).
+
+%%------------------------------------------------------------
+%% function : start
+%% Arguments: Type - see module application
+%% Arg - see module application
+%% Returns :
+%% Effect : Module callback for application
+%%------------------------------------------------------------
+start(_, _) ->
+ supervisor:start_link({local, ?SUPERVISOR_NAME}, cosFileTransferApp, app_init).
+
+
+%%------------------------------------------------------------
+%% function : stop
+%% Arguments: Arg - see module application
+%% Returns :
+%% Effect : Module callback for application
+%%------------------------------------------------------------
+stop(_) ->
+ ok.
+
+%%-----------------------------------------------------------%
+%% function : init
+%% Arguments:
+%% Returns :
+%% Effect :
+%%------------------------------------------------------------
+%% Starting using create_factory/X
+init(own_init) ->
+ {ok,{?SUP_FLAG, [?SUP_CHILD]}};
+%% When starting as an application.
+init(app_init) ->
+ {ok,{?SUP_FLAG, [?SUP_CHILD]}}.
+
+%%------------------------------------------------------------
+%% function : create_VFS
+%% Arguments:
+%% Returns :
+%% Effect :
+%%------------------------------------------------------------
+create_VFS(Type, Content, Host, Port) ->
+ create_VFS(Type, Content, Host, Port, []).
+
+create_VFS('FTP', Content, Host, Port, Options)
+ when is_list(Host) andalso is_integer(Port) andalso is_list(Options) ->
+ 'CosFileTransfer_VirtualFileSystem':oe_create(['FTP', Content, Host, Port,
+ Options],
+ [{pseudo, true}]);
+create_VFS({'NATIVE', Mod}, Content, Host, Port, Options)
+ when is_list(Host) andalso is_integer(Port) andalso is_list(Options) ->
+ 'CosFileTransfer_VirtualFileSystem':oe_create([{'NATIVE', Mod}, Content,
+ Host, Port, Options],
+ [{pseudo, true}]);
+create_VFS(_, _, _, _, _) ->
+ corba:raise(#'BAD_PARAM'{completion_status=?COMPLETED_NO}).
+
+%%-----------------------------------------------------------%
+%% function : create_link
+%% Arguments: Module - which Module to call
+%% Env/ArgList - ordinary oe_create arguments.
+%% Returns :
+%% Exception:
+%% Effect : Necessary since we want the supervisor to be a
+%% 'simple_one_for_one'. Otherwise, using for example,
+%% 'one_for_one', we have to call supervisor:delete_child
+%% to remove the childs startspecification from the
+%% supervisors internal state.
+%%------------------------------------------------------------
+create_link(Module, Env, ArgList) ->
+ Module:oe_create_link(Env, ArgList).
+
+%%-----------------------------------------------------------%
+%% function : get_option
+%% Arguments:
+%% Returns :
+%% Exception:
+%% Effect :
+%%------------------------------------------------------------
+get_option(Key, OptionList, DefaultList) ->
+ case lists:keysearch(Key, 1, OptionList) of
+ {value,{Key,Value}} ->
+ Value;
+ _ ->
+ case lists:keysearch(Key, 1, DefaultList) of
+ {value,{Key,Value}} ->
+ Value;
+ _->
+ {error, "Invalid option"}
+ end
+ end.
+
+%%-----------------------------------------------------------%
+%% function : type_check
+%% Arguments: Obj - objectrefernce to test.
+%% Mod - Module which contains typeID/0.
+%% Returns : 'ok' or raises exception.
+%% Effect :
+%%------------------------------------------------------------
+type_check(Obj, Mod) ->
+ case catch corba_object:is_a(Obj,Mod:typeID()) of
+ true ->
+ ok;
+ _ ->
+ corba:raise(#'BAD_PARAM'{minor=700, completion_status=?COMPLETED_NO})
+ end.
+
+
+%%-----------------------------------------------------------%
+%% function : create_name/1
+%% Arguments:
+%% Returns :
+%% Exception:
+%% Effect :
+%%------------------------------------------------------------
+create_name(Type) ->
+ {MSec, Sec, USec} = erlang:now(),
+ lists:concat(['oe_',node(),'_',Type,'_',MSec, '_', Sec, '_', USec]).
+
+
+%%-----------------------------------------------------------%
+%% function : get_buffert_size/0
+%% Arguments:
+%% Returns :
+%% Exception:
+%% Effect : Lookup the configuration variable 'buffert_size'
+%%------------------------------------------------------------
+get_buffert_size() ->
+ case application:get_env(cosFileTransfer, buffert_size) of
+ {ok, Size} when is_integer(Size) ->
+ Size;
+ _ ->
+ ?DEFAULT_BUFSIZE
+ end.
+
+%%-----------------------------------------------------------%
+%% function : configure/1
+%% Arguments:
+%% Returns :
+%% Exception:
+%% Effect :
+%%------------------------------------------------------------
+configure(buffert_size, Value) when is_integer(Value) ->
+ do_configure(buffert_size, Value);
+configure(ssl_port, Value) when is_integer(Value) ->
+ do_safe_configure(ssl_port, Value);
+configure(ssl_server_certfile, Value) when is_list(Value) ->
+ do_safe_configure(ssl_server_certfile, Value);
+configure(ssl_server_certfile, Value) when is_atom(Value) ->
+ do_safe_configure(ssl_server_certfile, atom_to_list(Value));
+configure(ssl_client_certfile, Value) when is_list(Value) ->
+ do_safe_configure(ssl_client_certfile, Value);
+configure(ssl_client_certfile, Value) when is_atom(Value) ->
+ do_safe_configure(ssl_client_certfile, atom_to_list(Value));
+configure(ssl_server_verify, Value) when is_integer(Value) ->
+ do_safe_configure(ssl_server_verify, Value);
+configure(ssl_client_verify, Value) when is_integer(Value) ->
+ do_safe_configure(ssl_client_verify, Value);
+configure(ssl_server_depth, Value) when is_integer(Value) ->
+ do_safe_configure(ssl_server_depth, Value);
+configure(ssl_client_depth, Value) when is_integer(Value) ->
+ do_safe_configure(ssl_client_depth, Value);
+configure(ssl_server_cacertfile, Value) when is_list(Value) ->
+ do_safe_configure(ssl_server_cacertfile, Value);
+configure(ssl_server_cacertfile, Value) when is_atom(Value) ->
+ do_safe_configure(ssl_server_cacertfile, atom_to_list(Value));
+configure(ssl_client_cacertfile, Value) when is_list(Value) ->
+ do_safe_configure(ssl_client_cacertfile, Value);
+configure(ssl_client_cacertfile, Value) when is_atom(Value) ->
+ do_safe_configure(ssl_client_cacertfile, atom_to_list(Value));
+configure(_, _) ->
+ exit({error, "Bad configure parameter(s)"}).
+
+%% This function may be used as long as it is safe to change a value at any time.
+do_configure(Key, Value) ->
+ case is_loaded() of
+ false ->
+ application:load(cosFileTransfer),
+ application_controller:set_env(cosFileTransfer, Key, Value);
+ true ->
+ application_controller:set_env(cosFileTransfer, Key, Value)
+ end.
+
+
+%% This function MUST(!!) be used when we cannot change a value if cosFileTransfer
+%% is running.
+do_safe_configure(Key, Value) ->
+ case is_loaded() of
+ false ->
+ application:load(cosFileTransfer),
+ application_controller:set_env(cosFileTransfer, Key, Value);
+ true ->
+ case is_running() of
+ false ->
+ application_controller:set_env(cosFileTransfer, Key, Value);
+ true ->
+ exit("cosFileTransfer already running, the given key may not be updated!")
+ end
+ end.
+
+%%-----------------------------------------------------------%
+%% function : SSL parameter access functions
+%% Arguments:
+%% Returns :
+%% Exception:
+%% Effect :
+%%------------------------------------------------------------
+ssl_port() ->
+ case application:get_env(cosFileTransfer, ssl_port) of
+ {ok, Port} when is_integer(Port) ->
+ Port;
+ _ ->
+ -1
+ end.
+
+ssl_server_certfile() ->
+ case application:get_env(cosFileTransfer, ssl_server_certfile) of
+ {ok, V1} when is_list(V1) ->
+ V1;
+ {ok, V2} when is_atom(V2) ->
+ atom_to_list(V2);
+ _What ->
+ {ok, Cwd} = file:get_cwd(),
+ filename:join(Cwd,"ssl_server_cert.pem")
+ end.
+
+
+ssl_client_certfile() ->
+ case application:get_env(cosFileTransfer, ssl_client_certfile) of
+ {ok, V1} when is_list(V1) ->
+ V1;
+ {ok, V2} when is_atom(V2) ->
+ atom_to_list(V2);
+ _ ->
+ {ok, Cwd} = file:get_cwd(),
+ filename:join(Cwd,"ssl_client_cert.pem")
+ end.
+
+ssl_server_verify() ->
+ Verify = case application:get_env(cosFileTransfer, ssl_server_verify) of
+ {ok, V} when is_integer(V) ->
+ V;
+ _ ->
+ 0
+ end,
+ if
+ Verify =< 2, Verify >= 0 ->
+ Verify;
+ true ->
+ 0
+ end.
+
+ssl_client_verify() ->
+ Verify = case application:get_env(cosFileTransfer, ssl_client_verify) of
+ {ok, V1} when is_integer(V1) ->
+ V1;
+ _ ->
+ 0
+ end,
+ if
+ Verify =< 2, Verify >= 0 ->
+ Verify;
+ true ->
+ 0
+ end.
+
+ssl_server_depth() ->
+ case application:get_env(cosFileTransfer, ssl_server_depth) of
+ {ok, V1} when is_integer(V1) ->
+ V1;
+ _ ->
+ 1
+ end.
+
+ssl_client_depth() ->
+ case application:get_env(cosFileTransfer, ssl_client_depth) of
+ {ok, V1} when is_integer(V1) ->
+ V1;
+ _ ->
+ 1
+ end.
+
+
+ssl_server_cacertfile() ->
+ case application:get_env(cosFileTransfer, ssl_server_cacertfile) of
+ {ok, V1} when is_list(V1) ->
+ V1;
+ {ok, V2} when is_atom(V2) ->
+ atom_to_list(V2);
+ _ ->
+ []
+ end.
+
+ssl_client_cacertfile() ->
+ case application:get_env(cosFileTransfer, ssl_client_cacertfile) of
+ {ok, V1} when is_list(V1) ->
+ V1;
+ {ok, V2} when is_atom(V2) ->
+ atom_to_list(V2);
+ _ ->
+ []
+ end.
+
+
+%%============================================================
+%% Internal functions
+%%============================================================
+%%-----------------------------------------------------------%
+%% function : is_loaded/0
+%% Arguments:
+%% Returns :
+%% Exception:
+%% Effect : Check if the application is loaded
+%%------------------------------------------------------------
+is_loaded() ->
+ is_loaded(application:loaded_applications()).
+
+is_running() ->
+ is_loaded(application:which_applications()).
+
+is_loaded([]) ->
+ false;
+is_loaded([{cosFileTransfer, _, _} |_As]) ->
+ true;
+is_loaded([_ |As]) ->
+ is_loaded(As).
+
+
+
+
+%%-----------------------------------------------------------%
+%% function : create_dir/3/4
+%% Arguments:
+%% Returns :
+%% Exception:
+%% Effect :
+%%------------------------------------------------------------
+create_dir(Session, FileNameList) ->
+ create_dir(Session, FileNameList, corba:create_nil_objref()).
+create_dir(Session, FileNameList, Parent) ->
+ 'CosFileTransfer_Directory':oe_create([lists:last(FileNameList), FileNameList,
+ Parent, Session],
+ [{pseudo, true}]).
+
+%%-----------------------------------------------------------%
+%% function : create_file/2/3
+%% Arguments:
+%% Returns :
+%% Exception:
+%% Effect :
+%%------------------------------------------------------------
+create_file(Session, FileNameList) ->
+ create_file(Session, FileNameList, corba:create_nil_objref()).
+create_file(Session, FileNameList, Parent) ->
+ 'CosFileTransfer_File':oe_create([lists:last(FileNameList), FileNameList,
+ Parent, Session], [{pseudo, true}]).
+
+%%-----------------------------------------------------------%
+%% function : split_paths
+%% Arguments:
+%% Returns :
+%% Exception:
+%% Effect :
+%%------------------------------------------------------------
+split_paths(Listing) ->
+ split_paths(string:tokens(Listing, ?SEPARATOR), []).
+split_paths([], Acc) ->
+ Acc;
+split_paths([H|T], Acc) ->
+ split_paths(T, [filename:split(H)|Acc]).
+
+
+%%--------------- END OF MODULE ------------------------------
+
+