diff --git a/sysutils/zrepl-dsh2dsh/Makefile b/sysutils/zrepl-dsh2dsh/Makefile index c17df694bca6..c238886cd900 100644 --- a/sysutils/zrepl-dsh2dsh/Makefile +++ b/sysutils/zrepl-dsh2dsh/Makefile @@ -1,47 +1,46 @@ PORTNAME= zrepl DISTVERSIONPREFIX= v -DISTVERSION= 0.7.8 +DISTVERSION= 0.8.3 CATEGORIES= sysutils PKGNAMESUFFIX= -dsh2dsh MAINTAINER= dsh@bamus.cz COMMENT= ZFS dataset replication tool (fork with more features) WWW= https://github.com/dsh2dsh/${PORTNAME} LICENSE= MIT LICENSE_FILE= ${WRKSRC}/LICENSE -USES= go:1.22,modules ncurses +USES= go:1.23,modules ncurses USE_RC_SUBR= ${PORTNAME} GO_MODULE= github.com/dsh2dsh/${PORTNAME} GO_BUILDFLAGS= -ldflags "${STRIP} -w -X github.com/dsh2dsh/${PORTNAME}/version.${PORTNAME}Version=${DISTVERSIONFULL}" CONFLICTS_INSTALL= ${PORTNAME} SUB_FILES= pkg-message 500.${PORTNAME} OPTIONS_DEFINE= EXAMPLES post-install: - @${MKDIR} ${STAGEDIR}${EXAMPLESDIR} \ + ${MKDIR} ${STAGEDIR}${EXAMPLESDIR} \ ${STAGEDIR}${ETCDIR} \ - ${STAGEDIR}${PREFIX}/etc/newsyslog.conf.d \ - ${STAGEDIR}/var/run/${PORTNAME} + ${STAGEDIR}${PREFIX}/etc/newsyslog.conf.d ${INSTALL_DATA} ${FILESDIR}/newsyslog.conf \ ${STAGEDIR}${EXAMPLESDIR}/newsyslog.conf ${INSTALL_DATA} ${FILESDIR}/${PORTNAME}.yml \ ${STAGEDIR}${ETCDIR}/${PORTNAME}.yml.sample ${MKDIR} ${STAGEDIR}${PREFIX}/etc/periodic/weekly ${INSTALL_SCRIPT} ${WRKDIR}/500.${PORTNAME} \ ${STAGEDIR}${PREFIX}/etc/periodic/weekly/500.${PORTNAME} post-install-EXAMPLES-on: - @${MKDIR} ${STAGEDIR}${EXAMPLESDIR}/hooks + ${MKDIR} ${STAGEDIR}${EXAMPLESDIR}/hooks (cd ${WRKSRC}/config/samples && \ ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR}) ${INSTALL_DATA} \ ${WRKSRC}/dist/grafana/grafana-prometheus-${PORTNAME}.json \ ${STAGEDIR}${EXAMPLESDIR} .include diff --git a/sysutils/zrepl-dsh2dsh/distinfo b/sysutils/zrepl-dsh2dsh/distinfo index 77e2b6aa4cb4..ed630c91e26f 100644 --- a/sysutils/zrepl-dsh2dsh/distinfo +++ b/sysutils/zrepl-dsh2dsh/distinfo @@ -1,5 +1,5 @@ -TIMESTAMP = 1718809873 -SHA256 (go/sysutils_zrepl-dsh2dsh/zrepl-v0.7.8/v0.7.8.mod) = 6de73508b106ec921d08bc908dd74e461a0f3b37040791d3945ce48c11a2acbd -SIZE (go/sysutils_zrepl-dsh2dsh/zrepl-v0.7.8/v0.7.8.mod) = 2984 -SHA256 (go/sysutils_zrepl-dsh2dsh/zrepl-v0.7.8/v0.7.8.zip) = 742801772c8511d8d7f03284520437128a70f8536b9722c9e9990335b6f14d17 -SIZE (go/sysutils_zrepl-dsh2dsh/zrepl-v0.7.8/v0.7.8.zip) = 589396 +TIMESTAMP = 1726766984 +SHA256 (go/sysutils_zrepl-dsh2dsh/zrepl-v0.8.3/v0.8.3.mod) = 6d039a394e4025517e66e4f016d60b5299d1541dca23913e1a8fa96bbedece12 +SIZE (go/sysutils_zrepl-dsh2dsh/zrepl-v0.8.3/v0.8.3.mod) = 3638 +SHA256 (go/sysutils_zrepl-dsh2dsh/zrepl-v0.8.3/v0.8.3.zip) = ba1ec6e71bb449d6e01b477387cbb003c55cb66f7820f141ce4135f862a9776c +SIZE (go/sysutils_zrepl-dsh2dsh/zrepl-v0.8.3/v0.8.3.zip) = 602193 diff --git a/sysutils/zrepl-dsh2dsh/files/zrepl.in b/sysutils/zrepl-dsh2dsh/files/zrepl.in index 6a2510f80572..2db852dd2a49 100644 --- a/sysutils/zrepl-dsh2dsh/files/zrepl.in +++ b/sysutils/zrepl-dsh2dsh/files/zrepl.in @@ -1,80 +1,104 @@ #!/bin/sh # PROVIDE: zrepl # REQUIRE: LOGIN # KEYWORD: shutdown # -# Add the following lines to /etc/rc.conf.local or /etc/rc.conf -# to enable this service: +# Add the following lines to /etc/rc.conf.local or /etc/rc.conf to enable this +# service: # -# zrepl_enable (bool): Set to YES to enable the zrepl service. -# Default: NO -# zrepl_config (str): File containing zrepl configuration details. -# Default: %%PREFIX%%/etc/zrepl/zrepl.yml -# zrepl_user (str): The user account used to run the zrepl daemon. -# Do not specifically set this to an empty string as this -# will cause the daemon to run as root. -# Default: root -# zrepl_group (str): The group account used to run the zrepl daemon. -# Do not specifically set this to an empty string as this -# will cause the daemon to run with group wheel. -# Default: wheel -# zrepl_flags (str): Extra flags passed to zrepl -# Default: "" -# zrepl_facility (str): Syslog facility to use -# Default: local0 -# zrepl_priority (str): Syslog priority to use -# Default: alert +# zrepl_enable (bool): Set to YES to enable the zrepl service. +# Default: NO +# zrepl_config (str): File containing zrepl configuration details. +# Default: %%PREFIX%%/etc/zrepl/zrepl.yml +# zrepl_user (str): The user account used to run the zrepl daemon. +# Do not specifically set this to an empty string as this +# will cause the daemon to run as root. +# Default: root +# zrepl_group (str): The group account used to run the zrepl daemon. +# Do not specifically set this to an empty string as this +# will cause the daemon to run with group wheel. +# Default: wheel +# zrepl_flags (str): Extra flags passed to zrepl +# Default: "" +# zrepl_facility (str): Syslog facility to use +# Default: local0 +# zrepl_priority (str): Syslog priority to use +# Default: alert +# +# zrepl_gracefully (bool): Set to YES to always stop the zrepl service +# gracefully. +# Default: NO . /etc/rc.subr -name=zrepl -rcvar=${name}_enable -load_rc_config $name + +name="zrepl" +rcvar="${name}_enable" +load_rc_config "$name" : ${zrepl_enable:="NO"} : ${zrepl_config:="%%PREFIX%%/etc/zrepl/zrepl.yml"} : ${zrepl_user:="root"} : ${zrepl_group:="wheel"} : ${zrepl_flags:=""} : ${zrepl_facility:="local0"} : ${zrepl_priority:="alert"} -: ${zrepl_options:="${zrepl_flags} --config ${zrepl_config}"} +: ${zrepl_options:="$zrepl_flags --config $zrepl_config"} +: ${zrepl_gracefully:="NO"} + +: ${zrepl_control_group:="$zrepl_group"} +: ${zrepl_control_mode:="0700"} pidfile="/var/run/zrepl.pid" command="/usr/sbin/daemon" procname="%%PREFIX%%/bin/zrepl" -command_args="-p ${pidfile} -S -l ${zrepl_facility} -s ${zrepl_priority} -T ${name} \ - ${procname} ${zrepl_options} daemon" +command_args="-p $pidfile -S -l $zrepl_facility -s $zrepl_priority -T $name \ + $procname $zrepl_options daemon" start_precmd="zrepl_precmd" -stop_postcmd="zrepl_postcmd" restart_precmd="zrepl_checkconfig" configtest_cmd="zrepl_checkconfig" -extra_commands="configtest" - -zrepl_precmd() -{ - if [ ! -d "/var/run/zrepl/stdinserver" ]; then - install -d -g ${zrepl_group} -o ${zrepl_user} -m 0700 -- "/var/run/zrepl"; - install -d -g ${zrepl_group} -o ${zrepl_user} -m 0700 -- "/var/run/zrepl/stdinserver"; - fi +graceful_cmd="zrepl_graceful" +gracefulstop_cmd="zrepl_gracefulstop" +extra_commands="configtest graceful gracefulstop" - if [ ! -e "${pidfile}" ]; then - install -g ${zrepl_group} -o ${zrepl_user} -- /dev/null "${pidfile}"; - fi +zrepl_checkconfig() { + echo "Performing sanity check on zrepl configuration:" + eval "$procname" $zrepl_options configcheck +} - zrepl_checkconfig +zrepl_precmd() { + if [ ! -d "/var/run/zrepl/stdinserver" ]; then + install -d -g "$zrepl_control_group" -o "$zrepl_user" \ + -m "$zrepl_control_mode" "/var/run/zrepl" + install -d -g "$zrepl_control_group" -o "$zrepl_user" \ + -m "$zrepl_control_mode" "/var/run/zrepl/stdinserver" + fi + zrepl_checkconfig } -zrepl_postcmd() -{ - rm -f -- "${pidfile}" +zrepl_graceful() { + local _rc_prefix _return + ( run_rc_command gracefulstop $rc_extra_args ) + ( run_rc_command start $rc_extra_args ) + _return=$? + [ $_return -ne 0 ] && [ -z "$rc_force" ] && return 1 + return $_return } -zrepl_checkconfig() -{ - echo "Performing sanity check on zrepl configuration:" - eval ${procname} ${zrepl_options} configcheck +zrepl_gracefulstop() { + if [ -z "$rc_pid" ]; then + echo 1>&2 "${name} not running? (check $pidfile)." + return 1 + fi + + echo "Gracefully stopping ${name}." + eval "$procname" signal shutdown + wait_for_pids "$rc_pid" } +if checkyesno zrepl_gracefully; then + stop_cmd="zrepl_gracefulstop" +fi + run_rc_command "$1" diff --git a/sysutils/zrepl-dsh2dsh/files/zrepl.yml b/sysutils/zrepl-dsh2dsh/files/zrepl.yml index 3f9278c345bc..048f5d58b1a5 100644 --- a/sysutils/zrepl-dsh2dsh/files/zrepl.yml +++ b/sysutils/zrepl-dsh2dsh/files/zrepl.yml @@ -1,148 +1,136 @@ # zrepl main configuration file. For documentation, refer to # https://zrepl.github.io/ and https://github.com/dsh2dsh/zrepl # global: # rpc_timeout: "1m" zfs_bin: "/sbin/zfs" logging: - type: "file" format: "text" # or "json" time: false # don't prepend with date and time hide_fields: &hide-log-fields - "span" # don't log "span" field level: "error" # log errors only # without filename logs to stderr - type: "file" format: "text" hide_fields: *hide-log-fields level: "info" filename: "/var/log/zrepl.log" # Add "jobs:" section(s) here for your specific use cases. jobs: - name: "hourly-snap" type: "snap" filesystems: &filesystems "zroot/ROOT/default<": true "zroot/usr/home<": true snapshotting: type: "periodic" interval: "1h" prefix: "zrepl_hourly_" - timestamp_format: "20060102_150405_MST" - timestamp_local: true pruning: &keep-all - name: "daily-snap" type: "snap" filesystems: *filesystems snapshotting: type: "periodic" interval: "1d" prefix: "zrepl_daily_" - timestamp_format: "20060102_150405_MST" - timestamp_local: true pruning: *keep-all - name: "monthly-snap" type: "snap" filesystems: *filesystems snapshotting: type: "periodic" interval: "30d" prefix: "zrepl_monthly_" - timestamp_format: "20060102_150405_MST" - timestamp_local: true pruning: *keep-all - name: "zdisk" type: "sink" root_fs: "zdisk/zrepl" serve: type: "local" listener_name: "zdisk" recv: placeholder: encryption: "inherit" monitor: &monitor-snapshots latest: - prefix: "zrepl_frequently_" critical: "48h" # 2d - prefix: "zrepl_hourly_" critical: "48h" - prefix: "zrepl_daily_" critical: "48h" - prefix: "zrepl_monthly_" critical: "768h" # 32d oldest: # see zroot-to-zdisk prunner.keep_receiver - prefix: "zrepl_frequently_" critical: "48h" # 2d - prefix: "zrepl_hourly_" critical: "168h" # 7d - prefix: "zrepl_daily_" critical: "2208h" # 90d + 2d - prefix: "zrepl_monthly_" critical: "8688h" # 30 * 12 = 360d + 2d - prefix: "" # everything else critical: "168h" # 7d - name: "zroot-to-zdisk" type: "push" connect: type: "local" listener_name: "zdisk" client_identity: "localhost" filesystems: *filesystems - # send: - # execpipe: - # # zfs send | mbuffer - # - [ "/usr/local/bin/mbuffer", "-q", "-s", "128k", "-m", "1G" ] replication: &replication # Send all intermediary snapshots as a stream package, instead of sending # them one by one. #one_step: true concurrency: steps: 4 size_estimates: 8 conflict_resolution: &conflict_resolution initial_replication: "all" snapshotting: type: "periodic" cron: "*/15 * * * *" prefix: "zrepl_frequently_" - timestamp_format: "20060102_150405_MST" - timestamp_local: true pruning: keep_sender: - type: "not_replicated" - type: "last_n" count: 16 regex: "^zrepl_frequently_" - type: "regex" negate: true regex: "^zrepl_" - type: "last_n" count: 8 regex: "^zrepl_hourly_" - type: "last_n" count: 4 regex: "^zrepl_daily_" - type: "last_n" count: 2 regex: "^zrepl_monthly_" keep_receiver: &keep-receiver - type: "last_n" count: 2 regex: "^zrepl_frequently_" - type: "last_n" count: 30 regex: "^zrepl_hourly_" - type: "last_n" count: 90 regex: "^zrepl_daily_" - type: "last_n" count: 12 regex: "^zrepl_monthly_" monitor: *monitor-snapshots diff --git a/sysutils/zrepl-dsh2dsh/pkg-descr b/sysutils/zrepl-dsh2dsh/pkg-descr index b75b34c591f5..2a89cb5c62d7 100644 --- a/sysutils/zrepl-dsh2dsh/pkg-descr +++ b/sysutils/zrepl-dsh2dsh/pkg-descr @@ -1,17 +1,19 @@ -Cross-platform ZFS replication tool written in Go that supports -feature detection, bookmarks, and other new features. +Cross-platform ZFS replication tool written in Go that supports feature +detection, bookmarks, and other new features. This is a fork with more features like * support of shell patterns for datasets definitions * new log formatters * ability to log into a file * ability to configure command piplines between `zfs send` and `zfs recv` * Icinga/Nagios checks * fast skip "keep all" pruning - * snapshots can be named using local time in timestamps + * snapshots named using local time in timestamps * configurable RPC timeout * configurable path to zfs binary * faster replication + * graceful shutdown + * redesigned `zrepl status` TUI and so on. diff --git a/sysutils/zrepl-dsh2dsh/pkg-plist b/sysutils/zrepl-dsh2dsh/pkg-plist index fc11dec8cfb3..7f2c52e6e5f6 100644 --- a/sysutils/zrepl-dsh2dsh/pkg-plist +++ b/sysutils/zrepl-dsh2dsh/pkg-plist @@ -1,23 +1,22 @@ bin/zrepl etc/periodic/weekly/500.zrepl @sample %%ETCDIR%%/zrepl.yml.sample %%PORTEXAMPLES%%%%EXAMPLESDIR%%/bandwidth_limit.yml %%PORTEXAMPLES%%%%EXAMPLESDIR%%/grafana-prometheus-zrepl.json %%PORTEXAMPLES%%%%EXAMPLESDIR%%/hooks/template.sh %%PORTEXAMPLES%%%%EXAMPLESDIR%%/local.yml @sample %%EXAMPLESDIR%%/newsyslog.conf etc/newsyslog.conf.d/zrepl.conf %%PORTEXAMPLES%%%%EXAMPLESDIR%%/pull.yml %%PORTEXAMPLES%%%%EXAMPLESDIR%%/pull_ssh.yml %%PORTEXAMPLES%%%%EXAMPLESDIR%%/push.yml %%PORTEXAMPLES%%%%EXAMPLESDIR%%/quickstart_backup_to_external_disk.yml %%PORTEXAMPLES%%%%EXAMPLESDIR%%/quickstart_continuous_server_backup_receiver.yml %%PORTEXAMPLES%%%%EXAMPLESDIR%%/quickstart_continuous_server_backup_sender.yml %%PORTEXAMPLES%%%%EXAMPLESDIR%%/quickstart_fan_out_replication_source.yml %%PORTEXAMPLES%%%%EXAMPLESDIR%%/quickstart_fan_out_replication_target.yml %%PORTEXAMPLES%%%%EXAMPLESDIR%%/sink.yml %%PORTEXAMPLES%%%%EXAMPLESDIR%%/snap.yml %%PORTEXAMPLES%%%%EXAMPLESDIR%%/snap_cron.yml %%PORTEXAMPLES%%%%EXAMPLESDIR%%/source.yml %%PORTEXAMPLES%%%%EXAMPLESDIR%%/source_ssh.yml @dir etc/newsyslog.conf.d -@dir(root,wheel,0750) /var/run/zrepl