summaryrefslogtreecommitdiff
path: root/bin/byteback-receive
diff options
context:
space:
mode:
Diffstat (limited to 'bin/byteback-receive')
-rwxr-xr-xbin/byteback-receive62
1 files changed, 62 insertions, 0 deletions
diff --git a/bin/byteback-receive b/bin/byteback-receive
new file mode 100755
index 0000000..4b949c2
--- /dev/null
+++ b/bin/byteback-receive
@@ -0,0 +1,62 @@
+#!/usr/bin/ruby
+#
+# Program to receive backups and run rsync in receive mode. Must check that
+# user as authorised by SSH is allowed to access particular directory.
+
+$LOAD_PATH << '/usr/lib/byteback'
+
+require 'trollop'
+require 'byteback'
+include Byteback::Log
+
+if ENV['SSH_ORIGINAL_COMMAND']
+ ARGV.concat(ENV['SSH_ORIGINAL_COMMAND'].split(' '))
+end
+
+byteback_host = ENV['BYTEBACK_HOST']
+fatal('BYTEBACK_HOST environment not set') unless byteback_host
+
+byteback_root = ENV['HOME'] + '/' + ENV['BYTEBACK_HOST']
+fatal("#{byteback_root} does not exist") unless File.directory?(byteback_root)
+
+#
+# Force restores to be limited to the hostname we're connecting form
+#
+if (ARGV[0] == 'restore')
+ ARGV[0] = 'rsync'
+ a = []
+ ARGV.each do |tmp|
+ if tmp =~ /^\/(.*)/
+ tmp = "#{byteback_host}/#{Regexp.last_match(1).dup}"
+ end
+ a.push(tmp)
+ end
+ exec(*a)
+elsif ARGV[0] == 'rsync'
+ ARGV[-1] = "#{byteback_root}/current"
+ exec(*ARGV)
+elsif ARGV[0] == 'byteback-snapshot'
+ ARGV.concat(['--root', "#{byteback_root}"])
+ exec(*ARGV)
+end
+
+opts = Trollop.options do
+ opt :verbose, 'Print diagnostics'
+ opt :ping, 'Check connection parameters and exit'
+ opt :list, 'Show backed up files matching the given pattern', type: :string
+ opt :restore, 'Perform a restoration operation', type: :string
+ opt :complete, 'Mark current backup as complete'
+end
+
+error('Please only choose one mode') if opts[:ping] && opts[:complete]
+if opts[:complete]
+ system('byteback-snapshot', '--root', byteback_root)
+elsif opts[:list]
+ system("cd #{byteback_root} && find . -print | grep #{opts[:list]}")
+ exit(0)
+elsif opts[:ping]
+ exit 0
+else
+ STDERR.print "byteback-receive failed\n"
+ exit 9
+end