diff --git a/bin/vps b/bin/vps index fdf3a09..3848262 100755 --- a/bin/vps +++ b/bin/vps @@ -244,17 +244,47 @@ mailcow:install-backup() { echo "ssh ${ssh_options[@]} myadmin@$dest ssh-key add \"$(cat /var/lib/rsync/.ssh/id_rsa.pub)\"" } +compose:has_domain() { + local compose_file="$1" host="$2" name conf relation relation_value domain server_aliases + + while read-0 name conf ; do + name=$(e "$name" | shyaml get-value) + if [[ "$name" =~ ^[a-zA-Z0-9-]+\.[a-zA-Z0-9-]+ ]]; then + [ "$host" == "$name" ] && return 0 + fi + + rel=$(e "$conf" | shyaml -y get-value relations 2>/dev/null) || continue + for relation in web-proxy publish-dir; do + relation_value=$(e "$rel" | shyaml -y get-value "$relation" 2>/dev/null) || continue + while read-0 label conf_relation; do + domain=$(e "$conf_relation" | shyaml get-value "domain" 2>/dev/null) && { + [ "$host" == "$domain" ] && return 0 + } + server_aliases=$(e "$conf_relation" | shyaml get-values "server-aliases" 2>/dev/null) && { + [[ $'\n'"$server_aliases" == *$'\n'"$host"$'\n'* ]] && return 0 + } + done < <(e "$relation_value" | shyaml -y key-values-0) + done + done < <(shyaml -y key-values-0 < "$compose_file") + return 1 +} + + compose:install-backup() { - local BACKUP_SERVER="$1" service_name="$2" compose_file="$3" force="$4" + local BACKUP_SERVER="$1" service_name="$2" compose_file="$3" ignore_ping_check="$4" ignore_domain_check="$5" ## XXXvlab: far from perfect as it mimics and depends internal ## logic of current default way to get a domain in compose-core host=$(hostname) - if ! egrep "^$host:" "$compose_file" >/dev/null && - ! egrep "^\s+domain:\s+$host\s*$" "$compose_file" >/dev/null; then - err "Can't find domain '$host' in compose file '$compose_file'." - return 1 + + if ! compose:has_domain "$compose_file" "$host"; then + if [ -n "$ignore_domain_check" ]; then + warn "domain of '$host' not found in compose file '$compose_file'. Ignoring due to ``--ignore-domain-check`` option." + else + err "domain of '$host' not found in compose file '$compose_file'. Use ``--ignore-domain-check`` to ignore check." + return 1 + fi fi ip=$(getent ahosts "$host" | egrep "^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\s+" | @@ -262,10 +292,10 @@ compose:install-backup() { my_ip=$(curl -s myip.kal.fr) if [ "$ip" != "$my_ip" ]; then - if [ -n "$force" ]; then - warn "IP of '$host' ($ip) doesn't match mine ($my_ip). Ignoring due to ``-f`` option." + if [ -n "$ignore_ping_check" ]; then + warn "IP of '$host' ($ip) doesn't match mine ($my_ip). Ignoring due to ``--ignore-ping-check`` option." else - err "IP of '$host' ($ip) doesn't match mine ($my_ip). Use ``-f`` to force." + err "IP of '$host' ($ip) doesn't match mine ($my_ip). Use ``--ignore-ping-check`` to ignore check." return 1 fi fi @@ -373,6 +403,7 @@ cmdline.spec:install:cmd:backup:run() { DEFAULT_BACKUP_SERVICE_NAME=rsync-backup +cmdline.spec.gnu compose-backup cmdline.spec:install:cmd:compose-backup:run() { : :posarg: BACKUP_SERVER 'Target backup server' @@ -383,8 +414,11 @@ cmdline.spec:install:cmd:compose-backup:run() { : :optval: --compose-file,-f "Compose file location. Defaults to the value of '\$DEFAULT_COMPOSE_FILE'" - : :optval: --force,-F "Compose file location. Defaults to - the value of '\$DEFAULT_COMPOSE_FILE'" + : :optfla: --ignore-domain-check \ + "Allow to bypass the domain check in + compose file." + : :optfla: --ignore-ping-check "Allow to bypass the ping check of host." + local service_name compose_file @@ -399,7 +433,8 @@ cmdline.spec:install:cmd:compose-backup:run() { return 1 fi - compose:install-backup "$BACKUP_SERVER" "$service_name" "$compose_file" "$opt_force" + compose:install-backup "$BACKUP_SERVER" "$service_name" "$compose_file" \ + "$opt_ignore_ping_check" "$opt_ignore_domain_check" }