#!/bin/sh

#################################################################################
#
#   Lynis
# ------------------
#
# Copyright 2007-2013, Michael Boelen
# Copyright 2013-2016, CISOfy
#
# Website  : https://cisofy.com
# Blog     : http://linux-audit.com
# GitHub   : https://github.com/CISOfy/lynis
#
# Lynis comes with ABSOLUTELY NO WARRANTY. This is free software, and you are
# welcome to redistribute it under the terms of the GNU General Public License.
# See LICENSE file for usage of this software.
#
#################################################################################
#
# Data upload
#
#################################################################################
#
#    LogTextbreak
PROGRAM_VERSION="101"

    # Data upload destination
    if [ "${UPLOAD_SERVER}" = "" ]; then UPLOAD_SERVER="portal.cisofy.com"; fi
    UPLOAD_URL="https://${UPLOAD_SERVER}/upload/"
    LogText "Upload server: ${UPLOAD_SERVER}"
    LogText "URL to upload to: ${UPLOAD_URL}"

    # License server (set to upload server if not configured)
    if [ "${LICENSE_SERVER}" = "" ]; then LICENSE_SERVER="${UPLOAD_SERVER}"; fi
    LICENSE_SERVER_URL="https://${LICENSE_SERVER}/license/"
    LogText "License server: ${LICENSE_SERVER}"

# Additional options to curl
if [ "${UPLOAD_OPTIONS}" = "" ]; then
    CURL_OPTIONS=""
  else
    CURL_OPTIONS=" ${UPLOAD_OPTIONS}"
fi
SETTINGS_FILE="${PROFILE}"

# Only output text to stdout if DEBUG mode is not used
output()
  {
    if [ ${DEBUG} -eq 1 ]; then echo "$1"; fi
  }

#####################################################################################
#
# SYSTEM CHECKS
#
#####################################################################################

output "Lynis Enterprise data uploader starting"
output "Settings file: ${SETTINGS_FILE}"

    # Check if we can find curl
    # Suggestion: If you want to keep the system hardened, copying the binary from a trusted source is a good alternative.
    #             Restrict access to this binary to the user who is running this script.
    if [ "${CURLBINARY}" = "" ]; then
        echo "Fatal: can't find curl binary. Please install the related package or put the binary in the PATH. Quitting.."
        LogText "Error: Could not find cURL binary"
        exit 1
    fi

    # Extra the license key from the settings file
    if [ "${LICENSE_KEY}" = "" ]; then
        echo "Fatal: no license key found. Quitting.."
        LogText "Error: no license key was specified in the profile (${PROFILE})"
        ExitFatal
      else
        output "License key = ${LICENSE_KEY}"
    fi


