doc/packaging_apps_helpers.md

3015 lines
86 KiB
Markdown

<!-- NO_MARKDOWN_PARSING -->
<h1>App helpers</h1>
<h3 style="text-transform: uppercase; font-weight: bold">backend</h3>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_use_logrotate" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_use_logrotate</tt></h5>
<h6 class="helper-card-subtitle text-muted">Use logrotate to manage the logfile</h6>
</div>
<div id="collapse-ynh_use_logrotate" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_use_logrotate [logfile] [--non-append|--append] [specific_user/specific_group]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>logfile</code> : absolute path of logfile</li>
<li><code>--non-append</code> : (Option) Replace the config file instead of appending this new config.</li>
<li><code>specific_user</code> : run logrotate as the specified user and group. If not specified logrotate is runned as root.</li>
</ul>
</p>
<p>
<strong>Details</strong>:
<p>
If no argument provided, a standard directory will be use. /var/log/${app}</br>You can provide a path with the directory only or with the logfile.</br>/parentdir/logdir</br>/parentdir/logdir/logfile.log</br></br>It's possible to use this helper several times, each config will be added to the same logrotate config file.</br>Unless you use the option --non-append</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/backend#L15">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_remove_logrotate" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_remove_logrotate</tt></h5>
<h6 class="helper-card-subtitle text-muted">Remove the app's logrotate config.</h6>
</div>
<div id="collapse-ynh_remove_logrotate" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_remove_logrotate</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/backend#L68">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_add_systemd_config" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_add_systemd_config</tt></h5>
<h6 class="helper-card-subtitle text-muted">Create a dedicated systemd config</h6>
</div>
<div id="collapse-ynh_add_systemd_config" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_add_systemd_config [service] [template]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>service</code> : Service name (optionnal, $app by default)</li>
<li><code>template</code> : Name of template file (optionnal, this is 'systemd' by default, meaning ./conf/systemd.service will be used as template)</li>
</ul>
</p>
<p>
<strong>Details</strong>:
<p>
This will use the template ../conf/<templatename>.service</br>to generate a systemd config, by replacing the following keywords</br>with global variables that should be defined before calling</br>this helper :</br></br>__APP__ by $app</br> __FINALPATH__ by $final_path</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/backend#L88">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_remove_systemd_config" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_remove_systemd_config</tt></h5>
<h6 class="helper-card-subtitle text-muted">Remove the dedicated systemd config</h6>
</div>
<div id="collapse-ynh_remove_systemd_config" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_remove_systemd_config [service]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>service</code> : Service name (optionnal, $app by default)</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/backend#L115">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_add_nginx_config" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_add_nginx_config</tt></h5>
<h6 class="helper-card-subtitle text-muted">Create a dedicated nginx config</h6>
</div>
<div id="collapse-ynh_add_nginx_config" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_add_nginx_config "list of others variables to replace"</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>list</code> : ['others', 'variables', 'to', 'replace', 'separeted', 'by', 'a', 'space']</li>
</ul>
</p>
<p>
<strong>Details</strong>:
<p>
This will use a template in ../conf/nginx.conf</br> __PATH__ by $path_url</br> __DOMAIN__ by $domain</br> __PORT__ by $port</br> __NAME__ by $app</br> __FINALPATH__ by $final_path</br></br>And dynamic variables (from the last example) :</br> __PATH_2__ by $path_2</br> __PORT_2__ by $port_2</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/backend#L145">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_remove_nginx_config" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_remove_nginx_config</tt></h5>
<h6 class="helper-card-subtitle text-muted">Remove the dedicated nginx config</h6>
</div>
<div id="collapse-ynh_remove_nginx_config" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_remove_nginx_config</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/backend#L195">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_add_fpm_config" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_add_fpm_config</tt></h5>
<h6 class="helper-card-subtitle text-muted">Create a dedicated php-fpm config</h6>
</div>
<div id="collapse-ynh_add_fpm_config" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_add_fpm_config</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/backend#L203">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_remove_fpm_config" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_remove_fpm_config</tt></h5>
<h6 class="helper-card-subtitle text-muted">Remove the dedicated php-fpm config</h6>
</div>
<div id="collapse-ynh_remove_fpm_config" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_remove_fpm_config</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/backend#L237">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<h3 style="text-transform: uppercase; font-weight: bold">filesystem</h3>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_backup" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_backup</tt></h5>
<h6 class="helper-card-subtitle text-muted">Add a file or a directory to the list of paths to backup</h6>
</div>
<div id="collapse-ynh_backup" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code helper-usage">ynh_backup src [dest [is_big [arg]]]
the backup dir.
backup dir</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>src</code> : file or directory to bind or symlink or copy. it shouldn't be in</li>
<li><code>dest</code> : destination file or directory inside the</li>
<li><code>is_big</code> : 1 to indicate data are big (mail, video, image ...)</li>
<li><code>arg</code> : Deprecated arg</li>
</ul>
</p>
<p>
<strong>Example</strong>: <code class="helper-code"># Wordpress app context</code>
</p>
<p>
<strong>Details</strong>:
<p>
Note: this helper could be used in backup hook or in backup script inside an</br>app package</br></br>Details: ynh_backup writes SRC and the relative DEST into a CSV file. And it</br>creates the parent destination directory</br></br>If DEST is ended by a slash it complete this path with the basename of SRC.</br></br>ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf"</br># => This line will be added into CSV file</br># "/etc/nginx/conf.d/$domain.d/$app.conf","apps/wordpress/etc/nginx/conf.d/$domain.d/$app.conf"</br></br>ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" "conf/nginx.conf"</br># => "/etc/nginx/conf.d/$domain.d/$app.conf","apps/wordpress/conf/nginx.conf"</br></br>ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" "conf/"</br># => "/etc/nginx/conf.d/$domain.d/$app.conf","apps/wordpress/conf/$app.conf"</br></br>ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" "conf"</br># => "/etc/nginx/conf.d/$domain.d/$app.conf","apps/wordpress/conf"</br></br>#Deprecated usages (maintained for retro-compatibility)</br>ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" "${backup_dir}/conf/nginx.conf"</br># => "/etc/nginx/conf.d/$domain.d/$app.conf","apps/wordpress/conf/nginx.conf"</br></br>ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" "/conf/"</br># => "/etc/nginx/conf.d/$domain.d/$app.conf","apps/wordpress/conf/$app.conf"</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/filesystem#L44">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_restore" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_restore</tt></h5>
<h6 class="helper-card-subtitle text-muted">Restore all files linked to the restore hook or to the restore app script</h6>
</div>
<div id="collapse-ynh_restore" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_restore</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/filesystem#L131">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_restore_file" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_restore_file</tt></h5>
<h6 class="helper-card-subtitle text-muted">Restore a file or a directory</h6>
</div>
<div id="collapse-ynh_restore_file" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code helper-usage">ynh_restore_file ORIGIN_PATH [ DEST_PATH ]
to be backuped or relative path to $YNH_CWD where it is located in the backup archive
the destination will be ORIGIN_PATH or if the ORIGIN_PATH doesn't exist in
the archive, the destination will be searched into backup.csv</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>ORIGIN_PATH</code> : Path where was located the file or the directory before</li>
<li><code>DEST_PATH</code> : Path where restore the file or the dir, if unspecified,</li>
</ul>
</p>
<p>
<strong>Example</strong>: <code class="helper-code">ynh_restore_file "/etc/nginx/conf.d/$domain.d/$app.conf" # if apps/wordpress/etc/nginx/conf.d/$domain.d/$app.conf exists, restore it into # /etc/nginx/conf.d/$domain.d/$app.conf # if no, search a correspondance in the csv (eg: conf/nginx.conf) and restore it into # /etc/nginx/conf.d/$domain.d/$app.conf</code>
</p>
<p>
<strong>Details</strong>:
<p>
Use the registered path in backup_list by ynh_backup to restore the file at</br>the good place.</br></br>If DEST_PATH already exists and is lighter than 500 Mo, a backup will be made in</br>/home/yunohost.conf/backup/. Otherwise, the existing file is removed.</br></br># DON'T GIVE THE ARCHIVE PATH:</br>ynh_restore_file "conf/nginx.conf"</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/filesystem#L191">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_store_file_checksum" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_store_file_checksum</tt></h5>
<h6 class="helper-card-subtitle text-muted">Calculate and store a file checksum into the app settings</h6>
</div>
<div id="collapse-ynh_store_file_checksum" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_store_file_checksum file</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>file</code> : The file on which the checksum will performed, then stored.</li>
</ul>
</p>
<p>
<strong>Details</strong>:
<p>
$app should be defined when calling this helper</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/filesystem#L270">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_backup_if_checksum_is_different" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_backup_if_checksum_is_different</tt></h5>
<h6 class="helper-card-subtitle text-muted">Verify the checksum and backup the file if it's different
This helper is primarily meant to allow to easily backup personalised/manually
modified config files.</h6>
</div>
<div id="collapse-ynh_backup_if_checksum_is_different" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_backup_if_checksum_is_different file</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>file</code> : The file on which the checksum test will be perfomed.</li>
</ul>
</p>
<p>
<strong>Details</strong>:
<p>
$app should be defined when calling this helper</br></br>| ret: Return the name a the backup file, or nothing</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/filesystem#L285">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_secure_remove" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_secure_remove</tt></h5>
<h6 class="helper-card-subtitle text-muted">Remove a file or a directory securely</h6>
</div>
<div id="collapse-ynh_secure_remove" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_secure_remove path_to_remove</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>path_to_remove</code> : File or directory to remove</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/filesystem#L306">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<h3 style="text-transform: uppercase; font-weight: bold">ip</h3>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_validate_ip" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_validate_ip</tt></h5>
<h6 class="helper-card-subtitle text-muted">Validate an IP address</h6>
</div>
<div id="collapse-ynh_validate_ip" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_validate_ip [family] [ip_address]</code>
</p>
<p>
<strong>Returns</strong>: 0 for valid ip addresses, 1 otherwise
</p>
<p>
<strong>Example</strong>: <code class="helper-code">ynh_validate_ip 4 111.222.333.444</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/ip#L8">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_validate_ip4" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_validate_ip4</tt></h5>
<h6 class="helper-card-subtitle text-muted">Validate an IPv4 address</h6>
</div>
<div id="collapse-ynh_validate_ip4" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_validate_ip4 <ip_address></code>
</p>
<p>
<strong>Returns</strong>: 0 for valid ipv4 addresses, 1 otherwise
</p>
<p>
<strong>Example</strong>: <code class="helper-code">ynh_validate_ip4 111.222.333.444</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/ip#L36">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_validate_ip6" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_validate_ip6</tt></h5>
<h6 class="helper-card-subtitle text-muted">Validate an IPv6 address</h6>
</div>
<div id="collapse-ynh_validate_ip6" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_validate_ip6 <ip_address></code>
</p>
<p>
<strong>Returns</strong>: 0 for valid ipv6 addresses, 1 otherwise
</p>
<p>
<strong>Example</strong>: <code class="helper-code">ynh_validate_ip6 2000:dead:beef::1</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/ip#L49">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<h3 style="text-transform: uppercase; font-weight: bold">mysql</h3>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_mysql_connect_as" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_mysql_connect_as</tt></h5>
<h6 class="helper-card-subtitle text-muted">Open a connection as a user</h6>
</div>
<div id="collapse-ynh_mysql_connect_as" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_mysql_connect_as user pwd [db]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>user</code> : the user name to connect as</li>
<li><code>pwd</code> : the user password</li>
<li><code>db</code> : the database to connect to</li>
</ul>
</p>
<p>
<strong>Example</strong>: <code class="helper-code">ynh_mysql_connect_as 'user' 'pass' <<< "UPDATE ...;" example: ynh_mysql_connect_as 'user' 'pass' < /path/to/file.sql</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/mysql#L12">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_mysql_execute_as_root" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_mysql_execute_as_root</tt></h5>
<h6 class="helper-card-subtitle text-muted">Execute a command as root user</h6>
</div>
<div id="collapse-ynh_mysql_execute_as_root" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_mysql_execute_as_root sql [db]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>sql</code> : the SQL command to execute</li>
<li><code>db</code> : the database to connect to</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/mysql#L21">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_mysql_execute_file_as_root" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_mysql_execute_file_as_root</tt></h5>
<h6 class="helper-card-subtitle text-muted">Execute a command from a file as root user</h6>
</div>
<div id="collapse-ynh_mysql_execute_file_as_root" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_mysql_execute_file_as_root file [db]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>file</code> : the file containing SQL commands</li>
<li><code>db</code> : the database to connect to</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/mysql#L31">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_mysql_dump_db" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_mysql_dump_db</tt></h5>
<h6 class="helper-card-subtitle text-muted">Dump a database</h6>
</div>
<div id="collapse-ynh_mysql_dump_db" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_mysql_dump_db db</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>db</code> : the database name to dump</li>
</ul>
</p>
<p>
<strong>Returns</strong>: the mysqldump output
</p>
<p>
<strong>Example</strong>: <code class="helper-code">ynh_mysql_dump_db 'roundcube' > ./dump.sql</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/mysql#L79">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_mysql_user_exists" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_mysql_user_exists</tt></h5>
<h6 class="helper-card-subtitle text-muted">Check if a mysql user exists</h6>
</div>
<div id="collapse-ynh_mysql_user_exists" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_mysql_user_exists user</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>user</code> : the user for which to check existence</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/mysql#L99">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_mysql_setup_db" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_mysql_setup_db</tt></h5>
<h6 class="helper-card-subtitle text-muted">Create a database, an user and its password. Then store the password in the app's config</h6>
</div>
<div id="collapse-ynh_mysql_setup_db" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_mysql_setup_db user name [pwd]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>user</code> : Owner of the database</li>
<li><code>name</code> : Name of the database</li>
<li><code>pwd</code> : Password of the database. If not given, a password will be generated</li>
</ul>
</p>
<p>
<strong>Details</strong>:
<p>
After executing this helper, the password of the created database will be available in $db_pwd</br>It will also be stored as "mysqlpwd" into the app settings.</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/mysql#L129">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_mysql_remove_db" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_mysql_remove_db</tt></h5>
<h6 class="helper-card-subtitle text-muted">Remove a database if it exists, and the associated user</h6>
</div>
<div id="collapse-ynh_mysql_remove_db" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_mysql_remove_db user name</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>user</code> : Owner of the database</li>
<li><code>name</code> : Name of the database</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/mysql#L144">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_sanitize_dbid" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_sanitize_dbid</tt></h5>
<h6 class="helper-card-subtitle text-muted">Sanitize a string intended to be the name of a database
(More specifically : replace - and . by _)</h6>
</div>
<div id="collapse-ynh_sanitize_dbid" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_sanitize_dbid name</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>name</code> : name to correct/sanitize</li>
</ul>
</p>
<p>
<strong>Returns</strong>: the corrected name
</p>
<p>
<strong>Example</strong>: <code class="helper-code">dbname=$(ynh_sanitize_dbid $app)</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/mysql#L169">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<h3 style="text-transform: uppercase; font-weight: bold">network</h3>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_normalize_url_path" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_normalize_url_path</tt></h5>
<h6 class="helper-card-subtitle text-muted">Normalize the url path syntax
Handle the slash at the beginning of path and its absence at ending
Return a normalized url path</h6>
</div>
<div id="collapse-ynh_normalize_url_path" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_normalize_url_path path_to_normalize</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>url_path_to_normalize</code> : URL path to normalize before using it</li>
</ul>
</p>
<p>
<strong>Example</strong>: <code class="helper-code">url_path=$(ynh_normalize_url_path $url_path) ynh_normalize_url_path example -> /example ynh_normalize_url_path /example -> /example ynh_normalize_url_path /example/ -> /example ynh_normalize_url_path / -> /</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/network#L13">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_find_port" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_find_port</tt></h5>
<h6 class="helper-card-subtitle text-muted">Find a free port and return it</h6>
</div>
<div id="collapse-ynh_find_port" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_find_port begin_port</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>begin_port</code> : port to start to search</li>
</ul>
</p>
<p>
<strong>Example</strong>: <code class="helper-code">port=$(ynh_find_port 8080)</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/network#L31">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_webpath_available" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_webpath_available</tt></h5>
<h6 class="helper-card-subtitle text-muted">Check availability of a web path</h6>
</div>
<div id="collapse-ynh_webpath_available" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_webpath_available domain path</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>domain</code> : the domain/host of the url</li>
<li><code>path</code> : the web path to check the availability of</li>
</ul>
</p>
<p>
<strong>Example</strong>: <code class="helper-code">ynh_webpath_available some.domain.tld /coffee</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/network#L48">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_webpath_register" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_webpath_register</tt></h5>
<h6 class="helper-card-subtitle text-muted">Register/book a web path for an app</h6>
</div>
<div id="collapse-ynh_webpath_register" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_webpath_register app domain path</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>app</code> : the app for which the domain should be registered</li>
<li><code>domain</code> : the domain/host of the web path</li>
<li><code>path</code> : the web path to be registered</li>
</ul>
</p>
<p>
<strong>Example</strong>: <code class="helper-code">ynh_webpath_register wordpress some.domain.tld /coffee</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/network#L62">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<h3 style="text-transform: uppercase; font-weight: bold">nodejs</h3>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-export" style="cursor:pointer">
<h5 class="helper-card-title"><tt>export</tt></h5>
<h6 class="helper-card-subtitle text-muted">N_PREFIX is the directory of n, it needs to be loaded as a environment variable.</h6>
</div>
<div id="collapse-export" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code"></code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/nodejs#L4">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_use_nodejs" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_use_nodejs</tt></h5>
<h6 class="helper-card-subtitle text-muted">Load the version of node for an app, and set variables.</h6>
</div>
<div id="collapse-ynh_use_nodejs" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_use_nodejs</code>
</p>
<p>
<strong>Details</strong>:
<p>
ynh_use_nodejs has to be used in any app scripts before using node for the first time.</br></br>2 variables are available:</br> - $nodejs_path: The absolute path of node for the chosen version.</br> - $nodejs_version: Just the version number of node for this app. Stored as 'nodejs_version' in settings.yml.</br>And 2 alias stored in variables:</br> - $nodejs_use_version: An old variable, not used anymore. Keep here to not break old apps</br> NB: $PATH will contain the path to node, it has to be propagated to any other shell which needs to use it.</br> That's means it has to be added to any systemd script.</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/nodejs#L37">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_install_nodejs" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_install_nodejs</tt></h5>
<h6 class="helper-card-subtitle text-muted">Install a specific version of nodejs</h6>
</div>
<div id="collapse-ynh_install_nodejs" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code helper-usage">ynh_install_nodejs [nodejs_version]
If possible, prefer to use major version number (e.g. 8 instead of 8.10.0).
The crontab will handle the update of minor versions when needed.</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>nodejs_version</code> : Version of node to install.</li>
</ul>
</p>
<p>
<strong>Details</strong>:
<p>
n (Node version management) uses the PATH variable to store the path of the version of node it is going to use.</br>That's how it changes the version</br></br>ynh_install_nodejs will install the version of node provided as argument by using n.</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/nodejs#L60">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_remove_nodejs" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_remove_nodejs</tt></h5>
<h6 class="helper-card-subtitle text-muted">Remove the version of node used by the app.</h6>
</div>
<div id="collapse-ynh_remove_nodejs" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_remove_nodejs</code>
</p>
<p>
<strong>Details</strong>:
<p>
This helper will check if another app uses the same version of node,</br>if not, this version of node will be removed.</br>If no other app uses node, n will be also removed.</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/nodejs#L124">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<h3 style="text-transform: uppercase; font-weight: bold">package</h3>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_package_is_installed" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_package_is_installed</tt></h5>
<h6 class="helper-card-subtitle text-muted">Check either a package is installed or not</h6>
</div>
<div id="collapse-ynh_package_is_installed" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_package_is_installed name</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>name</code> : the package name to check</li>
</ul>
</p>
<p>
<strong>Example</strong>: <code class="helper-code">ynh_package_is_installed 'yunohost' && echo "ok"</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/package#L7">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_package_version" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_package_version</tt></h5>
<h6 class="helper-card-subtitle text-muted">Get the version of an installed package</h6>
</div>
<div id="collapse-ynh_package_version" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_package_version name</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>name</code> : the package name to get version</li>
</ul>
</p>
<p>
<strong>Returns</strong>: the version or an empty string
</p>
<p>
<strong>Example</strong>: <code class="helper-code">version=$(ynh_package_version 'yunohost')</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/package#L19">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_package_update" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_package_update</tt></h5>
<h6 class="helper-card-subtitle text-muted">Update package index files</h6>
</div>
<div id="collapse-ynh_package_update" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_package_update</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/package#L39">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_package_install" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_package_install</tt></h5>
<h6 class="helper-card-subtitle text-muted">Install package(s)</h6>
</div>
<div id="collapse-ynh_package_install" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_package_install name [name [...]]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>name</code> : the package name to install</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/package#L47">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_package_remove" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_package_remove</tt></h5>
<h6 class="helper-card-subtitle text-muted">Remove package(s)</h6>
</div>
<div id="collapse-ynh_package_remove" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_package_remove name [name [...]]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>name</code> : the package name to remove</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/package#L56">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_package_autoremove" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_package_autoremove</tt></h5>
<h6 class="helper-card-subtitle text-muted">Remove package(s) and their uneeded dependencies</h6>
</div>
<div id="collapse-ynh_package_autoremove" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_package_autoremove name [name [...]]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>name</code> : the package name to remove</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/package#L64">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_package_autopurge" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_package_autopurge</tt></h5>
<h6 class="helper-card-subtitle text-muted">Purge package(s) and their uneeded dependencies</h6>
</div>
<div id="collapse-ynh_package_autopurge" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_package_autopurge name [name [...]]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>name</code> : the package name to autoremove and purge</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/package#L72">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_install_app_dependencies" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_install_app_dependencies</tt></h5>
<h6 class="helper-card-subtitle text-muted">Define and install dependencies with a equivs control file
This helper can/should only be called once per app</h6>
</div>
<div id="collapse-ynh_install_app_dependencies" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code helper-usage">ynh_install_app_dependencies dep [dep [...]]
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)</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>dep</code> : the package name to install in dependence</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/package#L127">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_remove_app_dependencies" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_remove_app_dependencies</tt></h5>
<h6 class="helper-card-subtitle text-muted">Remove fake package and its dependencies</h6>
</div>
<div id="collapse-ynh_remove_app_dependencies" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_remove_app_dependencies</code>
</p>
<p>
<strong>Details</strong>:
<p>
Dependencies will removed only if no other package need them.</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/package#L163">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<h3 style="text-transform: uppercase; font-weight: bold">print</h3>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_die" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_die</tt></h5>
<h6 class="helper-card-subtitle text-muted">Print a message to stderr and exit
usage: ynh_die MSG [RETCODE]</h6>
</div>
<div id="collapse-ynh_die" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code"></code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/print#L3">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_info" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_info</tt></h5>
<h6 class="helper-card-subtitle text-muted">Display a message in the 'INFO' logging category</h6>
</div>
<div id="collapse-ynh_info" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_info "Some message"</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/print#L11">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<h3 style="text-transform: uppercase; font-weight: bold">psql</h3>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_psql_test_if_first_run" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_psql_test_if_first_run</tt></h5>
<h6 class="helper-card-subtitle text-muted">Create a master password and set up global settings
Please always call this script in install and restore scripts</h6>
</div>
<div id="collapse-ynh_psql_test_if_first_run" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_psql_test_if_first_run</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/psql#L5">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_psql_connect_as" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_psql_connect_as</tt></h5>
<h6 class="helper-card-subtitle text-muted">Open a connection as a user</h6>
</div>
<div id="collapse-ynh_psql_connect_as" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_psql_connect_as user pwd [db]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>user</code> : the user name to connect as</li>
<li><code>pwd</code> : the user password</li>
<li><code>db</code> : the database to connect to</li>
</ul>
</p>
<p>
<strong>Example</strong>: <code class="helper-code">ynh_psql_connect_as 'user' 'pass' <<< "UPDATE ...;" example: ynh_psql_connect_as 'user' 'pass' < /path/to/file.sql</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/psql#L46">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_psql_execute_as_root" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_psql_execute_as_root</tt></h5>
<h6 class="helper-card-subtitle text-muted"># Execute a command as root user</h6>
</div>
<div id="collapse-ynh_psql_execute_as_root" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_psql_execute_as_root sql [db]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>sql</code> : the SQL command to execute</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/psql#L57">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_psql_execute_file_as_root" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_psql_execute_file_as_root</tt></h5>
<h6 class="helper-card-subtitle text-muted">Execute a command from a file as root user</h6>
</div>
<div id="collapse-ynh_psql_execute_file_as_root" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_psql_execute_file_as_root file [db]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>file</code> : the file containing SQL commands</li>
<li><code>db</code> : the database to connect to</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/psql#L67">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_psql_setup_db" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_psql_setup_db</tt></h5>
<h6 class="helper-card-subtitle text-muted">Create a database, an user and its password. Then store the password in the app's config</h6>
</div>
<div id="collapse-ynh_psql_setup_db" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_psql_setup_db user name [pwd]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>user</code> : Owner of the database</li>
<li><code>name</code> : Name of the database</li>
<li><code>pwd</code> : Password of the database. If not given, a password will be generated</li>
</ul>
</p>
<p>
<strong>Details</strong>:
<p>
After executing this helper, the password of the created database will be available in $db_pwd</br>It will also be stored as "psqlpwd" into the app settings.</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/psql#L82">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_psql_create_db" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_psql_create_db</tt></h5>
<h6 class="helper-card-subtitle text-muted">Create a database and grant privilegies to a user</h6>
</div>
<div id="collapse-ynh_psql_create_db" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_psql_create_db db [user [pwd]]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>db</code> : the database name to create</li>
<li><code>user</code> : the user to grant privilegies</li>
<li><code>pwd</code> : the user password</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/psql#L98">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_psql_remove_db" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_psql_remove_db</tt></h5>
<h6 class="helper-card-subtitle text-muted">Drop a database</h6>
</div>
<div id="collapse-ynh_psql_remove_db" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_psql_drop_db db</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>db</code> : the database name to drop</li>
<li><code>user</code> : the user to drop</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/psql#L111">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_psql_dump_db" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_psql_dump_db</tt></h5>
<h6 class="helper-card-subtitle text-muted">Dump a database</h6>
</div>
<div id="collapse-ynh_psql_dump_db" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_psql_dump_db db</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>db</code> : the database name to dump</li>
</ul>
</p>
<p>
<strong>Returns</strong>: the psqldump output
</p>
<p>
<strong>Example</strong>: <code class="helper-code">ynh_psql_dump_db 'roundcube' > ./dump.sql</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/psql#L125">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_psql_create_user" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_psql_create_user</tt></h5>
<h6 class="helper-card-subtitle text-muted">Create a user</h6>
</div>
<div id="collapse-ynh_psql_create_user" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_psql_create_user user pwd [host]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>user</code> : the user name to create</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/psql#L135">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_psql_drop_user" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_psql_drop_user</tt></h5>
<h6 class="helper-card-subtitle text-muted">Drop a user</h6>
</div>
<div id="collapse-ynh_psql_drop_user" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_psql_drop_user user</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>user</code> : the user name to drop</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/psql#L145">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<h3 style="text-transform: uppercase; font-weight: bold">setting</h3>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_app_setting_get" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_app_setting_get</tt></h5>
<h6 class="helper-card-subtitle text-muted">Get an application setting</h6>
</div>
<div id="collapse-ynh_app_setting_get" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_app_setting_get app key</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>app</code> : the application id</li>
<li><code>key</code> : the setting to get</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/setting#L6">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_app_setting_set" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_app_setting_set</tt></h5>
<h6 class="helper-card-subtitle text-muted">Set an application setting</h6>
</div>
<div id="collapse-ynh_app_setting_set" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_app_setting_set app key value</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>app</code> : the application id</li>
<li><code>key</code> : the setting name to set</li>
<li><code>value</code> : the setting value to set</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/setting#L16">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_app_setting_delete" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_app_setting_delete</tt></h5>
<h6 class="helper-card-subtitle text-muted">Delete an application setting</h6>
</div>
<div id="collapse-ynh_app_setting_delete" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_app_setting_delete app key</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>app</code> : the application id</li>
<li><code>key</code> : the setting to delete</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/setting#L25">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<h3 style="text-transform: uppercase; font-weight: bold">string</h3>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_string_random" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_string_random</tt></h5>
<h6 class="helper-card-subtitle text-muted">Generate a random string</h6>
</div>
<div id="collapse-ynh_string_random" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_string_random [length]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>length</code> : the string length to generate (default: 24)</li>
</ul>
</p>
<p>
<strong>Example</strong>: <code class="helper-code">pwd=$(ynh_string_random 8)</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/string#L7">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_replace_string" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_replace_string</tt></h5>
<h6 class="helper-card-subtitle text-muted">Substitute/replace a string (or expression) by another in a file</h6>
</div>
<div id="collapse-ynh_replace_string" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_replace_string match_string replace_string target_file</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>match_string</code> : String to be searched and replaced in the file</li>
<li><code>replace_string</code> : String that will replace matches</li>
<li><code>target_file</code> : File in which the string will be replaced.</li>
</ul>
</p>
<p>
<strong>Details</strong>:
<p>
As this helper is based on sed command, regular expressions and</br>references to sub-expressions can be used</br>(see sed manual page for more information)</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/string#L23">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_replace_special_string" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_replace_special_string</tt></h5>
<h6 class="helper-card-subtitle text-muted">Substitute/replace a special string by another in a file</h6>
</div>
<div id="collapse-ynh_replace_special_string" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_replace_special_string match_string replace_string target_file</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>match_string</code> : String to be searched and replaced in the file</li>
<li><code>replace_string</code> : String that will replace matches</li>
<li><code>target_file</code> : File in which the string will be replaced.</li>
</ul>
</p>
<p>
<strong>Details</strong>:
<p>
This helper will use ynh_replace_string, but as you can use special</br>characters, you can't use some regular expressions and sub-expressions.</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/string#L45">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<h3 style="text-transform: uppercase; font-weight: bold">system</h3>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_abort_if_errors" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_abort_if_errors</tt></h5>
<h6 class="helper-card-subtitle text-muted">Exits if an error occurs during the execution of the script.</h6>
</div>
<div id="collapse-ynh_abort_if_errors" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_abort_if_errors</code>
</p>
<p>
<strong>Details</strong>:
<p>
This configure the rest of the script execution such that, if an error occurs</br>or if an empty variable is used, the execution of the script stops</br>immediately and a call to `ynh_clean_setup` is triggered if it has been</br>defined by your script.</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/system#L44">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_get_debian_release" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_get_debian_release</tt></h5>
<h6 class="helper-card-subtitle text-muted">Fetch the Debian release codename</h6>
</div>
<div id="collapse-ynh_get_debian_release" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_get_debian_release</code>
</p>
<p>
<strong>Returns</strong>: The Debian release codename (i.e. jessie, stretch, ...)
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/system#L53">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<h3 style="text-transform: uppercase; font-weight: bold">user</h3>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_user_exists" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_user_exists</tt></h5>
<h6 class="helper-card-subtitle text-muted">Check if a YunoHost user exists</h6>
</div>
<div id="collapse-ynh_user_exists" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_user_exists username</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>username</code> : the username to check</li>
</ul>
</p>
<p>
<strong>Example</strong>: <code class="helper-code">ynh_user_exists 'toto' || exit 1</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/user#L7">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_user_get_info" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_user_get_info</tt></h5>
<h6 class="helper-card-subtitle text-muted">Retrieve a YunoHost user information</h6>
</div>
<div id="collapse-ynh_user_get_info" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_user_get_info username key</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>username</code> : the username to retrieve info from</li>
<li><code>key</code> : the key to retrieve</li>
</ul>
</p>
<p>
<strong>Returns</strong>: string - the key's value
</p>
<p>
<strong>Example</strong>: <code class="helper-code">mail=$(ynh_user_get_info 'toto' 'mail')</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/user#L19">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_user_list" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_user_list</tt></h5>
<h6 class="helper-card-subtitle text-muted">Get the list of YunoHost users</h6>
</div>
<div id="collapse-ynh_user_list" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_user_list</code>
</p>
<p>
<strong>Returns</strong>: string - one username per line
</p>
<p>
<strong>Example</strong>: <code class="helper-code">for u in $(ynh_user_list); do ...</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/user#L29">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_system_user_exists" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_system_user_exists</tt></h5>
<h6 class="helper-card-subtitle text-muted">Check if a user exists on the system</h6>
</div>
<div id="collapse-ynh_system_user_exists" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_system_user_exists username</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>username</code> : the username to check</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/user#L38">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_system_user_create" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_system_user_create</tt></h5>
<h6 class="helper-card-subtitle text-muted">Create a system user</h6>
</div>
<div id="collapse-ynh_system_user_create" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_system_user_create user_name [home_dir]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>user_name</code> : Name of the system user that will be create</li>
<li><code>home_dir</code> : Path of the home dir for the user. Usually the final path of the app. If this argument is omitted, the user will be created without home</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/user#L47">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_system_user_delete" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_system_user_delete</tt></h5>
<h6 class="helper-card-subtitle text-muted">Delete a system user</h6>
</div>
<div id="collapse-ynh_system_user_delete" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_system_user_delete user_name</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>user_name</code> : Name of the system user that will be create</li>
</ul>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/user#L63">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<h3 style="text-transform: uppercase; font-weight: bold">utils</h3>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_get_plain_key" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_get_plain_key</tt></h5>
<h6 class="helper-card-subtitle text-muted">Extract a key from a plain command output</h6>
</div>
<div id="collapse-ynh_get_plain_key" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_get_plain_key key [subkey [subsubkey ...]]</code>
</p>
<p>
<strong>Returns</strong>: string - the key's value
</p>
<p>
<strong>Example</strong>: <code class="helper-code">yunohost user info tata --output-as plain | ynh_get_plain_key mail</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/utils#L7">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_restore_upgradebackup" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_restore_upgradebackup</tt></h5>
<h6 class="helper-card-subtitle text-muted">Restore a previous backup if the upgrade process failed</h6>
</div>
<div id="collapse-ynh_restore_upgradebackup" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code helper-usage">ynh_backup_before_upgrade
ynh_clean_setup () {
ynh_restore_upgradebackup
}
ynh_abort_if_errors</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/utils#L37">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_backup_before_upgrade" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_backup_before_upgrade</tt></h5>
<h6 class="helper-card-subtitle text-muted">Make a backup in case of failed upgrade</h6>
</div>
<div id="collapse-ynh_backup_before_upgrade" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code helper-usage">ynh_backup_before_upgrade
ynh_clean_setup () {
ynh_restore_upgradebackup
}
ynh_abort_if_errors</code>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/utils#L68">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_setup_source" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_setup_source</tt></h5>
<h6 class="helper-card-subtitle text-muted">Download, check integrity, uncompress and patch the source from app.src</h6>
</div>
<div id="collapse-ynh_setup_source" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_setup_source dest_dir [source_id]</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>dest_dir</code> : Directory where to setup sources</li>
<li><code>source_id</code> : Name of the app, if the package contains more than one app</li>
</ul>
</p>
<p>
<strong>Details</strong>:
<p>
The file conf/app.src need to contains:</br></br>SOURCE_URL=Address to download the app archive</br>SOURCE_SUM=Control sum</br># (Optional) Program to check the integrity (sha256sum, md5sum...)</br># default: sha256</br>SOURCE_SUM_PRG=sha256</br># (Optional) Archive format</br># default: tar.gz</br>SOURCE_FORMAT=tar.gz</br># (Optional) Put false if sources are directly in the archive root</br># default: true</br>SOURCE_IN_SUBDIR=false</br># (Optionnal) Name of the local archive (offline setup support)</br># default: ${src_id}.${src_format}</br>SOURCE_FILENAME=example.tar.gz</br># (Optional) If it set as false don't extract the source.</br># (Useful to get a debian package or a python wheel.)</br># default: true</br>SOURCE_EXTRACT=(true|false)</br></br>Details:</br>This helper downloads sources from SOURCE_URL if there is no local source</br>archive in /opt/yunohost-apps-src/APP_ID/SOURCE_FILENAME</br></br>Next, it checks the integrity with "SOURCE_SUM_PRG -c --status" command.</br></br>If it's ok, the source archive will be uncompressed in $dest_dir. If the</br>SOURCE_IN_SUBDIR is true, the first level directory of the archive will be</br>removed.</br></br>Finally, patches named sources/patches/${src_id}-*.patch and extra files in</br>sources/extra_files/$src_id will be applied to dest_dir</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/utils#L147">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_local_curl" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_local_curl</tt></h5>
<h6 class="helper-card-subtitle text-muted">Curl abstraction to help with POST requests to local pages (such as installation forms)</h6>
</div>
<div id="collapse-ynh_local_curl" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_local_curl "page_uri" "key1=value1" "key2=value2" ...</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>page_uri</code> : Path (relative to $path_url) of the page where POST data will be sent</li>
<li><code>key1=value1</code> : (Optionnal) POST key and corresponding value</li>
<li><code>key2=value2</code> : (Optionnal) Another POST key and corresponding value</li>
<li><code>...</code> : (Optionnal) More POST keys and values</li>
</ul>
</p>
<p>
<strong>Example</strong>: <code class="helper-code">ynh_local_curl "/install.php?installButton" "foo=$var1" "bar=$var2"</code>
</p>
<p>
<strong>Details</strong>:
<p>
$domain and $path_url should be defined externally (and correspond to the domain.tld and the /path (of the app?))</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/utils#L240">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<div class="helper-card">
<div class="helper-card-body">
<div data-toggle="collapse" href="#collapse-ynh_render_template" style="cursor:pointer">
<h5 class="helper-card-title"><tt>ynh_render_template</tt></h5>
<h6 class="helper-card-subtitle text-muted">Render templates with Jinja2</h6>
</div>
<div id="collapse-ynh_render_template" class="collapse" role="tabpanel">
<hr style="margin-top:25px; margin-bottom:25px;">
<p>
<strong>Usage</strong>: <code class="helper-code">ynh_render_template some_template output_path</code>
</p>
<p>
<strong>Arguments</strong>:
<ul>
<li><code>some_template</code> : Template file to be rendered</li>
<li><code>output_path</code> : The path where the output will be redirected to</li>
</ul>
</p>
<p>
<strong>Details</strong>:
<p>
Attention : Variables should be exported before calling this helper to be</br>accessible inside templates.</br></br>
</p>
</p>
<p>
<a href="https://github.com/YunoHost/yunohost/blob/stretch-unstable/data/helpers.d/utils#L269">Dude, show me the code !</a>
</p>
</div>
</div>
</div>
<style>
/*=================================================
Helper card
=================================================*/
.helper-card {
width:100%;
min-height: 1px;
margin-right: 10px;
margin-left: 10px;
border: 1px solid rgba(0,0,0,.125);
border-radius: 0.5rem;
word-wrap: break-word;
margin-top: 0.5rem;
margin-bottom: 0.5rem;
}
.helper-card-body {
padding: 1.25rem;
padding-top: 0.8rem;
padding-bottom: 0;
}
.helper-code {
word-wrap: break-word;
white-space: normal;
}
/*===============================================*/
</style>