lsync 2.1.0 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
  require 'lsync/event_handler'
3
22
  require 'lsync/shells/ssh'
@@ -6,19 +25,24 @@ module LSync
6
25
  class Server
7
26
  include EventHandler
8
27
 
9
- def initialize(host)
28
+ def initialize(host, options = {})
29
+ @options = options
30
+
10
31
  @host = host
11
32
  @root = "/"
12
-
13
- @platform = "generic"
14
-
33
+
34
+ @platform = nil
35
+
15
36
  @shell = Shells::SSH.new
16
-
37
+
17
38
  @enabled = true
18
- @connection = nil
19
- @pid = nil
39
+
40
+ @roles = Set.new
20
41
  end
21
42
 
43
+ # The roles that dictate how the server fits into the overall infratstructure.
44
+ attr :roles, true
45
+
22
46
  # The host name (e.g. DNS entry) for the given server
23
47
  attr :host, true
24
48
 
@@ -35,20 +59,24 @@ module LSync
35
59
  def full_path(directory = "./")
36
60
  p = File.expand_path(directory.to_s, @root)
37
61
 
38
- return Pathname.new(p).cleanpath.normalize_trailing_slash.to_s
62
+ return Pathname.new(p).cleanpath.normalize_trailing_slash
39
63
  end
40
64
 
41
65
  # Give a general connection string (e.g +"host:/directory"+ or +"/directory"+ if local).
42
66
  def connection_string(directory)
43
- if is_local?
67
+ if local?
44
68
  return full_path(directory)
45
69
  else
46
- return @host + ":" + full_path(directory).dump
70
+ return @host + ":" + full_path(directory).to_cmd
47
71
  end
48
72
  end
49
73
 
74
+ def role?(role)
75
+ @roles.include?(role) || @roles.include?(:all) || role == :any
76
+ end
77
+
50
78
  # Checks if the host resolves to the local machine.
51
- def is_local?
79
+ def local?
52
80
  return true if @host == "localhost"
53
81
 
54
82
  hostname = Socket.gethostname
@@ -66,14 +94,5 @@ module LSync
66
94
  def to_s
67
95
  "#{@host}:#{full_path}"
68
96
  end
69
-
70
- # Connect to the server using the given #shell and #connection_string.
71
- def connect
72
- unless @connection
73
- @connection, @pid = @shell.connect(self)
74
- end
75
-
76
- return @connection
77
- end
78
97
  end
79
98
  end
@@ -1,10 +1,30 @@
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
  require 'rexec'
3
22
  require 'pathname'
4
23
 
5
24
  module LSync
6
- CLIENT_CODE = (Pathname.new(__FILE__).dirname + "shell_client.rb").read
7
-
25
+
26
+ CLIENT_CODE = (Pathname.new(__FILE__).dirname + "client.rb").read
27
+
8
28
  # There was an error establishing a connection with a server.
9
29
  class ConnectionError < StandardError
10
30
  end
@@ -22,7 +42,6 @@ module LSync
22
42
  @options = options
23
43
  end
24
44
 
25
- # The command required to start an instance of Ruby.
26
45
  def ruby_command
27
46
  @options[:ruby] || ["ruby"]
28
47
  end
@@ -32,33 +51,13 @@ module LSync
32
51
  @command + (@options[:arguments] || []) + arguments + [server.host]
33
52
  end
34
53
 
35
- # Establish a connection to the server using this shell configuration.
36
54
  def connect(server)
37
- begin
38
- connection, pid = open_connection(server)
39
- message = connection.receive_object
40
- ensure
41
- connection.dump_errors if connection
42
- end
43
-
44
- if message != :ready
45
- raise ConnectionError.new("Remote shell connection was not successful: #{message}")
46
- end
47
-
48
- return connection, pid
49
- end
50
-
51
- protected
52
- # Return a connection object representing a connection to the given server.
53
- def open_connection(server)
54
- command = ruby_command
55
-
56
- unless server.is_local?
57
- command = connection_command(server) + command
55
+ options = {:passthrough => []}
56
+ if server.local?
57
+ return RExec::start_server(CLIENT_CODE, ruby_command, options)
58
+ else
59
+ return RExec::start_server(CLIENT_CODE, connection_command(server) + ruby_command, options)
58
60
  end
