diff --git a/conf/multimedia.src b/conf/multimedia.src deleted file mode 100644 index 54c3617..0000000 --- a/conf/multimedia.src +++ /dev/null @@ -1,6 +0,0 @@ -SOURCE_URL=https://github.com/YunoHost-Apps/yunohost.multimedia/archive/v1.2.tar.gz -SOURCE_SUM=7dfc07e32d7842f87274ef780cb9757a7679573cbbeb095c5f86ef76806f5d95 -SOURCE_SUM_PRG=sha256sum -SOURCE_FORMAT=tar.gz -SOURCE_IN_SUBDIR=true -SOURCE_FILENAME= diff --git a/conf/pythonz.src b/conf/pythonz.src deleted file mode 100644 index fd43a3e..0000000 --- a/conf/pythonz.src +++ /dev/null @@ -1,6 +0,0 @@ -SOURCE_URL=https://github.com/saghul/pythonz/archive/9067f35e0253b015eb51b8a4d60c0bd1a06dcc83.tar.gz -SOURCE_SUM=ce9eb5400fff81e4877e04dd7166c764d8adc999d9ca6b06ce933ee9375b8652 -SOURCE_SUM_PRG=sha256sum -SOURCE_FORMAT=tar.gz -SOURCE_IN_SUBDIR=true -SOURCE_FILENAME= diff --git a/conf/systemd.service b/conf/systemd.service index 80314b3..437a957 100644 --- a/conf/systemd.service +++ b/conf/systemd.service @@ -3,10 +3,12 @@ Description=CouchPotato application instance After=network.target [Service] -ExecStart=__FINALPATH__/ve2/bin/python __FINALPATH__/CouchPotato.py --quiet --pid_file=/var/run/__APP__/__APP__.pid --data_dir=__APP_DATA_DIR__ --config_file=__FINALPATH__/settings.conf Type=simple User=__APP__ Group=__APP__ +WorkingDirectory=__FINALPATH__/ +ExecStart=/opt/pyenv/versions/__APP__/bin/python __FINALPATH__/CouchPotato.py --quiet --pid_file=/var/run/__APP__/__APP__.pid --data_dir=__APP_DATA_DIR__ --config_file=__FINALPATH__/settings.conf + [Install] WantedBy=multi-user.target diff --git a/scripts/_common.sh b/scripts/_common.sh index 8f9ca4b..49106f9 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -5,9 +5,10 @@ #================================================= # dependencies used by the app -pkg_dependencies="python-pip python-virtualenv python-dev uwsgi uwsgi-plugin-python build-essential zlib1g-dev libbz2-dev libssl-dev libreadline-dev libncurses5-dev libsqlite3-dev libgdbm-dev libdb-dev libexpat-dev libpcap-dev liblzma-dev libpcre3-dev libffi-dev" +pkg_dependencies="" +#python-pip python-virtualenv python-dev uwsgi uwsgi-plugin-python -python_version=2.7.2 +PHYTON_VERSION=2.7.18 #================================================= # PERSONAL HELPERS diff --git a/scripts/install b/scripts/install index f416ae6..6cbdde0 100644 --- a/scripts/install +++ b/scripts/install @@ -7,6 +7,8 @@ #================================================= source _common.sh +source ynh_install_python +source ynh_multimedia_3 source /usr/share/yunohost/helpers #================================================= @@ -14,6 +16,7 @@ source /usr/share/yunohost/helpers #================================================= ynh_clean_setup () { + read -p "key" true } # Exit if an error occurs during the execution of the script @@ -36,9 +39,6 @@ ynh_script_progression --message="Validating installation parameters..." final_path=/opt/yunohost/$app test ! -e "$final_path" || ynh_die --message="This path already contains a folder" -multimedia_final_path=/opt/yunohost/${app}_multimedia -test ! -e "$multimedia_final_path" || ynh_die --message="This path already contains a folder" - app_data_dir=/home/yunohost.app/$app test ! -e "$app_data_dir" || ynh_die --message="This path already contains a folder" @@ -52,7 +52,6 @@ ynh_script_progression --message="Storing installation settings..." ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=path --value=$path_url -ynh_app_setting_set --app=$app --key=multimedia_final_path --value=$multimedia_final_path ynh_app_setting_set --app=$app --key=app_data_dir --value=$app_data_dir #================================================= @@ -115,22 +114,6 @@ ynh_script_progression --message="Make data directory..." # Make directories mkdir -p $app_data_dir -#================================================= -# INSTALL PYTHONZ TO GET PYTHON -#================================================= -ynh_print_info --message="Installing Python..." - -# Get pythonz -# curl -kL https://raw.githubusercontent.com/saghul/pythonz/master/pythonz-install -# ./pythonz-install -ynh_setup_source --dest_dir="$final_path/.pythonz" --source_id=pythonz -export PYTHONZ_ROOT="$final_path/.pythonz" -# Then install it -python $final_path/.pythonz/pythonz_install.py - -# Install Python -$final_path/.pythonz/bin/pythonz install $python_version - #================================================= # BUILD COUCHPOTATO #================================================= @@ -139,10 +122,12 @@ ynh_script_progression --message="Building CouchPotato..." # Set permissions to app files chown -R "$app": "$final_path" -pushd $final_path/ - virtualenv -p $($final_path/.pythonz/bin/pythonz locate $python_version) ve2 - ve2/bin/pip install --upgrade pyopenssl - ve2/bin/pip install cheetah +ynh_install_python --python_version=$PHYTON_VERSION + +pushd $final_path + pyenv virtualenv $PHYTON_VERSION $app + /opt/pyenv/versions/$app/bin/pip install --upgrade pyopenssl + /opt/pyenv/versions/$app/bin/pip install cheetah popd #================================================= @@ -150,17 +135,16 @@ popd #================================================= ynh_script_progression --message="Install YunoHost multimedia..." -ynh_setup_source --dest_dir="$multimedia_final_path" -source_id=multimedia -$multimedia_final_path/script/ynh_media_build.sh +ynh_multimedia_build_main_dir # Give write access to the yunohost.multimedia directory so that Couchpotato can move Movies to the Movie directory -usermod -a -G multimedia $app +ynh_multimedia_addaccess $app # Creates the "Movies" subfolder in "Video" mkdir -p "/home/yunohost.multimedia/share/Video/Movies" # Fix permissions -$multimedia_final_path/script/ynh_media_build.sh +/home/yunohost.multimedia/ynh_media_build.sh #================================================= # CONFIGURE TRANSMISSION @@ -219,8 +203,8 @@ ynh_replace_string --match_string="__RPCURL__" --replace_string="$transmission_r ynh_replace_string --match_string="__RPCPASSWORD__" --replace_string="$transmission_rpcpassword" --target_file="../conf/couchpotato.conf" ynh_replace_string --match_string="__WATCHDIR__" --replace_string="$transmission_watchdir" --target_file="../conf/couchpotato.conf" -ynh_replace_string --match_string="__PATH__" --replace_string="$path" --target_file="../conf/couchpotato.conf" -ynh_replace_string --match_string="__PORT__" --replace_string="$port@" --target_file="../conf/couchpotato.conf" +ynh_replace_string --match_string="__PATH__" --replace_string="$path_url" --target_file="../conf/couchpotato.conf" +ynh_replace_string --match_string="__PORT__" --replace_string="$port" --target_file="../conf/couchpotato.conf" ynh_replace_string --match_string="__DATADIR__" --replace_string="$app_data_dir" --target_file="../conf/couchpotato.conf" cp -a ../conf/couchpotato.conf $app_config_file diff --git a/scripts/remove b/scripts/remove index 339d109..aea6ed0 100644 --- a/scripts/remove +++ b/scripts/remove @@ -7,6 +7,7 @@ #================================================= source _common.sh +source ynh_install_python source /usr/share/yunohost/helpers #================================================= @@ -48,6 +49,7 @@ ynh_remove_systemd_config ynh_script_progression --message="Removing dependencies..." # Remove metapackage and its dependencies +ynh_remove_python ynh_remove_app_dependencies #================================================= diff --git a/scripts/restore b/scripts/restore index 4261175..83a6c4c 100644 --- a/scripts/restore +++ b/scripts/restore @@ -8,6 +8,8 @@ #Keep this path for calling _common.sh inside the execution's context of backup and restore scripts source ../settings/scripts/_common.sh +source ../settings/scripts/ynh_install_pyhon +source ../settings/scripts/ynh_multimedia_3 source /usr/share/yunohost/helpers #================================================= @@ -31,7 +33,6 @@ domain=$(ynh_app_setting_get --app=$app --key=domain) path_url=$(ynh_app_setting_get --app=$app --key=path) final_path=$(ynh_app_setting_get --app=$app --key=final_path) app_data_dir=$(ynh_app_setting_get --app=$app --key=app_data_dir) -multimedia_final_path=$(ynh_app_setting_get --app=$app --key=multimedia_final_path) #================================================= # CHECK IF THE APP CAN BE RESTORED @@ -88,6 +89,22 @@ ynh_script_progression --message="Reinstalling dependencies..." # Define and install dependencies ynh_install_app_dependencies $pkg_dependencies +#================================================= +# BUILD COUCHPOTATO +#================================================= +ynh_script_progression --message="Building CouchPotato..." + +# Set permissions to app files +chown -R "$app": "$final_path" + +ynh_install_python --python_version=$PHYTON_VERSION + +pushd $final_path + pyenv virtualenv $PHYTON_VERSION $app + /opt/pyenv/versions/$app/bin/pip install --upgrade pyopenssl + /opt/pyenv/versions/$app/bin/pip install cheetah +popd + #================================================= # RESTORE THE DATA DIRECTORY #================================================= @@ -100,17 +117,16 @@ ynh_restore_file --origin_path="$app_data_dir" #================================================= ynh_script_progression --message="Install YunoHost multimedia..." -ynh_setup_source --dest_dir="$multimedia_final_path" -source_id=multimedia -$multimedia_final_path/script/ynh_media_build.sh +ynh_multimedia_build_main_dir # Give write access to the yunohost.multimedia directory so that Couchpotato can move Movies to the Movie directory -usermod -a -G multimedia $app +ynh_multimedia_addaccess $app # Creates the "Movies" subfolder in "Video" mkdir -p "/home/yunohost.multimedia/share/Video/Movies" # Fix permissions -$multimedia_final_path/script/ynh_media_build.sh +/home/yunohost.multimedia/ynh_media_build.sh #================================================= # CONFIGURE LOGS diff --git a/scripts/upgrade b/scripts/upgrade index ca8f17c..2954292 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -7,6 +7,8 @@ #================================================= source _common.sh +source ynh_install_python +source ynh_multimedia_3 source /usr/share/yunohost/helpers #================================================= @@ -139,24 +141,12 @@ ynh_script_progression --message="Building CouchPotato..." # Set permissions to app files chown -R "$app": "$final_path" -pushd $final_path/ - virtualenv -p $($final_path/.pythonz/bin/pythonz locate $python_version) ve2 - ve2/bin/pip install --upgrade pyopenssl - ve2/bin/pip install cheetah -popd +ynh_install_python --python_version=$PHYTON_VERSION -#================================================= -# BUILD COUCHPOTATO -#================================================= -ynh_script_progression --message="Building CouchPotato..." - -# Set permissions to app files -chown -R "$app": "$final_path" - -pushd $final_path/ - virtualenv -p $($final_path/.pythonz/bin/pythonz locate $python_version) ve2 - ve2/bin/pip install --upgrade pyopenssl - ve2/bin/pip install cheetah +pushd $final_path + pyenv virtualenv $PHYTON_VERSION $app + /opt/pyenv/versions/$app/bin/pip install --upgrade pyopenssl + /opt/pyenv/versions/$app/bin/pip install cheetah popd #================================================= @@ -164,17 +154,16 @@ popd #================================================= ynh_script_progression --message="Install YunoHost multimedia..." -ynh_setup_source --dest_dir="$multimedia_final_path" -source_id=multimedia -$multimedia_final_path/script/ynh_media_build.sh +ynh_multimedia_build_main_dir # Give write access to the yunohost.multimedia directory so that Couchpotato can move Movies to the Movie directory -usermod -a -G multimedia $app +ynh_multimedia_addaccess $app # Creates the "Movies" subfolder in "Video" mkdir -p "/home/yunohost.multimedia/share/Video/Movies" # Fix permissions -$multimedia_final_path/script/ynh_media_build.sh +/home/yunohost.multimedia/ynh_media_build.sh #================================================= # CONFIGURE LOGS diff --git a/scripts/ynh_install_python b/scripts/ynh_install_python new file mode 100644 index 0000000..7d763b2 --- /dev/null +++ b/scripts/ynh_install_python @@ -0,0 +1,151 @@ +#!/bin/bash + +# Need also the helper https://github.com/YunoHost-Apps/Experimental_helpers/blob/master/ynh_handle_getopts_args/ynh_handle_getopts_args + +pyenv_install_dir="/opt/pyenv" +# PYENV_ROOT is the directory of pyenv, it needs to be loaded as a environment variable. +export PYENV_ROOT="$pyenv_install_dir" +# Required dependencies +pyenv_dependencies="build-essential libssl1.0-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl git" + +# Install python version management +# +# [internal] +# +# usage: ynh_install_pyenv +ynh_install_pyenv () { + echo "Installation of pyenv - python version management" >&2 + # Build an app.src for pyenv + mkdir -p "../conf" + echo "SOURCE_URL=https://github.com/pyenv/pyenv/archive/v1.2.19.tar.gz +SOURCE_SUM=e93466735ac9c34d68b7d5d71f32c16a2b4b1a6a1adffb85acc4126a3398b9d0" > "../conf/pyenv.src" + # Download and extract pyenv + ynh_setup_source "$pyenv_install_dir" pyenv + + # Build an app.src for pyenv-virtualenv + mkdir -p "../conf" + echo "SOURCE_URL=https://github.com/pyenv/pyenv-virtualenv/archive/v1.1.5.tar.gz +SOURCE_SUM=27ae3de027a6f6dccdca4085225512e559c6b94b31625bd2b357a18890a1e618" > "../conf/pyenv-virtualenv.src" + # Download and extract pyenv-virtualenv + ynh_setup_source "$pyenv_install_dir/plugins/pyenv-virtualenv" pyenv-virtualenv + + (cd $pyenv_install_dir + ./src/configure && make -C src) + +# Create shims directory if needed +if [ ! -d $pyenv_install_dir/shims ] ; then + mkdir $pyenv_install_dir/shims +fi +} + +# Install a specific version of python +# +# ynh_install_python will install the version of python provided as argument by using pyenv. +# +# pyenv (python version management) stores the target python version in a .python_version file created in the target folder (using pyenv local ) +# It then uses that information for every python user that uses pyenv provided python command +# +# This helper creates a /etc/profile.d/pyenv.sh that configures PATH environment for pyenv +# for every LOGIN user, hence your user must have a defined shell (as opposed to /usr/sbin/nologin) +# +# Don't forget to execute python-dependent command in a login environment +# (e.g. sudo --login option) +# When not possible (e.g. in systemd service definition), please use direct path +# to pyenv shims (e.g. $PYENV_ROOT/shims/bundle) +# +# usage: ynh_install_python python_version user +# | arg: -v, --python_version= - Version of python to install. +# If possible, prefer to use major version number (e.g. 8 instead of 8.10.0). +# The crontab will handle the update of minor versions when needed. +ynh_install_python () { + # Declare an array to define the options of this helper. + declare -Ar args_array=( [v]=python_version= ) + # Use pyenv, https://github.com/pyenv/pyenv to manage the python versions + local python_version + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + + # Create $pyenv_install_dir + mkdir -p "$pyenv_install_dir/plugins/pyenv-virtualenv" + + # Load pyenv path in PATH + CLEAR_PATH="$pyenv_install_dir/bin:$PATH" + + # Remove /usr/local/bin in PATH in case of python prior installation + PATH=$(echo $CLEAR_PATH | sed 's@/usr/local/bin:@@') + + # Move an existing python binary, to avoid to block pyenv + #test -x /usr/bin/python && mv /usr/bin/python /usr/bin/python_pyenv + + # If pyenv is not previously setup, install it + if ! type pyenv > /dev/null 2>&1 + then + ynh_install_pyenv + elif dpkg --compare-versions "$($pyenv_install_dir/bin/pyenv --version | cut -d" " -f2)" lt "1.2.19" + then + ynh_install_pyenv + elif dpkg --compare-versions "$($pyenv_install_dir/plugins/pyenv-virtualenv/bin/pyenv-virtualenv --version | cut -d" " -f2)" lt "1.1.5" + then + ynh_install_pyenv + fi + + # Restore /usr/local/bin in PATH (if needed) + PATH=$CLEAR_PATH + + # And replace the old python binary + # test -x /usr/bin/python_pyenv && mv /usr/bin/python_pyenv /usr/bin/python + + # Install required dependencies + ynh_add_app_dependencies --package="$pyenv_dependencies" + + # Install the requested version of python + pyenv install --skip-existing $python_version + + # Store the ID of this app and the version of python requested for it + echo "$YNH_APP_ID:$python_version" | tee --append "$pyenv_install_dir/ynh_app_version" + + # Store python_version into the config of this app + ynh_app_setting_set --app=$app --key=python_version --value=$python_version + + # Set environment for python users + echo "#pyenv +export PYENV_ROOT=$pyenv_install_dir +export PATH=\"$pyenv_install_dir/bin:$PATH\" +eval \"\$(pyenv init -)\" +#pyenv" > /etc/profile.d/pyenv.sh + + # Load the right environment for the Installation + eval "$(pyenv init -)" + + (cd $final_path + pyenv local $python_version) +} + +# Remove the version of python used by the app. +# +# This helper will check if another app uses the same version of python, +# if not, this version of python will be removed. +# If no other app uses python, pyenv will be also removed. +# +# usage: ynh_remove_python +ynh_remove_python () { + python_version=$(ynh_app_setting_get --app=$app --key=python_version) + + # Remove the line for this app + sed --in-place "/$YNH_APP_ID:$python_version/d" "$pyenv_install_dir/ynh_app_version" + + # If no other app uses this version of python, remove it. + if ! grep --quiet "$python_version" "$pyenv_install_dir/ynh_app_version" + then + $pyenv_install_dir/bin/pyenv uninstall --force $python_version + fi + + # Remove pyenv environment configuration + rm /etc/profile.d/pyenv.sh + + # If no other app uses pyenv, remove pyenv and dedicated group + if [ ! -s "$pyenv_install_dir/ynh_app_version" ] + then + ynh_secure_remove --file="$pyenv_install_dir" + fi +} diff --git a/scripts/ynh_multimedia_3 b/scripts/ynh_multimedia_3 new file mode 100644 index 0000000..edf680c --- /dev/null +++ b/scripts/ynh_multimedia_3 @@ -0,0 +1,78 @@ +#!/bin/bash + +# Install or update the main directory yunohost.multimedia +# +# usage: ynh_multimedia_build_main_dir +ynh_multimedia_build_main_dir () { + local ynh_media_release="v1.2" + local checksum="806a827ba1902d6911095602a9221181" + + # Download yunohost.multimedia scripts + wget -nv https://github.com/YunoHost-Apps/yunohost.multimedia/archive/${ynh_media_release}.tar.gz + + # Check the control sum + echo "${checksum} ${ynh_media_release}.tar.gz" | md5sum -c --status \ + || ynh_die "Corrupt source" + + # Check if the package acl is installed. Or install it. + ynh_package_is_installed 'acl' \ + || ynh_package_install acl + + # Extract + mkdir yunohost.multimedia-master + tar -xf ${ynh_media_release}.tar.gz -C yunohost.multimedia-master --strip-components 1 + ./yunohost.multimedia-master/script/ynh_media_build.sh +} + +# Add a directory in yunohost.multimedia +# This "directory" will be a symbolic link to a existing directory. +# +# usage: ynh_multimedia_addfolder "Source directory" "Destination directory" +# +# | arg: -s, --source_dir= - Source directory - The real directory which contains your medias. +# | arg: -d, --dest_dir= - Destination directory - The name and the place of the symbolic link, relative to "/home/yunohost.multimedia" +ynh_multimedia_addfolder () { + # Declare an array to define the options of this helper. + declare -Ar args_array=( [s]=source_dir= [d]=dest_dir= ) + local source_dir + local dest_dir + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + + ./yunohost.multimedia-master/script/ynh_media_addfolder.sh --source="$source_dir" --dest="$dest_dir" +} + +# Move a directory in yunohost.multimedia, and replace by a symbolic link +# +# usage: ynh_multimedia_movefolder "Source directory" "Destination directory" +# +# | arg: -s, --source_dir= - Source directory - The real directory which contains your medias. +# It will be moved to "Destination directory" +# A symbolic link will replace it. +# | arg: -d, --dest_dir= - Destination directory - The new name and place of the directory, relative to "/home/yunohost.multimedia" +ynh_multimedia_movefolder () { + # Declare an array to define the options of this helper. + declare -Ar args_array=( [s]=source_dir= [d]=dest_dir= ) + local source_dir + local dest_dir + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + + ./yunohost.multimedia-master/script/ynh_media_addfolder.sh --inv --source="$source_dir" --dest="$dest_dir" +} + +# Allow an user to have an write authorisation in multimedia directories +# +# usage: ynh_multimedia_addaccess user_name +# +# | arg: -u, --user_name= - The name of the user which gain this access. +ynh_multimedia_addaccess () { + # Declare an array to define the options of this helper. + declare -Ar args_array=( [u]=user_name=) + local user_name + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + + groupadd -f multimedia + usermod -a -G multimedia $user_name +}