2017-04-08 04:04:27 +02:00
#!/bin/bash
ynh_version = "2.4"
YNH_VERSION ( ) { # Returns the version number of the Yunohost moulinette
ynh_version = $( sudo yunohost -v | grep "moulinette:" | cut -d' ' -f2 | cut -d'.' -f1,2)
}
CHECK_VAR ( ) { # Verifies that the variable is not empty.
# $1 = Variable to be checked
# $2 = Display text on error
test -n " $1 " || ( echo " $2 " >& 2 && false )
}
EXIT_PROPERLY ( ) { # Causes the script to stop in the event of an error. And clean the residue.
trap '' ERR
echo -e "\e[91m \e[1m" # Shell in light red bold
echo -e " !!\n $app install's script has encountered an error. Installation was cancelled.\n!! " >& 2
if type -t CLEAN_SETUP > /dev/null; then # Checks the existence of the function before executing it.
CLEAN_SETUP # Call the specific cleanup function of the install script.
fi
# Compensates the ssowat bug that does not remove the app's input in case of installation error.
2017-04-16 16:08:42 +02:00
sudo sed -i " \@\" $domain /\":@d " /etc/ssowat/conf.json
2017-04-08 04:04:27 +02:00
if [ " $ynh_version " = "2.2" ] ; then
/bin/bash $script_dir /remove
fi
ynh_die
}
TRAP_ON ( ) { # Activate signal capture
trap EXIT_PROPERLY ERR # Capturing exit signals on error
}
TRAP_OFF ( ) { # Ignoring signal capture until TRAP_ON
trap '' ERR # Ignoring exit signals
}
CHECK_USER ( ) { # Check the validity of the user admin
# $1 = User admin variable
ynh_user_exists " $1 " || ( echo "Wrong admin" >& 2 && false )
}
CHECK_PATH ( ) { # Checks / at the beginning of the path. And his absence at the end.
if [ " ${ path : 0 : 1 } " != "/" ] ; then # If the first character is not /
path = " / $path " # Add / at the beginning of path
fi
if [ " ${ path : ${# path } -1 } " = = "/" ] && [ ${# path } -gt 1 ] ; then # If the last character is a / and it is not the only character.
path = " ${ path : 0 : ${# path } -1 } " # Delete last character
fi
}
CHECK_DOMAINPATH ( ) { # Checks the availability of the path and domain.
2017-04-16 16:08:42 +02:00
sudo yunohost app checkurl $domain -a $app
2017-04-08 04:04:27 +02:00
}
CHECK_FINALPATH ( ) { # Checks that the destination folder is not already in use.
final_path = /opt/$app
if [ -e " $final_path " ]
then
echo "This path already contains a folder" >& 2
false
fi
}
STORE_MD5_CONFIG ( ) { # Saves the checksum of the config file
# $1 = Name of the conf file for storage in settings.yml
# $2 = Full name and path of the conf file.
ynh_app_setting_set $app $1 _file_md5 $( sudo md5sum " $2 " | cut -d' ' -f1)
}
CHECK_MD5_CONFIG ( ) { # Created a backup of the config file if it was changed.
# $1 = Name of the conf file for storage in settings.yml
# $2 = Full name and path of the conf file.onf.
if [ " $( ynh_app_setting_get $app $1 _file_md5) " != $( sudo md5sum " $2 " | cut -d' ' -f1) ] ; then
sudo cp -a " $2 " " $2 .backup. $( date '+%d.%m.%y_%Hh%M,%Ss' ) " # Si le fichier de config a été modifié, créer un backup.
fi
}
FIND_PORT ( ) { # Search free port
# $1 = Port number to start the search.
port = $1
while ! sudo yunohost app checkport $port ; do
port = $(( port+1))
done
CHECK_VAR " $port " "port empty"
}
2017-04-10 21:13:13 +02:00
SETUP_SOURCE ( ) { # Download source, decompress and copu into $final_path
src = $( cat ../sources/source_md5 | awk -F' ' { 'print $2' } )
sudo wget -nv -i ../sources/source_url -O $src
# Checks the checksum of the downloaded source.
# md5sum -c ../sources/source_md5 --status || ynh_die "Corrupt source"
# Decompress source
if [ " $( echo ${ src ##*. } ) " = = "tgz" ] ; then
tar -x -f $src
elif [ " $( echo ${ src ##*. } ) " = = "zip" ] ; then
unzip -q $src
else
false # Unsupported archive format.
fi
# Copy file source
sudo cp -a $( cat ../sources/source_dir) /. " $final_path /live "
# Copy additional file and modified
if test -e "../sources/ajouts" ; then
sudo cp -a ../sources/ajouts/. " $final_path "
fi
}
2017-04-16 16:12:21 +02:00
# Create user with special hack
CREATE_USER ( ) {
sudo curl -kSs https://${ domain } /auth/sign_up --cookie-jar cookie | grep csrf > token || true
token = $( sudo cat token | sed -n '/csrf-token/s/.*name="csrf-token"\s\+content="\([^"]\+\).*/\1/p' )
sudo curl -kSs https://${ domain } /auth --data " &user[account_attributes][username]= ${ admin_mastodon } &user[email]= ${ admin_mastodon } @ ${ domain } &user[password]= ${ admin_pass } &user[password_confirmation]= ${ admin_pass } &authenticity_token= ${ token } " --cookie cookie
}
2017-04-08 04:04:27 +02:00
### REMOVE SCRIPT
REMOVE_NGINX_CONF ( ) { # Delete nginx configuration
if [ -e " /etc/nginx/conf.d/ $domain .d/ $app .conf " ] ; then # Delete nginx config
echo "Delete nginx config"
sudo rm " /etc/nginx/conf.d/ $domain .d/ $app .conf "
sudo systemctl reload nginx
fi
}
REMOVE_LOGROTATE_CONF ( ) { # Delete logrotate configuration
if [ -e " /etc/logrotate.d/ $app " ] ; then
echo "Delete logrotate config"
sudo rm " /etc/logrotate.d/ $app "
fi
}
SECURE_REMOVE ( ) { # Deleting a folder with variable verification
chaine = " $1 " # The argument must be given between simple quotes '', to avoid interpreting the variables.
no_var = 0
while ( echo " $chaine " | grep -q '\$' ) # Loop as long as there are $ in the string
do
no_var = 1
global_var = $( echo " $chaine " | cut -d '$' -f 2) # Isole the first variable found.
only_var = \$ $( expr " $global_var " : '\([A-Za-z0-9_]*\)' ) # Isole completely the variable by adding the $ at the beginning and keeping only the name of the variable. Mostly gets rid of / and a possible path behind.
real_var = $( eval " echo ${ only_var } " ) # `eval "echo ${var}` Allows to interpret a variable contained in a variable.
if test -z " $real_var " || [ " $real_var " = "/" ] ; then
echo " Variable $only_var is empty, suppression of $chaine cancelled. " >& 2
return 1
fi
chaine = $( echo " $chaine " | sed " s@ $only_var @ $real_var @ " ) # Replaces variable with its value in the string.
done
if [ " $no_var " -eq 1 ]
then
if [ -e " $chaine " ] ; then
echo " Delete directory $chaine "
sudo rm -r " $chaine "
fi
return 0
else
echo "No detected variable." >& 2
return 1
fi
}
2017-04-10 04:55:10 +02:00
# Create a db without password
#
# usage: ynh_mysql_create_user user
# | arg: user - the user name to create
ynh_psql_create_db_without_password( ) {
db = $1
sudo su -c "psql" postgres <<< \
" CREATE USER $db CREATEDB; "
2017-04-08 04:04:27 +02:00
}
# Create a user
#
# usage: ynh_mysql_create_user user pwd [host]
# | arg: user - the user name to create
# | arg: pwd - the password to identify user by
ynh_psql_create_user( ) {
sudo su -c "psql" postgres <<< \
" CREATE USER ${ 1 } WITH PASSWORD ' ${ 2 } '; "
}
2017-04-11 11:47:25 +02:00
# Create a user without password
#
# usage: ynh_mysql_create_user user pwd [host]
# | arg: user - the user name to create
ynh_psql_create_user_without_password( ) {
sudo su -c "psql" postgres <<< \
" CREATE USER ${ 1 } ; "
}
2017-04-08 04:04:27 +02:00
# Create a database and grant optionnaly privilegies to a user
#
# usage: ynh_mysql_create_db db [user [pwd]]
# | arg: db - the database name to create
# | arg: user - the user to grant privilegies
# | arg: pwd - the password to identify user by
ynh_psql_create_db( ) {
db = $1
# grant all privilegies to user
if [ [ $# -gt 1 ] ] ; then
ynh_psql_create_user ${ 2 } " ${ 3 } "
sudo su -c " createdb -O ${ 2 } $db " postgres
else
sudo su -c " createdb $db " postgres
fi
}
2017-04-10 21:13:13 +02:00
# Drop a role
#
# usage: ynh_mysql_drop_role db
# | arg: db - the database name to drop
ynh_psql_drop_role( ) {
sudo su -c "psql" postgres <<< \
" DROP ROLE ${ 1 } ; "
}
2017-04-08 04:04:27 +02:00
# Drop a database
#
# usage: ynh_mysql_drop_db db
# | arg: db - the database name to drop
ynh_psql_drop_db( ) {
sudo su -c " dropdb ${ 1 } " postgres
}
# Drop a user
#
# usage: ynh_mysql_drop_user user
# | arg: user - the user name to drop
ynh_psql_drop_user( ) {
sudo su -c " dropuser ${ 1 } " postgres
2017-04-11 11:47:25 +02:00
}
2017-04-18 02:47:58 +02:00
# Remove a file or a directory securely
#
# usage: ynh_secure_remove path_to_remove
# | arg: path_to_remove - File or directory to remove
ynh_secure_remove ( ) {
path_to_remove = $1
forbidden_path = " \
/var/www \
/home/yunohost.app"
if [ [ " $forbidden_path " = ~ " $path_to_remove " \
# Match all path or subpath in $forbidden_path
|| " $path_to_remove " = ~ ^/[ [ :alnum:] ] +$ \
# Match all first level path from / (Like /var, /root, etc...)
|| " ${ path_to_remove : ${# path_to_remove } -1 } " = "/" ] ]
# Match if the path finish by /. Because it's seems there is an empty variable
then
echo " Avoid deleting of $path_to_remove . " >& 2
else
if [ -e " $path_to_remove " ]
then
sudo rm -R " $path_to_remove "
else
echo " $path_to_remove doesn't deleted because it's not exist. " >& 2
fi
fi
}