pre_install () { BACKUP_DIR=/etc/forticlient/.old FCT_CONFIG=/etc/forticlient/config.xml EC_CONFIG=/opt/forticlient/XMLs/ecdata.xml # Backup old XML configurations if they exist so they can # be imported on start up if upgrading from an older FCT version if [ -f $FCT_CONFIG ] || [ -f $EC_CONFIG ]; then mkdir $BACKUP_DIR && chmod 0600 $BACKUP_DIR else exit 0 fi if [ -d $BACKUP_DIR ] && [ $(stat -c "%a" $BACKUP_DIR) -eq 600 ] && [ -f $FCT_CONFIG ]; then cp $FCT_CONFIG $BACKUP_DIR fi if [ -d $BACKUP_DIR ] && [ $(stat -c "%a" $BACKUP_DIR) -eq 600 ] && [ -f $EC_CONFIG ]; then cp $EC_CONFIG $BACKUP_DIR fi exit 0 } pre_upgrade () { pre_install # Check if forticlient is registered to EMS if it's an uninstall if [ -f /opt/forticlient/.fct_ec_registered ] && [ "$action" != "upgrade" ]; then echo "=============================================================" echo "Error: Unable to uninstall forticlient while connected to EMS" echo "=============================================================" exit 1 fi # Remove old symlink when upgrading from older versions if [ -f /usr/bin/FortiClient ]; then pkill -f /usr/bin/FortiClient rm -rf /usr/bin/FortiClient fi # Remove old symlink to FortiClient scheduler if [ -f /lib/systemd/system/forticlient-scheduler.service ]; then rm -rf /lib/systemd/system/forticlient-scheduler.service || true fi if [ -f /usr/lib/systemd/system/forticlient-scheduler.service ]; then rm -rf /usr/lib/systemd/system/forticlient-scheduler.service || true fi } post_install() { # Remove older version directories and files when upgrading if [ -d /usr/bin/forticlient ]; then pkill -f /usr/bin/forticlient rm -rf /usr/bin/forticlient fi # Remove old configuration files when upgrading from older versions if [ -f /etc/forticlient/config.xml ]; then rm -rf /etc/forticlient/config.xml fi if [ -f /etc/forticlient/config_backup.xml ]; then rm -rf /etc/forticlient/config_backup.xml fi # Remove old pid lock if [ -f /tmp/.forticlient/fortivpn.pid ]; then rm -rf /tmp/.forticlient/fortivpn.pid fi if [ -f /opt/forticlient/Fortitray.desktop ]; then ln -sf /opt/forticlient/Fortitray.desktop /etc/xdg/autostart/Fortitray.desktop fi if [ -f /opt/forticlient/Fortivpn.desktop ]; then ln -sf /opt/forticlient/Fortivpn.desktop /etc/xdg/autostart/Fortivpn.desktop fi # Restore permissions to all files if [ -f /opt/forticlient/.repackaged ] && [ -f /opt/forticlient/.acl ]; then ( cd / setfacl --restore /opt/forticlient/.acl ) fi if [ -f /etc/forticlient/servers.conf ]; then chmod 600 /etc/forticlient/servers.conf fi # Keep old database when upgrading from older versions if [ ! -d /var/lib/forticlient ] || [ ! -O /var/lib/forticlient ]; then rm -rf /var/lib/forticlient mkdir -m 755 /var/lib/forticlient fi if [ -f /etc/forticlient/config.db ]; then if [ -O /etc/forticlient/config.db ]; then mv /etc/forticlient/config.db /var/lib/forticlient/config.db else # Old database cannot be trusted and should be replaced # So ems connection info is lost and fct has to register to ems again rm -f /etc/forticlient/config.db /opt/forticlient/.fct_ec_registered fi fi if [ ! -f /var/lib/forticlient/config.db ]; then cp /opt/forticlient/.config.db.init /var/lib/forticlient/config.db fi chmod 600 /var/lib/forticlient/config.db # Create CLI symlink to launch from terminal if [ -f /opt/forticlient/forticlient-cli ]; then ln -sf /opt/forticlient/forticlient-cli /usr/bin/forticlient fi # Launch fortitray if [ -f /opt/forticlient/fortitraylauncher ]; then if [ ! -z "$(logname 2>/dev/null)" ]; then user="$(logname 2>/dev/null)" elif [ ! -z "$SUDO_USER" ]; then user="$SUDO_USER" else user=$(users 2>/dev/null | cut -d ' ' -f1) fi GUI_ENV= # Attempt to get the GUI environment variables so fortitray will actually display correctly for p in $(pgrep -u "$user" dbus-daemon); do if [ -z "$(xargs -0 -L1 -a /proc/$p/cmdline | grep '^--config-file=')" ]; then continue fi OIFS="$IFS" IFS=$'\n' for e in $(xargs -0 -L1 -a /proc/$p/environ); do IFS== read -r left right <<< "$e" GUI_ENV="$GUI_ENV $left=\"$right\"" done IFS="$OIFS" break done FORTITRAY_CMD="env -i $GUI_ENV setsid /opt/forticlient/fortitraylauncher &>/dev/null &" # Start fortitraylauncher while forwarding environment variables needed by Fortitray su $user -c "$FORTITRAY_CMD" fi # Update icons cache so icon will show correctly if [ -f /usr/share/icons/hicolor/48x48/apps/forticlient.png ]; then gtk-update-icon-cache -f /usr/share/icons/hicolor || true fi # Setup forticlient protocol handler if [ -f /usr/share/applications/forticlient-register.desktop ]; then update-desktop-database fi # Stop reload daemons if [ -d /run/systemd/system ]; then systemctl --system daemon-reload > /dev/null || true fi } post_upgrade() { post_install cat << EOF ==> After upgrade, to restore your configuration, copy /etc/forticlient/.old/* to /etc/forticlient/ EOF } pre_remove() { # Stop fortitray if [ -f /tmp/.forticlient/fortitraylauncher ]; then echo "terminate" > /tmp/.forticlient/fortitraylauncher || true fi # Remove ZTNA browser certificates if [ -f /usr/bin/certutil ]; then find /home /root -regextype posix-extended \ -regex '(/home/[^/]*|/root)/(.pki/nssdb|.mozilla/firefox/[^/]*default(-release)?)' \ -maxdepth 5 -print0 2>/dev/null | while IFS= read -r -d $'\0' p; do RUN_USER=$(stat -c '%U' "$p") if [ $? -ne 0 ]; then continue fi su - "$RUN_USER" -c '/usr/bin/certutil -D -n "FortiClient ZTNA" -d sql:'"$p"' 2>/dev/null || true' su - "$RUN_USER" -c '/usr/bin/modutil -delete "FortiClient ZTNA" -dbdir sql:'"$p"' -force 2>/dev/null || true' done fi # Remove token from tpm2 database if [ -f /opt/forticlient/tpm2/tpm2_ptool/exe.linux-x86_64-3.7/tpm2_ptool ] && \ [ -d /opt/forticlient/tpm2/bin/ ]; then PATH="/opt/forticlient/tpm2/bin:$PATH" \ /opt/forticlient/tpm2/tpm2_ptool/exe.linux-x86_64-3.7/tpm2_ptool rmtoken \ --label fct-ztna-token --path /opt/forticlient/ fi # Stop forticlient service if [ -d /run/systemd/system ]; then systemctl stop forticlient.service fi pkill -f /opt/forticlient exit 0 } post_remove() { # Stop reload daemons if [ -d /run/systemd/system ]; then systemctl --system daemon-reload > /dev/null || true fi # Remove shared memory rm -rf /var/run/fctc.s || true # Remove Fortitray.desktop symlink rm -rf /etc/xdg/autostart/Fortitray.desktop || true # Remove fortitraylauncher fifo rm -rf /tmp/.forticlient/fortitraylauncher || true # Remove GUI symlink rm -rf /usr/bin/forticlient || true # Remove fortivpn symlink rm -rf /usr/bin/forticlient || true # Remove FortiClient service rm -rf /lib/systemd/system/forticlient.service || true # Remove FortiClient binaries rm -rf /opt/forticlient || true # Remove fortitray policy rm -rf /usr/share/polkit-1/actions/org.fortinet.fortitray.policy || true # Remove forticlient policy rm -rf /usr/share/polkit-1/actions/org.fortinet.forticlient.policy || true exit 0 }