diff options
-rw-r--r-- | rvi_ubuntu.config | 366 | ||||
-rwxr-xr-x | scripts/rvi.sh | 192 |
2 files changed, 0 insertions, 558 deletions
diff --git a/rvi_ubuntu.config b/rvi_ubuntu.config deleted file mode 100644 index e54ca63..0000000 --- a/rvi_ubuntu.config +++ /dev/null @@ -1,366 +0,0 @@ -%% -*- erlang -*- - -%% Copyright (C) 2014, 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. -%% -%% See ../CONFIGURE.md for a details on the configuration process -%% itself. -%% -[ - %% All erlang apps needed to fire up a node. Do not touch. - {apps, - [kernel, - stdlib, - sasl, - {setup, load}, - syntax_tools, - lager, - crypto, - public_key, - exo, - compiler, - ssl, - asn1, - %% RVI-specific apps. - - %% Do not touch unless you are replacing apps with your own - %% version. If you are replacing an app with a non-Erlang version, - %% it still has to be loaded in order to resolve. - %% If, for example, you want to deploy your own scheduler - %% outside Erlang, replace - %% - %% schedule, - %% with - %% { schedule, load }, - %% - rvi, - rvi_common, - service_discovery, - service_edge, - authorize, - schedule, - dlink_tcp, - %%{bt,load}, - %%{dlink_bt, load} - proto_bert, - proto_json - ]}, - - %% - %% Custom environment settings - %% for all apps running on the node. - %% - {env, - [ - %% Lager is the main logging mechanism. - %% See https://github.com/basho/lager for details. - %% - {lager, - [ { handlers, - %% Change this to debug, info, notice, warning, or error in - %% order to lower the console chatter. - [ {lager_console_backend, notice} ] - } - ] - }, - - %% 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, - [ - - %% 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 -> bert_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, "127.0.0.1:8807" }, - - %% 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_file(/etc/rvi/device_id,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. - - %% Use JSON-based protocol and data link. Have the data link connect - %% to a given target in order to reach the node hosting - %% "jlr.com/backend" prefixed services. - [ - { proto_json_rpc, { dlink_tcp_rpc, [ { target, "38.129.64.13:8807" } ]}} - ] - }, - - %% Used to communicate with vehicles - { "jlr.com/vin/", - [ - { proto_bert_rpc, { dlink_tcp_rpc, [ broadcast, { interface, "wlan0" } ] } }, - %% server_3g is augmented with hinting, provided to - { bert_rpc, { server_3g, [ initiate_outbound ]} }, - - %% Protocols can have hinting as well. - %% In this case bert_rpc should only be used if the - %% resulting message size can fit in an SMS (140 bytes). - - { { bert_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 data_link_bert_rpc will use - %% BERT-RPC to communicate ( using the address/port specified - %% by bert_rpc_server). - %% - - %% 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, { "127.0.0.1", 8801 } }, - - %% 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, 8808}]} - ] - } - ] - }, - { service_discovery, - [ { service_discovery_rpc, gen_server, - [ - { json_rpc_address, { "127.0.0.1", 8802 }} - ] - } - ] - }, - { schedule, - [ { schedule_rpc, gen_server, - [ - { json_rpc_address, { "127.0.0.1", 8803 }} - ] - } - ] - }, - { authorize, - [ { authorize_rpc, gen_server, - [ - { json_rpc_address, { "127.0.0.1", 8804 } } - ] - } - ] - }, - { protocol, - [ { proto_json_rpc, gen_server, - [ - { json_rpc_address, { "127.0.0.1", 8805 } } - ] - } - ] - }, - { data_link, - [ { dlink_tcp_rpc, gen_server, - [ - { json_rpc_address, { "127.0.0.1", 8806 } }, - %% Bert_rpc 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, 8807 }]}, - - %% Persistent connections are connected to at - %% startup, and will be reconnected to in case they fail - { persistent_connections, [ "38.129.64.13:8807" ]} - ] - } - ] - } - ] - } - ]} - ]} -]. diff --git a/scripts/rvi.sh b/scripts/rvi.sh deleted file mode 100755 index 7b69d8d..0000000 --- a/scripts/rvi.sh +++ /dev/null @@ -1,192 +0,0 @@ -#!/bin/sh -# -# Copyright (C) 2014, Jaguar Land Rover -# -# Mozilla Public License, version 2.0. The full text of the -# Mozilla Public License is at https://www.mozilla.org/MPL/2.0/ -# -# -# Setup a correct configuration and launch an RVI release node. -# If a UUID file has not been created, it will be done at this time. -# Init.d script to start and stop an RVI system installed -# through an RPM. -# - -SELF_DIR=$(dirname $(readlink -f "$0")) - -ERL=${ERL:=erl} - -usage() { - echo "Usage: $0 -d config_dir -c config_file -l log_dir \\" - echo " start|stop|console|attach|ping" - echo - echo " -c config_file Configuration file to launch rvi node with. " - echo " If omitted the rvi_sample.config in the configuration " - echo " directory will be used." - echo - echo " -s short_name Erlang node short name. Defaults to 'rvi_core'" - echo - echo " -C cookie Erlang node cookie to use. Defaults to 'rvi_cookue'" - echo - echo " -d config_dir Directory to put generated uuid 'device_id' file and" - echo " processed config files." - echo " Defauts to the '/etc/opt/rvi'." - echo - echo " -l log_dir The directory to store log files in." - echo " Defaults to '/tmp/rvi/[config]/log' where [config]" - echo " is the base name of the configuration file." - echo - echo " console [defaut] Start an rvi in foreground mode." - echo - echo " start Start an rvi node with the given configuration file." - echo - echo " stop Stop an rvi node previously started with 'start'." - echo - echo " attach Attach to an rvi node previously started with 'start'." - echo - echo " ping Ping to check if an rvi node is up. Returns 0 if up." - exit 1 -} - -CONFIG_FILE="" - -SNAME=rvi_core -COOKIE=rvi_cookie -unset CONFIG_DIR -unset LOG_DIR -while getopts "c:d:l:s:C:" o; do - case "${o}" in - s) - SNAME=${OPTARG} - ;; - c) - CONFIG_FILE=${OPTARG} - ;; - C) - COOKIE=${OPTARG} - ;; - d) - CONFIG_DIR=${OPTARG} - ;; - l) - LOG_DIR=${OPTARG} - ;; - *) - usage - ;; - esac -done - -CONFIG_DIR=${CONFIG_DIR:=/etc/opt/rvi} - -shift $((${OPTIND}-1)) - -if [ "${#}" = "0" ] -then - CMD="console" -else - CMD=$1 -fi - -if [ "${CMD}" != "start" -a "${CMD}" != "attach" -a "${CMD}" != "stop" -a "${CMD}" != "console" -a "${CMD}" != "ping" ] -then - usage -fi - -export ERL_LIBS=${SELF_DIR}/rvi_core:${SELF_DIR}/rvi_core/deps:${SELF_DIR}/rvi_core/components - -# Convert config dir to abs path -if [ $(echo ${CONFIG_DIR} | cut -c 1,1) != "/" ] -then - CONFIG_DIR=${PWD}/${CONFIG_DIR} -fi - -# Check that we have a config dir -if [ ! -d ${CONFIG_DIR} ] -then - install -d --mode=0755 ${CONFIG_DIR} -fi - -# Check if we have a uuid file. -if [ ! -f ${CONFIG_DIR}/device_id ] -then - echo "Creating device ID in ${CONFIG_DIR}/device_id" - cat /proc/sys/kernel/random/uuid > ${CONFIG_DIR}/device_id -fi - -# -# See if we need to process a config file -# -if [ ${CMD} = "start" -o ${CMD} = "console" ] -then - # Default to rvi.config - CONFIG_FILE=${CONFIG_FILE:=${CONFIG_DIR}/rvi_sample.config} - # - # Check if we need to prepend current dir - # to relative config file path - # - if [ $(echo ${CONFIG_FILE} | cut -c 1,1) != "/" ] - then - CONFIG_FILE=${PWD}/${CONFIG_FILE} - fi - - # Check that config file can be read. - if [ ! -r "${CONFIG_FILE}" ] - then - echo "${CONFIG_FILE} cannot be opened for reading." - usage - fi - # - # Generate a config file that will end up as - # /tmp/rvi/sys.config - # - ( - cd ${CONFIG_DIR} - ${SELF_DIR}/scripts/setup_gen rvi ${CONFIG_FILE} rvi - ) - - # Did we succeed with config generation? - if [ "$?" != "0" ] - then - # Nope - echo "Failed to process configuration file." - exit "$?" - fi -fi - -TMP_DIR=/tmp/rvi/$(basename ${CONFIG_FILE} .config) -LOG_DIR=${LOG_DIR:=${TMP_DIR}/rvi/log} - -if [ $(echo ${LOG_DIR} | cut -c 1,1) != "/" ] -then - LOG_DIR=${PWD}/${LOG_DIR} -fi - -LAUNCH="${ERL} +A 128 -boot ${CONFIG_DIR}/rvi/start -sname ${SNAME} -config ${CONFIG_DIR}/rvi/sys -setcookie ${COOKIE}" - -case "${CMD}" in - start) - install -d --mode 0755 ${TMP_DIR} - install -d --mode 0755 ${LOG_DIR} - cd ${SELF_DIR} - exec run_erl -daemon ${TMP_DIR}/ ${LOG_DIR} "exec ${LAUNCH}" - ;; - - console) - cd ${SELF_DIR} - exec ${LAUNCH} - ;; - - stop) - exec ${SELF_DIR}/scripts/nodetool -sname ${SNAME} -setcookie ${COOKIE} stop - ;; - - ping) - exec ${SELF_DIR}/scripts/nodetool -sname ${SNAME} -setcookie ${COOKIE} ping - ;; - - attach) - exec to_erl ${TMP_DIR} - ;; - -esac |