mirror of
https://github.com/YunoHost-Apps/garage_ynh.git
synced 2024-09-03 18:36:32 +02:00
commit
a495b308e7
27 changed files with 333 additions and 1581 deletions
137
.github/workflows/updater.sh
vendored
137
.github/workflows/updater.sh
vendored
|
@ -1,137 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
#=================================================
|
||||
# PACKAGE UPDATING HELPER
|
||||
#=================================================
|
||||
|
||||
# This script is meant to be run by GitHub Actions
|
||||
# The YunoHost-Apps organisation offers a template Action to run this script periodically
|
||||
# Since each app is different, maintainers can adapt its contents so as to perform
|
||||
# automatic actions when a new upstream release is detected.
|
||||
|
||||
# Remove this exit command when you are ready to run this Action
|
||||
exit 1
|
||||
|
||||
#=================================================
|
||||
# FETCHING LATEST RELEASE AND ITS ASSETS
|
||||
#=================================================
|
||||
|
||||
# Fetching information
|
||||
current_version=$(cat manifest.json | jq -j '.version|split("~")[0]')
|
||||
repo=$(cat manifest.json | jq -j '.upstream.code|split("https://github.com/")[1]')
|
||||
# Some jq magic is needed, because the latest upstream release is not always the latest version (e.g. security patches for older versions)
|
||||
version=$(curl --silent "https://api.github.com/repos/$repo/releases" | jq -r '.[] | select( .prerelease != true ) | .tag_name' | sort -V | tail -1)
|
||||
assets=($(curl --silent "https://api.github.com/repos/$repo/releases" | jq -r '[ .[] | select(.tag_name=="'$version'").assets[].browser_download_url ] | join(" ") | @sh' | tr -d "'"))
|
||||
|
||||
# Later down the script, we assume the version has only digits and dots
|
||||
# Sometimes the release name starts with a "v", so let's filter it out.
|
||||
# You may need more tweaks here if the upstream repository has different naming conventions.
|
||||
if [[ ${version:0:1} == "v" || ${version:0:1} == "V" ]]; then
|
||||
version=${version:1}
|
||||
fi
|
||||
|
||||
# Setting up the environment variables
|
||||
echo "Current version: $current_version"
|
||||
echo "Latest release from upstream: $version"
|
||||
echo "VERSION=$version" >> $GITHUB_ENV
|
||||
echo "REPO=$repo" >> $GITHUB_ENV
|
||||
# For the time being, let's assume the script will fail
|
||||
echo "PROCEED=false" >> $GITHUB_ENV
|
||||
|
||||
# Proceed only if the retrieved version is greater than the current one
|
||||
if ! dpkg --compare-versions "$current_version" "lt" "$version" ; then
|
||||
echo "::warning ::No new version available"
|
||||
exit 0
|
||||
# Proceed only if a PR for this new version does not already exist
|
||||
elif git ls-remote -q --exit-code --heads https://github.com/$GITHUB_REPOSITORY.git ci-auto-update-v$version ; then
|
||||
echo "::warning ::A branch already exists for this update"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Each release can hold multiple assets (e.g. binaries for different architectures, source code, etc.)
|
||||
echo "${#assets[@]} available asset(s)"
|
||||
|
||||
#=================================================
|
||||
# UPDATE SOURCE FILES
|
||||
#=================================================
|
||||
|
||||
# Here we use the $assets variable to get the resources published in the upstream release.
|
||||
# Here is an example for Grav, it has to be adapted in accordance with how the upstream releases look like.
|
||||
|
||||
# Let's loop over the array of assets URLs
|
||||
for asset_url in ${assets[@]}; do
|
||||
|
||||
echo "Handling asset at $asset_url"
|
||||
|
||||
# Assign the asset to a source file in conf/ directory
|
||||
# Here we base the source file name upon a unique keyword in the assets url (admin vs. update)
|
||||
# Leave $src empty to ignore the asset
|
||||
case $asset_url in
|
||||
*"admin"*)
|
||||
src="app"
|
||||
;;
|
||||
*"update"*)
|
||||
src="app-upgrade"
|
||||
;;
|
||||
*)
|
||||
src=""
|
||||
;;
|
||||
esac
|
||||
|
||||
# If $src is not empty, let's process the asset
|
||||
if [ ! -z "$src" ]; then
|
||||
|
||||
# Create the temporary directory
|
||||
tempdir="$(mktemp -d)"
|
||||
|
||||
# Download sources and calculate checksum
|
||||
filename=${asset_url##*/}
|
||||
curl --silent -4 -L $asset_url -o "$tempdir/$filename"
|
||||
checksum=$(sha256sum "$tempdir/$filename" | head -c 64)
|
||||
|
||||
# Delete temporary directory
|
||||
rm -rf $tempdir
|
||||
|
||||
# Get extension
|
||||
if [[ $filename == *.tar.gz ]]; then
|
||||
extension=tar.gz
|
||||
else
|
||||
extension=${filename##*.}
|
||||
fi
|
||||
|
||||
# Rewrite source file
|
||||
cat <<EOT > conf/$src.src
|
||||
SOURCE_URL=$asset_url
|
||||
SOURCE_SUM=$checksum
|
||||
SOURCE_SUM_PRG=sha256sum
|
||||
SOURCE_FORMAT=$extension
|
||||
SOURCE_IN_SUBDIR=true
|
||||
SOURCE_FILENAME=
|
||||
EOT
|
||||
echo "... conf/$src.src updated"
|
||||
|
||||
else
|
||||
echo "... asset ignored"
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
#=================================================
|
||||
# SPECIFIC UPDATE STEPS
|
||||
#=================================================
|
||||
|
||||
# Any action on the app's source code can be done.
|
||||
# The GitHub Action workflow takes care of committing all changes after this script ends.
|
||||
|
||||
#=================================================
|
||||
# GENERIC FINALIZATION
|
||||
#=================================================
|
||||
|
||||
# Replace new version in manifest
|
||||
echo "$(jq -s --indent 4 ".[] | .version = \"$version~ynh1\"" manifest.json)" > manifest.json
|
||||
|
||||
# No need to update the README, yunohost-bot takes care of it
|
||||
|
||||
# The Action will proceed only if the PROCEED environment variable is set to true
|
||||
echo "PROCEED=true" >> $GITHUB_ENV
|
||||
exit 0
|
13
README.md
13
README.md
|
@ -35,18 +35,7 @@ Garage is designed for storage clusters composed of nodes running at different p
|
|||
- K2V API (experimental)
|
||||
|
||||
|
||||
**Shipped version:** 0.8.0~ynh4
|
||||
## Disclaimers / important information
|
||||
|
||||
* Limitations :
|
||||
* This application is not usable if you're not part of a cluster with minimun 3 other nodes
|
||||
* If you are behind a nat and use upnp to configure your port redirection, you may need to add peers via config panel instead of during installation and/or create a permanent redirection in your router/box
|
||||
|
||||
* infos you should be aware of:
|
||||
* This application provide a node that you can connect to a garage cluster. Few option are manageable by the config panel for the current node but IT DOESN'T offer simpler way to manage bucket and keys. You have to do it by command line or let an other node managing it.
|
||||
* This application consider that the weight of the node is the size reserved to garage in G
|
||||
* This application will try to create a virtual disk to ensure garage doesn't use more than allowed. If virtualisation is not available your responsible to check space used by garage.
|
||||
|
||||
**Shipped version:** 0.9.0~ynh1
|
||||
## Documentation and resources
|
||||
|
||||
* Official app website: <https://garagehq.deuxfleurs.fr/>
|
||||
|
|
13
README_fr.md
13
README_fr.md
|
@ -35,18 +35,7 @@ Garage is designed for storage clusters composed of nodes running at different p
|
|||
- K2V API (experimental)
|
||||
|
||||
|
||||
**Version incluse :** 0.8.0~ynh4
|
||||
## Avertissements / informations importantes
|
||||
|
||||
* Limitations :
|
||||
* This application is not usable if you're not part of a cluster with minimun 3 other nodes
|
||||
* If you are behind a nat and use upnp to configure your port redirection, you may need to add peers via config panel instead of during installation and/or create a permanent redirection in your router/box
|
||||
|
||||
* infos you should be aware of:
|
||||
* This application provide a node that you can connect to a garage cluster. Few option are manageable by the config panel for the current node but IT DOESN'T offer simpler way to manage bucket and keys. You have to do it by command line or let an other node managing it.
|
||||
* This application consider that the weight of the node is the size reserved to garage in G
|
||||
* This application will try to create a virtual disk to ensure garage doesn't use more than allowed. If virtualisation is not available your responsible to check space used by garage.
|
||||
|
||||
**Version incluse :** 0.9.0~ynh1
|
||||
## Documentations et ressources
|
||||
|
||||
* Site officiel de l’app : <https://garagehq.deuxfleurs.fr/>
|
||||
|
|
|
@ -1,32 +0,0 @@
|
|||
# See here for more information
|
||||
# https://github.com/YunoHost/package_check#syntax-check_process-file
|
||||
|
||||
# Move this file from check_process.default to check_process when you have filled it.
|
||||
|
||||
;; Test complet
|
||||
; Manifest
|
||||
domain="domain.tld"
|
||||
rpc_secret=""
|
||||
bootstrap_peers=""
|
||||
weight="10"
|
||||
datadir=""
|
||||
; Checks
|
||||
pkg_linter=1
|
||||
setup_sub_dir=0
|
||||
setup_root=0
|
||||
setup_nourl=1
|
||||
setup_private=0
|
||||
setup_public=0
|
||||
upgrade=1
|
||||
upgrade=0 from_commit=CommitHash
|
||||
backup_restore=1
|
||||
multi_instance=1
|
||||
port_already_use=0
|
||||
change_url=1
|
||||
;;; Options
|
||||
Email=
|
||||
Notification=none
|
||||
;;; Upgrade options
|
||||
; commit=CommitHash
|
||||
name=Name and date of the commit.
|
||||
manifest_arg=domain=DOMAIN&rpc_secret=RPC_SECRET&bootstrap_peers=BOOTSTRAP_PEERS&weight=WEIGHT&datadir=DATADIR
|
|
@ -1,5 +1,5 @@
|
|||
metadata_dir = "/opt/yunohost/__APP__/metadata"
|
||||
data_dir = "__DATADIR__/data"
|
||||
metadata_dir = "__DATA_DIR__/metadata"
|
||||
data_dir = "__DATA_DIR__/data"
|
||||
|
||||
block_size = 1048576
|
||||
block_manager_background_tranquility = 2
|
||||
|
|
|
@ -1,24 +1,26 @@
|
|||
#!/bin/bash
|
||||
if [ "$VIRTUALISATION" = "true" ]
|
||||
|
||||
# If we're NOT inside a container
|
||||
if ! systemd-detect-virt -c -q
|
||||
then
|
||||
datadir=__DATADIR__
|
||||
data_dir=__DATA_DIR__
|
||||
format=$1
|
||||
i=0
|
||||
while fdisk -l /dev/nbd$i 1> /dev/null 2> /dev/null
|
||||
do
|
||||
i=$(( i + 1 ))
|
||||
done
|
||||
echo $i > $datadir/nbd_index
|
||||
echo $i > $data_dir/nbd_index
|
||||
modprobe nbd max_part=$(( i + 1 ))
|
||||
qemu-nbd --connect /dev/nbd$i $datadir/garage_data.qcow2
|
||||
qemu-nbd --connect /dev/nbd$i $data_dir/garage_data.qcow2
|
||||
if [[ "$format" = "true" ]]
|
||||
then
|
||||
echo "formatting /dev/nbd$i"
|
||||
mkfs.ext4 /dev/nbd$i
|
||||
fi
|
||||
mkdir -p $datadir/data
|
||||
chown __APP__:__APP__ $datadir/data
|
||||
mount /dev/nbd$i $datadir/data/
|
||||
mkdir -p $data_dir/data
|
||||
chown __APP__:__APP__ $data_dir/data
|
||||
mount /dev/nbd$i $data_dir/data/
|
||||
fi
|
||||
|
||||
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
location / {
|
||||
proxy_pass http://localhost:__PORT_API__;
|
||||
#sub_path_only rewrite ^__PATH__$ __PATH__/ permanent;
|
||||
location __PATH__/ {
|
||||
|
||||
proxy_pass http://127.0.0.1:__PORT_API__;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header Host $host;
|
||||
}
|
||||
|
|
|
@ -8,5 +8,4 @@ app=__APP__
|
|||
[[ "$action" == "pre" ]] || exit 0
|
||||
source /usr/share/yunohost/helpers
|
||||
|
||||
ynh_replace_special_string --match_string="server_name $domain" --replace_string="server_name $domain *.$domain" --target_file="/etc/nginx/conf.d/$domain.conf"
|
||||
ynh_store_file_checksum --file="/etc/nginx/conf.d/$domain.conf"
|
||||
ynh_replace_special_string --match_string="server_name $domain" --replace_string="server_name $domain *.$domain" --target_file="$pending_dir/../nginx/etc/nginx/conf.d/$domain.conf"
|
|
@ -1,15 +1,15 @@
|
|||
[Unit]
|
||||
Description=Garage Data Store
|
||||
Description=Garage: Data Store
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
User=__APP__
|
||||
Environment='RUST_LOG=garage=info' 'VIRTUALISATION=__VIRTUALISATION__' 'RUST_BACKTRACE=1'
|
||||
ExecStartPre=+__FINALPATH__/mount_disk.sh
|
||||
ExecStart=__FINALPATH__/garage -c __FINALPATH__/garage.toml server
|
||||
ExecStopPost=+__FINALPATH__/umount_disk.sh
|
||||
WorkingDirectory=__FINALPATH__/
|
||||
Environment='RUST_LOG=garage=info' 'VIRTUALISATION=__SYSTEM_IS_INSIDE_CONTAINER_BOOL__' 'RUST_BACKTRACE=1'
|
||||
ExecStartPre=+__INSTALL_DIR__/mount_disk.sh
|
||||
ExecStart=__INSTALL_DIR__/garage -c __INSTALL_DIR__/garage.toml server
|
||||
ExecStopPost=+__INSTALL_DIR__/umount_disk.sh
|
||||
WorkingDirectory=__INSTALL_DIR__/
|
||||
StandardOutput=append:/var/log/__APP__/__APP__.log
|
||||
StandardError=inherit
|
||||
|
||||
|
@ -17,16 +17,16 @@ StandardError=inherit
|
|||
# Depending on specificities of your service/app, you may need to tweak these
|
||||
# .. but this should be a good baseline
|
||||
# Details for these options: https://www.freedesktop.org/software/systemd/man/systemd.exec.html
|
||||
__VIRT_PROTECTION__PrivateTmp=yes
|
||||
__COMMENT_IF_SYSTEM_IS_INSIDE_CONTAINER__PrivateTmp=yes
|
||||
#PrivateDevices=yes
|
||||
# RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
|
||||
RestrictNamespaces=yes
|
||||
RestrictRealtime=yes
|
||||
#DevicePolicy=closed
|
||||
__VIRT_PROTECTION__ProtectSystem=full
|
||||
__VIRT_PROTECTION__ProtectControlGroups=yes
|
||||
__COMMENT_IF_SYSTEM_IS_INSIDE_CONTAINER__ProtectSystem=full
|
||||
__COMMENT_IF_SYSTEM_IS_INSIDE_CONTAINER__ProtectControlGroups=yes
|
||||
#ProtectKernelModules=yes
|
||||
__VIRT_PROTECTION__ProtectKernelTunables=yes
|
||||
__COMMENT_IF_SYSTEM_IS_INSIDE_CONTAINER__ProtectKernelTunables=yes
|
||||
LockPersonality=yes
|
||||
SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap
|
||||
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
#!/bin/bash
|
||||
if [ "$VIRTUALISATION" = "true" ]
|
||||
|
||||
# If we're NOT inside a container
|
||||
if ! systemd-detect-virt -c -q
|
||||
then
|
||||
datadir=__DATADIR__
|
||||
nbd=$(cat $datadir/nbd_index)
|
||||
data_dir=__DATA_DIR__
|
||||
nbd=$(cat $data_dir/nbd_index)
|
||||
umount /dev/nbd$nbd
|
||||
qemu-nbd --disconnect /dev/nbd$nbd
|
||||
fi
|
||||
|
|
|
@ -12,16 +12,14 @@ version = "1.0"
|
|||
[main.infos.status]
|
||||
type = "alert"
|
||||
|
||||
|
||||
[main.garage_conf]
|
||||
name = "Garage configuration"
|
||||
|
||||
|
||||
[main.garage_conf.weight]
|
||||
ask = "allocated space (Gio)"
|
||||
help = "This value is doubled used by yunohost. It set the weight of the garage node and if virtualisation is enabled, it create a virtual disk with the same size"
|
||||
type = "number"
|
||||
bind = "weight()"
|
||||
bind = "null"
|
||||
|
||||
[main.garage_conf.bootstrap_peers]
|
||||
ask = "Friend serveur adress"
|
||||
|
@ -41,7 +39,7 @@ services = ["__APP__"]
|
|||
ask = "Choose/Change rpc secret"
|
||||
type = "string"
|
||||
redact = true
|
||||
bind = "rpc_secret:/opt/yunohost/__APP__/garage.toml"
|
||||
bind = "rpc_secret:__INSTALL_DIR__/garage.toml"
|
||||
pattern.regexp = '^[0-9a-f]{64}$'
|
||||
pattern.error = "rpc_secret have to be a 32-byte hex-encoded random string. See https://garagehq.deuxfleurs.fr/documentation/reference-manual/configuration/ for more information"
|
||||
help = "Be careful if your node is already connected to a cluster, it won't be able to connect anymore if you change the rpc_secret value"
|
||||
|
|
|
@ -1,295 +0,0 @@
|
|||
|
||||
## Config panel are available from webadmin > Apps > YOUR_APP > Config Panel Button
|
||||
## Those panels let user configure some params on their apps using a friendly interface,
|
||||
## and remove the need to manually edit files from the command line.
|
||||
|
||||
## From a packager perspective, this .toml is coupled to the scripts/config script,
|
||||
## which may be used to define custom getters/setters. However, most use cases
|
||||
## should be covered automagically by the core, thus it may not be necessary
|
||||
## to define a scripts/config at all!
|
||||
|
||||
## -----------------------------------------------------------------------------
|
||||
## IMPORTANT: In accordance with YunoHost's spirit, please keep things simple and
|
||||
## do not overwhelm the admin with tons of misunderstandable or advanced settings.
|
||||
## -----------------------------------------------------------------------------
|
||||
|
||||
## The top level describe the entire config panels screen.
|
||||
|
||||
## The version is a required property.
|
||||
## Here a small reminder to associate config panel version with YunoHost version
|
||||
## | Config | YNH | Config panel small change log |
|
||||
## | ------ | --- | ------------------------------------------------------- |
|
||||
## | 0.1 | 3.x | 0.1 config script not compatible with YNH >= 4.3 |
|
||||
## | 1.0 | 4.3.x | The new config panel system with 'bind' property |
|
||||
version = "1.0"
|
||||
|
||||
## (optional) i18n property let you internationalize questions, however this feature
|
||||
## is only available in core configuration panel (like yunohost domain config).
|
||||
## So in app config panel this key is ignored for now, but you can internationalize
|
||||
## by using a lang dictionary (see property name bellow)
|
||||
# i18n = "prefix_translation_key"
|
||||
|
||||
################################################################################
|
||||
#### ABOUT PANELS
|
||||
################################################################################
|
||||
|
||||
## The next level describes web admin panels
|
||||
## You have to choose an ID for each panel, in this example the ID is "main"
|
||||
## Keep in mind this ID will be used in CLI to refer to your question, so choose
|
||||
## something short and meaningfull.
|
||||
## In the webadmin, each panel corresponds to a distinct tab / form
|
||||
[main]
|
||||
|
||||
## Define the label for your panel
|
||||
## Internationalization works similarly to the 'description' and 'ask' questions in the manifest
|
||||
# name.en = "Main configuration"
|
||||
# name.fr = "Configuration principale"
|
||||
|
||||
## (optional) If you need to trigger a service reload-or-restart after the user
|
||||
## change a question in this panel, you can add your service in the list.
|
||||
services = ["__APP__"]
|
||||
# or services = ["nginx", "__APP__"] to also reload-or-restart nginx
|
||||
|
||||
## (optional) This help properties is a short help displayed on the same line
|
||||
## than the panel title but not displayed in the tab.
|
||||
# help = ""
|
||||
|
||||
############################################################################
|
||||
#### ABOUT SECTIONS
|
||||
############################################################################
|
||||
|
||||
## A panel is composed of one or several sections.
|
||||
##
|
||||
## Sections are meant to group questions together when they correspond to
|
||||
## a same subtopic. This impacts the rendering in terms of CLI prompts
|
||||
## and HTML forms
|
||||
##
|
||||
## You should choose an ID for your section, and prefix it with the panel ID
|
||||
## (Be sure to not make a typo in the panel ID, which would implicitly create
|
||||
## an other entire panel)
|
||||
##
|
||||
## We use the context of pepettes_ynh as an example,
|
||||
## which is a simple donation form app written in python,
|
||||
## and for which the admin will want to edit the configuration
|
||||
[main.customization]
|
||||
|
||||
## (optional) Defining a proper title for sections is not mandatory
|
||||
## and depends on the exact rendering you're aiming for the CLI / webadmin
|
||||
name = ""
|
||||
|
||||
## (optional) This help properties is a short help displayed on the same line
|
||||
## than the section title, meant to provide additional details
|
||||
# help = ""
|
||||
|
||||
## (optional) As for panel, you can specify to trigger a service
|
||||
## reload-or-restart after the user change a question in this section.
|
||||
## This property is added to the panel property, it doesn't deactivate it.
|
||||
## So no need to replicate, the service list from panel services property.
|
||||
# services = []
|
||||
|
||||
## (optional) By default all questions are optionals, but you can specify a
|
||||
## default behaviour for question in the section
|
||||
##optional = false
|
||||
|
||||
## (optional) It's also possible with the 'visible' property to only
|
||||
## display the section depending on the user's answers to previous questions.
|
||||
##
|
||||
## Be careful that the 'visible' property should only refer to **previous** questions
|
||||
## Hence, it should not make sense to have a "visible" property on the very first section.
|
||||
##
|
||||
## Also, keep in mind that this feature only works in the webadmin and not in CLI
|
||||
## (therefore a user could be prompted in CLI for a question that may not be relevant)
|
||||
# visible = true
|
||||
|
||||
########################################################################
|
||||
#### ABOUT QUESTIONS
|
||||
########################################################################
|
||||
|
||||
## A section is compound of one or several questions.
|
||||
|
||||
## ---------------------------------------------------------------------
|
||||
## IMPORTANT: as for panel and section you have to choose an ID, but this
|
||||
## one should be unique in all this document, even if the question is in
|
||||
## an other panel.
|
||||
## ---------------------------------------------------------------------
|
||||
|
||||
## You can use same questions types and properties than in manifest.yml
|
||||
## install part. However, in YNH 4.3, a lot of change has been made to
|
||||
## extend availables questions types list.
|
||||
## See: TODO DOC LINK
|
||||
|
||||
[main.customization.weight]
|
||||
|
||||
## (required) The ask property is equivalent to the ask property in
|
||||
## the manifest. However, in config panels, questions are displayed on the
|
||||
## left side and therefore have less space to be rendered. Therefore,
|
||||
## it is better to use a short question, and use the "help" property to
|
||||
## provide additional details if necessary.
|
||||
ask.en = "allocated space"
|
||||
|
||||
## (required) The type property indicates how the question should be
|
||||
## displayed, validated and managed. Some types have specific properties.
|
||||
##
|
||||
## Types available: string, boolean, number, range, text, password, path
|
||||
## email, url, date, time, color, select, domain, user, tags, file.
|
||||
##
|
||||
## For a complete list with specific properties, see: TODO DOC LINK
|
||||
type = "number"
|
||||
|
||||
########################################################################
|
||||
#### ABOUT THE BIND PROPERTY
|
||||
########################################################################
|
||||
|
||||
## (recommended) 'bind' property is a powerful feature that let you
|
||||
## configure how and where the data will be read, validated and written.
|
||||
|
||||
## By default, 'bind property is in "settings" mode, it means it will
|
||||
## **only** read and write the value in application settings file.
|
||||
## bind = "settings"
|
||||
|
||||
## However, settings usually correspond to key/values in actual app configurations
|
||||
## Hence, a more useful mode is to have bind = ":FILENAME". In that case, YunoHost
|
||||
## will automagically find a line with "KEY=VALUE" in FILENAME
|
||||
## (with the adequate separator between KEY and VALUE)
|
||||
##
|
||||
## YunoHost will then use this value for the read/get operation.
|
||||
## During write/set operations, YunoHost will overwrite the value
|
||||
## in **both** FILENAME and in the app's settings.yml
|
||||
|
||||
## Configuration file format supported: yaml, toml, json, ini, env, php,
|
||||
## python. The feature probably works with others formats, but should be tested carefully.
|
||||
|
||||
## Note that this feature only works with relatively simple cases
|
||||
## such as `KEY: VALUE`, but won't properly work with
|
||||
## complex data structures like multilin array/lists or dictionnaries.
|
||||
## It also doesn't work with XML format, custom config function call, php define(), ...
|
||||
|
||||
## More info on TODO
|
||||
# bind = ":/var/www/__APP__/settings.py"
|
||||
|
||||
|
||||
## By default, bind = ":FILENAME" will use the question ID as KEY
|
||||
## ... but the question ID may sometime not be the exact KEY name in the configuration file.
|
||||
##
|
||||
## In particular, in pepettes, the python variable is 'name' and not 'project_name'
|
||||
## (c.f. https://github.com/YunoHost-Apps/pepettes_ynh/blob/5cc2d3ffd6529cc7356ff93af92dbb6785c3ab9a/conf/settings.py##L11 )
|
||||
##
|
||||
## In that case, the key name can be specified before the column ':'
|
||||
|
||||
bind = "name:/var/www/__APP__/settings.py"
|
||||
|
||||
## ---------------------------------------------------------------------
|
||||
## IMPORTANT: other 'bind' mode exists:
|
||||
##
|
||||
## bind = "FILENAME" (with no column character before FILENAME)
|
||||
## may be used to bind to the **entire file content** (instead of a single KEY/VALUE)
|
||||
## This could be used to expose an entire configuration file, or binary files such as images
|
||||
## For example:
|
||||
## bind = "/var/www/__APP__/img/logo.png"
|
||||
##
|
||||
## bind = "null" can be used to disable reading / writing in settings.
|
||||
## This creates sort of a "virtual" or "ephemeral" question which is not related to any actual setting
|
||||
## In this mode, you are expected to define custom getter/setters/validators in scripts/config:
|
||||
##
|
||||
## getter: get__QUESTIONID()
|
||||
## setter: set__QUESTIONID()
|
||||
## validator: validate__QUESTIONID()
|
||||
##
|
||||
## You can also specify a common getter / setter / validator, with the
|
||||
## function 'bind' mode, for example here it will try to run
|
||||
## get__array_settings() first.
|
||||
# bind = "array_settings()"
|
||||
## ---------------------------------------------------------------------
|
||||
|
||||
## ---------------------------------------------------------------------
|
||||
## IMPORTANT: with the exception of bind=null questions,
|
||||
## question IDs should almost **always** correspond to an app setting
|
||||
## initialized / reused during install/upgrade.
|
||||
## Not doing so may result in inconsistencies between the config panel mechanism
|
||||
## and the use of ynh_add_config
|
||||
## ---------------------------------------------------------------------
|
||||
|
||||
########################################################################
|
||||
#### OTHER GENERIC PROPERTY FOR QUESTIONS
|
||||
########################################################################
|
||||
|
||||
## (optional) An help text for the question
|
||||
help = "Fill the name of the project which will received donation"
|
||||
|
||||
## (optional) An example display as placeholder in web form
|
||||
# example = "YunoHost"
|
||||
|
||||
## (optional) set to true in order to redact the value in operation logs
|
||||
# redact = false
|
||||
|
||||
## (optional) A validation pattern
|
||||
## ---------------------------------------------------------------------
|
||||
## IMPORTANT: your pattern should be between simple quote, not double.
|
||||
## ---------------------------------------------------------------------
|
||||
pattern.regexp = '^\w{3,30}$'
|
||||
pattern.error = "The name should be at least 3 chars and less than 30 chars. Alphanumeric chars are accepted"
|
||||
|
||||
## Note: visible and optional properties are also available for questions
|
||||
|
||||
|
||||
[main.customization.contact_url]
|
||||
ask = "Contact url"
|
||||
type = "url"
|
||||
example = "mailto: contact@example.org"
|
||||
help = "mailto: accepted"
|
||||
pattern.regexp = '^mailto:[^@]+@[^@]+|https://$'
|
||||
pattern.error = "Should be https or mailto:"
|
||||
bind = ":/var/www/__APP__/settings.py"
|
||||
|
||||
[main.customization.logo]
|
||||
ask = "Logo"
|
||||
type = "file"
|
||||
accept = ".png"
|
||||
help = "Fill with an already resized logo"
|
||||
bind = "__FINALPATH__/img/logo.png"
|
||||
|
||||
[main.customization.favicon]
|
||||
ask = "Favicon"
|
||||
type = "file"
|
||||
accept = ".png"
|
||||
help = "Fill with an already sized favicon"
|
||||
bind = "__FINALPATH__/img/favicon.png"
|
||||
|
||||
|
||||
[main.stripe]
|
||||
name = "Stripe general info"
|
||||
optional = false
|
||||
|
||||
# The next alert is overwrited with a getter from the config script
|
||||
[main.stripe.amount]
|
||||
ask = "Donation in the month : XX €
|
||||
type = "alert"
|
||||
style = "success"
|
||||
|
||||
[main.stripe.publishable_key]
|
||||
ask = "Publishable key"
|
||||
type = "string"
|
||||
redact = true
|
||||
help = "Indicate here the stripe publishable key"
|
||||
bind = ":/var/www/__APP__/settings.py"
|
||||
|
||||
[main.stripe.secret_key]
|
||||
ask = "Secret key"
|
||||
type = "string"
|
||||
redact = true
|
||||
help = "Indicate here the stripe secret key"
|
||||
bind = ":/var/www/__APP__/settings.py"
|
||||
|
||||
[main.stripe.prices]
|
||||
ask = "Prices ID"
|
||||
type = "tags"
|
||||
help = """\
|
||||
Indicates here the prices ID of donation products you created in stripe interfaces. \
|
||||
Go on [Stripe products](https://dashboard.stripe.com/products) to create those donation products. \
|
||||
Fill it tag with 'FREQUENCY/CURRENCY/PRICE_ID' \
|
||||
FREQUENCY: 'one_time' or 'recuring' \
|
||||
CURRENCY: 'EUR' or 'USD' \
|
||||
PRICE_ID: ID from stripe interfaces starting with 'price_' \
|
||||
"""
|
||||
pattern.regexp = '^(one_time|recuring)/(EUR|USD)/price_.*$'
|
||||
pattern.error = "Please respect the format describe in help text for each price ID"
|
|
@ -6,3 +6,7 @@
|
|||
* This application provide a node that you can connect to a garage cluster. Few option are manageable by the config panel for the current node but IT DOESN'T offer simpler way to manage bucket and keys. You have to do it by command line or let an other node managing it.
|
||||
* This application consider that the weight of the node is the size reserved to garage in G
|
||||
* This application will try to create a virtual disk to ensure garage doesn't use more than allowed. If virtualisation is not available your responsible to check space used by garage.
|
||||
|
||||
# How to run commands for Garage
|
||||
1. Use `yunohost app shell garage` to use the command line in Garage own environnement (don't forget to `exit` at the end). You will be located in `/opt/yunohost/garage/` own directory.
|
||||
2. Then for each use of the `garage` command, you need to specify the config file as a parameter `garage -c garage.toml [the actions you wish to run]`.
|
6
doc/POST_INSTALL.md
Normal file
6
doc/POST_INSTALL.md
Normal file
|
@ -0,0 +1,6 @@
|
|||
Your Garage node have been installed. You can now connect to other nodes with the following identifiers :
|
||||
|
||||
rpc_secret: __RPC_SECRET__
|
||||
bootstrap_peers: __SELF_BOOTSTRAP_PEERS__
|
||||
|
||||
Current garage layout: __GARAGE_LAYOUT__
|
|
@ -1,74 +0,0 @@
|
|||
{
|
||||
"name": "Garage",
|
||||
"id": "garage",
|
||||
"packaging_format": 1,
|
||||
"description": {
|
||||
"en": "S3 storage",
|
||||
"fr": "stockage S3"
|
||||
},
|
||||
"version": "0.8.0~ynh4",
|
||||
"url": "https://garagehq.deuxfleurs.fr/",
|
||||
"upstream": {
|
||||
"license": "AGPL-3.0-only",
|
||||
"website": "https://garagehq.deuxfleurs.fr/",
|
||||
"admindoc": "https://garagehq.deuxfleurs.fr/documentation/quick-start/",
|
||||
"userdoc": "https://garagehq.deuxfleurs.fr/documentation/quick-start/",
|
||||
"code": "https://git.deuxfleurs.fr/Deuxfleurs/garage"
|
||||
},
|
||||
"services": [],
|
||||
"license": "AGPL-3.0-only",
|
||||
"maintainer": {
|
||||
"name": "oiseauroch",
|
||||
"email": "tobias.ollive@oiseauroch.fr."
|
||||
},
|
||||
"requirements": {
|
||||
"yunohost": ">= 4.3.0"
|
||||
},
|
||||
"multi_instance": true,
|
||||
"arguments": {
|
||||
"install": [
|
||||
{
|
||||
"name": "domain",
|
||||
"type": "domain"
|
||||
},
|
||||
{
|
||||
"name":"rpc_secret",
|
||||
"type":"string",
|
||||
"ask": {
|
||||
"en": "UUID of the network (rpc-secret) ",
|
||||
"fr": "UUID de l'ilot (rpc-secret)"
|
||||
},
|
||||
"optional": true,
|
||||
"example": "1799bccfd7411eddcf9ebd316bc1f5287ad12a68094e1c6ac6abde7e6feae1ec"
|
||||
},
|
||||
{
|
||||
"name": "bootstrap_peers",
|
||||
"type": "string",
|
||||
"example": "1799bccfd7411eddcf9ebd316bc1f5287ad12a68094e1c6ac6abde7e6feae1ec@127.0.0.1:3901",
|
||||
"optional": true,
|
||||
"ask": {
|
||||
"en": "friend server id",
|
||||
"fr": "serveur ami"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "weight",
|
||||
"type": "string",
|
||||
"ask": {
|
||||
"en": "number of G to allow",
|
||||
"fr": "nombre de G à allouer"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "datadir",
|
||||
"type": "string",
|
||||
"default": "/home/yunohost.app/__APP_NAME__/data",
|
||||
"exemple": "/opt/yunohost/garage/data",
|
||||
"ask" : {
|
||||
"en" : "data location",
|
||||
"fr": "dossier de stockage des données"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
93
manifest.toml
Normal file
93
manifest.toml
Normal file
|
@ -0,0 +1,93 @@
|
|||
packaging_format = 2
|
||||
|
||||
id = "garage"
|
||||
name = "Garage"
|
||||
description.en = "S3 storage"
|
||||
description.fr = "stockage S3"
|
||||
|
||||
version = "0.9.0~ynh1"
|
||||
|
||||
maintainers = ["oiseauroch"]
|
||||
|
||||
[upstream]
|
||||
license = "AGPL-3.0-only"
|
||||
website = "https://garagehq.deuxfleurs.fr/"
|
||||
admindoc = "https://garagehq.deuxfleurs.fr/documentation/quick-start/"
|
||||
userdoc = "https://garagehq.deuxfleurs.fr/documentation/quick-start/"
|
||||
code = "https://git.deuxfleurs.fr/Deuxfleurs/garage"
|
||||
|
||||
[integration]
|
||||
yunohost = ">= 11.2"
|
||||
architectures = "all"
|
||||
multi_instance = true
|
||||
|
||||
ldap = false
|
||||
|
||||
sso = false
|
||||
|
||||
disk = "50M"
|
||||
ram.build = "50M"
|
||||
ram.runtime = "50M"
|
||||
|
||||
[install]
|
||||
[install.domain]
|
||||
type = "domain"
|
||||
|
||||
[install.init_main_permission]
|
||||
type = "group"
|
||||
default = "visitors"
|
||||
|
||||
[install.rpc_secret]
|
||||
ask.en = "UUID of the network (rpc-secret) "
|
||||
ask.fr = "UUID de l'ilot (rpc-secret)"
|
||||
type = "string"
|
||||
optional = true
|
||||
example = "1799bccfd7411eddcf9ebd316bc1f5287ad12a68094e1c6ac6abde7e6feae1ec"
|
||||
|
||||
[install.bootstrap_peers]
|
||||
ask.en = "friend server id"
|
||||
ask.fr = "serveur ami"
|
||||
type = "string"
|
||||
example = "1799bccfd7411eddcf9ebd316bc1f5287ad12a68094e1c6ac6abde7e6feae1ec@127.0.0.1:3901"
|
||||
optional = true
|
||||
|
||||
[install.weight]
|
||||
ask.en = "Number of GB to allow for storage"
|
||||
ask.fr = "Nombre de GB à allouer pour le stockage"
|
||||
type = "number"
|
||||
|
||||
[resources]
|
||||
|
||||
[resources.sources]
|
||||
|
||||
[resources.sources.main]
|
||||
in_subdir = false
|
||||
extract = false
|
||||
amd64.url = "https://garagehq.deuxfleurs.fr/_releases/v0.9.0/x86_64-unknown-linux-musl/garage"
|
||||
amd64.sha256 = "3ae4ecb2a75610ab7bfe77bfac7a5c7a8834a0544158ac8ee37723e6d8fd1859"
|
||||
arm64.url = "https://garagehq.deuxfleurs.fr/_releases/v0.9.0/aarch64-unknown-linux-musl/garage"
|
||||
arm64.sha256 = "b4db67a618ed493e1803d8bae83e8ea091703763b182d4c62fa1896179b17b9b"
|
||||
i386.url = "https://garagehq.deuxfleurs.fr/_releases/v0.9.0/i686-unknown-linux-musl/garage"
|
||||
i386.sha256 = "fcec4c6918ac5ae04829ed9c4f20c7eef0966194eabfe961e6d7f8aee14b0108"
|
||||
armhf.url = "https://garagehq.deuxfleurs.fr/_releases/v0.9.0/armv6l-unknown-linux-musleabihf/garage"
|
||||
armhf.sha256 = "8f04a38fcafc2ccda652738f2e80b0d2b6443150db0d7165db2de6c75035b4e3"
|
||||
|
||||
[resources.ports]
|
||||
main.default = 4000
|
||||
main.exposed = "TCP"
|
||||
api.default = 5000
|
||||
|
||||
[resources.system_user]
|
||||
|
||||
[resources.install_dir]
|
||||
|
||||
[resources.data_dir]
|
||||
subdirs = ["data", "metadata"]
|
||||
|
||||
[resources.permissions]
|
||||
main.url = "/"
|
||||
|
||||
[resources.apt]
|
||||
packages_from_raw_bash = """
|
||||
systemd-detect-virt -q -c && echo "qemu-utils e2fsprogs" || true
|
||||
"""
|
|
@ -3,122 +3,52 @@
|
|||
#=================================================
|
||||
# COMMON VARIABLES
|
||||
#=================================================
|
||||
pkg_dependencies_virtualisation="qemu-utils e2fsprogs"
|
||||
|
||||
GARAGE_VERSION="0.9.0"
|
||||
|
||||
system_is_inside_container() {
|
||||
systemd-detect-virt -c -q
|
||||
}
|
||||
|
||||
if system_is_inside_container
|
||||
then
|
||||
# used to comment systemd isolation to allow mount disk
|
||||
system_is_inside_container_bool="true"
|
||||
comment_if_system_is_inside_container="#"
|
||||
else
|
||||
system_is_inside_container_bool="false"
|
||||
comment_if_system_is_inside_container=""
|
||||
fi
|
||||
|
||||
#=================================================
|
||||
# PERSONAL HELPERS
|
||||
#=================================================
|
||||
|
||||
|
||||
GARAGE_VERSION="0.8.0"
|
||||
|
||||
# inspired by restic helper
|
||||
install_garage () {
|
||||
architecture=$(uname -m)
|
||||
arch=''
|
||||
case $architecture in
|
||||
i386|i686)
|
||||
arch="i686"
|
||||
;;
|
||||
x86_64)
|
||||
arch=x86_64
|
||||
;;
|
||||
armv*)
|
||||
arch=armv6l
|
||||
;;
|
||||
aarch64)
|
||||
arch=aarch64
|
||||
;;
|
||||
*)
|
||||
echo
|
||||
ynh_die --message="Unsupported architecture \"$architecture\""
|
||||
;;
|
||||
esac
|
||||
wget https://garagehq.deuxfleurs.fr/_releases/v$GARAGE_VERSION/$arch-unknown-linux-musl/garage -O garage 2>&1 >/dev/null
|
||||
chmod +x garage
|
||||
}
|
||||
garage="$install_dir/garage -c $install_dir/garage.toml"
|
||||
|
||||
garage_connect() {
|
||||
local command="$1"
|
||||
local peer="$2"
|
||||
local peer="$1"
|
||||
# connect to cluster
|
||||
$command node connect "$peer"
|
||||
$garage node connect "$peer"
|
||||
sleep 2
|
||||
# wait until layout is updated
|
||||
local i=0
|
||||
until $command layout show 2>/dev/null | grep "${peer:0:15}"; do
|
||||
until $garage layout show 2>/dev/null | grep "${peer:0:15}"; do
|
||||
i=$(( i + 1 ))
|
||||
if [ $i -gt 30 ]
|
||||
then
|
||||
ynh_die --message="unable to get layout from remote peer"
|
||||
fi
|
||||
[ $i -le 30 ] || ynh_die --message="Unable to get layout from remote peer"
|
||||
sleep 1
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
apply_layout() {
|
||||
|
||||
garage_command=$1
|
||||
$garage_command layout show 2>/dev/null
|
||||
local layout_version=$($garage_command layout show 2>/dev/null | grep -Po -- "(?<=--version).*" | head -1 | xargs)
|
||||
if [ "$layout_version" != "" ]
|
||||
garage_layout_apply() {
|
||||
$garage layout show 2>/dev/null
|
||||
if $garage layout show | grep -q 'This new layout cannot yet be applied'
|
||||
then
|
||||
$garage_command layout apply --version $layout_version
|
||||
else
|
||||
ynh_print_warn --message="unable to apply layout. No enough nodes"
|
||||
ynh_print_warn --message="Unable to apply layout. No enough nodes"
|
||||
return 0
|
||||
fi
|
||||
|
||||
local layout_version=$($garage layout show 2>/dev/null | grep -Po -- "(?<=--version).*" | head -1 | xargs)
|
||||
$garage layout apply --version $layout_version
|
||||
}
|
||||
#=================================================
|
||||
# EXPERIMENTAL HELPERS
|
||||
#=================================================
|
||||
|
||||
ynh_send_readme_to_admin() {
|
||||
local app_message="${1:-...No specific information...}"
|
||||
local recipients="${2:-root}"
|
||||
|
||||
# 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")
|
||||
|
||||
local mail_subject="☁️🆈🅽🅷☁️: \`$app\` was just installed!"
|
||||
|
||||
local mail_message="This is an automated message from your beloved YunoHost server.
|
||||
Specific information for the application $app.
|
||||
$app_message"
|
||||
|
||||
# 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"
|
||||
}
|
||||
#=================================================
|
||||
# FUTURE OFFICIAL HELPERS
|
||||
#=================================================
|
||||
|
|
|
@ -10,54 +10,16 @@
|
|||
source ../settings/scripts/_common.sh
|
||||
source /usr/share/yunohost/helpers
|
||||
|
||||
#=================================================
|
||||
# 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_print_info --message="Loading installation settings..."
|
||||
|
||||
app=$YNH_APP_INSTANCE_NAME
|
||||
|
||||
domain=$(ynh_app_setting_get --app=$app --key=domain)
|
||||
port=$(ynh_app_setting_get --app=$app --key=port)
|
||||
rpc_secret=$(ynh_app_setting_get --app=$app --key=rpc_secret)
|
||||
port_api=$(ynh_app_setting_get --app=$app --key=port_api)
|
||||
port_web=$(ynh_app_setting_get --app=$app --key=port_web)
|
||||
datadir=$(ynh_app_setting_get --app=$app --key=datadir)
|
||||
bootstrap_peers=$(ynh_app_setting_get --app=$app --key=bootstrap_peers)
|
||||
|
||||
final_path=/opt/yunohost/$app
|
||||
#=================================================
|
||||
# DECLARE DATA AND CONF FILES TO BACKUP
|
||||
#=================================================
|
||||
ynh_print_info --message="Declaring files to be backed up..."
|
||||
|
||||
### N.B. : the following 'ynh_backup' calls are only a *declaration* of what needs
|
||||
### to be backuped and not an actual copy of any file. The actual backup that
|
||||
### creates and fill the archive with the files happens in the core after this
|
||||
### script is called. Hence ynh_backups calls takes basically 0 seconds to run.
|
||||
|
||||
#=================================================
|
||||
# BACKUP THE APP MAIN DIR
|
||||
#=================================================
|
||||
|
||||
ynh_backup --src_path="$final_path"
|
||||
|
||||
#=================================================
|
||||
# BACKUP THE DATA DIR
|
||||
#=================================================
|
||||
|
||||
#ynh_backup --src_path="$datadir/data" --is_big
|
||||
ynh_backup --src_path="$install_dir"
|
||||
|
||||
#=================================================
|
||||
# BACKUP THE NGINX CONFIGURATION
|
||||
|
@ -65,10 +27,6 @@ ynh_backup --src_path="$final_path"
|
|||
|
||||
ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf"
|
||||
|
||||
|
||||
|
||||
#=================================================
|
||||
# SPECIFIC BACKUP
|
||||
#=================================================
|
||||
# BACKUP LOGROTATE
|
||||
#=================================================
|
||||
|
@ -87,9 +45,6 @@ ynh_backup --src_path="/usr/share/yunohost/hooks/conf_regen/98-nginx_$app"
|
|||
|
||||
ynh_backup --src_path="/etc/systemd/system/$app.service"
|
||||
|
||||
|
||||
ynh_backup --src_path="/usr/share/yunohost/hooks/conf_regen/98-nginx_$app"
|
||||
|
||||
#=================================================
|
||||
# END OF SCRIPT
|
||||
#=================================================
|
||||
|
|
|
@ -9,126 +9,42 @@
|
|||
source _common.sh
|
||||
source /usr/share/yunohost/helpers
|
||||
|
||||
#=================================================
|
||||
# RETRIEVE ARGUMENTS
|
||||
#=================================================
|
||||
|
||||
old_domain=$YNH_APP_OLD_DOMAIN
|
||||
old_path=$YNH_APP_OLD_PATH
|
||||
|
||||
new_domain=$YNH_APP_NEW_DOMAIN
|
||||
new_path=$YNH_APP_NEW_PATH
|
||||
|
||||
app=$YNH_APP_INSTANCE_NAME
|
||||
|
||||
#=================================================
|
||||
# LOAD SETTINGS
|
||||
#=================================================
|
||||
ynh_script_progression --message="Loading installation settings..." --time --weight=1
|
||||
|
||||
# Needed for helper "ynh_add_nginx_config"
|
||||
final_path=$(ynh_app_setting_get --app=$app --key=final_path)
|
||||
|
||||
# Add settings here as needed by your application
|
||||
#db_name=$(ynh_app_setting_get --app=$app --key=db_name)
|
||||
#db_user=$db_name
|
||||
#db_pwd=$(ynh_app_setting_get --app=$app --key=db_pwd)
|
||||
|
||||
#=================================================
|
||||
# BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP
|
||||
#=================================================
|
||||
ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --time --weight=1
|
||||
|
||||
# Backup the current version of the app
|
||||
ynh_backup_before_upgrade
|
||||
ynh_clean_setup () {
|
||||
# Remove the new domain config file, the remove script won't do it as it doesn't know yet its location.
|
||||
ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf"
|
||||
|
||||
# Restore it if the upgrade fails
|
||||
ynh_restore_upgradebackup
|
||||
}
|
||||
# Exit if an error occurs during the execution of the script
|
||||
ynh_abort_if_errors
|
||||
|
||||
#=================================================
|
||||
# CHECK WHICH PARTS SHOULD BE CHANGED
|
||||
#=================================================
|
||||
|
||||
change_domain=0
|
||||
if [ "$old_domain" != "$new_domain" ]
|
||||
then
|
||||
change_domain=1
|
||||
fi
|
||||
|
||||
change_path=0
|
||||
if [ "$old_path" != "$new_path" ]
|
||||
then
|
||||
change_path=1
|
||||
fi
|
||||
|
||||
#=================================================
|
||||
# STANDARD MODIFICATIONS
|
||||
#=================================================
|
||||
# STOP SYSTEMD SERVICE
|
||||
#=================================================
|
||||
ynh_script_progression --message="Stopping a systemd service..." --time --weight=1
|
||||
ynh_script_progression --message="Stopping a systemd service..." --weight=1
|
||||
|
||||
ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log"
|
||||
ynh_systemd_action --service_name=$app --action="stop" --log_path="systemd"
|
||||
|
||||
#=================================================
|
||||
# MODIFY URL IN NGINX CONF
|
||||
#=================================================
|
||||
ynh_script_progression --message="Updating NGINX web server configuration..." --time --weight=1
|
||||
ynh_script_progression --message="Updating NGINX web server configuration..." --weight=1
|
||||
|
||||
nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf
|
||||
|
||||
# Change the path in the NGINX config file
|
||||
if [ $change_path -eq 1 ]
|
||||
if [[ "${PACKAGE_CHECK_EXEC:-}" -eq 1 ]]
|
||||
then
|
||||
# Make a backup of the original NGINX config file if modified
|
||||
ynh_backup_if_checksum_is_different --file="$nginx_conf_path"
|
||||
# Set global variables for NGINX helper
|
||||
domain="$old_domain"
|
||||
path_url="$new_path"
|
||||
# Create a dedicated NGINX config
|
||||
ynh_add_nginx_config
|
||||
cat << EOF > ../conf/nginx.conf
|
||||
location / {
|
||||
return 200 'This is a dummy page for garage, only displayed during tests on Yunohost CI';
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
|
||||
# Change the domain for NGINX
|
||||
if [ $change_domain -eq 1 ]
|
||||
then
|
||||
# Delete file checksum for the old conf file location
|
||||
ynh_delete_file_checksum --file="$nginx_conf_path"
|
||||
mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf
|
||||
# Store file checksum for the new config file location
|
||||
ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf"
|
||||
fi
|
||||
|
||||
#=================================================
|
||||
# SPECIFIC MODIFICATIONS
|
||||
#=================================================
|
||||
# ...
|
||||
#=================================================
|
||||
ynh_change_url_nginx_config
|
||||
|
||||
#=================================================
|
||||
# GENERIC FINALISATION
|
||||
#=================================================
|
||||
# START SYSTEMD SERVICE
|
||||
#=================================================
|
||||
ynh_script_progression --message="Starting a systemd service..." --time --weight=1
|
||||
ynh_script_progression --message="Starting a systemd service..." --weight=1
|
||||
|
||||
ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log"
|
||||
|
||||
#=================================================
|
||||
# RELOAD NGINX
|
||||
#=================================================
|
||||
ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1
|
||||
|
||||
ynh_systemd_action --service_name=nginx --action=reload
|
||||
ynh_systemd_action --service_name=$app --action="start" --log_path="systemd"
|
||||
|
||||
#=================================================
|
||||
# END OF SCRIPT
|
||||
#=================================================
|
||||
|
||||
ynh_script_progression --message="Change of URL completed for $app" --time --last
|
||||
ynh_script_progression --message="Change of URL completed for $app" --last
|
||||
|
|
|
@ -1,42 +1,29 @@
|
|||
#!/bin/bash
|
||||
#=================================================
|
||||
# GENERIC STARTING
|
||||
#=================================================
|
||||
# IMPORT GENERIC HELPERS
|
||||
#=================================================
|
||||
|
||||
source _common.sh
|
||||
source /usr/share/yunohost/helpers
|
||||
|
||||
ynh_abort_if_errors
|
||||
|
||||
#=================================================
|
||||
# RETRIEVE ARGUMENTS
|
||||
#=================================================
|
||||
|
||||
final_path=$(ynh_app_setting_get $app final_path)
|
||||
node_id=$(ynh_app_setting_get $app node_id)
|
||||
virtualisation=$(ynh_app_setting_get $app virtualisation)
|
||||
datadir=$(ynh_app_setting_get $app datadir)
|
||||
if [ "$virtualisation" = "true" ]
|
||||
then
|
||||
nbd_index=$(cat $datadir/nbd_index)
|
||||
fi
|
||||
command="$final_path/garage -c $final_path/garage.toml"
|
||||
data_dir=$(ynh_app_setting_get $app data_dir)
|
||||
secret_node_id=$(ynh_app_setting_get $app data_dir)
|
||||
|
||||
get__weight() {
|
||||
ynh_app_setting_get --app=$app --key=weight
|
||||
}
|
||||
if ! system_is_inside_container
|
||||
then
|
||||
nbd_index=$(cat $data_dir/nbd_index)
|
||||
fi
|
||||
|
||||
set__weight() {
|
||||
if [ "$virtualisation" = "true" ]
|
||||
if system_is_inside_container
|
||||
then
|
||||
systemctl stop $app
|
||||
old_weight="$(ynh_app_setting_get --app=$app --key=weight)"
|
||||
if [ $old_weight -le $weight ]
|
||||
then
|
||||
qemu-img resize $datadir/garage_data.qcow2 "$weight"G
|
||||
qemu-nbd --connect /dev/nbd$nbd_index $datadir/garage_data.qcow2
|
||||
qemu-img resize $data_dir/garage_data.qcow2 "$weight"G
|
||||
qemu-nbd --connect /dev/nbd$nbd_index $data_dir/garage_data.qcow2
|
||||
e2fsck -f -y /dev/nbd$nbd_index
|
||||
resize2fs /dev/nbd$nbd_index
|
||||
qemu-nbd --disconnect /dev/nbd$nbd_index
|
||||
|
@ -44,47 +31,42 @@ set__weight() {
|
|||
e2fsck -f -y /dev/nbd0
|
||||
resize2fs /dev/nbd$nbd_index $weightG
|
||||
qemu-nbd --disconnect /dev/nbd$nbd_index
|
||||
qemu-img resize --shrink $datadir/garage_data.qcow2 "$weight"G
|
||||
qemu-img resize --shrink $data_dir/garage_data.qcow2 "$weight"G
|
||||
fi
|
||||
$final_path/umount_disk.sh
|
||||
$install_dir/umount_disk.sh
|
||||
systemctl start $app
|
||||
sleep 3
|
||||
fi
|
||||
$command layout assign $node_id -c $weight 2>/dev/null
|
||||
apply_layout "$command"
|
||||
$garage layout assign $secret_node_id -c $weight 2>/dev/null
|
||||
garage_layout_apply
|
||||
ynh_app_setting_set --app=$app --key=weight --value=$weight
|
||||
}
|
||||
|
||||
|
||||
|
||||
get__bootstrap_peers() {
|
||||
ynh_app_setting_get --app=$app --key=bootstrap_peers
|
||||
}
|
||||
|
||||
set__bootstrap_peers() {
|
||||
garage_connect "$command" "$bootstrap_peers" 2>/dev/null
|
||||
apply_layout "$command"
|
||||
garage_connect "$bootstrap_peers" 2>/dev/null
|
||||
garage_layout_apply
|
||||
ynh_app_setting_set --app=$app --key=bootstrap_peers --value=$bootstrap_peers
|
||||
}
|
||||
|
||||
get__node() {
|
||||
cat << EOF
|
||||
ask:
|
||||
en: "**Node Id** : $($command node id -q) \n
|
||||
en: "**Node Id** : $($garage node id -q) \n
|
||||
*This id is a sensitive information and should not be shared with anyone else than other nodes of the cluster*"
|
||||
style: "info"
|
||||
EOF
|
||||
}
|
||||
|
||||
get__status() {
|
||||
status=$($command status 2> /dev/null | sed -E 's/([a-z0-9]{16})/\n**\1**/g')
|
||||
status=$($garage status 2> /dev/null | sed -E 's/([a-z0-9]{16})/\n**\1**/g')
|
||||
cat << EOF
|
||||
ask:
|
||||
en: "**Current garage layout**: \n
|
||||
$status"
|
||||
EOF
|
||||
|
||||
if [[ "$(echo \"$status\" | grep \"FAILED NODES\")" ]] || [[ "$(echo \"$status\" | grep 'garage layout show')" ]]
|
||||
if echo "$status" | grep -q "FAILED NODES\|garage layout show"
|
||||
then
|
||||
cat << EOF
|
||||
style: "danger"
|
||||
|
|
382
scripts/install
382
scripts/install
|
@ -9,57 +9,9 @@
|
|||
source _common.sh
|
||||
source /usr/share/yunohost/helpers
|
||||
|
||||
#=================================================
|
||||
# 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
|
||||
|
||||
#=================================================
|
||||
# RETRIEVE ARGUMENTS FROM THE MANIFEST
|
||||
#=================================================
|
||||
|
||||
domain=$YNH_APP_ARG_DOMAIN
|
||||
rpc_secret=$YNH_APP_ARG_RPC_SECRET
|
||||
bootstrap_peers=$YNH_APP_ARG_BOOTSTRAP_PEERS
|
||||
datadir=$YNH_APP_ARG_DATADIR
|
||||
weight=$YNH_APP_ARG_WEIGHT
|
||||
|
||||
|
||||
### If it's 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 interests you 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
|
||||
#=================================================
|
||||
### About --weight and
|
||||
### ynh_script_progression will show to your final users the progression of each scripts.
|
||||
### In order to do that, --weight will represent the relative time of execution compared to the other steps in the script.
|
||||
### is a packager option, it will show you the execution time since the previous call.
|
||||
### This option should be removed before releasing your app.
|
||||
### Use the execution time, given by , to estimate the weight of a step.
|
||||
### A common way to do it is to set a weight equal to the execution time in second +1.
|
||||
### The execution time is given for the duration since the previous call. So the weight should be applied to this previous call.
|
||||
ynh_script_progression --message="Validating installation parameters..." --weight=1
|
||||
|
||||
### If the app uses NGINX as web server (written in HTML/PHP in most cases), the final path should be "/var/www/$app".
|
||||
### If the app provides an internal web server (or uses another application server such as uWSGI), the final path should be "/opt/yunohost/$app"
|
||||
final_path=/opt/yunohost/$app
|
||||
test ! -e "$final_path" || ynh_die --message="This path already contains a folder"
|
||||
|
||||
if [[ -n "$rpc_secret" ]]
|
||||
then
|
||||
|
@ -72,333 +24,100 @@ then
|
|||
echo "$bootstrap_peers" | grep -E '[0-9a-f]{64}@((\b25[0-5]|\b2[0-4][0-9]|\b[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}|([a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]\.)+[a-zA-Z]{2,}):[0-9]{1,4}' || ynh_die --message="friend server id must have id with the following form : 1799bccfd7411eddcf9ebd316bc1f5287ad12a68094e1c6ac6abde7e6feae1ec@192.168.1.1:1234 or 1799bccfd7411eddcf9ebd316bc1f5287ad12a68094e1c6ac6abde7e6feae1ec@example.tld:1234"
|
||||
fi
|
||||
|
||||
if [ "$datadir" = "/home/yunohost.app/__APP_NAME__/data" ]
|
||||
then
|
||||
datadir="/home/yunohost.app/$app/data"
|
||||
fi
|
||||
|
||||
# Register (book) web path
|
||||
ynh_webpath_register --app=$app --domain=$domain --path_url="/"
|
||||
|
||||
#=================================================
|
||||
# LOOKING FOR VIRTUALISATION
|
||||
#=================================================
|
||||
ynh_script_progression --message="Checking virtualisation availability…" --weight=1
|
||||
|
||||
if [ "$(which modprobe)" = "" ]
|
||||
then
|
||||
virtualisation=false
|
||||
export VIRTUALISATION=false
|
||||
# uncomment systemd isolation
|
||||
virt_protection=""
|
||||
else
|
||||
export VIRTUALISATION=true
|
||||
virtualisation=true
|
||||
# comment systemd isolation to allow mount disk
|
||||
virt_protection="#"
|
||||
fi
|
||||
ynh_app_setting_set --app=$app --key=virtualisation --value=$virtualisation
|
||||
|
||||
#=================================================
|
||||
# STORE SETTINGS FROM MANIFEST
|
||||
#=================================================
|
||||
ynh_script_progression --message="Storing installation settings..." --weight=1
|
||||
|
||||
ynh_app_setting_set --app=$app --key=domain --value=$domain
|
||||
ynh_app_setting_set --app=$app --key=rpc_secret --value=$rpc_secret
|
||||
ynh_app_setting_set --app=$app --key=datadir --value=$datadir
|
||||
ynh_app_setting_set --app=$app --key=bootstrap_peers --value=$bootstrap_peers
|
||||
ynh_app_setting_set --app=$app --key=weight --value=$weight
|
||||
|
||||
|
||||
#=================================================
|
||||
# STANDARD MODIFICATIONS
|
||||
#=================================================
|
||||
# FIND AND OPEN A PORT
|
||||
#=================================================
|
||||
ynh_script_progression --message="Finding available ports..." --weight=1
|
||||
|
||||
### Use these lines if you have to open a port for the application
|
||||
### `ynh_find_port` will find the first available port starting from the given port.
|
||||
### If you're not using these lines:
|
||||
### - Remove the section "CLOSE A PORT" in the remove script
|
||||
|
||||
# Find an available port
|
||||
|
||||
port=$(ynh_find_port --port=4000)
|
||||
ynh_app_setting_set --app=$app --key=port --value=$port
|
||||
port_api=$(ynh_find_port --port=5000)
|
||||
ynh_app_setting_set --app=$app --key=port_api --value=$port_api
|
||||
|
||||
|
||||
# Optional: Expose this port publicly
|
||||
# (N.B.: you only need to do this if the app actually needs to expose the port publicly.
|
||||
# If you do this and the app doesn't actually need you are CREATING SECURITY HOLES IN THE SERVER !)
|
||||
|
||||
# Open the port
|
||||
ynh_script_progression --message="Configuring firewall..." --weight=1
|
||||
ynh_exec_warn_less yunohost firewall allow TCP $port
|
||||
|
||||
#=================================================
|
||||
# INSTALL DEPENDENCIES
|
||||
#=================================================
|
||||
ynh_script_progression --message="Installing dependencies..." --weight=1
|
||||
|
||||
### `ynh_install_app_dependencies` allows you to add any "apt" dependencies to the package.
|
||||
### Those deb packages will be installed as dependencies of this package.
|
||||
### If you're not using this helper:
|
||||
### - Remove the section "REMOVE DEPENDENCIES" in the remove script
|
||||
### - Remove the variable "pkg_dependencies" in _common.sh
|
||||
### - As well as the section "REINSTALL DEPENDENCIES" in the restore script
|
||||
### - And the section "UPGRADE DEPENDENCIES" in the upgrade script
|
||||
if [ "$virtualisation" = "true" ]
|
||||
then
|
||||
ynh_install_app_dependencies $pkg_dependencies_virtualisation
|
||||
fi
|
||||
#=================================================
|
||||
# CREATE DEDICATED USER
|
||||
#=================================================
|
||||
ynh_script_progression --message="Configuring system user..." --weight=1
|
||||
|
||||
# Create a system user
|
||||
ynh_system_user_create --username=$app --home_dir="$final_path"
|
||||
|
||||
#=================================================
|
||||
# DOWNLOAD, CHECK AND UNPACK SOURCE
|
||||
#=================================================
|
||||
ynh_script_progression --message="Setting up source files..." --weight=1
|
||||
|
||||
### `ynh_setup_source` is used to install an app from a zip or tar.gz file,
|
||||
### downloaded from an upstream source, like a git repository.
|
||||
### `ynh_setup_source` use the file conf/app.src
|
||||
|
||||
mkdir -p $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
|
||||
pushd $final_path
|
||||
install_garage
|
||||
popd
|
||||
|
||||
# FIXME: this should be managed by the core in the future
|
||||
# Here, as a packager, you may have to tweak the ownerhsip/permissions
|
||||
# such that the appropriate users (e.g. maybe www-data) can access
|
||||
# files in some cases.
|
||||
# But FOR THE LOVE OF GOD, do not allow r/x for "others" on the entire folder -
|
||||
# this will be treated as a security issue.
|
||||
chmod 750 "$final_path"
|
||||
chmod -R o-rwx "$final_path"
|
||||
chown -R $app:$app "$final_path"
|
||||
ynh_setup_source --dest_dir="$install_dir"
|
||||
mv $install_dir/main $install_dir/garage
|
||||
|
||||
chmod 750 $install_dir
|
||||
chmod +x $install_dir/garage
|
||||
chown -R $app:$app "$install_dir"
|
||||
|
||||
#=================================================
|
||||
# NGINX CONFIGURATION
|
||||
#=================================================
|
||||
ynh_script_progression --message="Configuring NGINX web server..." --weight=1
|
||||
|
||||
### `ynh_add_nginx_config` will use the file conf/nginx.conf
|
||||
|
||||
# Create a dedicated NGINX config
|
||||
ynh_add_nginx_config
|
||||
if [[ "${PACKAGE_CHECK_EXEC:-}" -eq 1 ]]
|
||||
then
|
||||
cat << EOF > ../conf/nginx.conf
|
||||
location / {
|
||||
return 200 'This is a dummy page for garage, only displayed during tests on Yunohost CI';
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
|
||||
ynh_add_nginx_config
|
||||
|
||||
#=================================================
|
||||
# ADD A CONFIGURATION
|
||||
#=================================================
|
||||
ynh_script_progression --message="Adding a configuration file..." --weight=1
|
||||
|
||||
### You can add specific configuration files.
|
||||
###
|
||||
### Typically, put your template conf file in ../conf/your_config_file
|
||||
### The template may contain strings such as __FOO__ or __FOO_BAR__,
|
||||
### which will automatically be replaced by the values of $foo and $foo_bar
|
||||
###
|
||||
### ynh_add_config will also keep track of the config file's checksum,
|
||||
### which later during upgrade may allow to automatically backup the config file
|
||||
### if it's found that the file was manually modified
|
||||
###
|
||||
### Check the documentation of `ynh_add_config` for more info.
|
||||
|
||||
ynh_add_config --template="mount_disk.sh" --destination="$final_path/mount_disk.sh"
|
||||
ynh_add_config --template="umount_disk.sh" --destination="$final_path/umount_disk.sh"
|
||||
ynh_add_config --template="garage.toml" --destination="$final_path/garage.toml"
|
||||
chmod +x "$final_path/mount_disk.sh" "$final_path/umount_disk.sh"
|
||||
|
||||
# FIXME: this should be handled by the core in the future
|
||||
# You may need to use chmod 600 instead of 400,
|
||||
# for example if the app is expected to be able to modify its own config
|
||||
chmod 600 "$final_path/garage.toml"
|
||||
chown $app:$app "$final_path/garage.toml"
|
||||
|
||||
### For more complex cases where you want to replace stuff using regexes,
|
||||
### you shoud rely on ynh_replace_string (which is basically a wrapper for sed)
|
||||
### When doing so, you also need to manually call ynh_store_file_checksum
|
||||
###
|
||||
### ynh_replace_string --match_string="match_string" --replace_string="replace_string" --target_file="$final_path/some_config_file"
|
||||
### ynh_store_file_checksum --file="$final_path/some_config_file"
|
||||
ynh_add_config --template="mount_disk.sh" --destination="$install_dir/mount_disk.sh"
|
||||
ynh_add_config --template="umount_disk.sh" --destination="$install_dir/umount_disk.sh"
|
||||
ynh_add_config --template="garage.toml" --destination="$install_dir/garage.toml"
|
||||
chmod +x "$install_dir/mount_disk.sh" "$install_dir/umount_disk.sh"
|
||||
|
||||
chmod 600 "$install_dir/garage.toml"
|
||||
chown $app:$app "$install_dir/garage.toml"
|
||||
|
||||
#=================================================
|
||||
# CREATE DATA DIRECTORY
|
||||
#=================================================
|
||||
ynh_script_progression --message="Creating a data directory..." --weight=5
|
||||
if [ "$virtualisation" = "true" ]
|
||||
|
||||
if system_is_inside_container
|
||||
then
|
||||
ynh_print_warn --message="This may take time regarding disk size…"
|
||||
fi
|
||||
### Use these lines if you need to create a directory to store "persistent files" for the application.
|
||||
### Usually this directory is used to store uploaded files or any file that won't be updated during
|
||||
### an upgrade and that won't be deleted during app removal unless "--purge" option is used.
|
||||
### If you're not using these lines:
|
||||
### - Remove the section "BACKUP THE DATA DIR" in the backup script
|
||||
### - Remove the section "RESTORE THE DATA DIRECTORY" in the restore script
|
||||
### - As well as the section "REMOVE DATA DIR" in the remove script
|
||||
ynh_print_warn --message="This may take time regarding disk size..."
|
||||
|
||||
ynh_app_setting_set --app=$app --key=datadir --value=$datadir
|
||||
|
||||
mkdir -p $datadir/data
|
||||
|
||||
#=================================================
|
||||
# create data partition
|
||||
#=================================================
|
||||
|
||||
if [ "$virtualisation" = "true" ]
|
||||
then
|
||||
# to be sure to not exceed size limit, i use a virtual disk with a fix size to have a max limit size.
|
||||
qemu-img create -f qcow2 $datadir/garage_data.qcow2 "$weight"G
|
||||
VIRTUALISATION=true $final_path/mount_disk.sh true
|
||||
fi
|
||||
|
||||
# FIXME: this should be managed by the core in the future
|
||||
# Here, as a packager, you may have to tweak the ownerhsip/permissions
|
||||
# such that the appropriate users (e.g. maybe www-data) can access
|
||||
# files in some cases.
|
||||
# But FOR THE LOVE OF GOD, do not allow r/x for "others" on the entire folder -
|
||||
# this will be treated as a security issue.
|
||||
chmod 750 "$datadir"
|
||||
chmod -R o-rwx "$datadir"
|
||||
chown -R $app:$app "$datadir"
|
||||
|
||||
if [ "$virtualisation" = "true" ]
|
||||
then
|
||||
VIRTUALISATION=true $final_path/umount_disk.sh
|
||||
qemu-img create -f qcow2 $data_dir/garage_data.qcow2 "$weight"G
|
||||
$install_dir/mount_disk.sh true
|
||||
$install_dir/umount_disk.sh
|
||||
fi
|
||||
|
||||
#=================================================
|
||||
# ADD REGEN-CONF HOOK
|
||||
#=================================================
|
||||
ynh_script_progression --message="adding regen-conf hook..." --weight=1
|
||||
|
||||
ynh_add_config --template="../sources/hooks/conf_regen/98-nginx_garage" --destination="/usr/share/yunohost/hooks/conf_regen/98-nginx_$app"
|
||||
#cp -R ../sources/hooks/conf_regen/98-nginx_garage /usr/share/yunohost/hooks/conf_regen/95-nginx_$app
|
||||
|
||||
|
||||
ynh_systemd_action --service_name=nginx --action="reload"
|
||||
ynh_script_progression --message="Adding regen-conf hook..." --weight=1
|
||||
|
||||
ynh_add_config --template="regenconf_nginx_garage" --destination="/usr/share/yunohost/hooks/conf_regen/98-nginx_$app"
|
||||
yunohost tools regen-conf nginx
|
||||
|
||||
|
||||
#=================================================
|
||||
# SETUP SYSTEMD
|
||||
#=================================================
|
||||
ynh_script_progression --message="Configuring a systemd service..." --weight=1
|
||||
|
||||
### `ynh_systemd_config` is used to configure a systemd script for an app.
|
||||
### It can be used for apps that use sysvinit (with adaptation) or systemd.
|
||||
### Have a look at the app to be sure this app needs a systemd script.
|
||||
### `ynh_systemd_config` will use the file conf/systemd.service
|
||||
### If you're not using these lines:
|
||||
### - You can remove those files in conf/.
|
||||
### - Remove the section "BACKUP SYSTEMD" in the backup script
|
||||
### - Remove also the section "STOP AND REMOVE SERVICE" in the remove script
|
||||
### - As well as the section "RESTORE SYSTEMD" in the restore script
|
||||
### - And the section "SETUP SYSTEMD" in the upgrade script
|
||||
|
||||
# Create a dedicated systemd config
|
||||
ynh_add_systemd_config
|
||||
|
||||
#=================================================
|
||||
# GENERIC FINALIZATION
|
||||
#=================================================
|
||||
# SETUP LOGROTATE
|
||||
#=================================================
|
||||
ynh_script_progression --message="Configuring log rotation..." --weight=1
|
||||
|
||||
### `ynh_use_logrotate` is used to configure a logrotate configuration for the logs of this app.
|
||||
### Use this helper only if there is effectively a log file for this app.
|
||||
### If you're not using this helper:
|
||||
### - Remove the section "BACKUP LOGROTATE" in the backup script
|
||||
### - Remove also the section "REMOVE LOGROTATE CONFIGURATION" in the remove script
|
||||
### - As well as the section "RESTORE THE LOGROTATE CONFIGURATION" in the restore script
|
||||
### - And the section "SETUP LOGROTATE" in the upgrade script
|
||||
|
||||
# Use logrotate to manage application logfile(s)
|
||||
ynh_use_logrotate
|
||||
|
||||
#=================================================
|
||||
# INTEGRATE SERVICE IN YUNOHOST
|
||||
#=================================================
|
||||
ynh_script_progression --message="Integrating service in YunoHost..." --weight=1
|
||||
|
||||
### `yunohost service add` integrates a service in YunoHost. It then gets
|
||||
### displayed in the admin interface and through the others `yunohost service` commands.
|
||||
### (N.B.: this line only makes sense if the app adds a service to the system!)
|
||||
### If you're not using these lines:
|
||||
### - You can remove these files in conf/.
|
||||
### - Remove the section "REMOVE SERVICE INTEGRATION IN YUNOHOST" in the remove script
|
||||
### - As well as the section "INTEGRATE SERVICE IN YUNOHOST" in the restore script
|
||||
### - And the section "INTEGRATE SERVICE IN YUNOHOST" in the upgrade script
|
||||
|
||||
yunohost service add --needs_exposed_ports $port --description="s3 storage" --log="/var/log/$app/$app.log" $app
|
||||
|
||||
### Additional options starting with 3.8:
|
||||
###
|
||||
### --needs_exposed_ports "$port" a list of ports that needs to be publicly exposed
|
||||
### which will then be checked by YunoHost's diagnosis system
|
||||
### (N.B. DO NOT USE THIS is the port is only internal!!!)
|
||||
###
|
||||
### --test_status "some command" a custom command to check the status of the service
|
||||
### (only relevant if 'systemctl status' doesn't do a good job)
|
||||
###
|
||||
### --test_conf "some command" some command similar to "nginx -t" that validates the conf of the service
|
||||
###
|
||||
### Re-calling 'yunohost service add' during the upgrade script is the right way
|
||||
### to proceed if you later realize that you need to enable some flags that
|
||||
### weren't enabled on old installs (be careful it'll override the existing
|
||||
### service though so you should re-provide all relevant flags when doing so)
|
||||
|
||||
yunohost service add $app --description="s3 storage" --log="/var/log/$app/$app.log" --needs_exposed_ports $port
|
||||
|
||||
#=================================================
|
||||
# START SYSTEMD SERVICE
|
||||
#=================================================
|
||||
ynh_script_progression --message="Starting a systemd service..." --weight=1
|
||||
|
||||
### `ynh_systemd_action` is used to start a systemd service for an app.
|
||||
### Only needed if you have configure a systemd service
|
||||
### If you're not using these lines:
|
||||
### - Remove the section "STOP SYSTEMD SERVICE" and "START SYSTEMD SERVICE" in the backup script
|
||||
### - As well as the section "START SYSTEMD SERVICE" in the restore script
|
||||
### - As well as the section"STOP SYSTEMD SERVICE" and "START SYSTEMD SERVICE" in the upgrade script
|
||||
### - And the section "STOP SYSTEMD SERVICE" and "START SYSTEMD SERVICE" in the change_url script
|
||||
|
||||
# Start a systemd service
|
||||
ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log"
|
||||
ynh_systemd_action --service_name=$app --action="start" --log_path="systemd" --line_match="Started Garage: Data Store."
|
||||
|
||||
#=================================================
|
||||
# SETUP SSOWAT
|
||||
#=================================================
|
||||
ynh_script_progression --message="Configuring permissions..." --weight=1
|
||||
|
||||
# Everyone can access the app.
|
||||
# The "main" permission is automatically created before the install script.
|
||||
ynh_permission_update --permission="main" --add="visitors"
|
||||
|
||||
#=================================================
|
||||
# RELOAD NGINX
|
||||
#=================================================
|
||||
ynh_script_progression --message="Reloading NGINX web server..." --weight=1
|
||||
|
||||
ynh_systemd_action --service_name=nginx --action=reload
|
||||
|
||||
|
||||
#=================================================
|
||||
|
@ -406,49 +125,32 @@ ynh_systemd_action --service_name=nginx --action=reload
|
|||
#=================================================
|
||||
ynh_script_progression --message="Configuring garage..." --weight=1
|
||||
|
||||
garage_command="$final_path/garage -c $final_path/garage.toml"
|
||||
|
||||
i=0
|
||||
# sometimes server need some time to start
|
||||
until [ "" != "$($garage_command node id -q 2>/dev/null | cut -d '@' -f1)" ] ; do
|
||||
while [ -z "$($garage node id -q 2>/dev/null | cut -d '@' -f1)" ]; do
|
||||
i=$(( i + 1 ))
|
||||
if [ $i -gt 30 ]
|
||||
then
|
||||
ynh_die --message="unable to get node id"
|
||||
fi
|
||||
[ $i -le 30 ] || { $garage node id || true; ynh_die --message="unable to get node id"; }
|
||||
sleep 1
|
||||
done
|
||||
node_id=$($garage_command node id -q 2>/dev/null | cut -d '@' -f1)
|
||||
ynh_app_setting_set --app=$app --key=node_id --value=$node_id
|
||||
|
||||
secret_node_id=$($garage node id -q 2>/dev/null | cut -d '@' -f1)
|
||||
ynh_app_setting_set --app=$app --key=secret_node_id --value=$secret_node_id
|
||||
|
||||
|
||||
# define node
|
||||
$garage_command layout assign $node_id -z $domain -c $weight -t $domain
|
||||
$garage layout assign $secret_node_id -z $domain -c ${weight}GB -t $domain
|
||||
# if there is enough node, apply layout
|
||||
apply_layout "$garage_command"
|
||||
garage_layout_apply
|
||||
|
||||
if [ -n "$bootstrap_peers" ]
|
||||
then
|
||||
garage_connect "$garage_command" "$bootstrap_peers"
|
||||
garage_connect "$bootstrap_peers"
|
||||
fi
|
||||
|
||||
self_bootstrap_peers="$($garage_command node id --quiet)"
|
||||
garage_layout="$($garage_command layout show)"
|
||||
|
||||
#=================================================
|
||||
# Send email to admin
|
||||
#=================================================
|
||||
app_message="
|
||||
your garage node have been installed. You can now connect to other nodes with the following identifiers :
|
||||
|
||||
rpc_secret: $rpc_secret
|
||||
bootstrap_peers: $self_bootstrap_peers
|
||||
|
||||
Current garage layout :
|
||||
|
||||
$garage_layout"
|
||||
|
||||
ynh_send_readme_to_admin --app_message="$app_message"
|
||||
self_bootstrap_peers="$($garage node id --quiet)"
|
||||
ynh_app_setting_set --app=$app --key=self_bootstrap_peers --value=$self_bootstrap_peers
|
||||
garage_layout="$($garage layout show)"
|
||||
ynh_app_setting_set --app=$app --key=garage_layout --value="$garage_layout"
|
||||
|
||||
#=================================================
|
||||
# END OF SCRIPT
|
||||
|
|
112
scripts/remove
112
scripts/remove
|
@ -1,4 +1,4 @@
|
|||
#!/bin/bash
|
||||
#!/bin/bash
|
||||
|
||||
#=================================================
|
||||
# GENERIC START
|
||||
|
@ -9,39 +9,18 @@
|
|||
source _common.sh
|
||||
source /usr/share/yunohost/helpers
|
||||
|
||||
#=================================================
|
||||
# LOAD SETTINGS
|
||||
#=================================================
|
||||
ynh_script_progression --message="Loading installation settings..." --weight=1
|
||||
|
||||
app=$YNH_APP_INSTANCE_NAME
|
||||
|
||||
domain=$(ynh_app_setting_get --app=$app --key=domain)
|
||||
port=$(ynh_app_setting_get --app=$app --key=port)
|
||||
rpc_secret=$(ynh_app_setting_get --app=$app --key=rpc_secret)
|
||||
port_api=$(ynh_app_setting_get --app=$app --key=port_api)
|
||||
port_web=$(ynh_app_setting_get --app=$app --key=port_web)
|
||||
datadir=$(ynh_app_setting_get --app=$app --key=datadir)
|
||||
bootstrap_peers=$(ynh_app_setting_get --app=$app --key=bootstrap_peers)
|
||||
node_id=$(ynh_app_setting_get --app=$app --key=node_id)
|
||||
final_path=$(ynh_app_setting_get --app=$app --key=final_path)
|
||||
virtualisation=$(ynh_app_setting_get --app=$app --key=virtualisation)
|
||||
if [ "$virtualisation" = "true" ]
|
||||
then
|
||||
export VIRTUALISTATION=true
|
||||
fi
|
||||
#=================================================
|
||||
# REMOVE NODE CONFIGURATION
|
||||
#=================================================
|
||||
$final_path/garage -c $final_path/garage.toml layout remove "$node_id"
|
||||
|
||||
apply_layout "$final_path/garage -c $final_path/garage.toml "
|
||||
$garage layout remove "$secret_node_id"
|
||||
|
||||
garage_layout_apply
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
ynh_print_warn --message="unable to remove the node. Maybe the number of node staying alive is not enough"
|
||||
ynh_print_warn --message="Unable to remove the node. Maybe the number of node staying alive is not enough"
|
||||
fi
|
||||
|
||||
|
||||
#=================================================
|
||||
# STANDARD REMOVE
|
||||
#=================================================
|
||||
|
@ -51,59 +30,23 @@ fi
|
|||
# Remove the service from the list of services known by YunoHost (added from `yunohost service add`)
|
||||
if ynh_exec_warn_less yunohost service status $app >/dev/null
|
||||
then
|
||||
ynh_script_progression --message="Removing $app service integration..." --weight=1
|
||||
ynh_script_progression --message="Removing $app service integration..."
|
||||
yunohost service remove $app
|
||||
fi
|
||||
|
||||
#=================================================
|
||||
# STOP AND REMOVE SERVICE
|
||||
#=================================================
|
||||
ynh_script_progression --message="Stopping and removing the systemd service..." --weight=1
|
||||
|
||||
# Remove the dedicated systemd config
|
||||
ynh_remove_systemd_config
|
||||
|
||||
#=================================================
|
||||
# REMOVE LOGROTATE CONFIGURATION
|
||||
#=================================================
|
||||
ynh_script_progression --message="Removing logrotate configuration..." --weight=1
|
||||
|
||||
# Remove the app-specific logrotate config
|
||||
ynh_remove_logrotate
|
||||
|
||||
|
||||
if [ "$virtualisation" = "true" ]
|
||||
if system_is_inside_container
|
||||
then
|
||||
#=================================================
|
||||
# REMOVE VIRTUAL DISK
|
||||
#=================================================
|
||||
ynh_script_progression --message="umount virtual disk..." --weight=1
|
||||
ynh_script_progression --message="Umount virtual disk..."
|
||||
|
||||
# Remove the app directory securely
|
||||
$final_path/umount_disk.sh
|
||||
$install_dir/umount_disk.sh
|
||||
fi
|
||||
#=================================================
|
||||
# REMOVE APP MAIN DIR
|
||||
#=================================================
|
||||
ynh_script_progression --message="Removing app main directory..." --weight=1
|
||||
|
||||
# Remove the app directory securely
|
||||
ynh_secure_remove --file="$final_path"
|
||||
|
||||
#=================================================
|
||||
# REMOVE DATA DIR
|
||||
#=================================================
|
||||
ynh_script_progression --message="Removing app data directory..." --weight=1
|
||||
ynh_secure_remove --file="$datadir"
|
||||
|
||||
#=================================================
|
||||
# REMOVE NGINX HOOK
|
||||
#=================================================
|
||||
|
||||
#=================================================
|
||||
# REMOVE NGINX CONFIGURATION
|
||||
#=================================================
|
||||
ynh_script_progression --message="Removing NGINX web server configuration..." --weight=1
|
||||
|
||||
# Remove the dedicated NGINX config
|
||||
ynh_remove_nginx_config
|
||||
|
@ -112,48 +55,11 @@ ynh_remove_nginx_config
|
|||
ynh_replace_string --replace_string="server_name $domain" --match_string="server_name $domain *.$domain" --target_file="/etc/nginx/conf.d/$domain.conf"
|
||||
ynh_store_file_checksum --file="/etc/nginx/conf.d/$domain.conf"
|
||||
|
||||
#=================================================
|
||||
# REMOVE DEPENDENCIES
|
||||
#=================================================
|
||||
ynh_script_progression --message="Removing dependencies..." --weight=1
|
||||
|
||||
# Remove metapackage and its dependencies
|
||||
ynh_remove_app_dependencies
|
||||
|
||||
#=================================================
|
||||
# CLOSE A PORT
|
||||
#=================================================
|
||||
|
||||
if yunohost firewall list | grep -q "\- $port$"
|
||||
then
|
||||
ynh_script_progression --message="Closing port $port..." --weight=1
|
||||
ynh_exec_warn_less yunohost firewall disallow TCP $port
|
||||
fi
|
||||
|
||||
|
||||
#=================================================
|
||||
# SPECIFIC REMOVE
|
||||
#=================================================
|
||||
# REMOVE VARIOUS FILES
|
||||
#=================================================
|
||||
ynh_script_progression --message="Removing various files..." --weight=1
|
||||
|
||||
# Remove the log files
|
||||
ynh_secure_remove --file="/var/log/$app"
|
||||
|
||||
#=================================================
|
||||
# GENERIC FINALIZATION
|
||||
#=================================================
|
||||
# REMOVE DEDICATED USER
|
||||
#=================================================
|
||||
ynh_script_progression --message="Removing the dedicated system user..." --weight=1
|
||||
|
||||
# Delete a system user
|
||||
ynh_system_user_delete --username=$app
|
||||
|
||||
ynh_secure_remove --file="/usr/share/yunohost/hooks/conf_regen/98-nginx_$app"
|
||||
yunohost tools regen-conf nginx
|
||||
ynh_systemd_action --service_name=nginx --action="reload"
|
||||
|
||||
#=================================================
|
||||
# END OF SCRIPT
|
||||
|
|
140
scripts/restore
140
scripts/restore
|
@ -10,172 +10,90 @@
|
|||
source ../settings/scripts/_common.sh
|
||||
source /usr/share/yunohost/helpers
|
||||
|
||||
#=================================================
|
||||
# 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..." --weight=1
|
||||
|
||||
app=$YNH_APP_INSTANCE_NAME
|
||||
|
||||
domain=$(ynh_app_setting_get --app=$app --key=domain)
|
||||
final_path=$(ynh_app_setting_get --app=$app --key=final_path)
|
||||
datadir=$(ynh_app_setting_get --app=$app --key=datadir)
|
||||
virtualisation=$(ynh_app_setting_get --app=$app --key=virtualisation)
|
||||
bootstrap_peers=$(ynh_app_setting_get --app=$app --key=bootstrap_peers)
|
||||
port=$(ynh_app_setting_get --app=$app --key=port)
|
||||
node_id=$(ynh_app_setting_get --app=$app --key=node_id)
|
||||
weight=$(ynh_app_setting_get --app=$app --key=weight)
|
||||
|
||||
#=================================================
|
||||
# CHECK IF THE APP CAN BE RESTORED
|
||||
#=================================================
|
||||
ynh_script_progression --message="Validating restoration parameters..." --weight=1
|
||||
|
||||
test ! -d $final_path \
|
||||
|| ynh_die --message="There is already a directory: $final_path "
|
||||
|
||||
#=================================================
|
||||
# STANDARD RESTORATION STEPS
|
||||
#=================================================
|
||||
# RECREATE THE DEDICATED USER
|
||||
#=================================================
|
||||
ynh_script_progression --message="Recreating the dedicated system user..." --weight=1
|
||||
|
||||
# Create the dedicated user (if not existing)
|
||||
ynh_system_user_create --username=$app --home_dir="$final_path"
|
||||
|
||||
#=================================================
|
||||
# RESTORE THE APP MAIN DIR
|
||||
#=================================================
|
||||
ynh_script_progression --message="Restoring the app main directory..." --weight=1
|
||||
ynh_script_progression --message="Restoring the app main directory..."
|
||||
|
||||
ynh_restore_file --origin_path="$final_path"
|
||||
ynh_restore_file --origin_path="$install_dir"
|
||||
|
||||
# FIXME: this should be managed by the core in the future
|
||||
# Here, as a packager, you may have to tweak the ownerhsip/permissions
|
||||
# such that the appropriate users (e.g. maybe www-data) can access
|
||||
# files in some cases.
|
||||
# But FOR THE LOVE OF GOD, do not allow r/x for "others" on the entire folder -
|
||||
# this will be treated as a security issue.
|
||||
chmod 750 "$final_path"
|
||||
chmod -R o-rwx "$final_path"
|
||||
chown -R $app:$app "$final_path"
|
||||
chown -R $app:$app "$install_dir"
|
||||
|
||||
#=================================================
|
||||
# RESTORE THE DATA DIRECTORY
|
||||
#=================================================
|
||||
ynh_script_progression --message="Restoring the data directory..." --weight=1
|
||||
ynh_script_progression --message="Restoring the data directory..."
|
||||
|
||||
mkdir -p "$datadir/data"
|
||||
|
||||
if [ "$virtualisation" = "true" ]
|
||||
if system_is_inside_container
|
||||
then
|
||||
export VIRTUALISATION=true
|
||||
# Define and install dependencies
|
||||
ynh_install_app_dependencies $pkg_dependencies_virtualisation
|
||||
# to be sure to not exceed size limit, i use a virtual disk with a fix size to have a max limit size.
|
||||
qemu-img create -f qcow2 $datadir/garage_data.qcow2 "$weight"G
|
||||
$final_path/mount_disk.sh true
|
||||
qemu-img create -f qcow2 $data_dir/garage_data.qcow2 "$weight"G
|
||||
$install_dir/mount_disk.sh true
|
||||
fi
|
||||
|
||||
|
||||
# # FIXME: this should be managed by the core in the future
|
||||
# Here, as a packager, you may have to tweak the ownerhsip/permissions
|
||||
# such that the appropriate users (e.g. maybe www-data) can access
|
||||
# files in some cases.
|
||||
# But FOR THE LOVE OF GOD, do not allow r/x for "others" on the entire folder -
|
||||
# this will be treated as a security issue.
|
||||
chmod 750 "$datadir"
|
||||
chmod -R o-rwx "$datadir"
|
||||
chown -R $app:$app "$datadir"
|
||||
|
||||
#=================================================
|
||||
# SPECIFIC RESTORATION
|
||||
#=================================================
|
||||
|
||||
# Open the port
|
||||
ynh_script_progression --message="Configuring firewall..." --weight=1
|
||||
ynh_exec_warn_less yunohost firewall allow TCP $port
|
||||
chown -R $app:$app "$data_dir"
|
||||
|
||||
#=================================================
|
||||
# RESTORE THE NGINX CONFIGURATION
|
||||
#=================================================
|
||||
ynh_script_progression --message="Restoring the NGINX web server configuration..." --weight=1
|
||||
ynh_script_progression --message="Restoring the NGINX web server configuration..."
|
||||
|
||||
ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf"
|
||||
#add wildcard subdomain
|
||||
|
||||
|
||||
ynh_restore_file --origin_path="/usr/share/yunohost/hooks/conf_regen/98-nginx_$app"
|
||||
yunohost tools regen-conf nginx
|
||||
ynh_systemd_action --service_name=nginx --action="reload"
|
||||
|
||||
|
||||
#=================================================
|
||||
# RESTORE SYSTEMD
|
||||
#=================================================
|
||||
ynh_script_progression --message="Restoring the systemd configuration..." --weight=1
|
||||
|
||||
ynh_restore_file --origin_path="/etc/systemd/system/$app.service"
|
||||
systemctl enable $app.service --quiet
|
||||
|
||||
#=================================================
|
||||
# RESTORE THE LOGROTATE CONFIGURATION
|
||||
#=================================================
|
||||
ynh_script_progression --message="Restoring the logrotate configuration..." --weight=1
|
||||
|
||||
ynh_restore_file --origin_path="/etc/logrotate.d/$app"
|
||||
|
||||
#=================================================
|
||||
# INTEGRATE SERVICE IN YUNOHOST
|
||||
#=================================================
|
||||
ynh_script_progression --message="Integrating service in YunoHost..." --weight=1
|
||||
|
||||
yunohost service add --needs_exposed_ports $port --description="s3 storage" --log="/var/log/$app/$app.log" $app
|
||||
yunohost service add $app --description="s3 storage" --log="/var/log/$app/$app.log" --needs_exposed_ports $port
|
||||
|
||||
#=================================================
|
||||
# START SYSTEMD SERVICE
|
||||
#=================================================
|
||||
ynh_script_progression --message="Starting a systemd service..." --weight=1
|
||||
ynh_script_progression --message="Starting a systemd service..."
|
||||
|
||||
#recreate log folder
|
||||
mkdir /var/log/$app
|
||||
|
||||
ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log"
|
||||
ynh_systemd_action --service_name=$app --action="start" --log_path="systemd"
|
||||
|
||||
#=================================================
|
||||
# RECREATE CONFIGURATION
|
||||
#=================================================
|
||||
|
||||
sleep 2
|
||||
i=0
|
||||
# sometimes server need some time to start
|
||||
while [ -z "$($garage node id -q 2>/dev/null | cut -d '@' -f1)" ]; do
|
||||
i=$(( i + 1 ))
|
||||
[ $i -le 30 ] || { $garage node id || true; ynh_die --message="unable to get node id"; }
|
||||
sleep 1
|
||||
done
|
||||
|
||||
# restoring garage can lead to change node id
|
||||
secret_node_id=$($garage node id -q 2>/dev/null | cut -d '@' -f1)
|
||||
ynh_app_setting_set --app=$app --key=secret_node_id --value=$secret_node_id
|
||||
|
||||
garage_command="$final_path/garage -c $final_path/garage.toml"
|
||||
|
||||
# define node
|
||||
$garage_command layout assign $node_id -z $domain -c $weight -t $domain
|
||||
$garage layout assign $secret_node_id -z $domain -c ${weight}GB -t $domain
|
||||
# if there is enough node, apply layout
|
||||
apply_layout "$garage_command"
|
||||
garage_layout_apply
|
||||
|
||||
if [ -n "$bootstrap_peers" ]
|
||||
then
|
||||
garage_connect "$garage_command" "$bootstrap_peers"
|
||||
garage_connect "$bootstrap_peers"
|
||||
fi
|
||||
|
||||
#=================================================
|
||||
# GENERIC FINALIZATION
|
||||
#=================================================
|
||||
# RELOAD NGINX AND PHP-FPM
|
||||
#=================================================
|
||||
ynh_script_progression --message="Reloading NGINX web server and PHP-FPM..." --weight=1
|
||||
ynh_script_progression --message="Reloading NGINX web server..."
|
||||
|
||||
ynh_systemd_action --service_name=nginx --action=reload
|
||||
|
||||
|
|
166
scripts/upgrade
166
scripts/upgrade
|
@ -9,55 +9,12 @@
|
|||
source _common.sh
|
||||
source /usr/share/yunohost/helpers
|
||||
|
||||
#=================================================
|
||||
# LOAD SETTINGS
|
||||
#=================================================
|
||||
ynh_script_progression --message="Loading installation settings..." --weight=1
|
||||
|
||||
app=$YNH_APP_INSTANCE_NAME
|
||||
|
||||
domain=$(ynh_app_setting_get --app=$app --key=domain)
|
||||
port=$(ynh_app_setting_get --app=$app --key=port)
|
||||
rpc_secret=$(ynh_app_setting_get --app=$app --key=rpc_secret)
|
||||
port_api=$(ynh_app_setting_get --app=$app --key=port_api)
|
||||
port_web=$(ynh_app_setting_get --app=$app --key=port_web)
|
||||
datadir=$(ynh_app_setting_get --app=$app --key=datadir)
|
||||
bootstrap_peers=$(ynh_app_setting_get --app=$app --key=bootstrap_peers)
|
||||
final_path=$(ynh_app_setting_get --app=$app --key=final_path)
|
||||
virtualisation=$(ynh_app_setting_get --app=$app --key=virtualisation)
|
||||
|
||||
if [ "$virtualisation" = "true" ] ;
|
||||
then
|
||||
virt_protection=""
|
||||
else
|
||||
virt_protection="#"
|
||||
fi
|
||||
#=================================================
|
||||
# CHECK VERSION
|
||||
#=================================================
|
||||
|
||||
### This helper will compare the version of the currently installed app and the version of the upstream package.
|
||||
### $upgrade_type can have 2 different values
|
||||
### - UPGRADE_APP if the upstream app version has changed
|
||||
### - UPGRADE_PACKAGE if only the YunoHost package has changed
|
||||
### ynh_check_app_version_changed will stop the upgrade if the app is up to date.
|
||||
### UPGRADE_APP should be used to upgrade the core app only if there's an upgrade to do.
|
||||
upgrade_type=$(ynh_check_app_version_changed)
|
||||
|
||||
#=================================================
|
||||
# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP
|
||||
#=================================================
|
||||
ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --weight=1
|
||||
|
||||
# Backup the current version of the app
|
||||
ynh_backup_before_upgrade
|
||||
ynh_clean_setup () {
|
||||
# Restore it if the upgrade fails
|
||||
ynh_restore_upgradebackup
|
||||
}
|
||||
# Exit if an error occurs during the execution of the script
|
||||
ynh_abort_if_errors
|
||||
|
||||
#=================================================
|
||||
# STANDARD UPGRADE STEPS
|
||||
#=================================================
|
||||
|
@ -65,43 +22,7 @@ ynh_abort_if_errors
|
|||
#=================================================
|
||||
ynh_script_progression --message="Stopping a systemd service..." --weight=1
|
||||
|
||||
ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log"
|
||||
|
||||
#=================================================
|
||||
# ENSURE DOWNWARD COMPATIBILITY
|
||||
#=================================================
|
||||
ynh_script_progression --message="Ensuring downward compatibility..." --weight=1
|
||||
|
||||
|
||||
# Create a permission if needed
|
||||
if ! ynh_permission_exists --permission="api"; then
|
||||
ynh_permission_create --permission="api" --url="/api" --allowed="visitors" --show_tile="false" --protected="true"
|
||||
fi
|
||||
|
||||
#=================================================
|
||||
# INSTALL DEPENDENCIES
|
||||
#=================================================
|
||||
ynh_script_progression --message="Installing dependencies..." --weight=1
|
||||
|
||||
### `ynh_install_app_dependencies` allows you to add any "apt" dependencies to the package.
|
||||
### Those deb packages will be installed as dependencies of this package.
|
||||
### If you're not using this helper:
|
||||
### - Remove the section "REMOVE DEPENDENCIES" in the remove script
|
||||
### - Remove the variable "pkg_dependencies" in _common.sh
|
||||
### - As well as the section "REINSTALL DEPENDENCIES" in the restore script
|
||||
### - And the section "UPGRADE DEPENDENCIES" in the upgrade script
|
||||
if [ "$virtualisation" = "true" ]
|
||||
then
|
||||
ynh_install_app_dependencies $pkg_dependencies_virtualisation
|
||||
fi
|
||||
|
||||
#=================================================
|
||||
# CREATE DEDICATED USER
|
||||
#=================================================
|
||||
ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1
|
||||
|
||||
# Create a dedicated user (if not existing)
|
||||
ynh_system_user_create --username=$app --home_dir="$final_path"
|
||||
ynh_systemd_action --service_name=$app --action="stop" --log_path="systemd"
|
||||
|
||||
#=================================================
|
||||
# DOWNLOAD, CHECK AND UNPACK SOURCE
|
||||
|
@ -110,23 +31,13 @@ ynh_system_user_create --username=$app --home_dir="$final_path"
|
|||
if [ "$upgrade_type" == "UPGRADE_APP" ]
|
||||
then
|
||||
ynh_script_progression --message="Upgrading source files..." --weight=1
|
||||
|
||||
# Download, check integrity, uncompress and patch the source from app.src
|
||||
pushd $final_path
|
||||
install_garage
|
||||
popd
|
||||
ynh_setup_source --dest_dir="$install_dir"
|
||||
mv $install_dir/main $install_dir/garage
|
||||
fi
|
||||
|
||||
# FIXME: this should be managed by the core in the future
|
||||
# Here, as a packager, you may have to tweak the ownerhsip/permissions
|
||||
# such that the appropriate users (e.g. maybe www-data) can access
|
||||
# files in some cases.
|
||||
# But FOR THE LOVE OF GOD, do not allow r/x for "others" on the entire folder -
|
||||
# this will be treated as a security issue.
|
||||
chmod 750 "$final_path"
|
||||
chmod -R o-rwx "$final_path"
|
||||
chown -R $app:$app "$final_path"
|
||||
|
||||
chmod 750 $install_dir
|
||||
chmod +x $install_dir/garage
|
||||
chown -R $app:$app "$install_dir"
|
||||
|
||||
#=================================================
|
||||
# NGINX CONFIGURATION
|
||||
|
@ -134,65 +45,40 @@ chown -R $app:$app "$final_path"
|
|||
ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=1
|
||||
|
||||
# Create a dedicated NGINX config
|
||||
if [[ "${PACKAGE_CHECK_EXEC:-}" -eq 1 ]]
|
||||
then
|
||||
cat << EOF > ../conf/nginx.conf
|
||||
location / {
|
||||
return 200 'This is a dummy page for garage, only displayed during tests on Yunohost CI';
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
ynh_add_nginx_config
|
||||
|
||||
#=================================================
|
||||
# SPECIFIC UPGRADE
|
||||
#=================================================
|
||||
# ...
|
||||
#=================================================
|
||||
ynh_add_config --template="regenconf_nginx_garage" --destination="/usr/share/yunohost/hooks/conf_regen/98-nginx_$app"
|
||||
yunohost tools regen-conf nginx
|
||||
|
||||
# Create a dedicated systemd config
|
||||
ynh_add_systemd_config
|
||||
|
||||
# Use logrotate to manage app-specific logfile(s)
|
||||
ynh_use_logrotate --non-append
|
||||
|
||||
yunohost service add $app --description="s3 storage" --log="/var/log/$app/$app.log" --needs_exposed_ports $port
|
||||
|
||||
#=================================================
|
||||
# UPDATE A CONFIG FILE
|
||||
#=================================================
|
||||
ynh_script_progression --message="Updating a configuration file..." --weight=1
|
||||
|
||||
|
||||
### For more complex cases where you want to replace stuff using regexes,
|
||||
### you shoud rely on ynh_replace_string (which is basically a wrapper for sed)
|
||||
### When doing so, you also need to manually call ynh_store_file_checksum
|
||||
###
|
||||
### ynh_replace_string --match_string="match_string" --replace_string="replace_string" --target_file="$final_path/some_config_file"
|
||||
### ynh_store_file_checksum --file="$final_path/some_config_file"
|
||||
|
||||
#=================================================
|
||||
# SETUP SYSTEMD
|
||||
#=================================================
|
||||
ynh_script_progression --message="Upgrading systemd configuration..." --weight=1
|
||||
|
||||
# Create a dedicated systemd config
|
||||
ynh_add_systemd_config
|
||||
|
||||
#=================================================
|
||||
# GENERIC FINALIZATION
|
||||
#=================================================
|
||||
# SETUP LOGROTATE
|
||||
#=================================================
|
||||
ynh_script_progression --message="Upgrading logrotate configuration..." --weight=1
|
||||
|
||||
# Use logrotate to manage app-specific logfile(s)
|
||||
ynh_use_logrotate --non-append
|
||||
|
||||
#=================================================
|
||||
# INTEGRATE SERVICE IN YUNOHOST
|
||||
#=================================================
|
||||
ynh_script_progression --message="Integrating service in YunoHost..." --weight=1
|
||||
|
||||
yunohost service add --needs_exposed_ports $port --description="s3 storage" --log="/var/log/$app/$app.log" $app
|
||||
ynh_add_config --template="garage.toml" --destination="$install_dir/garage.toml"
|
||||
|
||||
#=================================================
|
||||
# START SYSTEMD SERVICE
|
||||
#=================================================
|
||||
ynh_script_progression --message="Starting a systemd service..." --weight=1
|
||||
|
||||
ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log"
|
||||
|
||||
#=================================================
|
||||
# RELOAD NGINX
|
||||
#=================================================
|
||||
ynh_script_progression --message="Reloading NGINX web server..." --weight=1
|
||||
|
||||
ynh_systemd_action --service_name=nginx --action=reload
|
||||
ynh_systemd_action --service_name=$app --action="start" --log_path="systemd"
|
||||
|
||||
#=================================================
|
||||
# END OF SCRIPT
|
||||
|
|
2
sources/extra_files/app/.gitignore
vendored
2
sources/extra_files/app/.gitignore
vendored
|
@ -1,2 +0,0 @@
|
|||
*~
|
||||
*.sw[op]
|
2
sources/patches/.gitignore
vendored
2
sources/patches/.gitignore
vendored
|
@ -1,2 +0,0 @@
|
|||
*~
|
||||
*.sw[op]
|
15
tests.toml
Normal file
15
tests.toml
Normal file
|
@ -0,0 +1,15 @@
|
|||
test_format = 1.0
|
||||
|
||||
[default]
|
||||
|
||||
# ------------
|
||||
# Tests to run
|
||||
# ------------
|
||||
|
||||
exclude = ["install.private"]
|
||||
|
||||
# -------------------------------
|
||||
# Default args to use for install
|
||||
# -------------------------------
|
||||
|
||||
args.weight = "10"
|
Loading…
Add table
Reference in a new issue