diff --git a/README.md b/README.md index c85c145..d0dd04b 100644 --- a/README.md +++ b/README.md @@ -17,10 +17,17 @@ Help for dev/testing hightly appreciated :) * Backup/restore scripts * Adding / removing a link * Upgrade *not tested* + * Configure Shaarli during installation + +## Installation information + +When doing the installation you will be prompted if you want to have a public site, meaning that you don't have to be a user of this Yunohost instance to access the site. + +You will also be asked if you want to have a private instance, meaning that the authentication will be deactivated and the application will be only available to the owner designed during install. ## TODO - - * Configure Shaarli during installation + + * Integrate the ssowat authentication (currently the authentication is done by Shaarli) * Test more the package ## Changelog diff --git a/conf/config.json.php b/conf/config.json.php new file mode 100644 index 0000000..69a0604 --- /dev/null +++ b/conf/config.json.php @@ -0,0 +1,60 @@ + diff --git a/conf/config.php b/conf/config.php deleted file mode 100644 index d59c7c7..0000000 --- a/conf/config.php +++ /dev/null @@ -1,13 +0,0 @@ - \ No newline at end of file diff --git a/conf/datastore.php b/conf/datastore.php new file mode 100644 index 0000000..fa93c7f --- /dev/null +++ b/conf/datastore.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/conf/gen_hash.php b/conf/gen_hash.php new file mode 100644 index 0000000..e69dae1 --- /dev/null +++ b/conf/gen_hash.php @@ -0,0 +1,7 @@ + + diff --git a/conf/init_config.php b/conf/init_config.php deleted file mode 100644 index ce0b784..0000000 --- a/conf/init_config.php +++ /dev/null @@ -1,17 +0,0 @@ - diff --git a/conf/init_config_user.php b/conf/init_config_user.php deleted file mode 100644 index f0fc7ac..0000000 --- a/conf/init_config_user.php +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/php - $userlogin) -{ - $userlevel = '2'; - if ($userlogin == $GLOBALS['ynh_admin']) - { - $userlevel = '4'; - } - - $currentLogin = array($userlogin); - $currentPassword = array($userlogin => ''); - $currentLevel = array($userlogin => $userlevel); - $currentEmail = array($userlogin => ''); - - if (array_key_exists('login', $GLOBALS)) - { - $GLOBALS['login'] = array_merge($GLOBALS['login'], $currentLogin); - $GLOBALS['password'] = array_merge($GLOBALS['password'], $currentPassword); - $GLOBALS['level'] = array_merge($GLOBALS['level'], $currentLevel); - $GLOBALS['email'] = array_merge($GLOBALS['email'], $currentEmail); - } - else - { - $GLOBALS['login'] = $currentLogin; - $GLOBALS['password'] = $currentPassword; - $GLOBALS['level'] = $currentLevel; - $GLOBALS['email'] = $currentEmail; - } -} - -$userconf = ''; - -$userconf_file = '/home/yunohost.app/shaarli/data/config_user.php'; -if (!file_put_contents($userconf_file, $userconf) || strcmp(file_get_contents($userconf_file),$userconf)!=0) -{ - fwrite(STDERR, "Error while writing " . $userconf_file); - exit(1); -} - -?> diff --git a/conf/ipbans.php b/conf/ipbans.php new file mode 100644 index 0000000..9dadae2 --- /dev/null +++ b/conf/ipbans.php @@ -0,0 +1,10 @@ + + array ( + ), + 'BANS' => + array ( + ), +); +?> \ No newline at end of file diff --git a/conf/lastupdatecheck.txt b/conf/lastupdatecheck.txt new file mode 100644 index 0000000..2c2927f --- /dev/null +++ b/conf/lastupdatecheck.txt @@ -0,0 +1 @@ +0.7.0 */ \ No newline at end of file diff --git a/conf/log.txt b/conf/log.txt new file mode 100644 index 0000000..e69de29 diff --git a/conf/options.php b/conf/options.php deleted file mode 100644 index 56b818e..0000000 --- a/conf/options.php +++ /dev/null @@ -1,23 +0,0 @@ -> 2.3.15" + }, "description": { "en": "The personal, minimalist, super-fast, no-database delicious clone", "fr": "Clone de delicious, rapide, simple et sans base de données." @@ -10,12 +13,14 @@ "name": "Lapineige" }, "url": "https://github.com/shaarli/Shaarli", + "license": "free", "version": "0.8.3", - "multi_instance": "false", + "multi_instance": "true", "arguments": { "install" : [ { "name": "domain", + "type": "domain", "ask": { "en": "Choose a domain for your Shaarli", "fr": "Choisissez un domaine pour votre Shaarli" @@ -24,6 +29,7 @@ }, { "name": "path", + "type": "path", "ask": { "en": "Choose a path for your Shaarli", "fr": "Choisissez un chemin pour votre Shaarli" @@ -32,7 +38,7 @@ "default": "/shaarli" }, { - "name": "public", + "name": "is_public", "ask": { "en": "Is it a public Shaarli site ?", "fr": "Est-ce un site Shaarli public ?" @@ -40,15 +46,6 @@ "choices": ["Yes", "No"], "default": "No" }, - { - "name": "title", - "ask": { - "en": "Choose a title for Shaarli's page", - "fr": "Choissez un titre pour la page Shaarli" - }, - "example": "Shaarli", - "default": "Shaarli" - }, { "name": "privatelinkbydefault", "ask": { @@ -59,12 +56,39 @@ "default": "Yes" }, { - "name": "admin", + "name": "privateinstance", "ask": { - "en": "Admin user", - "fr": "Administrateur" + "en": "Is this instance private?", + "fr": "Cette instance est-elle privée ?" + }, + "choices": ["Yes", "No"], + "default": "Yes" + }, + { + "name": "admin", + "type": "user", + "ask": { + "en": "Owner of the Shaarli instance", + "fr": "Propriétaire de l'instance Shaarli" }, "example": "test" + }, + { + "name": "password", + "type": "password", + "ask": { + "en": "Define password for Shaarli user", + "fr": "Définissez le mot de passe de l'utilisateur Shaarli" + } + }, + { + "name": "title", + "ask": { + "en": "Choose a title for Shaarli's page", + "fr": "Choissez un titre pour la page Shaarli" + }, + "example": "Shaarli", + "default": "Shaarli" } ] } diff --git a/scripts/install b/scripts/install index 3253cb3..ee98524 100644 --- a/scripts/install +++ b/scripts/install @@ -1,26 +1,49 @@ #!/bin/bash +# causes the shell to exit if any subcommand or pipeline returns a non-zero status +set -e + +# This is a multi-instance app, meaning it can be installed several times independently +# The id of the app as stated in the manifest is available as $YNH_APP_ID +# The instance number is available as $YNH_APP_INSTANCE_NUMBER (equals "1", "2", ...) +# The app instance name is available as $YNH_APP_INSTANCE_NAME +# - the first time the app is installed, YNH_APP_INSTANCE_NAME = ynhexample +# - the second time the app is installed, YNH_APP_INSTANCE_NAME = ynhexample__2 +# - ynhexample__{N} for the subsequent installations, with N=3,4, ... +# The app instance name is probably what you are interested the most, since this is +# guaranteed to be unique. This is a good unique identifier to define installation path, +# db names, ... +app=$YNH_APP_INSTANCE_NAME + # Retrieve arguments -domain=$1 -path=$2 -is_public=$3 -title=$4 -privatelinkbydefault=$5 -admin=$6 +domain=$YNH_APP_ARG_DOMAIN +path=$YNH_APP_ARG_PATH +admin=$YNH_APP_ARG_ADMIN +is_public=$YNH_APP_ARG_IS_PUBLIC +title=$YNH_APP_ARG_TITLE +privatelinkbydefault=$YNH_APP_ARG_PRIVATELINKBYDEFAULT +password=$YNH_APP_ARG_PASSWORD +privateinstance=$YNH_APP_ARG_PRIVATEINSTANCE # Load common variables and helpers source ./_common.sh +# Check that the options are compatible +if [ $is_public = "Yes" ]; then + if [ $privateinstance = "Yes" ] ; then + ynh_die "Incompatible options: the instance cannot be both public and private" 1 + fi +fi + # Check that admin user is an existing account sudo yunohost user list --json | grep -q "\"username\": \"$admin\"" if [[ ! $? -eq 0 ]]; then -echo "Error : the chosen admin user does not exist" -exit 1 +ynh_die "Error : the chosen user does not exist" 1 fi -sudo yunohost app setting shaarli admin -v $admin +sudo yunohost app setting $app admin -v $admin # Check domain/path availability -sudo yunohost app checkurl $domain$path -a shaarli +sudo yunohost app checkurl $domain$path -a $app if [[ ! $? -eq 0 ]]; then exit 1 fi @@ -29,53 +52,70 @@ fi sudo apt-get install php5-cli -y -qq # Copy files to the right place -app_home_path=/home/yunohost.app/shaarli -final_path=/var/www/shaarli +app_home_path=/home/yunohost.app/$app +final_path=/var/www/$app sudo mkdir -p $final_path # Download and extract in /var/www extract_shaarli -sudo mkdir -p $app_home_path/data -sudo mkdir -p $app_home_path/cache -sudo mkdir -p $app_home_path/pagecache -sudo mkdir -p $app_home_path/tmp -sudo mkdir -p $app_home_path/conf -sudo chown -R www-data: $app_home_path - +# generate the salt salt=$(dd if=/dev/urandom bs=1 count=200 2> /dev/null | tr -c -d 'A-Za-z0-9' | sed -n 's/\(.\{24\}\).*/\1/p') + +# generate the hash with the password +password_hash=$(php ../conf/gen_hash.php $password $admin $salt) + +# set the proper value for substitution if [ $privatelinkbydefault = "No" ]; then privatelinkbydefault_php=false else privatelinkbydefault_php=true fi -sudo sed -i "s@YNH_SALT@$salt@g" ../conf/init_config.php -sudo sed -i "s@YNH_TIMEZONE@$(cat /etc/timezone)@g" ../conf/init_config.php -sudo sed -i "s@YNH_TITLE@$title@g" ../conf/init_config.php -sudo sed -i "s@YNH_PRIVATE_LINK_BY_DEFAULT@$privatelinkbydefault_php@g" ../conf/init_config.php -sudo sed -i "s@YNH_ADMIN@$admin@g" ../conf/init_config.php +# Prepare the configuration file +sudo sed -i "s@YNH_SALT@$salt@g" ../conf/config.json.php +sudo sed -i "s@YNH_ADMIN@$admin@g" ../conf/config.json.php +sudo sed -i "s@YNH_HASH@$password_hash@g" ../conf/config.json.php +sudo sed -i "s@YNH_TIMEZONE@$(cat /etc/timezone)@g" ../conf/config.json.php +sudo sed -i "s@YNH_TITLE@$title@g" ../conf/config.json.php +sudo sed -i "s@YNH_PRIVATE_LINK_BY_DEFAULT@$privatelinkbydefault_php@g" ../conf/config.json.php +# turn off authentication on the instance +if [ $privateinstance = "Yes" ] ; then + sudo sed -i "/open_shaarli/s/false/true/" ../conf/config.json.php +fi -sudo cp ../conf/options.php $app_home_path/data/options.php -sudo cp ../conf/init_config.php $app_home_path/data/config.php -sudo php ../conf/init_config_user.php $(sudo yunohost user list --json | python ../conf/user_list.py) +# Populate the data directory of the shaarli instance +sudo cp ../conf/config.json.php $final_path/data +sudo cp ../conf/datastore.php $final_path/data +sudo cp ../conf/ipbans.php $final_path/data +sudo cp ../conf/lastupdatecheck.txt $final_path/data +sudo cp ../conf/log.txt $final_path/data +sudo cp ../conf/updates.txt $final_path/data +# set proper permissions sudo find $final_path -type f | xargs sudo chmod 644 sudo find $final_path -type d | xargs sudo chmod 755 #sudo chown -R root: $final_path -sudo find $app_home_path -type f | xargs sudo chmod 600 -sudo find $app_home_path -type d | xargs sudo chmod 700 -sudo chown -R www-data: $app_home_path +#set proper ownership of the files in /data +sudo chown www-data:www-data $final_path/data/config.json.php +sudo chown www-data:www-data $final_path/data/datastore.php +sudo chown www-data:www-data $final_path/data/ipbans.php +sudo chown www-data:www-data $final_path/data/lastupdatecheck.txt +sudo chown www-data:www-data $final_path/data/log.txt +sudo chown www-data:www-data $final_path/data/updates.txt # Modify Nginx configuration file and copy it to Nginx conf directory sudo sed -i "s@YNH_WWW_PATH@$path@g" ../conf/nginx.conf sudo sed -i "s@YNH_ALIAS@$final_path@g" ../conf/nginx.conf -sudo cp ../conf/nginx.conf /etc/nginx/conf.d/$domain.d/shaarli.conf +sudo cp ../conf/nginx.conf /etc/nginx/conf.d/$domain.d/$app.conf # Reload Nginx and regenerate SSOwat conf if [ $is_public = "Yes" ]; then -sudo yunohost app setting shaarli unprotected_uris -v "/" +sudo yunohost app setting $app unprotected_uris -v "/" +elif [ $privateinstance = "Yes" ] ; then +# Configure SSOWat to prevent access for other users +sudo yunohost app setting $app allowed_users -v "$admin" fi sudo service nginx reload sudo yunohost app ssowatconf diff --git a/scripts/remove b/scripts/remove index ebd64ce..6cc1615 100644 --- a/scripts/remove +++ b/scripts/remove @@ -1,7 +1,20 @@ #!/bin/bash -domain=$(sudo yunohost app setting shaarli domain) +# This is a multi-instance app, meaning it can be installed several times independently +# The id of the app as stated in the manifest is available as $YNH_APP_ID +# The instance number is available as $YNH_APP_INSTANCE_NUMBER (equals "1", "2", ...) +# The app instance name is available as $YNH_APP_INSTANCE_NAME +# - the first time the app is installed, YNH_APP_INSTANCE_NAME = ynhexample +# - the second time the app is installed, YNH_APP_INSTANCE_NAME = ynhexample__2 +# - ynhexample__{N} for the subsequent installations, with N=3,4, ... +# The app instance name is probably what you are interested the most, since this is +# guaranteed to be unique. This is a good unique identifier to define installation path, +# db names, ... +app=$YNH_APP_INSTANCE_NAME -sudo rm -rf /var/www/shaarli -sudo rm -f /etc/nginx/conf.d/$domain.d/shaarli.conf -sudo rm -rf /home/yunohost.app/shaarli/data \ No newline at end of file +domain=$(sudo yunohost app setting $app domain) + +sudo rm -rf /var/www/$app +sudo rm -f /etc/nginx/conf.d/$domain.d/$app.conf + +sudo service nginx reload