diff --git a/README.md b/README.md index 607a312..3596fad 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,69 @@ # Moodle app for YunoHost -[![Install Moodle with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=Moodle)

-Version: **3.8.1** -Moodle - the world's open source learning platform +[![Integration level](https://dash.yunohost.org/integration/moodle.svg)](https://dash.yunohost.org/appci/app/moodle) +[![Install moodle with YunoHost](https://install-app.yunohost.org/install-with-yunohost.png)](https://install-app.yunohost.org/?app=moodle) -Moodle is a learning platform designed to provide -educators, administrators and learners with a single robust, secure and -integrated system to create personalised learning environments. +*[Lire ce readme en français.](./README_fr.md)* -Moodle is widely used around the world by universities, schools, companies and -all manner of organisations and individuals. +> *This package allow you to install moodle quickly and simply on a YunoHost server. +If you don't have YunoHost, please see [here](https://yunohost.org/#/install) to know how to install and enjoy it.* +## Overview +Moodle https://moodle.org is a learning platform designed to provide educators, administrators and learners with a single robust, secure and integrated system to create personalised learning environments. -### Installing guide +Moodle is widely used around the world by universities, schools, companies and all manner of organisations and individuals. - App can be installed by YunoHost **admin web-interface** or by **running following command**: +**Shipped version:** 3.8.2 - $ sudo yunohost app install https://github.com/YunoHost-Apps/moodle_ynh - - After install : - - 1. Login in moodle exemple : https://domain.tld/moodle - 2. Create admin account +## Screenshots - -### Upgrade this package: +![](https://upload.wikimedia.org/wikipedia/commons/3/36/Moodle_2.0_on_Firefox_4.0.png) - $ sudo yunohost app upgrade moodle -u https://github.com/YunoHost-Apps/moodle_ynh - - After upgrade : - - 1. If you have custom plugins or themes need to move your plugins - 2. Moodle is saved in /var/www/moodle.backup - 3. Moove your plugins / themes exemple "cp -a moodle.backup/mod/hvp moodle/mod/hvp" - 4. After moving your plugins and themes make "rm -r moodle.backup" - 5. Login in moodle for complete upgrade - -More informations : https://docs.moodle.org/26/en/Upgrading +## Demo +* [Official demo](https://sandbox.moodledemo.net/) +## Configuration -## To-do -- [X] Install script -- [X] Remove script -- [x] Upgrade script -- [X] Backup and Restore scripts(need testing) -- [ ] LDAP integration +How to configure this app: by an admin panel. + +## Documentation + + * Official documentation: https://docs.moodle.org/38/en/Main_page + +## YunoHost specific features + +#### Multi-users support + +Are LDAP and HTTP auth supported? *Yes* +Can the app be used by multiple users? *Yes* + +#### Supported architectures + +* x86-64b - [![Build Status](https://ci-apps.yunohost.org/ci/logs/moodle%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/moodle/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/moodle%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/moodle/) + +**More information on the documentation page:** +https://yunohost.org/packaging_apps + +## Links + + * Report a bug: https://github.com/YunoHost-Apps/moodle_ynh/issues + * App website: https://moodle.org/ + * Upstream app repository: http://git.moodle.org/ - https://github.com/moodle/moodle + * YunoHost website: https://yunohost.org/ + +--- + +Developers info +---------------- + +**Only if you want to use a testing branch for coding, instead of merging directly into master.** +Please do your pull request to the [testing branch](https://github.com/YunoHost-Apps/moodle_ynh/tree/testing). + +To try the testing branch, please proceed like that. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/moodle_ynh/tree/testing --debug +or +sudo yunohost app upgrade moodle -u https://github.com/YunoHost-Apps/moodle_ynh/tree/testing --debug +``` diff --git a/conf/app.src b/conf/app.src index 743fc5a..4b75f29 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,7 +1,6 @@ -SOURCE_URL=https://download.moodle.org/stable38/moodle-3.8.1.tgz -SOURCE_SUM=bec050a92f682cee03cb70abfc350b7741522898dd21f5b5847f5c2ddfdd785ad404f6f06ed17b31bfa031aebe42bd35e3a205de686bd8627e92b9a919addb4c -SOURCE_SUM_PRG=sha512sum -SOURCE_FORMAT=tar.gz +SOURCE_URL=https://download.moodle.org/stable38/moodle-3.8.2.zip +SOURCE_SUM=19504ee7fefd5797e0336bd993bb7c18b3f00ea02f3a35206e361c2defc4ea9b +SOURCE_SUM_PRG=sha256sum +SOURCE_FORMAT=zip SOURCE_IN_SUBDIR=true -SOURCE_EXTRACT=true -SOURCE_FILENAME=moodle.tgz +SOURCE_FILENAME= \ No newline at end of file diff --git a/conf/config.php b/conf/config.php deleted file mode 100644 index 6b3ca8b..0000000 --- a/conf/config.php +++ /dev/null @@ -1,884 +0,0 @@ -dbtype = 'pgsql'; // 'pgsql', 'mariadb', 'mysqli', 'mssql', 'sqlsrv' or 'oci' -$CFG->dblibrary = 'native'; // 'native' only at the moment -$CFG->dbhost = 'localhost'; // eg 'localhost' or 'db.isp.com' or IP -$CFG->dbname = 'YNH_DB_USER'; // database name, eg moodle -$CFG->dbuser = 'YNH_APP'; // your database username -$CFG->dbpass = 'YNH_DB_PWD'; // your database password -$CFG->prefix = 'mdl_'; // prefix to use for all table names -$CFG->dboptions = array( - 'dbpersist' => false, // should persistent database connections be - // used? set to 'false' for the most stable - // setting, 'true' can improve performance - // sometimes - 'dbsocket' => false, // should connection via UNIX socket be used? - // if you set it to 'true' or custom path - // here set dbhost to 'localhost', - // (please note mysql is always using socket - // if dbhost is 'localhost' - if you need - // local port connection use '127.0.0.1') - 'dbport' => '', // the TCP port number to use when connecting - // to the server. keep empty string for the - // default port - 'dbhandlesoptions' => false,// On PostgreSQL poolers like pgbouncer don't - // support advanced options on connection. - // If you set those in the database then - // the advanced settings will not be sent. - // 'dbcollation' => 'utf8mb4_unicode_ci', // MySQL has partial and full UTF-8 - // support. If you wish to use partial UTF-8 - // (three bytes) then set this option to - // 'utf8_unicode_ci', otherwise this option - // can be removed for MySQL (by default it will - // use 'utf8mb4_unicode_ci'. This option should - // be removed for all other databases. - // 'fetchbuffersize' => 100000, // On PostgreSQL, this option sets a limit - // on the number of rows that are fetched into - // memory when doing a large recordset query - // (e.g. search indexing). Default is 100000. - // Uncomment and set to a value to change it, - // or zero to turn off the limit. You need to - // set to zero if you are using pg_bouncer in - // 'transaction' mode (it is fine in 'session' - // mode). -); -//========================================================================= -// 2. WEB SITE LOCATION -//========================================================================= -// Now you need to tell Moodle where it is located. Specify the full -// web address to where moodle has been installed. If your web site -// is accessible via multiple URLs then choose the most natural one -// that your students would use. Do not include a trailing slash -// -// If you need both intranet and Internet access please read -// http://docs.moodle.org/en/masquerading -$CFG->wwwroot = 'https://YNH_DOMAINYNH_WWW_PATH'; -//========================================================================= -// 3. DATA FILES LOCATION -//========================================================================= -// Now you need a place where Moodle can save uploaded files. This -// directory should be readable AND WRITEABLE by the web server user -// (usually 'nobody' or 'apache'), but it should not be accessible -// directly via the web. -// -// - On hosting systems you might need to make sure that your "group" has -// no permissions at all, but that "others" have full permissions. -// -// - On Windows systems you might specify something like 'c:\moodledata' -$CFG->dataroot = 'YNH_VAR_ROOT'; -//========================================================================= -// 4. DATA FILES PERMISSIONS -//========================================================================= -// The following parameter sets the permissions of new directories -// created by Moodle within the data directory. The format is in -// octal format (as used by the Unix utility chmod, for example). -// The default is usually OK, but you may want to change it to 0750 -// if you are concerned about world-access to the files (you will need -// to make sure the web server process (eg Apache) can access the files. -// NOTE: the prefixed 0 is important, and don't use quotes. -$CFG->directorypermissions = 02777; -//========================================================================= -// 5. DIRECTORY LOCATION (most people can just ignore this setting) -//========================================================================= -// A very few webhosts use /admin as a special URL for you to access a -// control panel or something. Unfortunately this conflicts with the -// standard location for the Moodle admin pages. You can work around this -// by renaming the admin directory in your installation, and putting that -// new name here. eg "moodleadmin". This should fix all admin links in Moodle. -// After any change you need to visit your new admin directory -// and purge all caches. -$CFG->admin = 'admin'; -//========================================================================= -// 6. OTHER MISCELLANEOUS SETTINGS (ignore these for new installations) -//========================================================================= -// -// These are additional tweaks for which no GUI exists in Moodle yet. -// -// Starting in PHP 5.3 administrators should specify default timezone -// in PHP.ini, you can also specify it here if needed. -// See details at: http://php.net/manual/en/function.date-default-timezone-set.php -// List of time zones at: http://php.net/manual/en/timezones.php -// date_default_timezone_set('Australia/Perth'); -// -// Change the key pair lifetime for Moodle Networking -// The default is 28 days. You would only want to change this if the key -// was not getting regenerated for any reason. You would probably want -// make it much longer. Note that you'll need to delete and manually update -// any existing key. -// $CFG->mnetkeylifetime = 28; -// -// Not recommended: Set the following to true to allow the use -// off non-Moodle standard characters in usernames. -// $CFG->extendedusernamechars = true; -// -// Allow user passwords to be included in backup files. Very dangerous -// setting as far as it publishes password hashes that can be unencrypted -// if the backup file is publicy available. Use it only if you can guarantee -// that all your backup files remain only privacy available and are never -// shared out from your site/institution! -// $CFG->includeuserpasswordsinbackup = true; -// -// Completely disable user creation when restoring a course, bypassing any -// permissions granted via roles and capabilities. Enabling this setting -// results in the restore process stopping when a user attempts to restore a -// course requiring users to be created. -// $CFG->disableusercreationonrestore = true; -// -// Keep the temporary directories used by backup and restore without being -// deleted at the end of the process. Use it if you want to debug / view -// all the information stored there after the process has ended. Note that -// those directories may be deleted (after some ttl) both by cron and / or -// by new backup / restore invocations. -// $CFG->keeptempdirectoriesonbackup = true; -// -// Modify the restore process in order to force the "user checks" to assume -// that the backup originated from a different site, so detection of matching -// users is performed with different (more "relaxed") rules. Note that this is -// only useful if the backup file has been created using Moodle < 1.9.4 and the -// site has been rebuilt from scratch using backup files (not the best way btw). -// If you obtain user conflicts on restore, rather than enabling this setting -// permanently, try restoring the backup on a different site, back it up again -// and then restore on the target server. -// $CFG->forcedifferentsitecheckingusersonrestore = true; -// -// Force the backup system to continue to create backups in the legacy zip -// format instead of the new tgz format. Does not affect restore, which -// auto-detects the underlying file format. -// $CFG->usezipbackups = true; -// -// Prevent stats processing and hide the GUI -// $CFG->disablestatsprocessing = true; -// -// Setting this to true will enable admins to edit any post at any time -// $CFG->admineditalways = true; -// -// These variables define DEFAULT block variables for new courses -// If this one is set it overrides all others and is the only one used. -// $CFG->defaultblocks_override = 'participants,activity_modules,search_forums,course_list:news_items,calendar_upcoming,recent_activity'; -// -// These variables define the specific settings for defined course formats. -// They override any settings defined in the formats own config file. -// $CFG->defaultblocks_site = 'site_main_menu,course_list:course_summary,calendar_month'; -// $CFG->defaultblocks_social = 'participants,search_forums,calendar_month,calendar_upcoming,social_activities,recent_activity,course_list'; -// $CFG->defaultblocks_topics = 'participants,activity_modules,search_forums,course_list:news_items,calendar_upcoming,recent_activity'; -// $CFG->defaultblocks_weeks = 'participants,activity_modules,search_forums,course_list:news_items,calendar_upcoming,recent_activity'; -// -// These blocks are used when no other default setting is found. -// $CFG->defaultblocks = 'participants,activity_modules,search_forums,course_list:news_items,calendar_upcoming,recent_activity'; -// -// You can specify a different class to be created for the $PAGE global, and to -// compute which blocks appear on each page. However, I cannot think of any good -// reason why you would need to change that. It just felt wrong to hard-code the -// the class name. You are strongly advised not to use these to settings unless -// you are absolutely sure you know what you are doing. -// $CFG->moodlepageclass = 'moodle_page'; -// $CFG->moodlepageclassfile = "$CFG->dirroot/local/myplugin/mypageclass.php"; -// $CFG->blockmanagerclass = 'block_manager'; -// $CFG->blockmanagerclassfile = "$CFG->dirroot/local/myplugin/myblockamanagerclass.php"; -// -// Seconds for files to remain in caches. Decrease this if you are worried -// about students being served outdated versions of uploaded files. -// $CFG->filelifetime = 60*60*6; -// -// Some web servers can offload the file serving from PHP process, -// comment out one the following options to enable it in Moodle: -// $CFG->xsendfile = 'X-Sendfile'; // Apache {@see https://tn123.org/mod_xsendfile/} -// $CFG->xsendfile = 'X-LIGHTTPD-send-file'; // Lighttpd {@see http://redmine.lighttpd.net/projects/lighttpd/wiki/X-LIGHTTPD-send-file} -// $CFG->xsendfile = 'X-Accel-Redirect'; // Nginx {@see http://wiki.nginx.org/XSendfile} -// If your X-Sendfile implementation (usually Nginx) uses directory aliases specify them -// in the following array setting: -// $CFG->xsendfilealiases = array( -// '/dataroot/' => $CFG->dataroot, -// '/cachedir/' => '/var/www/moodle/cache', // for custom $CFG->cachedir locations -// '/localcachedir/' => '/var/local/cache', // for custom $CFG->localcachedir locations -// '/tempdir/' => '/var/www/moodle/temp', // for custom $CFG->tempdir locations -// '/filedir' => '/var/www/moodle/filedir', // for custom $CFG->filedir locations -// ); -// -// YUI caching may be sometimes improved by slasharguments: -// $CFG->yuislasharguments = 1; -// Some servers may need a special rewrite rule to work around internal path length limitations: -// RewriteRule (^.*/theme/yui_combo\.php)(/.*) $1?file=$2 -// -// -// Following settings may be used to select session driver, uncomment only one of the handlers. -// Database session handler (not compatible with MyISAM): -// $CFG->session_handler_class = '\core\session\database'; -// $CFG->session_database_acquire_lock_timeout = 120; -// -// File session handler (file system locking required): -// $CFG->session_handler_class = '\core\session\file'; -// $CFG->session_file_save_path = $CFG->dataroot.'/sessions'; -// -// Memcached session handler (requires memcached server and extension): -// $CFG->session_handler_class = '\core\session\memcached'; -// $CFG->session_memcached_save_path = '127.0.0.1:11211'; -// $CFG->session_memcached_prefix = 'memc.sess.key.'; -// $CFG->session_memcached_acquire_lock_timeout = 120; -// $CFG->session_memcached_lock_expire = 7200; // Ignored if PECL memcached is below version 2.2.0 -// $CFG->session_memcached_lock_retry_sleep = 150; // Spin-lock retry sleeptime (msec). Only effective -// // for tuning php-memcached 3.0.x (PHP 7) -// -// Redis session handler (requires redis server and redis extension): -// $CFG->session_handler_class = '\core\session\redis'; -// $CFG->session_redis_host = '127.0.0.1'; -// $CFG->session_redis_port = 6379; // Optional. -// $CFG->session_redis_database = 0; // Optional, default is db 0. -// $CFG->session_redis_auth = ''; // Optional, default is don't set one. -// $CFG->session_redis_prefix = ''; // Optional, default is don't set one. -// $CFG->session_redis_acquire_lock_timeout = 120; -// $CFG->session_redis_lock_expire = 7200; -// Use the igbinary serializer instead of the php default one. Note that phpredis must be compiled with -// igbinary support to make the setting to work. Also, if you change the serializer you have to flush the database! -// $CFG->session_redis_serializer_use_igbinary = false; // Optional, default is PHP builtin serializer. -// -// Memcache session handler (requires memcached server and memcache extension): -// $CFG->session_handler_class = '\core\session\memcache'; -// $CFG->session_memcache_save_path = '127.0.0.1:11211'; -// $CFG->session_memcache_acquire_lock_timeout = 120; -// ** NOTE: Memcache extension has less features than memcached and may be -// less reliable. Use memcached where possible or if you encounter -// session problems. ** -// -// Please be aware that when selecting either Memcached or Memcache for sessions that it is advised to use a dedicated -// memcache server. The memcache and memcached extensions do not provide isolated environments for individual uses. -// Using the same server for other purposes (MUC for example) can lead to sessions being prematurely removed should -// the other uses of the server purge the cache. -// -// Following setting allows you to alter how frequently is timemodified updated in sessions table. -// $CFG->session_update_timemodified_frequency = 20; // In seconds. -// -// If this setting is set to true, then Moodle will track the IP of the -// current user to make sure it hasn't changed during a session. This -// will prevent the possibility of sessions being hijacked via XSS, but it -// may break things for users coming using proxies that change all the time, -// like AOL. -// $CFG->tracksessionip = true; -// -// The following lines are for handling email bounces. -// $CFG->handlebounces = true; -// $CFG->minbounces = 10; -// $CFG->bounceratio = .20; -// The next lines are needed both for bounce handling and any other email to module processing. -// mailprefix must be EXACTLY four characters. -// Uncomment and customise this block for Postfix -// $CFG->mailprefix = 'mdl+'; // + is the separator for Exim and Postfix. -// $CFG->mailprefix = 'mdl-'; // - is the separator for qmail -// $CFG->maildomain = 'youremaildomain.com'; -// -// Enable when setting up advanced reverse proxy load balancing configurations, -// it may be also necessary to enable this when using port forwarding. -// $CFG->reverseproxy = true; -// -// Enable when using external SSL appliance for performance reasons. -// Please note that site may be accessible via http: or https:, but not both! -// $CFG->sslproxy = true; -// -// This setting will cause the userdate() function not to fix %d in -// date strings, and just let them show with a zero prefix. -// $CFG->nofixday = true; -// -// This setting will make some graphs (eg user logs) use lines instead of bars -// $CFG->preferlinegraphs = true; -// -// This setting allows you to specify a class to rewrite outgoing urls -// enabling 'clean urls' in conjunction with an apache / nginx handler. -// The handler must implement \core\output\url_rewriter. -// $CFG->urlrewriteclass = '\local_cleanurls\url_rewriter'; -// -// Enabling this will allow custom scripts to replace existing moodle scripts. -// For example: if $CFG->customscripts/course/view.php exists then -// it will be used instead of $CFG->wwwroot/course/view.php -// At present this will only work for files that include config.php and are called -// as part of the url (index.php is implied). -// Some examples are: -// http://my.moodle.site/course/view.php -// http://my.moodle.site/index.php -// http://my.moodle.site/admin (index.php implied) -// Custom scripts should not include config.php -// Warning: Replacing standard moodle scripts may pose security risks and/or may not -// be compatible with upgrades. Use this option only if you are aware of the risks -// involved. -// Specify the full directory path to the custom scripts -// $CFG->customscripts = '/home/example/customscripts'; -// -// Performance profiling -// -// If you set Debug to "Yes" in the Configuration->Variables page some -// performance profiling data will show up on your footer (in default theme). -// With these settings you get more granular control over the capture -// and printout of the data -// -// Capture performance profiling data -// define('MDL_PERF' , true); -// -// Capture additional data from DB -// define('MDL_PERFDB' , true); -// -// Print to log (for passive profiling of production servers) -// define('MDL_PERFTOLOG' , true); -// -// Print to footer (works with the default theme) -// define('MDL_PERFTOFOOT', true); -// -// Enable earlier profiling that causes more code to be covered -// on every request (db connections, config load, other inits...). -// Requires extra configuration to be defined in config.php like: -// profilingincluded, profilingexcluded, profilingautofrec, -// profilingallowme, profilingallowall, profilinglifetime -// $CFG->earlyprofilingenabled = true; -// -// Force displayed usernames -// A little hack to anonymise user names for all students. If you set these -// then all non-teachers will always see these for every person. -// $CFG->forcefirstname = 'Bruce'; -// $CFG->forcelastname = 'Simpson'; -// -// The following setting will turn on username logging into Apache log. For full details regarding setting -// up of this function please refer to the install section of the document. -// $CFG->apacheloguser = 0; // Turn this feature off. Default value. -// $CFG->apacheloguser = 1; // Log user id. -// $CFG->apacheloguser = 2; // Log full name in cleaned format. ie, Darth Vader will be displayed as darth_vader. -// $CFG->apacheloguser = 3; // Log username. -// To get the values logged in Apache's log, add to your httpd.conf -// the following statements. In the General part put: -// LogFormat "%h %l %{MOODLEUSER}n %t \"%r\" %s %b \"%{Referer}i\" \"%{User-Agent}i\"" moodleformat -// And in the part specific to your Moodle install / virtualhost: -// CustomLog "/your/path/to/log" moodleformat -// -// Alternatively for other webservers such as nginx, you can instead have the username sent via a http header -// 'X-MOODLEUSER' which can be saved in the logfile and then stripped out before being sent to the browser: -// $CFG->headerloguser = 0; // Turn this feature off. Default value. -// $CFG->headerloguser = 1; // Log user id. -// $CFG->headerloguser = 2; // Log full name in cleaned format. ie, Darth Vader will be displayed as darth_vader. -// $CFG->headerloguser = 3; // Log username. -// -// CAUTION: Use of this option will expose usernames in the Apache / nginx log, -// If you are going to publish your log, or the output of your web stats analyzer -// this will weaken the security of your website. -// -// Email database connection errors to someone. If Moodle cannot connect to the -// database, then email this address with a notice. -// -// $CFG->emailconnectionerrorsto = 'your@emailaddress.com'; -// -// Set the priority of themes from highest to lowest. This is useful (for -// example) in sites where the user theme should override all other theme -// settings for accessibility reasons. You can also disable types of themes -// (other than site) by removing them from the array. The default setting is: -// -// $CFG->themeorder = array('course', 'category', 'session', 'user', 'cohort', 'site'); -// -// NOTE: course, category, session, user, cohort themes still require the -// respective settings to be enabled -// -// It is possible to add extra themes directory stored outside of $CFG->dirroot. -// This local directory does not have to be accessible from internet. -// -// $CFG->themedir = '/location/of/extra/themes'; -// -// It is possible to specify different cache and temp directories, use local fast filesystem -// for normal web servers. Server clusters MUST use shared filesystem for cachedir! -// Localcachedir is intended for server clusters, it does not have to be shared by cluster nodes. -// The directories must not be accessible via web. -// -// $CFG->tempdir = '/var/www/moodle/temp'; // Directory MUST BE SHARED by all cluster nodes. -// $CFG->cachedir = '/var/www/moodle/cache'; // Directory MUST BE SHARED by all cluster nodes, locking required. -// $CFG->localcachedir = '/var/local/cache'; // Intended for local node caching. -// -// It is possible to specify a different backup temp directory, use local fast filesystem -// for normal web servers. Server clusters MUST use shared filesystem for backuptempdir! -// The directory must not be accessible via web. -// -// $CFG->backuptempdir = '/var/www/moodle/backuptemp'; // Directory MUST BE SHARED by all cluster nodes. -// -// Some filesystems such as NFS may not support file locking operations. -// Locking resolves race conditions and is strongly recommended for production servers. -// $CFG->preventfilelocking = false; -// -// Site default language can be set via standard administration interface. If you -// want to have initial error messages for eventual database connection problems -// localized too, you have to set your language code here. -// -// $CFG->lang = 'yourlangcode'; // for example 'cs' -// -// When Moodle is about to perform an intensive operation it raises PHP's memory -// limit. The following setting should be used on large sites to set the raised -// memory limit to something higher. -// The value for the settings should be a valid PHP memory value. e.g. 512M, 1G -// -// $CFG->extramemorylimit = '1024M'; -// -// Moodle 2.4 introduced a new cache API. -// The cache API stores a configuration file within the Moodle data directory and -// uses that rather than the database in order to function in a stand-alone manner. -// Using altcacheconfigpath you can change the location where this config file is -// looked for. -// It can either be a directory in which to store the file, or the full path to the -// file if you want to take full control. Either way it must be writable by the -// webserver. -// -// $CFG->altcacheconfigpath = '/var/www/shared/moodle.cache.config.php -// -// Use the following flag to completely disable the Available update notifications -// feature and hide it from the server administration UI. -// -// $CFG->disableupdatenotifications = true; -// -// Use the following flag to completely disable the installation of plugins -// (new plugins, available updates and missing dependencies) and related -// features (such as cancelling the plugin installation or upgrade) via the -// server administration web interface. -// -// $CFG->disableupdateautodeploy = true; -// -// Use the following flag to disable the warning on the system notifications page -// about present development libraries. This flag will not disable the warning within -// the security overview report. Use this flag only if you really have prohibited web -// access to the development libraries in your webserver configuration. -// -// $CFG->disabledevlibdirscheck = true; -// -// Use the following flag to disable modifications to scheduled tasks -// whilst still showing the state of tasks. -// -// $CFG->preventscheduledtaskchanges = true; -// -// As of version 2.4 Moodle serves icons as SVG images if the users browser appears -// to support SVG. -// For those wanting to control the serving of SVG images the following setting can -// be defined in your config.php. -// If it is not defined then the default (browser detection) will occur. -// -// To ensure they are always used when available: -// $CFG->svgicons = true; -// -// To ensure they are never used even when available: -// $CFG->svgicons = false; -// -// Some administration options allow setting the path to executable files. This can -// potentially cause a security risk. Set this option to true to disable editing -// those config settings via the web. They will need to be set explicitly in the -// config.php file -// $CFG->preventexecpath = true; -// -// Use the following flag to set userid for noreply user. If not set then moodle will -// create dummy user and use -ve value as user id. -// $CFG->noreplyuserid = -10; -// -// As of version 2.6 Moodle supports admin to set support user. If not set, all mails -// will be sent to supportemail. -// $CFG->supportuserid = -20; -// -// Moodle 2.7 introduces a locking api for critical tasks (e.g. cron). -// The default locking system to use is DB locking for Postgres, and file locking for -// MySQL, Oracle and SQLServer. If $CFG->preventfilelocking is set, then the default -// will always be DB locking. It can be manually set to one of the lock -// factory classes listed below, or one of your own custom classes implementing the -// \core\lock\lock_factory interface. -// -// $CFG->lock_factory = "auto"; -// -// The list of available lock factories is: -// -// "\\core\\lock\\file_lock_factory" - File locking -// Uses lock files stored by default in the dataroot. Whether this -// works on clusters depends on the file system used for the dataroot. -// -// "\\core\\lock\\db_record_lock_factory" - DB locking based on table rows. -// -// "\\core\\lock\\postgres_lock_factory" - DB locking based on postgres advisory locks. -// -// Settings used by the lock factories -// -// Location for lock files used by the File locking factory. This must exist -// on a shared file system that supports locking. -// $CFG->lock_file_root = $CFG->dataroot . '/lock'; -// -// Moodle 2.9 allows administrators to customise the list of supported file types. -// To add a new filetype or override the definition of an existing one, set the -// customfiletypes variable like this: -// -// $CFG->customfiletypes = array( -// (object)array( -// 'extension' => 'frog', -// 'icon' => 'archive', -// 'type' => 'application/frog', -// 'customdescription' => 'Amphibian-related file archive' -// ) -// ); -// -// The extension, icon, and type fields are required. The icon field can refer to -// any icon inside the pix/f folder. You can also set the customdescription field -// (shown above) and (for advanced use) the groups, string, and defaulticon fields. -// -// Upgrade key -// -// If the upgrade key is defined here, then the value must be provided every time -// the site is being upgraded though the web interface, regardless of whether the -// administrator is logged in or not. This prevents anonymous access to the upgrade -// screens where the real authentication and authorization mechanisms can not be -// relied on. -// -// It is strongly recommended to use a value different from your real account -// password. -// -// $CFG->upgradekey = 'put_some_password-like_value_here'; -// -//========================================================================= -// 7. SETTINGS FOR DEVELOPMENT SERVERS - not intended for production use!!! -//========================================================================= -// -// Force a debugging mode regardless the settings in the site administration -// @error_reporting(E_ALL | E_STRICT); // NOT FOR PRODUCTION SERVERS! -// @ini_set('display_errors', '1'); // NOT FOR PRODUCTION SERVERS! -// $CFG->debug = (E_ALL | E_STRICT); // === DEBUG_DEVELOPER - NOT FOR PRODUCTION SERVERS! -// $CFG->debugdisplay = 1; // NOT FOR PRODUCTION SERVERS! -// -// You can specify a comma separated list of user ids that that always see -// debug messages, this overrides the debug flag in $CFG->debug and $CFG->debugdisplay -// for these users only. -// $CFG->debugusers = '2'; -// -// Prevent theme caching -// $CFG->themedesignermode = true; // NOT FOR PRODUCTION SERVERS! -// -// Enable verbose debug information during fetching of email messages from IMAP server. -// $CFG->debugimap = true; -// -// Prevent JS caching -// $CFG->cachejs = false; // NOT FOR PRODUCTION SERVERS! -// -// Restrict which YUI logging statements are shown in the browser console. -// For details see the upstream documentation: -// http://yuilibrary.com/yui/docs/api/classes/config.html#property_logInclude -// http://yuilibrary.com/yui/docs/api/classes/config.html#property_logExclude -// $CFG->yuiloginclude = array( -// 'moodle-core-dock-loader' => true, -// 'moodle-course-categoryexpander' => true, -// ); -// $CFG->yuilogexclude = array( -// 'moodle-core-dock' => true, -// 'moodle-core-notification' => true, -// ); -// -// Set the minimum log level for YUI logging statements. -// For details see the upstream documentation: -// http://yuilibrary.com/yui/docs/api/classes/config.html#property_logLevel -// $CFG->yuiloglevel = 'debug'; -// -// Prevent core_string_manager application caching -// $CFG->langstringcache = false; // NOT FOR PRODUCTION SERVERS! -// -// When working with production data on test servers, no emails or other messages -// should ever be send to real users -// $CFG->noemailever = true; // NOT FOR PRODUCTION SERVERS! -// -// Divert all outgoing emails to this address to test and debug emailing features -// $CFG->divertallemailsto = 'root@localhost.local'; // NOT FOR PRODUCTION SERVERS! -// -// Except for certain email addresses you want to let through for testing. Accepts -// a comma separated list of regexes. -// $CFG->divertallemailsexcept = 'tester@dev.com, fred(\+.*)?@example.com'; // NOT FOR PRODUCTION SERVERS! -// -// Uncomment if you want to allow empty comments when modifying install.xml files. -// $CFG->xmldbdisablecommentchecking = true; // NOT FOR PRODUCTION SERVERS! -// -// Since 2.0 sql queries are not shown during upgrade by default. -// Please note that this setting may produce very long upgrade page on large sites. -// $CFG->upgradeshowsql = true; // NOT FOR PRODUCTION SERVERS! -// -// Add SQL queries to the output of cron, just before their execution -// $CFG->showcronsql = true; -// -// Force developer level debug and add debug info to the output of cron -// $CFG->showcrondebugging = true; -// -//========================================================================= -// 8. FORCED SETTINGS -//========================================================================= -// It is possible to specify normal admin settings here, the point is that -// they can not be changed through the standard admin settings pages any more. -// -// Core settings are specified directly via assignment to $CFG variable. -// Example: -// $CFG->somecoresetting = 'value'; -// -// Plugin settings have to be put into a special array. -// Example: -// $CFG->forced_plugin_settings = array('pluginname' => array('settingname' => 'value', 'secondsetting' => 'othervalue'), -// 'otherplugin' => array('mysetting' => 'myvalue', 'thesetting' => 'thevalue')); -// Module default settings with advanced/locked checkboxes can be set too. To do this, add -// an extra config with '_adv' or '_locked' as a suffix and set the value to true or false. -// Example: -// $CFG->forced_plugin_settings = array('pluginname' => array('settingname' => 'value', 'settingname_locked' => true, 'settingname_adv' => true)); -// -//========================================================================= -// 9. PHPUNIT SUPPORT -//========================================================================= -// $CFG->phpunit_prefix = 'phpu_'; -// $CFG->phpunit_dataroot = '/home/example/phpu_moodledata'; -// $CFG->phpunit_directorypermissions = 02777; // optional -// $CFG->phpunit_profilingenabled = true; // optional to profile PHPUnit runs. -// -// -//========================================================================= -// 10. SECRET PASSWORD SALT -//========================================================================= -// A site-wide password salt is no longer used in new installations. -// If upgrading from 2.6 or older, keep all existing salts in config.php file. -// -// $CFG->passwordsaltmain = 'a_very_long_random_string_of_characters#@6&*1'; -// -// You may also have some alternative salts to allow migration from previously -// used salts. -// -// $CFG->passwordsaltalt1 = ''; -// $CFG->passwordsaltalt2 = ''; -// $CFG->passwordsaltalt3 = ''; -// .... -// $CFG->passwordsaltalt19 = ''; -// $CFG->passwordsaltalt20 = ''; -// -// -//========================================================================= -// 11. BEHAT SUPPORT -//========================================================================= -// Behat test site needs a unique www root, data directory and database prefix: -// -// $CFG->behat_wwwroot = 'http://127.0.0.1/moodle'; -// $CFG->behat_prefix = 'bht_'; -// $CFG->behat_dataroot = '/home/example/bht_moodledata'; -// -// You can override default Moodle configuration for Behat and add your own -// params; here you can add more profiles, use different Mink drivers than Selenium... -// These params would be merged with the default Moodle behat.yml, giving priority -// to the ones specified here. The array format is YAML, following the Behat -// params hierarchy. More info: http://docs.behat.org/guides/7.config.html -// Example: -// $CFG->behat_config = array( -// 'Mac-Firefox' => array( -// 'suites' => array ( -// 'default' => array( -// 'filters' => array( -// 'tags' => '~@_file_upload' -// ), -// ), -// ), -// 'extensions' => array( -// 'Behat\MinkExtension' => array( -// 'selenium2' => array( -// 'browser' => 'firefox', -// 'capabilities' => array( -// 'platform' => 'OS X 10.6', -// 'version' => 20 -// ) -// ) -// ) -// ) -// ), -// 'Mac-Safari' => array( -// 'extensions' => array( -// 'Behat\MinkExtension' => array( -// 'selenium2' => array( -// 'browser' => 'safari', -// 'capabilities' => array( -// 'platform' => 'OS X 10.8', -// 'version' => 6 -// ) -// ) -// ) -// ) -// ) -// ); -// You can also use the following config to override default Moodle configuration for Behat. -// This config is limited to default suite and will be supported in later versions. -// It will have precedence over $CFG->behat_config. -// $CFG->behat_profiles = array( -// 'phantomjs' => array( -// 'browser' => 'phantomjs', -// 'tags' => '~@_file_upload&&~@_alert&&~@_bug_phantomjs', -// 'wd_host' => 'http://127.0.0.1:4443/wd/hub', -// 'capabilities' => array( -// 'platform' => 'Linux', -// 'version' => 2.1 -// ) -// ), -// ); -// -// You can force the browser session (not user's sessions) to restart after N seconds. This could -// be useful if you are using a cloud-based service with time restrictions in the browser side. -// Setting this value the browser session that Behat is using will be restarted. Set the time in -// seconds. Is not recommended to use this setting if you don't explicitly need it. -// Example: -// $CFG->behat_restart_browser_after = 7200; // Restarts the browser session after 2 hours -// -// All this page's extra Moodle settings are compared against a white list of allowed settings -// (the basic and behat_* ones) to avoid problems with production environments. This setting can be -// used to expand the default white list with an array of extra settings. -// Example: -// $CFG->behat_extraallowedsettings = array('somecoresetting', ...); -// -// You should explicitly allow the usage of the deprecated behat steps, otherwise an exception will -// be thrown when using them. The setting is disabled by default. -// Example: -// $CFG->behat_usedeprecated = true; -// -// Including feature files from directories outside the dirroot is possible if required. The setting -// requires that the running user has executable permissions on all parent directories in the paths. -// Example: -// $CFG->behat_additionalfeatures = array('/home/developer/code/wipfeatures'); -// -// You can make behat save several dumps when a scenario fails. The dumps currently saved are: -// * a dump of the DOM in it's state at the time of failure; and -// * a screenshot (JavaScript is required for the screenshot functionality, so not all browsers support this option) -// Example: -// $CFG->behat_faildump_path = '/my/path/to/save/failure/dumps'; -// -// You can specify db, selenium wd_host etc. for behat parallel run by setting following variable. -// Example: -// $CFG->behat_parallel_run = array ( -// array ( -// 'dbtype' => 'mysqli', -// 'dblibrary' => 'native', -// 'dbhost' => 'localhost', -// 'dbname' => 'moodletest', -// 'dbuser' => 'moodle', -// 'dbpass' => 'moodle', -// 'behat_prefix' => 'mdl_', -// 'wd_host' => 'http://127.0.0.1:4444/wd/hub', -// 'behat_wwwroot' => 'http://127.0.0.1/moodle', -// 'behat_dataroot' => '/home/example/bht_moodledata' -// ), -// ); -// -// To change name of behat parallel run site, define BEHAT_PARALLEL_SITE_NAME and parallel run sites will be suffixed -// with this value -// Example: -// define('BEHAT_PARALLEL_SITE_NAME', 'behatparallelsite'); -// -// Command line output for parallel behat install is limited to 80 chars, if you are installing more then 4 sites and -// want to expand output to more then 80 chars, then define BEHAT_MAX_CMD_LINE_OUTPUT -// Example: -// define('BEHAT_MAX_CMD_LINE_OUTPUT', 120); -// -// Behat feature files will be distributed randomly between the processes by default. If you have timing file or want -// to create timing file then define BEHAT_FEATURE_TIMING_FILE with path to timing file. It will be updated for each -// run with latest time taken to execute feature. -// Example: -// define('BEHAT_FEATURE_TIMING_FILE', '/PATH_TO_TIMING_FILE/timing.json'); -// -// If you don't have timing file and want some stable distribution of features, then you can use step counts to -// distribute the features. You can generate step file by executing php admin/tool/behat/cli/util.php --updatesteps -// this will update step file which is defined by BEHAT_FEATURE_STEP_FILE. -// Example: -// define('BEHAT_FEATURE_STEP_FILE', '/PATH_TO_FEATURE_STEP_COUNT_FILE/stepcount.json'); -// -// Feature distribution for each process is displayed as histogram. you can disable it by setting -// BEHAT_DISABLE_HISTOGRAM -// Example: -// define('BEHAT_DISABLE_HISTOGRAM', true); -// -//========================================================================= -// 12. DEVELOPER DATA GENERATOR -//========================================================================= -// -// The developer data generator tool is intended to be used only in development or testing sites and -// it's usage in production environments is not recommended; if it is used to create JMeter test plans -// is even less recommended as JMeter needs to log in as site course users. JMeter needs to know the -// users passwords but would be dangerous to have a default password as everybody would know it, which would -// be specially dangerouse if somebody uses this tool in a production site, so in order to prevent unintended -// uses of the tool and undesired accesses as well, is compulsory to set a password for the users -// generated by this tool, but only in case you want to generate a JMeter test. The value should be a string. -// Example: -// $CFG->tool_generator_users_password = 'examplepassword'; -// -//========================================================================= -// 13. SYSTEM PATHS (You need to set following, depending on your system) -//========================================================================= -// Ghostscript path. -// On most Linux installs, this can be left as '/usr/bin/gs'. -// On Windows it will be something like 'c:\gs\bin\gswin32c.exe' (make sure -// there are no spaces in the path - if necessary copy the files 'gswin32c.exe' -// and 'gsdll32.dll' to a new folder without a space in the path) -// $CFG->pathtogs = '/usr/bin/gs'; -// -// Path to du. -// Probably something like /usr/bin/du. If you enter this, pages that display -// directory contents will run much faster for directories with a lot of files. -// $CFG->pathtodu = ''; -// -// Path to aspell. -// To use spell-checking within the editor, you MUST have aspell 0.50 or later -// installed on your server, and you must specify the correct path to access the -// aspell binary. On Unix/Linux systems, this path is usually /usr/bin/aspell, -// but it might be something else. -// $CFG->aspellpath = ''; -// -// Path to dot. -// Probably something like /usr/bin/dot. To be able to generate graphics from -// DOT files, you must have installed the dot executable and point to it here. -// Note that, for now, this only used by the profiling features -// (Development->Profiling) built into Moodle. -// $CFG->pathtodot = ''; -// -// Path to unoconv. -// Probably something like /usr/bin/unoconv. Used as a fallback to convert between document formats. -// Unoconv is used convert between file formats supported by LibreOffice. -// Use a recent version of unoconv ( >= 0.7 ), older versions have trouble running from a webserver. -// $CFG->pathtounoconv = ''; -// -//========================================================================= -// 14. ALTERNATIVE FILE SYSTEM SETTINGS -//========================================================================= -// -// Alternative file system. -// Since 3.3 it is possible to override file_storage and file_system API and use alternative storage systems (e.g. S3, -// Rackspace Cloud Files, Google Cloud Storage, Azure Storage, etc.). -// To set the alternative file storage system in config.php you can use the following setting, providing the -// alternative system class name that will be auto-loaded by file_storage API. -// -// $CFG->alternative_file_system_class = '\\local_myfilestorage\\file_system'; -// -//========================================================================= -// ALL DONE! To continue installation, visit your main page with a browser -//========================================================================= -require_once(__DIR__ . '/lib/setup.php'); // Do not edit -// There is no php closing tag in this file, -// it is intentional because it prevents trailing whitespace problems! diff --git a/conf/cron b/conf/cron index 6027f3d..f38896d 100644 --- a/conf/cron +++ b/conf/cron @@ -1 +1 @@ -* * * * * /usr/bin/php YNH_DOMAIN/admin/cli/cron.php >/dev/null +*/15 * * * * /usr/bin/php__YNH_PHP_VERSION__ __FINAL_PATH__/admin/cli/cron.php >/dev/null diff --git a/conf/nginx.conf b/conf/nginx.conf index 74fc4df..1efbff7 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,29 +1,23 @@ -location __PATH__ { +#sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; +location __PATH__/ { # Path to source alias __FINALPATH__/ ; + # Force usage of https if ($scheme = http) { rewrite ^ https://$server_name$request_uri? permanent; } - # Example PHP configuration (remove if not used) index index.php; - # Common parameter to increase upload size limit in conjuction with dedicated php-fpm file + # Common parameter to increase upload size limit in conjunction with dedicated php-fpm file #client_max_body_size 50M; try_files $uri $uri/ index.php; location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; - fastcgi_pass unix:/var/run/php5-fpm-__NAME__.sock; - - # If you don't use a dedicated fpm config for your app, - # use a general fpm pool. - # This is to be used INSTEAD of line above - # Don't forget to adjust scripts install/upgrade/remove/backup accordingly - # - #fastcgi_pass unix:/var/run/php5-fpm.sock; + fastcgi_pass unix:/var/run/php/php__YNH_PHP_VERSION__-fpm-__NAME__.sock; fastcgi_index index.php; include fastcgi_params; @@ -31,7 +25,6 @@ location __PATH__ { fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $request_filename; } - # PHP configuration end # Include SSOWAT user panel. include conf.d/yunohost_panel.conf.inc; diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf index 2aec4a2..ab1a471 100644 --- a/conf/php-fpm.conf +++ b/conf/php-fpm.conf @@ -1,10 +1,11 @@ ; Start a new pool named 'www'. -; the variable $pool can we used in any directive and will be replaced by the +; the variable $pool can be used in any directive and will be replaced by the ; pool name ('www' here) [__NAMETOCHANGE__] ; Per pool prefix ; It only applies on the following directives: +; - 'access.log' ; - 'slowlog' ; - 'listen' (unixsocket) ; - 'chroot' @@ -24,17 +25,19 @@ group = __USER__ ; The address on which to accept FastCGI requests. ; Valid syntaxes are: -; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific address on +; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on ; a specific port; -; 'port' - to listen on a TCP socket to all addresses on a -; specific port; +; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on +; a specific port; +; 'port' - to listen on a TCP socket to all addresses +; (IPv6 and IPv4-mapped) on a specific port; ; '/path/to/unix/socket' - to listen on a unix socket. ; Note: This value is mandatory. -listen = /var/run/php5-fpm-__NAMETOCHANGE__.sock +listen = /var/run/php/php__PHPVERSION__-fpm-__NAMETOCHANGE__.sock -; Set listen(2) backlog. A value of '-1' means unlimited. -; Default Value: 128 (-1 on FreeBSD and OpenBSD) -;listen.backlog = 128 +; Set listen(2) backlog. +; Default Value: 511 (-1 on FreeBSD and OpenBSD) +;listen.backlog = 511 ; Set permissions for unix socket, if one is used. In Linux, read/write ; permissions must be set in order to allow connections from a web server. Many @@ -44,8 +47,13 @@ listen = /var/run/php5-fpm-__NAMETOCHANGE__.sock listen.owner = www-data listen.group = www-data ;listen.mode = 0660 +; When POSIX Access Control Lists are supported you can set them using +; these options, value is a comma separated list of user/group names. +; When set, listen.owner and listen.group are ignored +;listen.acl_users = +;listen.acl_groups = -; List of ipv4 addresses of FastCGI clients which are allowed to connect. +; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. ; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original ; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address ; must be separated by a comma. If this value is left blank, connections will be @@ -59,7 +67,13 @@ listen.group = www-data ; - The pool processes will inherit the master process priority ; unless it specified otherwise ; Default Value: no set -; priority = -19 +; process.priority = -19 + +; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user +; or group is differrent than the master process user. It allows to create process +; core dump and ptrace the process for the pool user. +; Default Value: no +; process.dumpable = yes ; Choose how the process manager will control the number of child processes. ; Possible Values: @@ -96,7 +110,7 @@ pm = dynamic ; forget to tweak pm.* to fit your needs. ; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' ; Note: This value is mandatory. -pm.max_children = 10 +pm.max_children = 5 ; The number of child processes created on startup. ; Note: Used only when pm is set to 'dynamic' @@ -122,7 +136,7 @@ pm.max_spare_servers = 3 ; This can be useful to work around memory leaks in 3rd party libraries. For ; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. ; Default Value: 0 -pm.max_requests = 500 +;pm.max_requests = 500 ; The URI to view the FPM status page. If this value is not set, no URI will be ; recognized as a status page. It shows the following informations: @@ -215,7 +229,7 @@ pm.max_requests = 500 ; last request memory: 0 ; ; Note: There is a real-time FPM status monitoring sample web page available -; It's available in: ${prefix}/share/fpm/status.html +; It's available in: /usr/share/php/7.0/fpm/status.html ; ; Note: The value must start with a leading slash (/). The value can be ; anything, but it may not be a good idea to use the .php extension or it @@ -275,7 +289,7 @@ pm.max_requests = 500 ; - %{megabytes}M ; - %{mega}M ; %n: pool name -; %o: ouput header +; %o: output header ; it must be associated with embraces to specify the name of the header: ; - %{Content-Type}o ; - %{X-Powered-By}o @@ -291,9 +305,13 @@ pm.max_requests = 500 ; %t: server time the request was received ; it can accept a strftime(3) format: ; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t ; %T: time the log has been written (the request has finished) ; it can accept a strftime(3) format: ; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t ; %u: remote user ; ; Default: "%R - %u %t \"%m %r\" %s" @@ -302,13 +320,13 @@ pm.max_requests = 500 ; The log file for slow requests ; Default Value: not set ; Note: slowlog is mandatory if request_slowlog_timeout is set -slowlog = /var/log/nginx/__NAMETOCHANGE__.slow.log +;slowlog = log/$pool.log.slow ; The timeout for serving a single request after which a PHP backtrace will be ; dumped to the 'slowlog' file. A value of '0s' means 'off'. ; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) ; Default Value: 0 -request_slowlog_timeout = 5s +;request_slowlog_timeout = 0 ; The timeout for serving a single request after which the worker process will ; be killed. This option should be used when the 'max_execution_time' ini option @@ -347,15 +365,24 @@ chdir = __FINALPATH__ ; Note: on highloaded environement, this can cause some delay in the page ; process time (several ms). ; Default Value: no -catch_workers_output = yes +;catch_workers_output = yes + +; Clear environment in FPM workers +; Prevents arbitrary environment variables from reaching FPM worker processes +; by clearing the environment in workers before env vars specified in this +; pool configuration are added. +; Setting to "no" will make all environment variables available to PHP code +; via getenv(), $_ENV and $_SERVER. +; Default Value: yes +;clear_env = no ; Limits the extensions of the main script FPM will allow to parse. This can ; prevent configuration mistakes on the web server side. You should only limit ; FPM to .php extensions to prevent malicious users to use other extensions to -; exectute php code. +; execute php code. ; Note: set an empty value to allow all extensions. ; Default Value: .php -;security.limit_extensions = .php .php3 .php4 .php5 +;security.limit_extensions = .php .php3 .php4 .php5 .php7 ; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from ; the current environment. @@ -390,3 +417,14 @@ catch_workers_output = yes ;php_admin_value[error_log] = /var/log/fpm-php.www.log ;php_admin_flag[log_errors] = on ;php_admin_value[memory_limit] = 32M + +; Common values to change to increase file upload limit +; php_admin_value[upload_max_filesize] = 50M +; php_admin_value[post_max_size] = 50M +; php_admin_flag[mail.add_x_header] = Off + +; Other common parameters +; php_admin_value[max_execution_time] = 600 +; php_admin_value[max_input_time] = 300 +; php_admin_value[memory_limit] = 256M +; php_admin_flag[short_open_tag] = On diff --git a/conf/php-fpm.ini b/conf/php-fpm.ini deleted file mode 100644 index 5c27d59..0000000 --- a/conf/php-fpm.ini +++ /dev/null @@ -1,10 +0,0 @@ -; Common values to change to increase file upload limit -; upload_max_filesize = 50M -; post_max_size = 50M -; mail.add_x_header = Off - -; Other common parameters -; max_execution_time = 600 -; max_input_time = 300 -; memory_limit = 256M -; short_open_tag = On diff --git a/manifest.json b/manifest.json index 5160959..0850b4b 100644 --- a/manifest.json +++ b/manifest.json @@ -6,21 +6,19 @@ "en": "Moodle package for YunoHost application.", "fr": "Moodle de package d’application pour YunoHost." }, - "version": "3.8.1", + "version": "3.8.2", "url": "https://moodle.org/", - "license": "GPL-3.0", + "license": "GPL-3.0-or-later", "maintainer": { "name": "Anmol Sharma", "email": "anmol@datamol.org" }, "requirements": { - "yunohost": ">= 3.0" + "yunohost": ">= 3.5" }, "multi_instance": true, "services": [ - "nginx", - "php7.1-fpm", - "psql" + "nginx" ], "arguments": { "install" : [ @@ -43,6 +41,23 @@ "example": "/moodle", "default": "/moodle" }, + { + "name": "admin", + "type": "user", + "ask": { + "en": "Choose the Moodle administrator (must be an existing YunoHost user)", + "fr": "Administrateur du site (doit être un utilisateur YunoHost existant)" + }, + "example": "johndoe" + }, + { + "name": "password", + "type": "password", + "ask": { + "en": "Choose a password for the administrator", + "fr": "Choisissez un mot de passe pour l'administrateur" + } + }, { "name": "is_public", "type": "boolean", diff --git a/scripts/_common.sh b/scripts/_common.sh index b8c5f97..631df84 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -1,72 +1,27 @@ #!/bin/bash -# ============= FUTURE YUNOHOST HELPER ============= -# Delete a file checksum from the app settings -# -# $app should be defined when calling this helper -# -# usage: ynh_remove_file_checksum file -# | arg: file - The file for which the checksum will be deleted -ynh_delete_file_checksum () { - local checksum_setting_name=checksum_${1//[\/ ]/_} # Replace all '/' and ' ' by '_' - ynh_app_setting_delete $app $checksum_setting_name -} +#================================================= +# COMMON VARIABLES +#================================================= -extra_pkg_dependencies="php7.1-zip php7.1-mysql php7.1-xml php7.1-intl php7.1-mbstring php7.1-gd php7.1-curl php7.1-soap php7.1-pgsql php7.1-xmlrpc" +# dependencies used by the app +YNH_PHP_VERSION="7.3" +extra_pkg_dependencies="php$YNH_PHP_VERSION-common php$YNH_PHP_VERSION-mbstring php$YNH_PHP_VERSION-curl php$YNH_PHP_VERSION-xmlrpc php$YNH_PHP_VERSION-soap php$YNH_PHP_VERSION-zip php$YNH_PHP_VERSION-gd php$YNH_PHP_VERSION-xml php$YNH_PHP_VERSION-intl php$YNH_PHP_VERSION-json php$YNH_PHP_VERSION-pgsql php$YNH_PHP_VERSION-ldap" +pkg_dependencies="postgresql" -# Send an email to inform the administrator -# -# usage: ynh_send_readme_to_admin app_message [recipients] -# | arg: app_message - The message to send to the administrator. -# | arg: recipients - The recipients of this email. Use spaces to separate multiples recipients. - default: root -# example: "root admin@domain" -# If you give the name of a YunoHost user, ynh_send_readme_to_admin will find its email adress for you -# example: "root admin@domain user1 user2" -ynh_send_readme_to_admin() { - local app_message="${1:-...No specific information...}" - local recipients="${2:-root}" +#================================================= +# EXPERIMENTAL HELPERS +#================================================= - # Retrieve the email of users - find_mails () { - local list_mails="$1" - local mail - local recipients=" " - # Read each mail in argument - for mail in $list_mails - do - # Keep root or a real email address as it is - if [ "$mail" = "root" ] || echo "$mail" | grep --quiet "@" - then - recipients="$recipients $mail" - else - # But replace an user name without a domain after by its email - if mail=$(ynh_user_get_info "$mail" "mail" 2> /dev/null) - then - recipients="$recipients $mail" - fi - fi - done - echo "$recipients" - } - recipients=$(find_mails "$recipients") +# Execute a command as another user +# usage: exec_as USER COMMAND [ARG ...] +exec_as() { + local USER=$1 + shift 1 - local mail_subject="☁️🆈🅽🅷☁️: \`$app\` has important message for you" - - local mail_message="This is an automated message from your beloved YunoHost server. -Specific information for the application $app. -$app_message ---- -Automatic diagnosis data from YunoHost -$(yunohost tools diagnosis | grep -B 100 "services:" | sed '/services:/d')" - - # Define binary to use for mail command - if [ -e /usr/bin/bsd-mailx ] - then - local mail_bin=/usr/bin/bsd-mailx - else - local mail_bin=/usr/bin/mail.mailutils - fi - - # Send the email to the recipients - echo "$mail_message" | $mail_bin -a "Content-Type: text/plain; charset=UTF-8" -s "$mail_subject" "$recipients" -} + if [[ $USER = $(whoami) ]]; then + eval "$@" + else + sudo -u "$USER" "$@" + fi +} \ No newline at end of file diff --git a/scripts/backup b/scripts/backup index f501e0e..5466fd1 100644 --- a/scripts/backup +++ b/scripts/backup @@ -6,65 +6,73 @@ # IMPORT GENERIC HELPERS #================================================= -source _common.sh -source psql.sh +source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers +source ../settings/scripts/ynh_add_extra_apt_repos +source ../settings/scripts/ynh_install_php #================================================= # MANAGE SCRIPT FAILURE #================================================= -ynh_clean_setup () { - ### Remove this function if there's nothing to clean before calling the remove script. - true -} # Exit if an error occurs during the execution of the script ynh_abort_if_errors #================================================= # LOAD SETTINGS #================================================= +ynh_script_progression --message="Loading installation settings..." app=$YNH_APP_INSTANCE_NAME -final_path=$(ynh_app_setting_get "$app" final_path) -domain=$(ynh_app_setting_get "$app" domain) -db_name=$(ynh_app_setting_get "$app" psql_db) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +data_path=$(ynh_app_setting_get --app=$app --key=data_path) +domain=$(ynh_app_setting_get --app=$app --key=domain) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) #================================================= # STANDARD BACKUP STEPS #================================================= # BACKUP THE APP MAIN DIR #================================================= +ynh_script_progression --message="Backing up the main app directory..." -ynh_backup "$final_path" -# BACKUP APP home directory -ynh_backup "/home/yunohost.app/$app" +ynh_backup --src_path="$final_path" + +ynh_backup --src_path="$data_path" #================================================= # BACKUP THE NGINX CONFIGURATION #================================================= +ynh_script_progression --message="Backing up nginx web server configuration..." -ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" +ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # BACKUP THE PHP-FPM CONFIGURATION #================================================= +ynh_script_progression --message="Backing up php-fpm configuration..." -ynh_backup "/etc/php5/fpm/pool.d/$app.conf" -ynh_backup "/etc/php5/fpm/conf.d/20-$app.ini" +ynh_backup --src_path="/etc/php/$YNH_PHP_VERSION/fpm/pool.d/$app.conf" #================================================= -# BACKUP THE PSQL DATABASE +# BACKUP THE MYSQL DATABASE #================================================= +ynh_script_progression --message="Backing up the PostgreSQL database..." -ynh_psql_dump_db "$db_name" > db.sql -ynh_backup "db.sql" +ynh_psql_dump_db --database="$db_name" > db.sql #================================================= # SPECIFIC BACKUP #================================================= -# BACKUP THE CRON FILE +# BACKUP A CRON FILE +#================================================= +ynh_script_progression --message="Backing up the cron file..." + +ynh_backup --src_path="/etc/cron.d/$app" + +#================================================= +# END OF SCRIPT #================================================= -ynh_backup "/etc/cron.d/$app" +ynh_script_progression --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." --last diff --git a/scripts/install b/scripts/install index 6f6c0de..354f887 100644 --- a/scripts/install +++ b/scripts/install @@ -7,19 +7,14 @@ #================================================= source _common.sh -source psql.sh -source ynh_install_php -source ynh_add_extra_apt_repos source /usr/share/yunohost/helpers +source ynh_add_extra_apt_repos +source ynh_install_php #================================================= # MANAGE SCRIPT FAILURE #================================================= -ynh_clean_setup () { - ### Remove this function if there's nothing to clean before calling the remove script. - true -} # Exit if an error occurs during the execution of the script ynh_abort_if_errors @@ -29,177 +24,163 @@ ynh_abort_if_errors domain=$YNH_APP_ARG_DOMAIN path_url=$YNH_APP_ARG_PATH +admin=$YNH_APP_ARG_ADMIN +password=$YNH_APP_ARG_PASSWORD is_public=$YNH_APP_ARG_IS_PUBLIC -# 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 #================================================= # CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS #================================================= +ynh_script_progression --message="Validating installation parameters..." final_path=/var/www/$app -test ! -e "$final_path" || ynh_die "This path already contains a folder" +test ! -e "$final_path" || ynh_die --message="This path already contains a folder" +data_path=/home/yunohost.app/$app +test ! -e "$data_path" || ynh_die --message="This path already contains a folder" -# Normalize the url path syntax -path_url=$(ynh_normalize_url_path "$path_url") - -# Check web path availability -ynh_webpath_available "$domain" "$path_url" # Register (book) web path -ynh_webpath_register "$app" "$domain" "$path_url" +ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url #================================================= # STORE SETTINGS FROM MANIFEST #================================================= +ynh_script_progression --message="Storing installation settings..." -ynh_app_setting_set "$app" domain "$domain" -ynh_app_setting_set "$app" path "$path_url" -ynh_app_setting_set "$app" is_public "$is_public" +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=admin --value=$admin +ynh_app_setting_set --app=$app --key=password --value=$password +ynh_app_setting_set --app=$app --key=is_public --value=$is_public #================================================= # STANDARD MODIFICATIONS #================================================= +# INSTALL DEPENDENCIES +#================================================= +ynh_script_progression --message="Installing dependencies..." --weight=60 + +ynh_install_app_dependencies $pkg_dependencies +ynh_install_php --phpversion="$YNH_PHP_VERSION" --package="$extra_pkg_dependencies" #================================================= -# INSTALL PHP7.3 AND DEPENDENCIES (EXP HELPER) +# CREATE POSTGRESQL DATABASE #================================================= -ynh_print_info --message="Installing php7.1..." +ynh_script_progression --message="Creating a PostgreSQL database..." --weight=4 -ynh_install_php --phpversion="7.1" --package="$extra_pkg_dependencies" -ynh_install_app_dependencies postgresql - -#================================================= -# Create postgresql database -#================================================= - -db_name=$app -db_pwd=$(ynh_string_random 30) -ynh_app_setting_set "$app" psql_db "$db_name" -ynh_app_setting_set "$app" psqlpwd "$db_pwd" ynh_psql_test_if_first_run -ynh_psql_create_user "$app" "$db_pwd" -ynh_psql_execute_as_root \ -"CREATE DATABASE $db_name ENCODING 'UTF8' LC_COLLATE='C' LC_CTYPE='C' template=template0 OWNER $app;" + +db_name=$(ynh_sanitize_dbid --db_name=$app) +ynh_app_setting_set --app=$app --key=db_name --value=$db_name +ynh_psql_setup_db --db_user=$db_name --db_name=$db_name + +db_pwd=$(ynh_app_setting_get $app psqlpwd) + #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= +ynh_script_progression --message="Setting up source files..." --weight=6 -ynh_app_setting_set "$app" final_path "$final_path" +ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src -ynh_setup_source "$final_path" -cp ../conf/config.php "$final_path"/. +ynh_setup_source --dest_dir="$final_path" #================================================= # NGINX CONFIGURATION #================================================= +ynh_script_progression --message="Configuring nginx web server..." --weight=2 # Create a dedicated nginx config -ynh_add_nginx_config +ynh_add_nginx_config YNH_PHP_VERSION #================================================= # CREATE DEDICATED USER #================================================= +ynh_script_progression --message="Configuring system user..." --weight=2 # Create a system user -ynh_system_user_create "$app" +ynh_system_user_create --username=$app + #================================================= # PHP-FPM CONFIGURATION #================================================= - -### `ynh_add_fpm_config` is used to set up a PHP config. -### You can remove it if your app doesn't use PHP. -### `ynh_add_fpm_config` will use the files conf/php-fpm.conf and conf/php-fpm.ini -### If you're not using these lines: -### - You can remove these files in conf/. -### - Remove the section "BACKUP THE PHP-FPM CONFIGURATION" in the backup script -### - Remove also the section "REMOVE PHP-FPM CONFIGURATION" in the remove script -### - As well as the section "RESTORE THE PHP-FPM CONFIGURATION" in the restore script -### With the reload at the end of the script. -### - And the section "PHP-FPM CONFIGURATION" in the upgrade script +ynh_script_progression --message="Configuring php-fpm..." --weight=1 # Create a dedicated php-fpm config -ynh_add_fpm_config --phpversion="7.1" +ynh_add_fpm_config --phpversion="$YNH_PHP_VERSION" #================================================= # SPECIFIC SETUP #================================================= -# SETUP config file +# SECURE FILES AND DIRECTORIES #================================================= -var_root=/home/yunohost.app/$app -ynh_replace_string "YNH_DB_USER" "$app" "$final_path/config.php" -ynh_replace_string "YNH_APP" "$db_name" "$final_path/config.php" -ynh_replace_string "YNH_DB_PWD" "$db_pwd" "$final_path/config.php" -ynh_replace_string "YNH_DOMAIN" "$domain" "$final_path/config.php" -if [ "$path_url" = "/" ] -then - ynh_replace_string "YNH_WWW_PATH" "" "$final_path/config.php" -else - ynh_replace_string "YNH_WWW_PATH" "$path_url" "$final_path/config.php" -fi -ynh_replace_string "YNH_VAR_ROOT" "$var_root" "$final_path/config.php" + +ynh_app_setting_set --app=$app --key=data_path --value=$data_path +mkdir -p $data_path +chown -R "$app": "$data_path" +chown -R "$app": "$final_path" + +#================================================= +# SETUP APPLICATION +#================================================= +ynh_script_progression --message="Configuring the application..." --weight=190 + +email=$(ynh_user_get_info $admin mail) + +exec_as "$app" php$YNH_PHP_VERSION "$final_path/admin/cli/install.php" --wwwroot="https://$domain${path_url%/}" --dataroot=$data_path --dbtype='pgsql' --dbname=$db_name --dbuser=$db_name --dbpass=$db_pwd --adminuser=$admin --adminpass=$password --adminemail=$email --fullname="YunoHost" --shortname="YNH" --non-interactive --agree-license # Calculate and store the config file checksum into the app settings ynh_store_file_checksum "$final_path/config.php" -# Create the home directory -mkdir -p "$var_root" -chown -R "$app": "$var_root" -chmod -R 700 "$var_root" - #================================================= -# SETUP APPLICATION WITH CURL +# ACTIVATE LDAP SUPPORT #================================================= -# Set right permissions for curl install -chown -R "$app": "$final_path" +ynh_psql_execute_as_root --database=$db_name --sql="UPDATE public.mdl_config SET value='ldap,email' WHERE name='auth';" +ynh_psql_execute_as_root --database=$db_name --sql="UPDATE public.mdl_config_plugins SET value='ldap://127.0.0.1/' WHERE plugin='auth_ldap' AND name='host_url';" +ynh_psql_execute_as_root --database=$db_name --sql="UPDATE public.mdl_config_plugins SET value='uid' WHERE plugin='auth_ldap' AND name='user_attribute';" +ynh_psql_execute_as_root --database=$db_name --sql="UPDATE public.mdl_config_plugins SET value='ou=users,dc=yunohost,dc=org' WHERE plugin='auth_ldap' AND name='contexts';" +ynh_psql_execute_as_root --database=$db_name --sql="UPDATE public.mdl_config_plugins SET value='givenName' WHERE plugin='auth_ldap' AND name='field_map_firstname';" +ynh_psql_execute_as_root --database=$db_name --sql="UPDATE public.mdl_config_plugins SET value='sn' WHERE plugin='auth_ldap' AND name='field_map_lastname';" +ynh_psql_execute_as_root --database=$db_name --sql="UPDATE public.mdl_config_plugins SET value='mail' WHERE plugin='auth_ldap' AND name='field_map_email';" +ynh_psql_execute_as_root --database=$db_name --sql="UPDATE public.mdl_config_plugins SET value='onlogin' WHERE plugin='auth_ldap' AND (name='field_updatelocal_firstname' OR name='field_updatelocal_lastname' OR name='field_updatelocal_email');" +ynh_psql_execute_as_root --database=$db_name --sql="UPDATE public.mdl_config_plugins SET value='locked' WHERE plugin='auth_ldap' AND (name='field_lock_firstname' OR name='field_lock_lastname' OR name='field_lock_email');" -# Reload Nginx -systemctl reload nginx +exec_as "$app" php$YNH_PHP_VERSION "$final_path/admin/cli/purge_caches.php" + +#================================================= +# ADD CRON JOB +#================================================= + +# Set up poller +sudo cp "../conf/cron" "/etc/cron.d/$app" +ynh_replace_string "__FINAL_PATH__" "$final_path" "/etc/cron.d/$app" +ynh_replace_string "__YNH_PHP_VERSION__" "$YNH_PHP_VERSION" "/etc/cron.d/$app" #================================================= # GENERIC FINALIZATION -#================================================= -# SECURE FILES AND DIRECTORIES -#================================================= - -# Set permissions to app files -chown root: "$final_path"/config.php - - -# Set up poller -sudo cp ../conf/cron /etc/cron.d/"$app" -ynh_replace_string "YNH_DOMAIN" "$final_path" "/etc/cron.d/$app" - #================================================= # SETUP SSOWAT #================================================= -if [ "$is_public" -eq 0 ] -then # Remove the public access - ynh_app_setting_delete "$app" skipped_uris -fi # Make app public if necessary if [ "$is_public" -eq 1 ] then # unprotected_uris allows SSO credentials to be passed anyway. - ynh_app_setting_set "$app" unprotected_uris "/" + ynh_app_setting_set --app=$app --key=unprotected_uris --value="/" fi -yunohost app ssowatconf - #================================================= # RELOAD NGINX #================================================= +ynh_script_progression --message="Reloading nginx web server..." --weight=1 -systemctl reload nginx +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Installation of $app completed" --last diff --git a/scripts/psql.sh b/scripts/psql.sh deleted file mode 100644 index 0fa1cda..0000000 --- a/scripts/psql.sh +++ /dev/null @@ -1,160 +0,0 @@ -#!/bin/bash - -#================================================= -# -# POSTGRES HELPERS -# -# Point of contact : Jean-Baptiste Holcroft -#================================================= - -# Create a master password and set up global settings -# Please always call this script in install and restore scripts -# -# usage: ynh_psql_test_if_first_run - -ynh_psql_test_if_first_run() { - if [ -f /etc/yunohost/psql ]; - then - echo "PostgreSQL is already installed, no need to create master password" - else - pgsql=$(ynh_string_random) - pg_hba="" - echo "$pgsql" >> /etc/yunohost/psql - - if [ -e /etc/postgresql/9.4/ ] - then - pg_hba=/etc/postgresql/9.4/main/pg_hba.conf - elif [ -e /etc/postgresql/9.6/ ] - then - pg_hba=/etc/postgresql/9.6/main/pg_hba.conf - else - ynh_die "postgresql shoud be 9.4 or 9.6" - fi - - systemctl start postgresql - sudo --login --user=postgres psql -c"ALTER user postgres WITH PASSWORD '$pgsql'" postgres - - # force all user to connect to local database using passwords - # https://www.postgresql.org/docs/current/static/auth-pg-hba-conf.html#EXAMPLE-PG-HBA.CONF - # Note: we can't use peer since YunoHost create users with nologin - # See: https://github.com/YunoHost/yunohost/blob/unstable/data/helpers.d/user - sed -i '/local\s*all\s*all\s*peer/i \ - local all all password' "$pg_hba" - systemctl enable postgresql - systemctl reload postgresql - fi -} - -# Open a connection as a user -# -# example: ynh_psql_connect_as 'user' 'pass' <<< "UPDATE ...;" -# example: ynh_psql_connect_as 'user' 'pass' < /path/to/file.sql -# -# usage: ynh_psql_connect_as user pwd [db] -# | arg: user - the user name to connect as -# | arg: pwd - the user password -# | arg: db - the database to connect to -ynh_psql_connect_as() { - user="$1" - pwd="$2" - db="$3" - sudo --login --user=postgres PGUSER="$user" PGPASSWORD="$pwd" psql "$db" -} - -# # Execute a command as root user -# -# usage: ynh_psql_execute_as_root sql [db] -# | arg: sql - the SQL command to execute -# | arg: db - the database to connect to -ynh_psql_execute_as_root () { - sql="$1" - sudo --login --user=postgres psql <<< "$sql" -} - -# Execute a command from a file as root user -# -# usage: ynh_psql_execute_file_as_root file [db] -# | arg: file - the file containing SQL commands -# | arg: db - the database to connect to -ynh_psql_execute_file_as_root() { - file="$1" - db="$2" - sudo --login --user=postgres psql "$db" < "$file" -} - -# Create a database, an user and its password. Then store the password in the app's config -# -# After executing this helper, the password of the created database will be available in $db_pwd -# It will also be stored as "psqlpwd" into the app settings. -# -# usage: ynh_psql_setup_db user name [pwd] -# | arg: user - Owner of the database -# | arg: name - Name of the database -# | arg: pwd - Password of the database. If not given, a password will be generated -ynh_psql_setup_db () { - db_user="$1" - db_name="$2" - new_db_pwd=$(ynh_string_random) # Generate a random password - # If $3 is not given, use new_db_pwd instead for db_pwd. - db_pwd="${3:-$new_db_pwd}" - ynh_psql_create_db "$db_name" "$db_user" "$db_pwd" # Create the database - ynh_app_setting_set "$app" psqlpwd "$db_pwd" # Store the password in the app's config -} - -# Create a database and grant privilegies to a user -# -# usage: ynh_psql_create_db db [user [pwd]] -# | arg: db - the database name to create -# | arg: user - the user to grant privilegies -# | arg: pwd - the user password -ynh_psql_create_db() { - db="$1" - user="$2" - pwd="$3" - ynh_psql_create_user "$user" "$pwd" - sudo --login --user=postgres createdb --owner="$user" "$db" -} - -# Drop a database -# -# usage: ynh_psql_drop_db db -# | arg: db - the database name to drop -# | arg: user - the user to drop -ynh_psql_remove_db() { - db="$1" - user="$2" - sudo --login --user=postgres dropdb "$db" - ynh_psql_drop_user "$user" -} - -# Dump a database -# -# example: ynh_psql_dump_db 'roundcube' > ./dump.sql -# -# usage: ynh_psql_dump_db db -# | arg: db - the database name to dump -# | ret: the psqldump output -ynh_psql_dump_db() { - db="$1" - sudo --login --user=postgres pg_dump "$db" -} - - -# Create a user -# -# usage: ynh_psql_create_user user pwd [host] -# | arg: user - the user name to create -ynh_psql_create_user() { - user="$1" - pwd="$2" - sudo --login --user=postgres psql -c"CREATE USER $user WITH PASSWORD '$pwd'" postgres -} - -# Drop a user -# -# usage: ynh_psql_drop_user user -# | arg: user - the user name to drop -ynh_psql_drop_user() { - user="$1" - sudo --login --user=postgres dropuser "$user" -} diff --git a/scripts/remove b/scripts/remove index 5f4e91e..105f20e 100644 --- a/scripts/remove +++ b/scripts/remove @@ -7,72 +7,52 @@ #================================================= source _common.sh -source psql.sh -source ynh_install_php source /usr/share/yunohost/helpers +source ynh_add_extra_apt_repos +source ynh_install_php #================================================= # LOAD SETTINGS #================================================= -ynh_print_info "Loading installation settings..." +ynh_script_progression --message="Loading installation settings..." app=$YNH_APP_INSTANCE_NAME -domain=$(ynh_app_setting_get "$app" domain) -db_name=$(ynh_app_setting_get "$app" psql_db) -db_user=$db_name -final_path=$(ynh_app_setting_get "$app" final_path) +domain=$(ynh_app_setting_get --app=$app --key=domain) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +data_path=$(ynh_app_setting_get --app=$app --key=data_path) #================================================= # STANDARD REMOVE -#================================================= -# REMOVE SERVICE FROM ADMIN PANEL -#================================================= - -# Remove a service from the admin panel, added by `yunohost service add` -if yunohost service status "$app" >/dev/null 2>&1 -then - ynh_print_info "Removing $app service" - yunohost service remove "$app" -fi - -#================================================= -# STOP AND REMOVE SERVICE -#================================================= -ynh_print_info "Stopping and removing the systemd service" - -# Remove the dedicated systemd config -ynh_remove_systemd_config - #================================================= # REMOVE THE POSTGRESQL DATABASE #================================================= -ynh_print_info "Removing the PostgreSQL database" +ynh_script_progression --message="Removing the PostgresSQL database..." # Remove a database if it exists, along with the associated user -ynh_psql_remove_db "$db_name" "$db_name" +ynh_psql_remove_db --db_user=$db_name --db_name=$db_name #================================================= # REMOVE DEPENDENCIES #================================================= -ynh_print_info "Removing dependencies" +ynh_script_progression --message="Removing dependencies..." # Remove metapackage and its dependencies ynh_remove_app_dependencies -ynh_remove_php #================================================= # REMOVE APP MAIN DIR #================================================= -ynh_print_info "Removing app main directory" +ynh_script_progression --message="Removing app main directory..." # Remove the app directory securely -ynh_secure_remove "$final_path" +ynh_secure_remove --file="$final_path" #================================================= # REMOVE NGINX CONFIGURATION #================================================= -ynh_print_info "Removing nginx web server configuration" +ynh_script_progression --message="Removing nginx web server configuration..." # Remove the dedicated nginx config ynh_remove_nginx_config @@ -80,18 +60,11 @@ ynh_remove_nginx_config #================================================= # REMOVE PHP-FPM CONFIGURATION #================================================= -ynh_print_info "Removing php-fpm configuration" +ynh_script_progression --message="Removing php-fpm configuration..." --weight=20 # Remove the dedicated php-fpm config ynh_remove_fpm_config - -#================================================= -# REMOVE LOGROTATE CONFIGURATION -#================================================= -ynh_print_info "Removing logrotate configuration" - -# Remove the app-specific logrotate config -ynh_remove_logrotate +ynh_remove_php "$YNH_PHP_VERSION" #================================================= # SPECIFIC REMOVE @@ -100,27 +73,23 @@ ynh_remove_logrotate #================================================= # Remove a cron file -ynh_secure_remove "/etc/cron.d/$app" +ynh_secure_remove --file="/etc/cron.d/$app" # Remove a directory securely -ynh_secure_remove "/etc/$app/" -ynh_secure_remove "/home/yunohost.app/$app" - -# Remove the log files -ynh_secure_remove "/var/log/$app/" +ynh_secure_remove --file="$data_path" #================================================= # GENERIC FINALIZATION #================================================= # REMOVE DEDICATED USER #================================================= -ynh_print_info "Removing the dedicated system user" +ynh_script_progression --message="Removing the dedicated system user..." # Delete a system user -ynh_system_user_delete "$app" +ynh_system_user_delete --username=$app #================================================= # END OF SCRIPT #================================================= -ynh_print_info "Removal of $app completed" +ynh_script_progression --message="Removal of $app completed" --last diff --git a/scripts/restore b/scripts/restore index ff17c15..e40caf3 100644 --- a/scripts/restore +++ b/scripts/restore @@ -5,41 +5,43 @@ #================================================= # IMPORT GENERIC HELPERS #================================================= -source _common.sh -source psql.sh + +source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers +source ../settings/scripts/ynh_add_extra_apt_repos +source ../settings/scripts/ynh_install_php #================================================= # MANAGE SCRIPT FAILURE #================================================= -ynh_clean_setup () { - #### Remove this function if there's nothing to clean before calling the remove script. - true -} # Exit if an error occurs during the execution of the script ynh_abort_if_errors #================================================= # LOAD SETTINGS #================================================= +ynh_script_progression --message="Loading settings..." app=$YNH_APP_INSTANCE_NAME -domain=$(ynh_app_setting_get $app domain) -path_url=$(ynh_app_setting_get $app path) -final_path=$(ynh_app_setting_get $app final_path) -db_name=$(ynh_app_setting_get $app psql_db) -db_pwd=$(ynh_app_setting_get $app psqlpwd) +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) +data_path=$(ynh_app_setting_get --app=$app --key=data_path) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) #================================================= # CHECK IF THE APP CAN BE RESTORED #================================================= +ynh_script_progression --message="Validating restoration parameters..." -ynh_webpath_available $domain $path_url \ - || ynh_die "Path not available: ${domain}${path_url}" +ynh_webpath_available --domain=$domain --path_url=$path_url \ + || ynh_die --message="Path not available: ${domain}${path_url}" test ! -d $final_path \ - || ynh_die "There is already a directory: $final_path " + || ynh_die --message="There is already a directory: $final_path " +test ! -d $data_path \ + || ynh_die --message="There is already a directory: $data_path " #================================================= # STANDARD RESTORATION STEPS @@ -47,30 +49,24 @@ test ! -d $final_path \ # RESTORE THE NGINX CONFIGURATION #================================================= -ynh_restore_file "/etc/nginx/conf.d/$domain.d/$app.conf" +ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # RESTORE THE APP MAIN DIR #================================================= -var_root=/home/yunohost.app/$app -ynh_restore_file "$final_path" -ynh_restore_file "$var_root" +ynh_script_progression --message="Restoring the app main directory..." -#================================================= -# RESTORE THE psql DATABASE -#================================================= -ynh_psql_test_if_first_run -ynh_psql_create_user $app $db_pwd -ynh_psql_execute_as_root \ -"CREATE DATABASE $db_name ENCODING 'UTF8' LC_COLLATE='C' LC_CTYPE='C' template=template0 OWNER $app;" -ynh_psql_execute_file_as_root ./db.sql "$db_name" +ynh_restore_file --origin_path="$final_path" + +ynh_restore_file --origin_path="$data_path" #================================================= # RECREATE THE DEDICATED USER #================================================= +ynh_script_progression --message="Recreating the dedicated system user..." # Create the dedicated user (if not existing) -ynh_system_user_create $app +ynh_system_user_create --username=$app #================================================= # RESTORE USER RIGHTS @@ -78,38 +74,52 @@ ynh_system_user_create $app # Restore permissions on app files chown -R $app: $final_path -chown -R root: $final_path/config.php -mkdir -p $var_root -chown -R $app: $var_root -chmod -R 700 $var_root +chown -R $app: $data_path #================================================= # RESTORE THE PHP-FPM CONFIGURATION #================================================= -ynh_restore_file "/etc/php5/fpm/pool.d/$app.conf" -ynh_restore_file "/etc/php5/fpm/conf.d/20-$app.ini" +ynh_restore_file --origin_path="/etc/php/$YNH_PHP_VERSION/fpm/pool.d/$app.conf" #================================================= # SPECIFIC RESTORATION #================================================= # REINSTALL DEPENDENCIES #================================================= +ynh_script_progression --message="Reinstalling dependencies..." --weight=60 # Define and install dependencies -ynh_install_app_dependencies php-zip php-mysql php-xml php-intl php-mbstring php-gd php-curl php-soap php-pgsql php-xmlrpc postgresql +ynh_install_app_dependencies $pkg_dependencies +ynh_install_php --phpversion="$YNH_PHP_VERSION" --package="$extra_pkg_dependencies" + +#================================================= +# RESTORE THE MYSQL DATABASE +#================================================= +ynh_script_progression --message="Restoring the PostgreSQL database..."--weight=47 + +db_pwd=$(ynh_app_setting_get --app=$app --key=psqlpwd) +ynh_psql_setup_db --db_user=$db_name --db_name=$db_name --db_pwd=$db_pwd +ynh_psql_connect_as --user=$db_name --password=$db_pwd --database=$db_name < ./db.sql #================================================= # RESTORE THE CRON FILE #================================================= -ynh_restore_file "/etc/cron.d/$app" +ynh_restore_file --origin_path="/etc/cron.d/$app" #================================================= # GENERIC FINALIZATION #================================================= # RELOAD NGINX AND PHP-FPM #================================================= +ynh_script_progression --message="Reloading nginx web server and php-fpm..." -systemctl reload php5-fpm -systemctl reload nginx +ynh_systemd_action --service_name=php$YNH_PHP_VERSION-fpm --action=reload +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Restoration completed for $app" --last diff --git a/scripts/upgrade b/scripts/upgrade index ae1b135..8ef0ae2 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -6,53 +6,46 @@ # IMPORT GENERIC HELPERS #================================================= +source _common.sh source /usr/share/yunohost/helpers +source ynh_add_extra_apt_repos +source ynh_install_php #================================================= # LOAD SETTINGS #================================================= -ynh_print_info "Loading installation settings..." +ynh_script_progression --message="Loading installation settings..." app=$YNH_APP_INSTANCE_NAME -domain=$(ynh_app_setting_get $app domain) -path_url=$(ynh_app_setting_get $app path) -admin=$(ynh_app_setting_get $app admin) -is_public=$(ynh_app_setting_get $app is_public) -final_path=$(ynh_app_setting_get $app final_path) -#language=$(ynh_app_setting_get $app language) -db_name=$(ynh_app_setting_get $app db_name) +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_app_setting_get --app=$app --key=path) +admin=$(ynh_app_setting_get --app=$app --key=admin) +is_public=$(ynh_app_setting_get --app=$app --key=is_public) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +data_path=$(ynh_app_setting_get --app=$app --key=data_path) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) + +#================================================= +# CHECK VERSION +#================================================= + +upgrade_type=$(ynh_check_app_version_changed) #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= -ynh_print_info "Ensuring downward compatibility..." +ynh_script_progression --message="Ensuring downward compatibility..." -# Fix is_public as a boolean value -if [ "$is_public" = "Yes" ]; then - ynh_app_setting_set $app is_public 1 - is_public=1 -elif [ "$is_public" = "No" ]; then - ynh_app_setting_set $app is_public 0 - is_public=0 -fi - -# If db_name doesn't exist, create it -if [ -z $db_name ]; then - db_name=$(ynh_sanitize_dbid $app) - ynh_app_setting_set $app db_name $db_name -fi - -# If final_path doesn't exist, create it -if [ -z $final_path ]; then - final_path=/var/www/$app - ynh_app_setting_set $app final_path $final_path +# If the admin is not defined, We can't upgrade this app +if [ -z $admin ]; then + ynh_die --message="This app can't be upgraded from a very old version of the package. Please remove and reinstall Moodle_ynh" fi #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= -ynh_print_info "Backing up the app before upgrading (may take a while)..." +ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --weight=30 # Backup the current version of the app ynh_backup_before_upgrade @@ -63,83 +56,64 @@ ynh_clean_setup () { # Exit if an error occurs during the execution of the script ynh_abort_if_errors -cp -a $final_path $final_path.backup - -#================================================= -# CHECK THE PATH -#================================================= - -# Normalize the URL path syntax -path_url=$(ynh_normalize_url_path $path_url) - #================================================= # STANDARD UPGRADE STEPS #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= -ynh_print_info "Upgrading source files..." -# Download, check integrity, uncompress and patch the source from app.src -ynh_setup_source "$final_path" +if [ "$upgrade_type" == "UPGRADE_APP" ] +then + ynh_script_progression --message="Upgrading source files..." --weight=6 + + # Download, check integrity, uncompress and patch the source from app.src + ynh_setup_source --dest_dir="$final_path" +fi #================================================= # NGINX CONFIGURATION #================================================= -ynh_print_info "Upgrading nginx web server configuration..." +ynh_script_progression --message="Upgrading nginx web server configuration..." # Create a dedicated nginx config -ynh_add_nginx_config +ynh_add_nginx_config YNH_PHP_VERSION #================================================= # UPGRADE DEPENDENCIES #================================================= -#ynh_print_info "Upgrading dependencies..." +ynh_script_progression --message="Upgrading dependencies..." --weight=30 -#ynh_install_app_dependencies $pkg_dependencies +ynh_install_app_dependencies $pkg_dependencies +ynh_install_php --phpversion="$YNH_PHP_VERSION" --package="$extra_pkg_dependencies" #================================================= # CREATE DEDICATED USER #================================================= -ynh_print_info "Making sure dedicated system user exists..." +ynh_script_progression --message="Making sure dedicated system user exists..." # Create a dedicated user (if not existing) -ynh_system_user_create $app +ynh_system_user_create --username=$app #================================================= # PHP-FPM CONFIGURATION #================================================= -ynh_print_info "Upgrading php-fpm configuration..." +ynh_script_progression --message="Upgrading php-fpm configuration..." # Create a dedicated php-fpm config -ynh_add_fpm_config +ynh_add_fpm_config --phpversion="$YNH_PHP_VERSION" #================================================= # SPECIFIC UPGRADE #================================================= -# ... +# STORE THE CONFIG FILE CHECKSUM #================================================= -### Verify the checksum of a file, stored by `ynh_store_file_checksum` in the install script. -### And create a backup of this file if the checksum is different. So the file will be backed up if the admin had modified it. -ynh_backup_if_checksum_is_different "$final_path/config.php" +ynh_backup_if_checksum_is_different --file="$final_path/config.php" + +exec_as "$app" php$YNH_PHP_VERSION "$final_path/admin/cli/upgrade.php" --non-interactive + # Recalculate and store the checksum of the file for the next upgrade. -ynh_store_file_checksum "$final_path/config.php" - -#================================================= -# SETUP LOGROTATE -#================================================= -ynh_print_info "Upgrading logrotate configuration..." - -# Use logrotate to manage app-specific logfile(s) -ynh_use_logrotate --non-append - -#================================================= -# SETUP SYSTEMD -#================================================= -#ynh_print_info "Upgrading systemd configuration..." - -# Create a dedicated systemd config -#ynh_add_systemd_config +ynh_store_file_checksum --file="$final_path/config.php" #================================================= # GENERIC FINALIZATION @@ -148,29 +122,55 @@ ynh_use_logrotate --non-append #================================================= # Set permissions on app files -chown root: $final_path/config.php +chown -R "$app": "$data_path" +chown -R "$app": "$final_path" + +#================================================= +# ADD CRON JOB +#================================================= + +# Set up poller +sudo cp "../conf/cron" "/etc/cron.d/$app" +ynh_replace_string "__FINAL_PATH__" "$final_path" "/etc/cron.d/$app" +ynh_replace_string "__YNH_PHP_VERSION__" "$YNH_PHP_VERSION" "/etc/cron.d/$app" + +#================================================= +# ACTIVATE LDAP SUPPORT +#================================================= + +ynh_psql_execute_as_root --database=$db_name --sql="UPDATE public.mdl_config SET value='ldap,email' WHERE name='auth';" +ynh_psql_execute_as_root --database=$db_name --sql="UPDATE public.mdl_config_plugins SET value='ldap://127.0.0.1/' WHERE plugin='auth_ldap' AND name='host_url';" +ynh_psql_execute_as_root --database=$db_name --sql="UPDATE public.mdl_config_plugins SET value='uid' WHERE plugin='auth_ldap' AND name='user_attribute';" +ynh_psql_execute_as_root --database=$db_name --sql="UPDATE public.mdl_config_plugins SET value='ou=users,dc=yunohost,dc=org' WHERE plugin='auth_ldap' AND name='contexts';" +ynh_psql_execute_as_root --database=$db_name --sql="UPDATE public.mdl_config_plugins SET value='givenName' WHERE plugin='auth_ldap' AND name='field_map_firstname';" +ynh_psql_execute_as_root --database=$db_name --sql="UPDATE public.mdl_config_plugins SET value='sn' WHERE plugin='auth_ldap' AND name='field_map_lastname';" +ynh_psql_execute_as_root --database=$db_name --sql="UPDATE public.mdl_config_plugins SET value='mail' WHERE plugin='auth_ldap' AND name='field_map_email';" +ynh_psql_execute_as_root --database=$db_name --sql="UPDATE public.mdl_config_plugins SET value='onlogin' WHERE plugin='auth_ldap' AND (name='field_updatelocal_firstname' OR name='field_updatelocal_lastname' OR name='field_updatelocal_email');" +ynh_psql_execute_as_root --database=$db_name --sql="UPDATE public.mdl_config_plugins SET value='locked' WHERE plugin='auth_ldap' AND (name='field_lock_firstname' OR name='field_lock_lastname' OR name='field_lock_email');" + +exec_as "$app" php$YNH_PHP_VERSION "$final_path/admin/cli/purge_caches.php" #================================================= # SETUP SSOWAT #================================================= -ynh_print_info "Upgrading SSOwat configuration..." +ynh_script_progression --message="Upgrading SSOwat configuration..." # Make app public if necessary if [ $is_public -eq 1 ] then # unprotected_uris allows SSO credentials to be passed anyway - ynh_app_setting_set $app unprotected_uris "/" + ynh_app_setting_set --app=$app --key=unprotected_uris --value="/" fi #================================================= # RELOAD NGINX #================================================= -ynh_print_info "Reloading nginx web server..." +ynh_script_progression --message="Reloading nginx web server..." -systemctl reload nginx +ynh_systemd_action --service_name=nginx --action=reload #================================================= # END OF SCRIPT #================================================= -ynh_print_info "Upgrade of $app completed" +ynh_script_progression --message="Upgrade of $app completed" --last diff --git a/scripts/ynh_add_extra_apt_repos b/scripts/ynh_add_extra_apt_repos index 3276f00..df092aa 100644 --- a/scripts/ynh_add_extra_apt_repos +++ b/scripts/ynh_add_extra_apt_repos @@ -1,88 +1,74 @@ -#!/bin/bash - -# Pin a repository. +# Add dependencies to install with ynh_install_app_dependencies # -# usage: ynh_pin_repo --package=packages --pin=pin_filter [--priority=priority_value] [--name=name] [--append] -# | arg: -p, --package - Packages concerned by the pin. Or all, *. -# | arg: -i, --pin - Filter for the pin. -# | arg: -p, --priority - Priority for the pin -# | arg: -n, --name - Name for the files for this repo, $app as default value. -# | arg: -a, --append - Do not overwrite existing files. +# [internal] # -# See https://manpages.debian.org/stretch/apt/apt_preferences.5.en.html for information about pinning. -# -ynh_pin_repo () { +# usage: ynh_add_app_dependencies --package=phpversion [--replace] +# | arg: -p, --package - Packages to add as dependencies for the app. +# | arg: -r, --replace - Replace dependencies instead of adding to existing ones. +ynh_add_app_dependencies () { # Declare an array to define the options of this helper. - local legacy_args=pirna - declare -Ar args_array=( [p]=package= [i]=pin= [r]=priority= [n]=name= [a]=append ) + local legacy_args=pr + declare -Ar args_array=( [p]=package= [r]=replace) local package - local pin - local priority - local name - local append + local replace # Manage arguments with getopts ynh_handle_getopts_args "$@" - package="${package:-*}" - priority=${priority:-50} - name="${name:-$app}" - append=${append:-0} + replace=${replace:-0} - if [ $append -eq 1 ] + local current_dependencies="" + if [ $replace -eq 0 ] then - append="tee -a" - else - append="tee" + local dep_app=${app//_/-} # Replace all '_' by '-' + if ynh_package_is_installed --package="${dep_app}-ynh-deps" + then + current_dependencies="$(dpkg-query --show --showformat='${Depends}' ${dep_app}-ynh-deps) " + fi + + current_dependencies=${current_dependencies// | /|} fi - mkdir -p "/etc/apt/preferences.d" - echo "Package: $package -Pin: $pin -Pin-Priority: $priority" \ - | $append "/etc/apt/preferences.d/$name" + ynh_install_app_dependencies "${current_dependencies}${package}" } -# Add a repository. +# Install packages from an extra repository properly. # -# usage: ynh_add_repo --uri=uri --suite=suite --component=component [--name=name] [--append] -# | arg: -u, --uri - Uri of the repository. -# | arg: -s, --suite - Suite of the repository. -# | arg: -c, --component - Component of the repository. +# usage: ynh_install_extra_app_dependencies --repo="repo" --package="dep1 dep2" [--key=key_url] [--name=name] +# | arg: -r, --repo - Complete url of the extra repository. +# | arg: -p, --package - The packages to install from this extra repository +# | arg: -k, --key - url to get the public key. # | arg: -n, --name - Name for the files for this repo, $app as default value. -# | arg: -a, --append - Do not overwrite existing files. -# -# Example for a repo like deb http://forge.yunohost.org/debian/ stretch stable -# uri suite component -# ynh_add_repo --uri=http://forge.yunohost.org/debian/ --suite=stretch --component=stable -# -ynh_add_repo () { +ynh_install_extra_app_dependencies () { # Declare an array to define the options of this helper. - local legacy_args=uscna - declare -Ar args_array=( [u]=uri= [s]=suite= [c]=component= [n]=name= [a]=append ) - local uri - local suite - local component + local legacy_args=rpkn + declare -Ar args_array=( [r]=repo= [p]=package= [k]=key= [n]=name= ) + local repo + local package + local key local name - local append # Manage arguments with getopts ynh_handle_getopts_args "$@" name="${name:-$app}" - append=${append:-0} + key=${key:-0} - if [ $append -eq 1 ] + # Set a key only if asked + if [ -n "$key" ] then - append="tee -a" - else - append="tee" + key="--key=$key" fi + # Add an extra repository for those packages + ynh_install_extra_repo --repo="$repo" $key --priority=995 --name=$name - mkdir -p "/etc/apt/sources.list.d" - # Add the new repo in sources.list.d - echo "deb $uri $suite $component" \ - | $append "/etc/apt/sources.list.d/$name.list" + # Install requested dependencies from this extra repository. + ynh_add_app_dependencies --package="$package" + + # Remove this extra repository after packages are installed + ynh_remove_extra_repo --name=$app } # Add an extra repository correctly, pin it and get the key. # +# [internal] +# # usage: ynh_install_extra_repo --repo="repo" [--key=key_url] [--priority=priority_value] [--name=name] [--append] # | arg: -r, --repo - Complete url of the extra repository. # | arg: -k, --key - url to get the public key. @@ -154,6 +140,8 @@ ynh_install_extra_repo () { # Remove an extra repository and the assiociated configuration. # +# [internal] +# # usage: ynh_remove_extra_repo [--name=name] # | arg: -n, --name - Name for the files for this repo, $app as default value. ynh_remove_extra_repo () { @@ -174,121 +162,88 @@ ynh_remove_extra_repo () { ynh_package_update } -# Install packages from an extra repository properly. +# Add a repository. # -# usage: ynh_install_extra_app_dependencies --repo="repo" --package="dep1 dep2" [--key=key_url] [--name=name] -# | arg: -r, --repo - Complete url of the extra repository. -# | arg: -p, --package - The packages to install from this extra repository -# | arg: -k, --key - url to get the public key. +# [internal] +# +# usage: ynh_add_repo --uri=uri --suite=suite --component=component [--name=name] [--append] +# | arg: -u, --uri - Uri of the repository. +# | arg: -s, --suite - Suite of the repository. +# | arg: -c, --component - Component of the repository. # | arg: -n, --name - Name for the files for this repo, $app as default value. -ynh_install_extra_app_dependencies () { +# | arg: -a, --append - Do not overwrite existing files. +# +# Example for a repo like deb http://forge.yunohost.org/debian/ stretch stable +# uri suite component +# ynh_add_repo --uri=http://forge.yunohost.org/debian/ --suite=stretch --component=stable +# +ynh_add_repo () { # Declare an array to define the options of this helper. - local legacy_args=rpkn - declare -Ar args_array=( [r]=repo= [p]=package= [k]=key= [n]=name= ) - local repo - local package - local key + local legacy_args=uscna + declare -Ar args_array=( [u]=uri= [s]=suite= [c]=component= [n]=name= [a]=append ) + local uri + local suite + local component local name + local append # Manage arguments with getopts ynh_handle_getopts_args "$@" name="${name:-$app}" - key=${key:-0} + append=${append:-0} - # Set a key only if asked - if [ -n "$key" ] + if [ $append -eq 1 ] then - key="--key=$key" + append="tee -a" + else + append="tee" fi - # Add an extra repository for those packages - ynh_install_extra_repo --repo="$repo" $key --priority=995 --name=$name - # Install requested dependencies from this extra repository. - ynh_add_app_dependencies --package="$package" - - # Remove this extra repository after packages are installed - ynh_remove_extra_repo --name=$app + mkdir -p "/etc/apt/sources.list.d" + # Add the new repo in sources.list.d + echo "deb $uri $suite $component" \ + | $append "/etc/apt/sources.list.d/$name.list" } -#================================================= - -# patched version of ynh_install_app_dependencies to be used with ynh_add_app_dependencies - -# Define and install dependencies with a equivs control file -# This helper can/should only be called once per app +# Pin a repository. # -# usage: ynh_install_app_dependencies dep [dep [...]] -# | arg: dep - the package name to install in dependence -# You can give a choice between some package with this syntax : "dep1|dep2" -# Example : ynh_install_app_dependencies dep1 dep2 "dep3|dep4|dep5" -# This mean in the dependence tree : dep1 & dep2 & (dep3 | dep4 | dep5) +# [internal] # -# Requires YunoHost version 2.6.4 or higher. -ynh_install_app_dependencies () { - local dependencies=$@ - dependencies="$(echo "$dependencies" | sed 's/\([^\<=\>]\)\ \([^(]\)/\1, \2/g')" - dependencies=${dependencies//|/ | } - local manifest_path="../manifest.json" - if [ ! -e "$manifest_path" ]; then - manifest_path="../settings/manifest.json" # Into the restore script, the manifest is not at the same place - fi - - local version=$(grep '\"version\": ' "$manifest_path" | cut -d '"' -f 4) # Retrieve the version number in the manifest file. - if [ ${#version} -eq 0 ]; then - version="1.0" - fi - local dep_app=${app//_/-} # Replace all '_' by '-' - - # Handle specific versions - if [[ "$dependencies" =~ [\<=\>] ]] - then - # Replace version specifications by relationships syntax - # https://www.debian.org/doc/debian-policy/ch-relationships.html - # Sed clarification - # [^(\<=\>] ignore if it begins by ( or < = >. To not apply twice. - # [\<=\>] matches < = or > - # \+ matches one or more occurence of the previous characters, for >= or >>. - # [^,]\+ matches all characters except ',' - # Ex: package>=1.0 will be replaced by package (>= 1.0) - dependencies="$(echo "$dependencies" | sed 's/\([^(\<=\>]\)\([\<=\>]\+\)\([^,]\+\)/\1 (\2 \3)/g')" - fi - - cat > /tmp/${dep_app}-ynh-deps.control << EOF # Make a control file for equivs-build -Section: misc -Priority: optional -Package: ${dep_app}-ynh-deps -Version: ${version} -Depends: ${dependencies} -Architecture: all -Description: Fake package for $app (YunoHost app) dependencies - This meta-package is only responsible of installing its dependencies. -EOF - ynh_package_install_from_equivs /tmp/${dep_app}-ynh-deps.control \ - || ynh_die --message="Unable to install dependencies" # Install the fake package and its dependencies - rm /tmp/${dep_app}-ynh-deps.control - ynh_app_setting_set --app=$app --key=apt_dependencies --value="$dependencies" -} - -ynh_add_app_dependencies () { +# usage: ynh_pin_repo --package=packages --pin=pin_filter [--priority=priority_value] [--name=name] [--append] +# | arg: -p, --package - Packages concerned by the pin. Or all, *. +# | arg: -i, --pin - Filter for the pin. +# | arg: -p, --priority - Priority for the pin +# | arg: -n, --name - Name for the files for this repo, $app as default value. +# | arg: -a, --append - Do not overwrite existing files. +# +# See https://manpages.debian.org/stretch/apt/apt_preferences.5.en.html for information about pinning. +# +ynh_pin_repo () { # Declare an array to define the options of this helper. - local legacy_args=pr - declare -Ar args_array=( [p]=package= [r]=replace) + local legacy_args=pirna + declare -Ar args_array=( [p]=package= [i]=pin= [r]=priority= [n]=name= [a]=append ) local package - local replace + local pin + local priority + local name + local append # Manage arguments with getopts ynh_handle_getopts_args "$@" - replace=${replace:-0} + package="${package:-*}" + priority=${priority:-50} + name="${name:-$app}" + append=${append:-0} - local current_dependencies="" - if [ $replace -eq 0 ] + if [ $append -eq 1 ] then - local dep_app=${app//_/-} # Replace all '_' by '-' - if ynh_package_is_installed --package="${dep_app}-ynh-deps" - then - current_dependencies="$(dpkg-query --show --showformat='${Depends}' ${dep_app}-ynh-deps) " - fi - - current_dependencies=${current_dependencies// | /|} + append="tee -a" + else + append="tee" fi - ynh_install_app_dependencies "${current_dependencies}${package}" -} + mkdir -p "/etc/apt/preferences.d" + echo "Package: $package +Pin: $pin +Pin-Priority: $priority +" \ + | $append "/etc/apt/preferences.d/$name" +} \ No newline at end of file diff --git a/scripts/ynh_install_php b/scripts/ynh_install_php index 1066727..7ac4420 100644 --- a/scripts/ynh_install_php +++ b/scripts/ynh_install_php @@ -33,12 +33,13 @@ ynh_install_php () { # Install php-fpm first, otherwise php will install apache as a dependency. ynh_add_app_dependencies --package="php${phpversion}-fpm" ynh_add_app_dependencies --package="php$phpversion php${phpversion}-common $package" - + # Set php7.0 back as the default version for php-cli. update-alternatives --set php /usr/bin/php7.0 - # Remove this extra repository after packages are installed - ynh_remove_extra_repo --name=extra_php_version + # Pin this extra repository after packages are installed to prevent sury of doing shit + ynh_pin_repo --package="*" --pin="origin \"packages.sury.org\"" --priority=200 --name=extra_php_version + ynh_pin_repo --package="php7.0*" --pin="origin \"packages.sury.org\"" --priority=600 --name=extra_php_version --append # Advertise service in admin panel yunohost service add php${phpversion}-fpm --log "/var/log/php${phpversion}-fpm.log" @@ -74,4 +75,4 @@ ynh_remove_php () { then ynh_secure_remove /etc/php/ynh_app_version fi -} +} \ No newline at end of file