59
-
60
- return RExec::start_server(CLIENT_CODE, command)
61
61
  end
62
62
  end
63
-
64
63
  end
@@ -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
  require 'lsync/shell'
3
22
 
@@ -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
  # A helper to provide easy access to the TeeLogger functionality.
@@ -1,23 +1,28 @@
1
- # Copyright (c) 2007 Samuel Williams. Released under the GNU GPLv2.
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
- # This program is distributed in the hope that it will be useful,
9
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
- # GNU General Public License for more details.
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
- # You should have received a copy of the GNU General Public License
14
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
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
  module LSync
17
- module VERSION #:nodoc:
22
+ module VERSION
18
23
  MAJOR = 2
19
- MINOR = 1
20
- TINY = 0
24
+ MINOR = 3
25
+ TINY = 1
21
26
 
22
27
  STRING = [MAJOR, MINOR, TINY].join('.')
23
28
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lsync
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 1
5
+ prerelease:
5
6
  segments:
6
7
  - 2
8
+ - 3
7
9
  - 1
8
- - 0
9
- version: 2.1.0
10
+ version: 2.3.1
10
11
  platform: ruby
11
12
  authors:
12
13
  - Samuel Williams
@@ -14,53 +15,55 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2011-07-26 00:00:00 +12:00
18
- default_executable:
18
+ date: 2011-08-08 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: fingerprint
22
22
  prerelease: false
23
23
  requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
24
25
  requirements:
25
26
  - - ">="
26
27
  - !ruby/object:Gem::Version
28
+ hash: 25
27
29
  segments:
28
30
  - 1
29
- - 1
31
+ - 2
30
32
  - 3
31
- version: 1.1.3
33
+ version: 1.2.3
32
34
  type: :runtime
33
35
  version_requirements: *id001
34
36
  - !ruby/object:Gem::Dependency
35
37
  name: rexec
36
38
  prerelease: false
37
39
  requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
38
41
  requirements:
39
42
  - - ">="
40
43
  - !ruby/object:Gem::Version
44
+ hash: 7
41
45
  segments:
42
46
  - 1
43
- - 2
44
- - 6
45
- version: 1.2.6
47
+ - 4
48
+ - 0
49
+ version: 1.4.0
46
50
  type: :runtime
47
51
  version_requirements: *id002
48
52
  description:
49
53
  email: samuel.williams@oriontransfer.co.nz
50
- executables: []
51
-
54
+ executables:
55
+ - lsync-mount
56
+ - lsync-prune
57
+ - lsync-rotate
52
58
  extensions: []
53
59
 
54
60
  extra_rdoc_files: []
55
61
 
56
62
  files:
57
- - lib/lsync/action.rb
58
- - lib/lsync/actions/darwin/disk
59
- - lib/lsync/actions/darwin/terminal
60
- - lib/lsync/actions/generic/prune
61
- - lib/lsync/actions/generic/rotate
62
- - lib/lsync/actions/linux/disk
63
- - lib/lsync/actions/linux/terminal
63
+ - bin/lsync-mount
64
+ - bin/lsync-prune
65
+ - bin/lsync-rotate
66
+ - lib/lsync/client.rb
64
67
  - lib/lsync/controller.rb
65
68
  - lib/lsync/directory.rb
66
69
  - lib/lsync/error.rb
@@ -72,13 +75,11 @@ files:
72
75
  - lib/lsync/script.rb
73
76
  - lib/lsync/server.rb
74
77
  - lib/lsync/shell.rb
75
- - lib/lsync/shell_client.rb
76
78
  - lib/lsync/shells/ssh.rb
77
79
  - lib/lsync/tee_logger.rb
78
80
  - lib/lsync/version.rb
79
81
  - lib/lsync.rb
80
82
  - README.md
81
- has_rdoc: yard
82
83
  homepage: http://www.oriontransfer.co.nz/gems/lsync
83
84
  licenses: []
84
85
 