#####################################################################################
#
# JOB CONTROL
#
#####################################################################################

    # Check report file
    if [ -f ${REPORTFILE} ]; then
        output "${WHITE}Report file found.${NORMAL} Starting with connectivity check.."

            if [ ! "${UPLOAD_PROXY_SERVER}" = "" ]; then
                LogText "Upload: Proxy is configured: ${UPLOAD_SERVER}"
                if [ ! "${UPLOAD_PROXY_PORT}" = "" ]; then
                    LogText "Upload: Proxy port number is ${UPLOAD_PROXY_PORT}"
                    UPLOAD_PROXY_PORT=":${UPLOAD_PROXY_PORT}"
                fi
                LogText "Upload: Proxy protocol is ${UPLOAD_PROXY_PROTOCOL}"
                case ${UPLOAD_PROXY_PROTOCOL} in
                    "http")
                        UPLOAD_PROXY="http://${UPLOAD_PROXY_SERVER}${UPLOAD_PROXY_PORT}"
                        CURL_OPTIONS="${CURL_OPTIONS} --proxy ${UPLOAD_PROXY}"
                    ;;
                    "https")
                        UPLOAD_PROXY="https://${UPLOAD_PROXY_SERVER}${UPLOAD_PROXY_PORT}"
                        CURL_OPTIONS="${CURL_OPTIONS} --proxy ${UPLOAD_PROXY}"
                    ;;
                    "socks5")
                        UPLOAD_PROXY="${UPLOAD_PROXY_SERVER}${UPLOAD_PROXY_PORT}"
                        CURL_OPTIONS="${CURL_OPTIONS} --socks5 ${UPLOAD_PROXY}"
                    ;;
                    *)
                        echo "Unknown protocol. Please report to lynis-dev@cisofy.com"
                        ExitFatal
                    ;;
                esac
            fi

        # Quit if license is not valid, to reduce load on both client and server.
        LogText "Command used: ${CURLBINARY}${CURL_OPTIONS} -s -S --data-urlencode "licensekey=${LICENSE_KEY}" --data-urlencode "collector_version=${PROGRAM_VERSION}" ${LICENSE_SERVER_URL} 2> /dev/null"
        UPLOAD=`${CURLBINARY}${CURL_OPTIONS} -s -S --data-urlencode "licensekey=${LICENSE_KEY}" --data-urlencode "collector_version=${PROGRAM_VERSION}" ${LICENSE_SERVER_URL} 2> /dev/null`
        EXITCODE=$?
        if [ ${EXITCODE} -gt 0 ]; then
            LogText "Exit code: ${EXITCODE}"
            if [ ${EXITCODE} -eq 7 ]; then
                LogText "Result: could not contact license server."
                LogText "Details: used URL ${LICENSE_SERVER_URL}"
                LogText "Suggestion: check if the upload host is correctly configured."
                echo "${RED}Error${NORMAL}: license server not available. See ${LOGFILE} for details."
            elif [ ${EXITCODE} -eq 60 ]; then
                echo "${RED}Self-signed certificate used on Lynis Enterprise node${NORMAL}"
                echo "If you want to accept a self-signed certificate, use the -k option in the profile."
                echo "Example: ${WHITE}config:upload_options:-k:${NORMAL}"
                LogText "Result: found self-signed certificate, however cURL -k option not used."
              else
                echo "${RED}Upload Error: ${NORMAL}cURL exited with code ${EXITCODE}. See ${LOGFILE} for details."
                LogText "Result: cURL exited with code ${EXITCODE}."
            fi
            LogText "Result: quitting, can't check license"
            ExitFatal
        fi
        UPLOAD_CODE=`echo ${UPLOAD} | head -n 1 | awk '{ if ($1=="Response") { print $2 }}'`
        if [ "${UPLOAD_CODE}" = "100" ]; then
            output "${WHITE}License is valid${NORMAL}"
            LogText "Result: license is valid"
          else
            LogText "Result: error while checking license"
            LogText "Output: ${UPLOAD_CODE}"
            echo "${RED}Fatal error: ${WHITE}Error while checking the license.${NORMAL}"
            echo ""
            echo "Possible causes and steps you can take:"
            echo "- Connection with license server could not be established (try address in your web browser)"
            echo "- Incorrect server has been configured in profile"
            echo "- License is expired (listed in Configuration screen) or No credits left (listed in Configuration screen)"
            echo "- Collector version of Lynis version outdated (upgrade to latest version of Lynis and/or Lynis Collector)"
            echo ""
            echo "If you need support in solving this, please contact support@cisofy.com and include this screen output."
            echo ""
            echo "URL: ${LICENSE_SERVER_URL}"
            echo "Key: ${LICENSE_KEY}"
            output "Debug information: ${UPLOAD}"
            # Quit
            ExitFatal
        fi
        # Extract the hostid from the parse file
        HOSTID=`awk -F= '/^hostid=/ { print $2 }' ${REPORTFILE}`
        if [ ! "${HOSTID}" = "" ]; then
            output "${WHITE}Found hostid: ${HOSTID}${NORMAL}"
            # Try to connect
            output "Uploading data.."
            # Add a space
            CURL_OPTIONS=" ${CURL_OPTIONS}"
            # Currently compressed uploads are not supported yet on central node. Therefore default value is set to 0.
            if [ ${COMPRESSED_UPLOADS} -eq 1 ]; then
                CURL_OPTIONS="${CURL_OPTIONS} --compressed -H 'Content-Encoding: gzip'"
            fi
            if [ ! "${UPLOAD_PROXY_SERVER}" = "" ]; then
                LogText "Upload: Proxy is configured: ${UPLOAD_SERVER}"
                if [ ! "${UPLOAD_PROXY_PORT}" = "" ]; then
                    LogText "Upload: Proxy port number is ${UPLOAD_PROXY_PORT}"
                    UPLOAD_PROXY_PORT=":${UPLOAD_PROXY_PORT}"
                fi
                LogText "Upload: Proxy protocol is ${UPLOAD_PROXY_PROTOCOL}"
                case ${UPLOAD_PROXY_PROTOCOL} in
                    "http")
                        UPLOAD_PROXY="http://${UPLOAD_PROXY_SERVER}${UPLOAD_PROXY_PORT}"
                        CURL_OPTIONS="${CURL_OPTIONS} --proxy ${UPLOAD_PROXY}"
                    ;;
                    "https")
                        UPLOAD_PROXY="https://${UPLOAD_PROXY_SERVER}${UPLOAD_PROXY_PORT}"
                        CURL_OPTIONS="${CURL_OPTIONS} --proxy ${UPLOAD_PROXY}"
                    ;;
                    "socks5")
                        UPLOAD_PROXY="${UPLOAD_PROXY_SERVER}${UPLOAD_PROXY_PORT}"
                        CURL_OPTIONS="${CURL_OPTIONS} --socks5 ${UPLOAD_PROXY}"
                    ;;
                    *)
                        echo "Unknown protocol. Please report to lynis-dev@cisofy.com"
                        ExitFatal
                    ;;
                esac
            fi
            LogText "Command used: ${CURLBINARY}${CURL_OPTIONS} -s -S --data-urlencode \"data@${REPORTFILE}\" --data-urlencode \"licensekey=${LICENSE_KEY}\" --data-urlencode \"hostid=${HOSTID}\" ${UPLOAD_URL}"
            UPLOAD=`${CURLBINARY}${CURL_OPTIONS} -s -S --data-urlencode "data@${REPORTFILE}" --data-urlencode "licensekey=${LICENSE_KEY}" --data-urlencode "hostid=${HOSTID}" ${UPLOAD_URL} 2> /dev/null`
            EXITCODE=$?
            if [ ${EXITCODE} -gt 0 ]; then
                echo ""
                echo "${RED}Upload Error${NORMAL}: cURL could not upload data. See ${LOGFILE} for details."
                echo "Suggested command: tail -n 20 ${LOGFILE}"
                echo ""
                case ${EXITCODE} in
                    5) echo "${YELLOW}Error (5): ${NORMAL}Could not resolve the hostname of the proxy." ;;
                    6) echo "${YELLOW}Error (6): ${NORMAL}Could not resolve the hostname of central server." ;;
                    7) echo "${YELLOW}Error (7): ${NORMAL}Could not connect to central server or proxy server." ;;
                    59) echo "${YELLOW}Error (59): ${NORMAL}Could not connect because of used SSL cipher." ;;
                    83) echo "${YELLOW}Error (83): ${NORMAL}Could not check used certificate of server." ;;
                    *) echo "Related exit code: ${YELLOW}{EXITCODE}${NORMAL}. See man page of cURL for the meaning of this code." ;;
                esac
                if [ ! "${UPLOAD}" = "" ]; then echo ""; echo "Debug:"; echo ${UPLOAD}; fi
                echo ""
                # Quit
                ExitClean
            fi
          else
            echo "${RED}Error${NORMAL}: No hostid found in report file. Can not upload report file."
            # Quit
            ExitFatal
        fi
      else
         output "${YELLOW}No report file found to upload.${NORMAL}"
         ExitFatal
    fi

#
#================================================================================
# Lynis - Security Auditing and System Hardening for Linux and UNIX - https://cisofy.com
