mirror of
https://gh.con.sh/https://github.com/plexinc/pms-docker
synced 2025-04-28 12:19:54 +00:00
122 lines
3.5 KiB
Plaintext
Executable File
122 lines
3.5 KiB
Plaintext
Executable File
#!/usr/bin/with-contenv bash
|
|
|
|
# If we are debugging, enable trace
|
|
if [ "${DEBUG,,}" = "true" ]; then
|
|
set -x
|
|
fi
|
|
|
|
# If the first run completed successfully, we are done
|
|
if [ -e /.firstRunComplete ]; then
|
|
exit 0
|
|
fi
|
|
|
|
function getPref {
|
|
local key="$1"
|
|
|
|
xmlstarlet sel -T -t -m "/Preferences" -v "@${key}" -n "${prefFile}"
|
|
}
|
|
|
|
function setPref {
|
|
local key="$1"
|
|
local value="$2"
|
|
|
|
count="$(xmlstarlet sel -t -v "count(/Preferences/@${key})" "${prefFile}")"
|
|
count=$(($count + 0))
|
|
if [[ $count > 0 ]]; then
|
|
xmlstarlet ed --inplace --update "/Preferences/@${key}" -v "${value}" "${prefFile}"
|
|
else
|
|
xmlstarlet ed --inplace --insert "/Preferences" --type attr -n "${key}" -v "${value}" "${prefFile}"
|
|
fi
|
|
}
|
|
|
|
home="$(echo ~plex)"
|
|
[ -f /etc/default/plexmediaserver ] && . /etc/default/plexmediaserver
|
|
pmsApplicationSupportDir="${PLEX_MEDIA_SERVER_APPLICATION_SUPPORT_DIR:-${home}/Library/Application Support}"
|
|
prefFile="${pmsApplicationSupportDir}/Plex Media Server/Preferences.xml"
|
|
|
|
# Setup user/group ids
|
|
if [ ! -z "${PLEX_UID}" ]; then
|
|
if [ ! "$(id -u plex)" -eq "${PLEX_UID}" ]; then
|
|
usermod -o -u "${PLEX_UID}" plex
|
|
fi
|
|
fi
|
|
|
|
if [ ! -z "${PLEX_GID}" ]; then
|
|
if [ ! "$(id -g plex)" -eq "${PLEX_GID}" ]; then
|
|
groupmod -o -g "${PLEX_GID}" plex
|
|
fi
|
|
fi
|
|
|
|
# Update ownership of dirs we need to write
|
|
if [ "${CHANGE_CONFIG_DIR_OWNERSHIP,,}" = "true" ]; then
|
|
if [ -f "${prefFile}" ]; then
|
|
if [ ! "$(stat -c %U "${prefFile}")" = "plex" ]; then
|
|
chown -R plex:plex /config
|
|
fi
|
|
else
|
|
chown -R plex:plex /config
|
|
fi
|
|
chown -R plex:plex /transcode
|
|
fi
|
|
|
|
# Create empty shell pref file if it doesn't exist already
|
|
if [ ! -e "${prefFile}" ]; then
|
|
echo "Creating pref shell"
|
|
mkdir -p "$(dirname "${prefFile}")"
|
|
cat > "${prefFile}" <<-EOF
|
|
<?xml version="1.0" encoding="utf-8"?>
|
|
<Preferences/>
|
|
EOF
|
|
chown -R plex:plex "$(dirname "${prefFile}")"
|
|
fi
|
|
|
|
# Setup Server's client identifier
|
|
serial="$(getPref "MachineIdentifier")"
|
|
if [ -z "${serial}" ]; then
|
|
serial="$(uuidgen)"
|
|
setPref "MachineIdentifier" "${serial}"
|
|
fi
|
|
clientId="$(getPref "ProcessedMachineIdentifier")"
|
|
if [ -z "${clientId}" ]; then
|
|
clientId="$(echo -n "${serial}- Plex Media Server" | sha1sum | cut -b 1-40)"
|
|
setPref "ProcessedMachineIdentifier" "${clientId}"
|
|
fi
|
|
|
|
# Get server token and only turn claim token into server token if we have former but not latter.
|
|
token="$(getPref "PlexOnlineToken")"
|
|
if [ ! -z "${PLEX_CLAIM}" ] && [ -z "${token}" ]; then
|
|
echo "Attempting to obtain server token from claim token"
|
|
loginInfo="$(curl -X POST \
|
|
-H 'X-Plex-Client-Identifier: '${clientId} \
|
|
-H 'X-Plex-Product: Plex Media Server'\
|
|
-H 'X-Plex-Version: 1.1' \
|
|
-H 'X-Plex-Provides: server' \
|
|
-H 'X-Plex-Platform: Linux' \
|
|
-H 'X-Plex-Platform-Version: 1.0' \
|
|
-H 'X-Plex-Device-Name: PlexMediaServer' \
|
|
-H 'X-Plex-Device: Linux' \
|
|
"https://plex.tv/api/claim/exchange?token=${PLEX_CLAIM}")"
|
|
token="$(echo "$loginInfo" | sed -n 's/.*<authentication-token>\(.*\)<\/authentication-token>.*/\1/p')"
|
|
|
|
if [ "$token" ]; then
|
|
echo "Token obtained successfully"
|
|
setPref "PlexOnlineToken" "${token}"
|
|
fi
|
|
fi
|
|
|
|
if [ ! -z "${ADVERTISE_IP}" ]; then
|
|
setPref "customConnections" "${ADVERTISE_IP}"
|
|
fi
|
|
|
|
if [ ! -z "${ALLOWED_NETWORKS}" ]; then
|
|
setPref "allowedNetworks" "${ALLOWED_NETWORKS}"
|
|
fi
|
|
|
|
# Set transcoder temp if not yet set
|
|
if [ -z "$(getPref "TranscoderTempDirectory")" ]; then
|
|
setPref "TranscoderTempDirectory" "/transcode"
|
|
fi
|
|
|
|
touch /.firstRunComplete
|
|
echo "Plex Media Server first run setup complete"
|