#!/usr/bin/env bash
set -e
RED = '\033[0;31m'
GREEN = '\033[0;32m'
BOLD = '\033[1m'
NC = '\033[0m'
if [ -z " $OPENPILOT_ROOT " ] ; then
# default to current directory for installation
OPENPILOT_ROOT = " $( pwd ) /openpilot "
fi
function show_motd( ) {
cat << 'EOF'
.~ssos+.
+8888888888i,
{ 888888888888o.
h8888888888888k
t888888888s888k
` t88888d/ h88k
` ` ` h88l
,88k`
.d8h`
+d8h
_+d8h`
; y8h+`
| -`
openpilot installer
EOF
}
function sentry_send_event( ) {
SENTRY_KEY = dd0cba62ba0ac07ff9f388f8f1e6a7f4
SENTRY_URL = https://sentry.io/api/4507726145781760/store/
EVENT = $1
EVENT_TYPE = ${ 2 :- $EVENT }
EVENT_LOG = ${ 3 :- "NA" }
PLATFORM = $( uname -s)
ARCH = $( uname -m)
SYSTEM = $( uname -a)
if [ [ $PLATFORM = = "Darwin" ] ] ; then
OS = "macos"
elif [ [ $PLATFORM = = "Linux" ] ] ; then
OS = "linux"
fi
if [ [ $ARCH = = armv8* ] ] || [ [ $ARCH = = arm64* ] ] || [ [ $ARCH = = aarch64* ] ] ; then
ARCH = "aarch64"
elif [ [ $ARCH = = "x86_64" ] ] || [ [ $ARCH = = i686* ] ] ; then
ARCH = "x86"
fi
PYTHON_VERSION = $( echo $( python3 --version 2> /dev/null || echo "NA" ) )
BRANCH = $( echo $( git -C $OPENPILOT_ROOT rev-parse --abbrev-ref HEAD 2> /dev/null || echo "NA" ) )
COMMIT = $( echo $( git -C $OPENPILOT_ROOT rev-parse HEAD 2> /dev/null || echo "NA" ) )
curl -s -o /dev/null -X POST -g --data " { \"exception\": { \"values\": [{ \"type\": \" $EVENT \" }] }, \"tags\" : { \"event_type\" : \" $EVENT_TYPE \", \"event_log\" : \" $EVENT_LOG \", \"os\" : \" $OS \", \"arch\" : \" $ARCH \", \"python_version\" : \" $PYTHON_VERSION \" , \"git_branch\" : \" $BRANCH \", \"git_commit\" : \" $COMMIT \", \"system\" : \" $SYSTEM \" } } " \
-H 'Content-Type: application/json' \
-H " X-Sentry-Auth: Sentry sentry_version=7, sentry_key= $SENTRY_KEY , sentry_client=op_setup/0.1 " \
$SENTRY_URL 2> /dev/null
}
function check_stdin( ) {
if [ -t 0 ] ; then
INTERACTIVE = 1
else
echo "Checking for valid invocation..."
echo -e " ↳ [ ${ RED } ✗ ${ NC } ] stdin not found! Running in non-interactive mode. "
echo -e " Run ${ BOLD } 'bash <(curl -fsSL openpilot.comma.ai)' ${ NC } to run in interactive mode.\n "
fi
}
function ask_dir( ) {
echo -n " Enter directory in which to install openpilot (default $OPENPILOT_ROOT ): "
if [ [ -z $INTERACTIVE ] ] ; then
echo -e "\nBecause your are running in non-interactive mode, the installation"
echo -e " will default to $OPENPILOT_ROOT \n "
return 0
fi
read
if [ [ ! -z " $REPLY " ] ] ; then
mkdir -p $REPLY
OPENPILOT_ROOT = " $( realpath $REPLY ) /openpilot "
fi
}
function check_dir( ) {
echo "Checking for installation directory..."
if [ -d " $OPENPILOT_ROOT " ] ; then
echo -e " ↳ [ ${ RED } ✗ ${ NC } ] Installation destination $OPENPILOT_ROOT already exists! "
# not a valid clone, can't continue
if [ [ ! -z " $( ls -A $OPENPILOT_ROOT ) " && ! -f " $OPENPILOT_ROOT /launch_openpilot.sh " ] ] ; then
echo -e " $OPENPILOT_ROOT already contains files but does not seems "
echo -e " to be a valid openpilot git clone. Choose another location for"
echo -e " installing openpilot!\n"
return 1
fi
# already a "valid" openpilot clone, skip cloning again
if [ [ ! -z " $( ls -A $OPENPILOT_ROOT ) " ] ] ; then
SKIP_GIT_CLONE = 1
fi
# by default, don't try installing in already existing directory
if [ [ -z $INTERACTIVE ] ] ; then
return 0
fi
read -p " Would you like to attempt installation anyway? [Y/n] " -n 1 -r
echo -e "\n"
if [ [ ! $REPLY = ~ ^[ Yy] $ ] ] ; then
return 1
fi
return 0
fi
echo -e " ↳ [ ${ GREEN } ✔ ${ NC } ] Successfully chosen $OPENPILOT_ROOT as installation directory\n "
}
function check_git( ) {
echo "Checking for git..."
if ! command -v "git" > /dev/null 2>& 1; then
echo -e " ↳ [ ${ RED } ✗ ${ NC } ] git not found on your system, can't continue! "
sentry_send_event "SETUP_FAILURE" "ERROR_GIT_NOT_FOUND"
return 1
else
echo -e " ↳ [ ${ GREEN } ✔ ${ NC } ] git found.\n "
fi
}
function git_clone( ) {
st = " $( date +%s) "
echo "Cloning openpilot..."
if $( git clone --filter= blob:none https://github.com/commaai/openpilot.git " $OPENPILOT_ROOT " ) ; then
if [ [ -f $OPENPILOT_ROOT /launch_openpilot.sh ] ] ; then
et = " $( date +%s) "
echo -e " ↳ [ ${ GREEN } ✔ ${ NC } ] Successfully cloned openpilot in $(( et - st)) seconds.\n "
return 0
fi
fi
echo -e " ↳ [ ${ RED } ✗ ${ NC } ] failed to clone openpilot! "
sentry_send_event "SETUP_FAILURE" "ERROR_GIT_CLONE"
return 1
}
function install_with_op( ) {
cd $OPENPILOT_ROOT
$OPENPILOT_ROOT /tools/op.sh install
LOG_FILE = $( mktemp)
if ! $OPENPILOT_ROOT /tools/op.sh --log $LOG_FILE setup; then
echo -e " \n[ ${ RED } ✗ ${ NC } ] failed to install openpilot! "
ERROR_TYPE = " $( cat " $LOG_FILE " | sed '1p;d' ) "
ERROR_LOG = " $( cat " $LOG_FILE " | sed '2p;d' ) "
sentry_send_event "SETUP_FAILURE" " $ERROR_TYPE " " $ERROR_LOG " || true
return 1
else
sentry_send_event "SETUP_SUCCESS" || true
fi
echo -e "\n----------------------------------------------------------------------"
echo -e " [ ${ GREEN } ✔ ${ NC } ] openpilot was successfully installed into ${ BOLD } $OPENPILOT_ROOT ${ NC } "
echo -e "Checkout the docs at https://docs.comma.ai"
echo -e "Checkout how to contribute at https://github.com/commaai/openpilot/blob/master/docs/CONTRIBUTING.md"
}
show_motd
check_stdin
ask_dir
check_dir
check_git
[ -z $SKIP_GIT_CLONE ] && git_clone
install_with_op