summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRudolf J Streif <rudolf.streif@gmail.com>2016-02-23 08:24:48 -0800
committerRudolf J Streif <rudolf.streif@gmail.com>2016-02-23 08:24:48 -0800
commit5cffa3d484ba8f9dc4873fbea66f0a2730480feb (patch)
tree190cb401bcbb479694c6863a5ff12824ace256ff
parent78c0f2638648a4f856a9945d5bbc1d0c7af5f30e (diff)
downloadrvi_core-5cffa3d484ba8f9dc4873fbea66f0a2730480feb.tar.gz
Unified configuration files
The configuration file rvi_yocto.config still represented a previous state. Made it the same as rvi_ubuntu.config which represents the newest configuration settings. Since there also was no rvi_debian.config (the rvi_ubuntu.config file was used when building for Debian), I created that for consistency reasons. Future will tell if we actually need separate configuration files for the different build and deployment environments. If not then we can consolidate easily later. Signed-off-by: Rudolf J Streif <rudolf.streif@gmail.com>
-rwxr-xr-xdebian_template/rules2
-rw-r--r--priv/config/rvi_debian.config344
-rw-r--r--priv/config/rvi_ubuntu.config6
-rw-r--r--priv/config/rvi_yocto.config22
4 files changed, 355 insertions, 19 deletions
diff --git a/debian_template/rules b/debian_template/rules
index b6b8c0a..fc2f6c0 100755
--- a/debian_template/rules
+++ b/debian_template/rules
@@ -18,4 +18,4 @@ override_dh_auto_install:
# Copy out rvi_ctl to /usr/bin
install -D -m 0755 ./debian/rvi/usr/lib/rvi_core/rvi_ctl ./debian/rvi/usr/bin/rvi_ctl
# Install default config
- install -D -m 0644 ./priv/config/rvi_ubuntu.config ./debian/rvi/etc/rvi/rvi.config
+ install -D -m 0644 ./priv/config/rvi_debian.config ./debian/rvi/etc/rvi/rvi.config
diff --git a/priv/config/rvi_debian.config b/priv/config/rvi_debian.config
new file mode 100644
index 0000000..e075fa4
--- /dev/null
+++ b/priv/config/rvi_debian.config
@@ -0,0 +1,344 @@
+%% -*- erlang -*-
+
+%% Copyright (C) 2014,2015,2016 Jaguar Land Rover
+%%
+%% This program is licensed under the terms and conditions of the
+%% Mozilla Public License, version 2.0. The full text of the
+%% Mozilla Public License is at https://www.mozilla.org/MPL/2.0/
+%%
+%% Configuration file for RVI deployed on Debian systems.
+%%
+%% See ../CONFIGURE.md for a details on the configuration process
+%% itself.
+%%
+
+%% Parameters for simpler modification
+Env = fun(V, Def) ->
+ case os:getenv(V) of
+ false -> Def;
+ Str when is_integer(Def) -> list_to_integer(Str);
+ Str when is_atom(Def) -> list_to_atom(Str);
+ Str -> Str
+ end
+ end.
+IPPort = fun(IP, Port) ->
+ IP ++ ":" ++ integer_to_list(Port)
+ end.
+MyPort = Env("RVI_PORT", 9000).
+MyIP = Env("RVI_MYIP", "127.0.0.1").
+MyNodeAddr = Env("RVI_MY_NODE_ADDR", IPPort(MyIP, MyPort)).
+BackendIP = Env("RVI_BACKEND", "38.129.64.31").
+BackendPort = Env("RVI_BACKEND_PORT", 8807).
+LogLevel = Env("RVI_LOGLEVEL", notice).
+
+[
+ %% All erlang apps needed to fire up a node. Do not touch.
+ {include_lib, "rvi_core/priv/config/rvi_common.config"},
+
+ %%
+ %% Custom environment settings
+ %% for all apps running on the node.
+ %%
+ {env,
+ [
+
+ %% All RVI configuration is done here.
+ %%
+ %% Please note that the rvi_node.sh launch script
+ %% can still override the port range and static nodes
+ %% through its command line parameters.
+ %%
+ %% Value substitution:
+ %% All string values under the rvi tuple tree are scanned
+ %% for specific dokens during startup. If a token is
+ %% found, it will be replaced with a value referenced by it.
+ %% Tokens can one of the following:
+ %%
+ %% $rvi_file(FileName,Default) - File content
+ %% When an $rvi_file() token is encountered, the first line of
+ %% the referenced file is read. The line (without the newline)
+ %% replaces the token.
+ %%
+ %% Example:
+ %% { node_service_prefix, "jlr.com/vin/$rvi_file(/etc/vin,default_vin)"},
+ %%
+ %% will be substituted with the first line from the file
+ %% /etc/vin:
+ %%
+ %% { node_service_prefix, "jlr.com/vin/2GKEG25HXP4093669"},
+ %%
+ %% If /etc/vin cannot be opened, the value default_vin
+ %% will be used instead.
+ %%
+ %%
+ %% $rvi_env(EnvironemtnName,Default) - Environment variable
+ %% When an $rvi_env() token is encountered, the value of
+ %% the Linux process environment variable (such as $HOME) is read
+ %% to replace the token.
+ %%
+ %% Example:
+ %% { node_service_prefix, "jlr.com/vin/$rvi_env(VIN,default_vin)"},
+ %%
+ %% will be substituted with the value of the $VIN environment
+ %% variable:
+ %%
+ %% { node_service_prefix, "jlr.com/vin/2GKEG25HXP4093669"},
+ %%
+ %% If VIN is not a defined environment variable, the value
+ %% default_vin will be used instead.
+ %%
+ %%
+ %% $rvi_uuid(Default) - Unique machine identifier
+ %% When an $rvi_uuid() token is encountered, the UUID of the root
+ %% disk used by the system is read to replace the token.
+ %% The UUID of the root disk is retrieved by opening /proc/cmdline
+ %% and extracting the root=UUID=[DiskUUID] value.
+ %% This value is generated at system install time and is reasonably
+ %% world wide unique.
+ %%
+ %% Example:
+ %% { node_service_prefix, "jlr.com/vin/$uuid(default_vin)"},
+ %%
+ %% will be substituted with the value of the root disk UUID:
+ %%
+ %% { node_service_prefix,
+ %% "jlr.com/vin/afc0a6d8-0264-4f8a-bb3e-51ff8655b51c"},
+ %%
+ %% If the root UUID cannot be retrieved, the value default_vin
+ %% will be used instead.
+ %%
+
+ {rvi_core,
+ [
+ %% Specify the node address that data_link uses to listen to
+ %% incoming traffic from other rvi nodes.
+ %%
+ %% This is the address that is announced to
+ %% other rvi nodes during service discovery and should be
+ %% forwarded through firewalls and port forwarding to to the port
+ %% specified by the configuration entry rvi -> components ->
+ %% data_link ->json_rpc_server (see below).
+ %%
+ %% If this node is sitting behind a firewall and cannot
+ %% receive incomign connections on any address, its
+ %% node_address should be set to "0.0.0.0:0" to inform
+ %% the remote node that it should not attempt to
+ %% connect back to self.
+ { node_address, MyNodeAddr },
+
+ %% Specify the prefix of all services that this rvi node is hosting.
+ %%
+ %% All local services regsitering with service edge will be prefixed with
+ %% the string below when they are announced to remote rvi nodes
+ %% that connect to this node (using the address specified
+ %% by node_address above).
+ %%
+ %% If a locally connected service registers itself as
+ %% "hvac/fan_speed", and the node_service_prefix is
+ %% "jlr.com/vin/1234/", this node will announce the service
+ %% "jlr.com/vin/1234/hvac/fan_speed" as being available
+ %% to remotely connected rvi nodes.
+ %%
+ %% Two rvi nodes should never have the same node_service_prefix
+ %% value unless all services add a system-wide unique name
+ %% to it.
+ %%
+ { node_service_prefix, "jlr.com/vin/$rvi_uuid(default_vin)/"},
+
+
+ %% Routing rules determine how to get a message targeting a specific
+ %% service to its destination.
+ %%
+ %% Please note that if a remotely initiated (== client) data link is
+ %% available and has announced that the targeted service is available,
+ %% that data link will be used regardless of what it is.
+ %%
+ %% In other words, if you setup routing rules for how to reach out
+ %% to a vehicle using SMS, and that vehicle happens to have a 3G
+ %% connection up when the message is sent, the 3G connection will be used.
+ %%
+ %% We will add a blacklist feature in the future to optionally block
+ %% such opportunistic routing in the future.
+ %%
+ { routing_rules,
+ [
+ %% Service name prefix that rules are specified for
+ %% The service prefix with the longest match against the service targeted
+ %% by the message will be used.
+ %%
+ %% Example: Targeted service = jlr.com/backend/sota/get_updates
+ %%
+ %% Prefix1: { "jlr.com/backend", [...]}
+ %% Prefix2: { "jlr.com/backend/sota", [...]}
+ %%
+ %% Prefix2 will be used.
+ %%
+ %% This allows you, for example, to setup different servers
+ %% for different types of services (SOTA, remote door unlock,
+ %% HVAC etc).
+ %%
+
+ %% Make sure to have a default if you don't want your message
+ %% to error out immediately. With a default the message will
+ %% be queued until it times out, waiting for a remote node
+ %% to connect and announce that it can handle the targeted service.
+ { "",
+ [
+ { proto_json_rpc, dlink_tcp_rpc}
+ ]
+ },
+
+ { "jlr.com/backend/",
+ %% Which protocol and data link pair to use when transmitting the message
+ %% to the targeted service. If a pair reports a failure, the next pair is tried.
+ [
+ { proto_json_rpc, { dlink_tcp_rpc,
+ % {"38.129.64.13", 8807}
+ [ { target, IPPort(BackendIP, BackendPort) } ]}}
+ ]
+ },
+
+ %% Used to communicate with vehicles
+ { "jlr.com/vin/",
+ [
+ { proto_json_rpc, { dlink_tcp_rpc, [ broadcast, { interface, "wlan0" } ] } },
+ { proto_json_rpc, { server_3g, [ initiate_outbound ]} },
+
+ %% Protocols can have hinting as well.
+ %% In this case JSON-RPC should only be used if the
+ %% resulting message size can fit in an SMS (140 bytes).
+
+ { { proto_json_rpc, [ { max_msg_size, 140 } ] } , server_sms }
+ ]
+ }
+ ]
+ },
+
+ { components,
+ [
+ %% A note about JSON-RPC calls vs gen_server calls:
+ %%
+ %% All locally connected services communicate with Service Edge
+ %% through JSON-RPC.
+ %%
+ %% Communication between the internal RVI components, however,
+ %% can be either JSON-RPC or gen_server calls.
+ %%
+ %% JSON-RPC calls provide compatability with replacement components
+ %% written in languages other than Erlang.
+ %%
+ %% Gen_server calls provide native erlang inter-process calls that
+ %% are about 4x faster than JSON-RPC when transmitting large data volumes.
+ %%
+ %% If one or more of the components below are replaced with external
+ %% components, use JSON-RPC by specifying IP address and port in
+ %% json_rpc_address for all interfaced by the external components.
+ %%
+ %% If you are running an all-native erlang system, use gen_server calls
+ %% by specifying gen_server for all components
+ %%
+ %% Please note that communication between two RVI nodes are
+ %% not affected by this since dlink_tcp will use
+ %% JSON-RPC to communicate ( using the address/port specified
+ %% by proto_json_rpc).
+ %%
+
+ {rvi_common,
+ [
+ {rvi_log, gen_server,
+ [{json_rpc_address, MyPort+9}]
+ }
+ ]},
+ %% Service_edge.
+ %% The service_edge tuple is a top level configuration
+ %% container for everything about service edge.
+ %% In theory, we can support multiple different service edge
+ %% components (written in different languages).
+ %%
+ %% However, until we've sorted out internal routing, we will
+ %% only support the native service_edge_rpc component,
+ %% accessed either as a gen_server or through JSON-RPC.
+ %%
+ {service_edge,
+ [
+ %% Service_edge_rpc component is used as a gen_server
+ { service_edge_rpc, gen_server,
+ [
+ %% JSON-RPC address will be translated to
+ %% an URL looking like this:
+ %% http://127.0.0.1:8801
+ %%
+ %% This URL is used both for communication with
+ %% locally connected services and for intra-component
+ %% communication in case the access method for
+ %% service_edge_rpc is specified as json_rpc.
+ { json_rpc_address, { MyIP, MyPort+1 } }, % {"127.0.0.1",8801}
+ { msgpack_rpc_address, { MyIP, MyPort + 21 } },
+
+ %% Websocket is used for websocket access, preferably
+ %% through the rvi.js package available for Javascript
+ %% apps in browsers and crosswalk who wants to interface
+ %% RVI.
+ { websocket, [ { port, MyPort+8}]} % 9008
+ ]
+ }
+ ]
+ },
+ { service_discovery,
+ [ { service_discovery_rpc, gen_server,
+ [
+ { json_rpc_address, { MyIP, MyPort+2 }} % {"127.0.0.1",9002}
+ ]
+ }
+ ]
+ },
+ { schedule,
+ [ { schedule_rpc, gen_server,
+ [
+ { json_rpc_address, { MyIP, MyPort+3 }} % {"127.0.0.1",9003}
+ ]
+ }
+ ]
+ },
+ { authorize,
+ [ { authorize_rpc, gen_server,
+ [
+ { json_rpc_address, { MyIP, MyPort+4 } } % {"127.0.0.1",9004}
+ ]
+ }
+ ]
+ },
+ { protocol,
+ [ { proto_json_rpc, gen_server,
+ [
+ { json_rpc_address, { MyIP, MyPort+5 } } % {"127.0.0.1",9005}
+ ]
+ }
+ ]
+ },
+ { data_link,
+ [ { dlink_tcp_rpc, gen_server,
+ [
+ { json_rpc_address, { MyIP, MyPort+6 } }, % 9006
+ %% data link TCP server specifies the port we should
+ %% listen to for incoming connections
+ %% from other rvi nodes.
+ %% A specific NIC address can also be specified
+ %% through the {ip, "192.168.0.1" } tuple.
+ { server_opts, [ { port, MyPort+7 }]},
+ { persistent_connections, [ IPPort(BackendIP, BackendPort) ]}
+ ]
+ },
+ { dlink_tls_rpc, gen_server,
+ [
+ { json_rpc_address, { MyIP, MyPort+11} },
+ { server_opts, [ {port, MyPort+10} ]}
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]}
+ ]}
+].
diff --git a/priv/config/rvi_ubuntu.config b/priv/config/rvi_ubuntu.config
index 57ffd37..9c09cca 100644
--- a/priv/config/rvi_ubuntu.config
+++ b/priv/config/rvi_ubuntu.config
@@ -1,14 +1,12 @@
%% -*- erlang -*-
-%% Copyright (C) 2014, Jaguar Land Rover
+%% Copyright (C) 2014,2015,2016 Jaguar Land Rover
%%
%% This program is licensed under the terms and conditions of the
%% Mozilla Public License, version 2.0. The full text of the
%% Mozilla Public License is at https://www.mozilla.org/MPL/2.0/
%%
-%% Configuration file for the (in-vehicle) IVI used by the hvac_demo
-%%
-%% See ../hvac_demo/README.md for details on the demo.
+%% Configuration file for RVI deployed on Ubuntu systems.
%%
%% See ../CONFIGURE.md for a details on the configuration process
%% itself.
diff --git a/priv/config/rvi_yocto.config b/priv/config/rvi_yocto.config
index 6e7863a..c0cb162 100644
--- a/priv/config/rvi_yocto.config
+++ b/priv/config/rvi_yocto.config
@@ -1,14 +1,13 @@
%% -*- erlang -*-
-%% Copyright (C) 2014, Jaguar Land Rover
+%% Copyright (C) 2014,2015,2016 Jaguar Land Rover
%%
%% This program is licensed under the terms and conditions of the
%% Mozilla Public License, version 2.0. The full text of the
%% Mozilla Public License is at https://www.mozilla.org/MPL/2.0/
%%
-%% Configuration file for the (in-vehicle) IVI used by the hvac_demo
-%%
-%% See ../hvac_demo/README.md for details on the demo.
+%% Configuration file for RVI built and deployed with the
+%% Yocto Project
%%
%% See ../CONFIGURE.md for a details on the configuration process
%% itself.
@@ -23,14 +22,14 @@ Env = fun(V, Def) ->
Str -> Str
end
end.
+IPPort = fun(IP, Port) ->
+ IP ++ ":" ++ integer_to_list(Port)
+ end.
MyPort = Env("RVI_PORT", 9000).
MyIP = Env("RVI_MYIP", "127.0.0.1").
-MyNodeAddr = Env("RVI_MY_NODE_ADDR", "0.0.0.0:0").
+MyNodeAddr = Env("RVI_MY_NODE_ADDR", IPPort(MyIP, MyPort)).
BackendIP = Env("RVI_BACKEND", "38.129.64.31").
BackendPort = Env("RVI_BACKEND_PORT", 8807).
-IPPort = fun(IP, Port) ->
- IP ++ ":" ++ integer_to_list(Port)
- end.
LogLevel = Env("RVI_LOGLEVEL", notice).
[
@@ -112,12 +111,6 @@ LogLevel = Env("RVI_LOGLEVEL", notice).
{rvi_core,
[
-
- {key_pair, {openssl_pem, "rvi_core/priv/sample_keys/insecure_device_bkey_priv.pem"}},
- {provisioning_key, "rvi_core/priv/sample_keys/insecure_root_key_pub.pem"},
- {authorize_jwt, "rvi_core/priv/sample_keys/insecure_device_key_pub_sign.jwt"},
- {cert_dir, "rvi_core/priv/sample_certs"},
-
%% Specify the node address that data_link uses to listen to
%% incoming traffic from other rvi nodes.
%%
@@ -281,6 +274,7 @@ LogLevel = Env("RVI_LOGLEVEL", notice).
%% communication in case the access method for
%% service_edge_rpc is specified as json_rpc.
{ json_rpc_address, { MyIP, MyPort+1 } }, % {"127.0.0.1",8801}
+ { msgpack_rpc_address, { MyIP, MyPort + 21 } },
%% Websocket is used for websocket access, preferably
%% through the rvi.js package available for Javascript