1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/garage_ynh.git synced 2024-09-03 18:36:32 +02:00

Merge pull request #13 from YunoHost-Apps/testing

Testing
This commit is contained in:
lapineige 2024-01-27 12:25:56 +01:00 committed by GitHub
commit a495b308e7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
27 changed files with 333 additions and 1581 deletions

View file

@ -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

View file

@ -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/>

View file

@ -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 lapp : <https://garagehq.deuxfleurs.fr/>

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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;
}

View file

@ -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"

View file

@ -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

View file

@ -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

View file

@ -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"

View file

@ -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"

View file

@ -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
View 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__

View file

@ -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
View 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
"""

View file

@ -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
}
#=================================================
# 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"
local layout_version=$($garage layout show 2>/dev/null | grep -Po -- "(?<=--version).*" | head -1 | xargs)
$garage layout apply --version $layout_version
}
#=================================================
# FUTURE OFFICIAL HELPERS
#=================================================

View file

@ -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
#=================================================

View file

@ -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

View file

@ -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"

View file

@ -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,386 +24,136 @@ 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_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_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
ynh_script_progression --message="Configuring NGINX web server..." --weight=1
# 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
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" ]
ynh_script_progression --message="Creating a data directory..." --weight=5
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
# 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 $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
ynh_script_progression --message="Configuring a systemd service..." --weight=1
# 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
ynh_script_progression --message="Starting a systemd service..." --weight=1
# 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
#=================================================
# CONFIGURE GARAGE
#=================================================
ynh_script_progression --message="Configuring garage..." --weight=1
garage_command="$final_path/garage -c $final_path/garage.toml"
ynh_script_progression --message="Configuring garage..." --weight=1
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
#=================================================
ynh_script_progression --message="Installation of $app completed" --last
ynh_script_progression --message="Installation of $app completed" --last

View file

@ -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,51 +55,14 @@ 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
#=================================================
ynh_script_progression --message="Removal of $app completed" --last
ynh_script_progression --message="Removal of $app completed" --last

View file

@ -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

View file

@ -9,99 +9,20 @@
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
#=================================================
# STOP SYSTEMD SERVICE
#=================================================
ynh_script_progression --message="Stopping a systemd service..." --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"
#=================================================
# 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
@ -109,93 +30,58 @@ 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_script_progression --message="Upgrading source files..." --weight=1
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
#=================================================
ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=1
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
#=================================================
# ...
#=================================================
#=================================================
# 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
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
#=================================================
# 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 $app --description="s3 storage" --log="/var/log/$app/$app.log" --needs_exposed_ports $port
yunohost service add --needs_exposed_ports $port --description="s3 storage" --log="/var/log/$app/$app.log" $app
#=================================================
# UPDATE A CONFIG FILE
#=================================================
ynh_script_progression --message="Updating a configuration file..." --weight=1
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_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
#=================================================
ynh_script_progression --message="Upgrade of $app completed" --last
ynh_script_progression --message="Upgrade of $app completed" --last

View file

@ -1,2 +0,0 @@
*~
*.sw[op]

View file

@ -1,2 +0,0 @@
*~
*.sw[op]

15
tests.toml Normal file
View 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"