@@ -88,23 +89,27 @@ rdoc_options: []
88
89
  require_paths:
89
90
  - lib
90
91
  required_ruby_version: !ruby/object:Gem::Requirement
92
+ none: false
91
93
  requirements:
92
94
  - - ">="
93
95
  - !ruby/object:Gem::Version
96
+ hash: 3
94
97
  segments:
95
98
  - 0
96
99
  version: "0"
97
100
  required_rubygems_version: !ruby/object:Gem::Requirement
101
+ none: false
98
102
  requirements:
99
103
  - - ">="
100
104
  - !ruby/object:Gem::Version
105
+ hash: 3
101
106
  segments:
102
107
  - 0
103
108
  version: "0"
104
109
  requirements: []
105
110
 
106
111
  rubyforge_project:
107
- rubygems_version: 1.3.6
112
+ rubygems_version: 1.8.7
108
113
  signing_key:
109
114
  specification_version: 3
110
115
  summary: LSync is a tool for scripted synchronization and backups.
@@ -1,105 +0,0 @@
1
-
2
- require 'pathname'
3
- require 'lsync/run'
4
- require 'lsync/error'
5
-
6
- module LSync
7
-
8
- class AbortBackupException < StandardError
9
- end
10
-
11
- # A runnable action, such as a shell command or action script.
12
- #
13
- # If the first argument is a symbol, then this will map to one of the standard
14
- # actions in the `lsync/actions` subdirectory. These actions are sometimes implemented
15
- # on a per-platform basis.
16
- class Action
17
- def initialize(function)
18
- @function = function
19
-
20
- case @function[0]
21
- when Symbol
22
- @script_name = @function[0].to_s
23
- @arguments = @function[1,@function.size]
24
- else
25
- @script_name = nil
26
- end
27
- end
28
-
29
- # Return a string representation of the action for logging.
30
- def to_s
31
- @function.to_cmd
32
- end
33
-
34
- # Run the action on the given server, typically in the root directory specified.
35
- def run_on_server(server, logger)
36
- # logger.info "Running #{@function.to_cmd} on #{server}"
37
-
38
- if server.is_local?
39
- run_locally(server, logger)
40
- else
41
- run_remotely(server, logger)
42
- end
43
- end
44
-
45
- private
46
- # Run the script locally by invoking it directly.
47
- def run_locally(server, logger)
48
- command = nil
49
-
50
- if @script_name
51
- uname = `uname`.chomp.downcase
52
-
53
- local_path = Action.script_path(uname, @script_name)
54
- command = [local_path] + @arguments
55
- else
56
- command = @function
57
- end
58
-
59
- result = nil
60
- Dir.chdir(server.root) do
61
- result = LSync.run_command(command, logger)
62
- end
63
-
64
- if result != 0
65
- raise ShellScriptError.new(command, result)
66
- end
67
- end
68
-
69
- # Run the script remotely by sending the data across the network and executing it.
70
- def run_remotely(server, logger)
71
- conn = server.connect
72
- conn.send_object([:set_working_dir, server.root])
73
-
74
- if @script_name
75
- uname = `uname`.chomp.downcase
76
-
77
- local_path = Action.script_path(uname, @script_name)
78
-
79
- logger.info("Sending run_script #{@script_name}...")
80
- conn.send_object([:run_script, @script_name, Pathname.new(local_path).read, @arguments])
81
- else
82
- logger.info("Sending run_command #{@function}...")
83
- conn.send_object([:run_command, @function])
84
- end
85
-
86
- conn.run do |message|
87
- break if message == :done
88
-
89
- logger.send(*message)
90
- end
91
- end
92
-
93
- # Figure out the path of the script, which may depend on the given platform.
94
- def self.script_path(platform, name)
95
- exact_script_path(platform, name) || exact_script_path("generic", name)
96
- end
97
-
98
- # Return the exact path of a builtin action script.
99
- def self.exact_script_path(platform, name)
100
- path = (Pathname.new(__FILE__).dirname + "actions" + platform + name).expand_path
101
- path.exist? ? path : nil
102
- end
103
- end
104
-
105
- end