kdump.etc, submit-report.sh: Enhance Steam ID/Account obtaining
Currently we hardcode the account-related VDF file path in kdump, and expose it in "/etc/default/kdump" - this is unnecessary since this path is not expected to change nor users to mess with it; thanks Emil (@xexaxo) for this suggestion. So, this patch improves things in some ways: (a) Do not expose VDF path or Valve's server URL in user configurable file - no reasons for users to mess with that. (b) Generate "/home" mount point based on DEVNODE, also determine the username based on "getent'ing" the passwd database. See CAVEAT below. (c) Move the VDF parsing to a separate function to clean up the submit log path on submit-report.sh . No functional change is expected after this commit. CAVEAT: Notice that "getent passwd" is *VERY* slow, and if we follow a generic approach of doing it for UID_MIN..UID_MAX, it takes quite some time. So, instead we simplify and just query the user 1000; this might be a bit incomplete, but it's still better than hardcoding a username as it's done until now. Signed-off-by: Guilherme G. Piccoli <gpiccoli@igalia.com>
This commit is contained in:
@ -161,8 +161,7 @@
|
|||||||
# => The API details: it works by a first POST request to Valve servers,
|
# => The API details: it works by a first POST request to Valve servers,
|
||||||
# which, when succeed, returns 3 main components in the response. We use
|
# which, when succeed, returns 3 main components in the response. We use
|
||||||
# these values to perform a PUT request with the ZIP compressed file, and
|
# these values to perform a PUT request with the ZIP compressed file, and
|
||||||
# finally a last POST request is necessary to finish the transaction. The
|
# finally a last POST request is necessary to finish the transaction.
|
||||||
# POST requests' URL is present in "/etc/default/kdump".
|
|
||||||
# Below, the specific format of such requests:
|
# Below, the specific format of such requests:
|
||||||
#
|
#
|
||||||
# The first POST takes the following fields:
|
# The first POST takes the following fields:
|
||||||
|
|||||||
@ -43,9 +43,3 @@ USE_PSTORE_RAM=1
|
|||||||
# Setting LOG_SUBMISSION to '0' will disable this behavior; but notice that
|
# Setting LOG_SUBMISSION to '0' will disable this behavior; but notice that
|
||||||
# even with the log submission disabled, the logs are saved locally.
|
# even with the log submission disabled, the logs are saved locally.
|
||||||
LOG_SUBMISSION=1
|
LOG_SUBMISSION=1
|
||||||
|
|
||||||
# Below some log submission settings, based on Steam config files and Valve
|
|
||||||
# URLs. These settings *should not* be changed, or else the log sending
|
|
||||||
# mechanism will be impaired.
|
|
||||||
LOGINVDF="/home/doorstop/.local/share/Steam/config/loginusers.vdf"
|
|
||||||
POST_URL="https://api.steampowered.com/ICrashReportService/ACTIONCrashUpload/v1"
|
|
||||||
|
|||||||
@ -22,6 +22,50 @@ save_locally_and_bail() {
|
|||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Next function is used to get Steam Account/ID from the VDF file for
|
||||||
|
# the current user; in case it fails, STEAM_ID and STEAM_ACCOUNT vars
|
||||||
|
# aren't updated.
|
||||||
|
# Arg1: devnode information to determine the /home mount point.
|
||||||
|
|
||||||
|
get_steam_account_id() {
|
||||||
|
# Step 1: get the /home mount point.
|
||||||
|
HOMEFLD="$(findmnt "$1" -fno TARGET)"
|
||||||
|
|
||||||
|
# Step 2: determine the username; notice that
|
||||||
|
# UID_MIN = 1000, UID_MAX = 60000 from "/etc/login.defs", but
|
||||||
|
# getent takes long time to check all of them, so we restrict
|
||||||
|
# to UID = 1000 only.
|
||||||
|
USERN="$(getent passwd 1000 | cut -f1 -d:)"
|
||||||
|
|
||||||
|
# Let's determine the VDF file location using the above info.
|
||||||
|
LOGINVDF="${HOMEFLD}/${USERN}/.local/share/Steam/config/loginusers.vdf"
|
||||||
|
if [ ! -s "${LOGINVDF}" ]; then # bail if no valid VDF is found.
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Step 3: Parse the VDF file to obtain Account/ID; the following AWK
|
||||||
|
# command was borrowed from: https://unix.stackexchange.com/a/663959.
|
||||||
|
NUMREG=$(grep -c AccountName "${LOGINVDF}")
|
||||||
|
IDX=1
|
||||||
|
while [ ${IDX} -le "${NUMREG}" ]; do
|
||||||
|
MR=$(awk -v n=${IDX} -v RS='}' 'NR==n{gsub(/.*\{\n|\n$/,""); print}' "${LOGINVDF}" | grep "MostRecent" | cut -f4 -d\")
|
||||||
|
if [ "$MR" -ne 1 ]; then
|
||||||
|
IDX=$((IDX + 1))
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
STEAM_ACCOUNT=$(awk -v n=${IDX} -v RS='}' 'NR==n{gsub(/.*\{\n|\n$/,""); print}' "${LOGINVDF}" | grep "AccountName" | cut -f4 -d\")
|
||||||
|
|
||||||
|
# Get also the Steam ID, used in the POST request to Valve servers; this
|
||||||
|
# is a bit fragile, but there's no proper VDF parse tooling it seems...
|
||||||
|
LN=$(grep -n "AccountName.*${STEAM_ACCOUNT}\"" "${LOGINVDF}" | cut -f1 -d:)
|
||||||
|
LN=$((LN - 2))
|
||||||
|
STEAM_ID=$(sed -n "${LN}p" "${LOGINVDF}" | cut -f2 -d\")
|
||||||
|
break
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# We do some validation to be sure KDUMP_MNT pointed path is valid...
|
# We do some validation to be sure KDUMP_MNT pointed path is valid...
|
||||||
# That and having a valid /etc/default/kdump are essential conditions.
|
# That and having a valid /etc/default/kdump are essential conditions.
|
||||||
if [ ! -s "/etc/default/kdump" ]; then
|
if [ ! -s "/etc/default/kdump" ]; then
|
||||||
@ -128,28 +172,7 @@ if [ ${LOGS_FOUND} -ne 0 ]; then
|
|||||||
|
|
||||||
STEAM_ACCOUNT=0
|
STEAM_ACCOUNT=0
|
||||||
STEAM_ID=0
|
STEAM_ID=0
|
||||||
if [ -s "${LOGINVDF}" ]; then
|
get_steam_account_id "${MOUNT_DEVNODE}"
|
||||||
# The following awk command was borrowed from:
|
|
||||||
# https://unix.stackexchange.com/a/663959
|
|
||||||
NUMREG=$(grep -c AccountName "${LOGINVDF}")
|
|
||||||
IDX=1
|
|
||||||
while [ ${IDX} -le "${NUMREG}" ]; do
|
|
||||||
MR=$(awk -v n=${IDX} -v RS='}' 'NR==n{gsub(/.*\{\n|\n$/,""); print}' "${LOGINVDF}" | grep "MostRecent" | cut -f4 -d\")
|
|
||||||
if [ "$MR" -ne 1 ]; then
|
|
||||||
IDX=$((IDX + 1))
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
STEAM_ACCOUNT=$(awk -v n=${IDX} -v RS='}' 'NR==n{gsub(/.*\{\n|\n$/,""); print}' "${LOGINVDF}" | grep "AccountName" | cut -f4 -d\")
|
|
||||||
|
|
||||||
# Get also the Steam ID, used in the POST request to Valve servers; this
|
|
||||||
# is a bit fragile, but there's no proper VDF parse tooling it seems...
|
|
||||||
LN=$(grep -n "AccountName.*${STEAM_ACCOUNT}\"" "${LOGINVDF}" | cut -f1 -d:)
|
|
||||||
LN=$((LN - 2))
|
|
||||||
STEAM_ID=$(sed -n "${LN}p" "${LOGINVDF}" | cut -f2 -d\")
|
|
||||||
break
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Here we collect some more info, like DMI data, os-release, etc;
|
# Here we collect some more info, like DMI data, os-release, etc;
|
||||||
# TODO: Add Steam application / Proton / Games logs collection...
|
# TODO: Add Steam application / Proton / Games logs collection...
|
||||||
@ -237,9 +260,11 @@ if [ ${LOGS_FOUND} -ne 0 ]; then
|
|||||||
save_locally_and_bail "${NOT_SENT_FLD}" "${LOG_FNAME}"
|
save_locally_and_bail "${NOT_SENT_FLD}" "${LOG_FNAME}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# These URLs are hardcoded based on Valve's server information.
|
||||||
|
START_URL="https://api.steampowered.com/ICrashReportService/StartCrashUpload/v1"
|
||||||
|
FINISH_URL="https://api.steampowered.com/ICrashReportService/FinishCrashUpload/v1"
|
||||||
|
|
||||||
CURL_ERR="${KDUMP_MAIN_FOLDER}/.curl_err"
|
CURL_ERR="${KDUMP_MAIN_FOLDER}/.curl_err"
|
||||||
START_URL="$(echo "${POST_URL}" | sed 's/ACTION/Start/g')"
|
|
||||||
FINISH_URL="$(echo "${POST_URL}" | sed 's/ACTION/Finish/g')"
|
|
||||||
RESPONSE_FILE="${KDUMP_MAIN_FOLDER}/.curl_response"
|
RESPONSE_FILE="${KDUMP_MAIN_FOLDER}/.curl_response"
|
||||||
|
|
||||||
if ! curl -X POST -d "${POST_REQ}" "${START_URL}" 1>"${RESPONSE_FILE}" 2>"${CURL_ERR}"; then
|
if ! curl -X POST -d "${POST_REQ}" "${START_URL}" 1>"${RESPONSE_FILE}" 2>"${CURL_ERR}"; then
|
||||||
|
|||||||
Reference in New Issue
Block a user