summaryrefslogtreecommitdiff
path: root/bin/byteback-receive
blob: 4b949c2093b9a41c5e302cbe1b59d0977563e12f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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