lsync 2.1.0 → 2.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/lsync-mount +88 -0
- data/{lib/lsync/actions/generic/prune → bin/lsync-prune} +20 -0
- data/{lib/lsync/actions/generic/rotate → bin/lsync-rotate} +27 -3
- data/lib/lsync.rb +17 -12
- data/lib/lsync/client.rb +56 -0
- data/lib/lsync/controller.rb +117 -9
- data/lib/lsync/directory.rb +28 -1
- data/lib/lsync/error.rb +19 -0
- data/lib/lsync/event_handler.rb +28 -1
- data/lib/lsync/event_timer.rb +19 -0
- data/lib/lsync/method.rb +21 -5
- data/lib/lsync/methods/rsync.rb +56 -36
- data/lib/lsync/run.rb +59 -23
- data/lib/lsync/script.rb +52 -23
- data/lib/lsync/server.rb +39 -20
- data/lib/lsync/shell.rb +27 -28
- data/lib/lsync/shells/ssh.rb +19 -0
- data/lib/lsync/tee_logger.rb +19 -0
- data/lib/lsync/version.rb +20 -15
- metadata +27 -22
- data/lib/lsync/action.rb +0 -105
- data/lib/lsync/actions/darwin/disk +0 -19
- data/lib/lsync/actions/darwin/terminal +0 -8
- data/lib/lsync/actions/linux/disk +0 -28
- data/lib/lsync/actions/linux/terminal +0 -8
- data/lib/lsync/shell_client.rb +0 -88
data/bin/lsync-mount
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# Copyright (c) 2007, 2011 Samuel G. D. Williams. <http://www.oriontransfer.co.nz>
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
13
|
+
# all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
# THE SOFTWARE.
|
22
|
+
|
23
|
+
module Linux
|
24
|
+
Commands = {
|
25
|
+
"mount" => "mount",
|
26
|
+
"unmount" => "umount"
|
27
|
+
}
|
28
|
+
|
29
|
+
DevicePaths = [
|
30
|
+
"/dev/disk/by-label",
|
31
|
+
"/dev/disk/by-uuid",
|
32
|
+
"/dev"
|
33
|
+
]
|
34
|
+
|
35
|
+
def self.run(action, disk_name)
|
36
|
+
action = ARGV[0]
|
37
|
+
disk_name = ARGV[1]
|
38
|
+
|
39
|
+
mountpoint = File.join('', 'mnt', disk_name)
|
40
|
+
|
41
|
+
if (action == 'mountpoint')
|
42
|
+
puts File.join(mountpoint, ARGV[2..-1])
|
43
|
+
else
|
44
|
+
puts "#{action.capitalize}ing #{mountpoint}..."
|
45
|
+
system Commands[action], mountpoint
|
46
|
+
|
47
|
+
if $?.exitstatus != 0 or $?.exitstatus != 3383
|
48
|
+
exit 5
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
module Darwin
|
55
|
+
DISKUTIL = "diskutil"
|
56
|
+
|
57
|
+
def self.get_disk_id(name)
|
58
|
+
begin
|
59
|
+
`diskutil list`.match(/#{name}\s*\*?[0-9]+\.[0-9]+ .B\s+(disk[0-9]s[0-9])$/)[1]
|
60
|
+
rescue
|
61
|
+
exit 5
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.run
|
66
|
+
action = ARGV[0]
|
67
|
+
disk_name = ARGV[1]
|
68
|
+
|
69
|
+
if (action == 'mountpoint')
|
70
|
+
puts File.join('', 'Volumes', disk_name, ARGV[2..-1])
|
71
|
+
else
|
72
|
+
system DISKUTIL, action, get_disk_id(disk_name)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
class UnsupportedPlatformError < StandardError
|
78
|
+
end
|
79
|
+
|
80
|
+
platform = `uname`.chomp.downcase
|
81
|
+
case platform
|
82
|
+
when "darwin"
|
83
|
+
Darwin.run
|
84
|
+
when "linux"
|
85
|
+
Linux.run
|
86
|
+
else
|
87
|
+
raise UnsupportedPlatformError.new("Platform #{platform} not supported.")
|
88
|
+
end
|
@@ -1,5 +1,25 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
# Copyright (c) 2007, 2011 Samuel G. D. Williams. <http://www.oriontransfer.co.nz>
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
13
|
+
# all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
# THE SOFTWARE.
|
22
|
+
|
3
23
|
# This script takes a specified directory, and removes any directories that
|
4
24
|
# don't match the supplied policy. Thanks to Scott Lu and his "snapfilter"
|
5
25
|
# command which made me realise how complicated my first attempt at doing this
|
@@ -1,5 +1,25 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
# Copyright (c) 2007, 2011 Samuel G. D. Williams. <http://www.oriontransfer.co.nz>
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
13
|
+
# all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
# THE SOFTWARE.
|
22
|
+
|
3
23
|
# This script takes a given path, and renames it with the given format.
|
4
24
|
# It then ensures that there is a symlink called "latest" that points
|
5
25
|
# to the renamed directory.
|
@@ -11,7 +31,7 @@ require 'optparse'
|
|
11
31
|
OPTIONS = {
|
12
32
|
:Format => "%Y.%m.%d-%H.%M.%S",
|
13
33
|
:Latest => "latest",
|
14
|
-
:
|
34
|
+
:UseUTC => false,
|
15
35
|
:Destination => nil
|
16
36
|
}
|
17
37
|
|
@@ -25,7 +45,7 @@ ARGV.options do |o|
|
|
25
45
|
o.separator ""
|
26
46
|
o.separator "Help and Copyright information"
|
27
47
|
|
28
|
-
o.on("-f format", String, "Set the format of the rotated directory names. See Time
|
48
|
+
o.on("-f format", String, "Set the format of the rotated directory names. See Time\#strftime") do |format|
|
29
49
|
OPTIONS[:Format] = format
|
30
50
|
end
|
31
51
|
|
@@ -36,9 +56,13 @@ ARGV.options do |o|
|
|
36
56
|
o.on("-d destination", String, "Set the directory to move rotated backups.") do |destination|
|
37
57
|
OPTIONS[:Destination] = destination
|
38
58
|
end
|
59
|
+
|
60
|
+
o.on("-u", "Use UTC time for directory names.") do
|
61
|
+
OPTIONS[:UseUTC] = true
|
62
|
+
end
|
39
63
|
|
40
64
|
o.on_tail("--copy", "Display copyright information") do
|
41
|
-
puts "#{script_name}. Copyright (c)
|
65
|
+
puts "#{script_name}. Copyright (c) 2007-2011 Samuel Williams. Released under the MIT license."
|
42
66
|
puts "See http://www.oriontransfer.co.nz/ for more information."
|
43
67
|
|
44
68
|
exit
|
data/lib/lsync.rb
CHANGED
@@ -1,17 +1,22 @@
|
|
1
|
-
# Copyright (c) 2007 Samuel
|
2
|
-
#
|
3
|
-
# This program is free software: you can redistribute it and/or modify
|
4
|
-
# it under the terms of the GNU General Public License as published by
|
5
|
-
# the Free Software Foundation, either version 3 of the License, or
|
6
|
-
# (at your option) any later version.
|
1
|
+
# Copyright (c) 2007, 2011 Samuel G. D. Williams. <http://www.oriontransfer.co.nz>
|
7
2
|
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the "Software"), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
12
9
|
#
|
13
|
-
#
|
14
|
-
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
11
|
+
# all copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
# THE SOFTWARE.
|
15
20
|
|
16
21
|
require 'rubygems'
|
17
22
|
|
data/lib/lsync/client.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
# Copyright (c) 2007, 2011 Samuel G. D. Williams. <http://www.oriontransfer.co.nz>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the "Software"), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
11
|
+
# all copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
# THE SOFTWARE.
|
20
|
+
|
21
|
+
require 'pathname'
|
22
|
+
require 'fileutils'
|
23
|
+
|
24
|
+
$connection.run do |object|
|
25
|
+
case(object[0])
|
26
|
+
when :chdir
|
27
|
+
# [:chdir, :path]
|
28
|
+
Dir.chdir(object[1])
|
29
|
+
when :script
|
30
|
+
# [:script, :command, :data]
|
31
|
+
|
32
|
+
command = object[1]
|
33
|
+
script_name = File.basename(command[0])
|
34
|
+
|
35
|
+
local_path = `mktemp -t #{script_name.gsub(/[^a-z]/i, '')}.XXXX`.chomp
|
36
|
+
|
37
|
+
File.open(local_path, 'w') { |fp| fp.write(object[2]) }
|
38
|
+
system('chmod', '+x', local_path)
|
39
|
+
|
40
|
+
pid = fork do
|
41
|
+
command[0] = local_path
|
42
|
+
exec *command
|
43
|
+
end
|
44
|
+
|
45
|
+
# Clean up the script after execution:
|
46
|
+
pid, result = Process.wait2(pid)
|
47
|
+
# system('rm', '-f', local_path)
|
48
|
+
|
49
|
+
exit!(result.exitstatus)
|
50
|
+
when :exec
|
51
|
+
# [:exec, :command]
|
52
|
+
command = object[1]
|
53
|
+
|
54
|
+
exec *command
|
55
|
+
end
|
56
|
+
end
|
data/lib/lsync/controller.rb
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
# Copyright (c) 2007, 2011 Samuel G. D. Williams. <http://www.oriontransfer.co.nz>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the "Software"), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
11
|
+
# all copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
# THE SOFTWARE.
|
1
20
|
|
2
21
|
module LSync
|
3
22
|
class BasicController
|
@@ -12,32 +31,118 @@ module LSync
|
|
12
31
|
# The output logger.
|
13
32
|
attr :logger
|
14
33
|
end
|
15
|
-
|
34
|
+
|
16
35
|
# The server controller provides event handlers with a unified interface
|
17
36
|
# for dealing with servers and associated actions.
|
18
37
|
class ServerController < BasicController
|
19
38
|
def initialize(script, logger, server)
|
20
39
|
super(script, logger)
|
21
|
-
|
40
|
+
|
22
41
|
@server = server
|
42
|
+
|
43
|
+
@connection = nil
|
44
|
+
@platform = nil
|
23
45
|
end
|
24
46
|
|
25
47
|
# The current server.
|
26
48
|
attr :server
|
27
49
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
50
|
+
def run(command, options = {})
|
51
|
+
task = nil
|
52
|
+
|
53
|
+
root ||= options[:root] || @server.root
|
54
|
+
|
55
|
+
if String === command
|
56
|
+
command = [command]
|
57
|
+
end
|
58
|
+
|
59
|
+
begin
|
60
|
+
connection, task = @server.shell.connect(@server)
|
61
|
+
connection.send_object([:chdir, root])
|
62
|
+
|
63
|
+
if options[:script]
|
64
|
+
data = command[0]
|
65
|
+
|
66
|
+
command = command.dup
|
67
|
+
|
68
|
+
# Descriptive name can be provided by options[:script].
|
69
|
+
case options[:script]
|
70
|
+
when String
|
71
|
+
command[0] = options[:script]
|
72
|
+
else
|
73
|
+
command[0] = "script"
|
74
|
+
end
|
75
|
+
|
76
|
+
@logger.info "Running script #{command.inspect} on #{@server}"
|
77
|
+
|
78
|
+
connection.send_object([:script, command, data])
|
79
|
+
elsif options[:remote]
|
80
|
+
@logger.info "Running script #{command.inspect} on #{@server}"
|
81
|
+
|
82
|
+
data = File.read(command[0])
|
83
|
+
connection.send_object([:script, command, data])
|
84
|
+
else
|
85
|
+
@logger.info "Running command #{command.inspect} on #{@server}"
|
86
|
+
connection.send_object([:exec, command])
|
87
|
+
end
|
88
|
+
|
89
|
+
if block_given?
|
90
|
+
yield task
|
91
|
+
else
|
92
|
+
LSync::log_task(task, @logger)
|
93
|
+
end
|
94
|
+
ensure
|
95
|
+
if task
|
96
|
+
task.stop
|
97
|
+
task.wait
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# Run a command on the given server using this shell.
|
103
|
+
def exec(command, options = {}, &block)
|
104
|
+
unless @server.local?
|
105
|
+
command = @server.shell.connection_command(@server) + ["--"] + command
|
106
|
+
end
|
107
|
+
|
108
|
+
@logger.debug "Executing #{command.inspect} on #{@server}"
|
109
|
+
RExec::Task.open(command, options, &block)
|
110
|
+
end
|
111
|
+
|
112
|
+
def exec!(command, options = {})
|
113
|
+
exec(command, options) do |task|
|
114
|
+
task.input.close
|
115
|
+
|
116
|
+
result = task.wait
|
117
|
+
|
118
|
+
unless result.exitstatus == 0
|
119
|
+
raise ShellScriptError.new("Command #{command.inspect} failed: #{result.exitstatus}", result.exitstatus)
|
120
|
+
end
|
121
|
+
|
122
|
+
return task.output.read
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def ==(other)
|
127
|
+
@server == other.server
|
128
|
+
end
|
129
|
+
|
130
|
+
def respond_to?(name)
|
131
|
+
@server.respond_to?(name) || super(name)
|
132
|
+
end
|
133
|
+
|
134
|
+
def method_missing(name, *args, &block)
|
135
|
+
@server.send(name, *args, &block)
|
32
136
|
end
|
33
137
|
end
|
34
138
|
|
35
139
|
class CopyController < BasicController
|
36
|
-
def initialize(script, logger, master, target)
|
140
|
+
def initialize(script, logger, master, target, current)
|
37
141
|
super(script, logger)
|
38
142
|
|
39
143
|
@master = ServerController.new(script, logger, master)
|
40
144
|
@target = ServerController.new(script, logger, target)
|
145
|
+
@current = ServerController.new(script, logger, current)
|
41
146
|
end
|
42
147
|
|
43
148
|
# The master server controller (where the data is being copied from).
|
@@ -45,13 +150,16 @@ module LSync
|
|
45
150
|
|
46
151
|
# The target server controller (where the data is being copied to).
|
47
152
|
attr :target
|
153
|
+
|
154
|
+
# The current server controller (the controller for the local machine).
|
155
|
+
attr :current
|
48
156
|
end
|
49
157
|
|
50
158
|
# The directory controller provides event handlers with a unified interface
|
51
159
|
# for dealing with a particular backup in a particular directory.
|
52
160
|
class DirectoryController < CopyController
|
53
|
-
def initialize(script, logger, master, target, directory)
|
54
|
-
super(script, logger, master, target)
|
161
|
+
def initialize(script, logger, master, target, current, directory)
|
162
|
+
super(script, logger, master, target, current)
|
55
163
|
|
56
164
|
@directory = directory
|
57
165
|
end
|
data/lib/lsync/directory.rb
CHANGED
@@ -1,4 +1,24 @@
|
|
1
|
+
# Copyright (c) 2007, 2011 Samuel G. D. Williams. <http://www.oriontransfer.co.nz>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the "Software"), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
11
|
+
# all copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
# THE SOFTWARE.
|
1
20
|
|
21
|
+
require 'lsync/error'
|
2
22
|
require 'lsync/event_handler'
|
3
23
|
require 'pathname'
|
4
24
|
|
@@ -35,7 +55,10 @@ class Pathname
|
|
35
55
|
end
|
36
56
|
|
37
57
|
module LSync
|
38
|
-
|
58
|
+
|
59
|
+
class AbsolutePathError < Error
|
60
|
+
end
|
61
|
+
|
39
62
|
# A specific directory which is relative to the root of a given server. Specific configuration details
|
40
63
|
# such as excludes and other options may be specified.
|
41
64
|
class Directory
|
@@ -44,6 +67,10 @@ module LSync
|
|
44
67
|
def initialize(path)
|
45
68
|
@path = Pathname.new(path).cleanpath.normalize_trailing_slash
|
46
69
|
@options = {:arguments => []}
|
70
|
+
|
71
|
+
if @path.absolute?
|
72
|
+
raise AbsolutePathError.new("Path #{path} may not be absolute!", :path => path)
|
73
|
+
end
|
47
74
|
end
|
48
75
|
|
49
76
|
attr :path
|