vos 0.1.3 → 0.1.4

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.
data/Rakefile CHANGED
@@ -2,7 +2,7 @@ require 'rake_ext'
2
2
 
3
3
  project(
4
4
  name: "vos",
5
- version: "0.1.3",
5
+ version: "0.1.4",
6
6
  summary: "Virtual Operating System",
7
7
 
8
8
  author: "Alexey Petrushin",
data/lib/vos/box/marks.rb CHANGED
@@ -1,30 +1,28 @@
1
1
  module Vos
2
2
  class Box
3
3
  module Marks
4
- def mark key
5
- ensure_mark_requrements!
6
- file("#{marks_dir}/#{key}").create!
4
+ def mark! key
5
+ marks_dir.file(key).create
6
+ @marks_cache = nil
7
7
  end
8
8
 
9
9
  def has_mark? key
10
- ensure_mark_requrements!
11
- entry["#{marks_dir}/#{key}"].exist?
10
+ marks_cache.include? key.to_s
12
11
  end
12
+ alias_method :marked?, :has_mark?
13
13
 
14
- def clear_marks
15
- bash "rm -r #{marks_dir}"
14
+ def clear_marks!
15
+ marks_dir.destroy
16
+ @marks_cache = nil
16
17
  end
17
-
18
+
19
+ def marks_dir
20
+ dir "/marks"
21
+ end
22
+
18
23
  protected
19
- def marks_dir
20
- home "/.marks"
21
- end
22
-
23
- def ensure_mark_requrements!
24
- unless @ensure_mark_requrements
25
- self.dir(marks_dir).create
26
- @ensure_mark_requrements = true
27
- end
24
+ def marks_cache
25
+ @marks_cache ||= marks_dir.files(bang: false).collect{|file| file.name}
28
26
  end
29
27
  end
30
28
  end
data/lib/vos/box.rb CHANGED
@@ -2,8 +2,6 @@ module Vos
2
2
  class Box
3
3
  include Shell, Marks, Vfs
4
4
 
5
- attr_accessor :options
6
-
7
5
  def initialize *args
8
6
  first = args.first
9
7
  if args.empty?
@@ -18,12 +16,12 @@ module Vos
18
16
  options[:host] = first.to_s
19
17
  end
20
18
 
21
- @driver = options[:host] == 'localhost' ? Drivers::Local.new(options) : Drivers::Ssh.new(options)
19
+ @driver = options[:host] == 'localhost' ? Drivers::Local.new : Drivers::Ssh.new(options)
22
20
  elsif args.size == 1
23
21
  @driver = first
24
22
  else
25
23
  raise 'invalid arguments'
26
- end
24
+ end
27
25
  end
28
26
 
29
27
 
@@ -43,15 +41,15 @@ module Vos
43
41
  #
44
42
  # Micelaneous
45
43
  #
46
- def inspect
47
- driver.to_s
48
- # host = options[:host]
49
- # if host == 'localhost'
50
- # ''
51
- # else
52
- # host
53
- # end
54
- end
44
+ def inspect; driver.to_s end
55
45
  alias_method :to_s, :inspect
46
+
47
+ def host; driver.host end
48
+
49
+ def local?; host == 'localhost' end
50
+
51
+ class << self
52
+ def local; @local ||= Box.new end
53
+ end
56
54
  end
57
55
  end
@@ -2,7 +2,7 @@ require 'vfs/storages/local'
2
2
 
3
3
  module Vos
4
4
  module Drivers
5
- class Local < Abstract
5
+ class Local < Abstract
6
6
  #
7
7
  # Vfs
8
8
  #
@@ -39,6 +39,7 @@ module Vos
39
39
  # Other
40
40
  #
41
41
  def to_s; '' end
42
+ def host; 'localhost' end
42
43
  end
43
44
  end
44
45
  end
@@ -1,4 +1,8 @@
1
1
  shared_examples_for 'vos driver' do
2
+ it 'should respond to :host' do
3
+ @driver.host.should_not be_nil
4
+ end
5
+
2
6
  describe "shell" do
3
7
  it 'exec' do
4
8
  @driver.open do |d|
@@ -77,7 +77,6 @@ module Vos
77
77
  def bash command
78
78
  # somehow net-ssh doesn't executes ~/.profile, so we need to execute it manually
79
79
  # command = ". ~/.profile && #{command}"
80
-
81
80
  stdout_and_stderr, stderr, code, signal = hacked_exec! ssh, command, true
82
81
 
83
82
  return code, stdout_and_stderr
@@ -88,6 +87,7 @@ module Vos
88
87
  # Micelaneous
89
88
  #
90
89
  def to_s; options[:host] end
90
+ def host; options[:host] end
91
91
 
92
92
  protected
93
93
  attr_accessor :ssh, :sftp
@@ -128,7 +128,6 @@ module Vos
128
128
  end
129
129
 
130
130
  channel.wait
131
-
132
131
  [stdout_data, stderr_data, exit_code, exit_signal]
133
132
  end
134
133
  end
@@ -11,6 +11,10 @@ module Vos
11
11
  attrs[:file] = stat.file?
12
12
  attrs[:dir] = stat.directory?
13
13
  # stat.symlink?
14
+
15
+ # attributes special for file system
16
+ attrs[:updated_at] = stat.mtime
17
+
14
18
  attrs
15
19
  rescue Net::SFTP::StatusException
16
20
  {}
@@ -79,7 +83,7 @@ module Vos
79
83
  exec "rm -r #{path}"
80
84
  end
81
85
 
82
- def each path, &block
86
+ def each_entry path, &block
83
87
  sftp.dir.foreach path do |stat|
84
88
  next if stat.name == '.' or stat.name == '..'
85
89
  if stat.directory?
@@ -90,14 +94,16 @@ module Vos
90
94
  end
91
95
  end
92
96
 
93
- def efficient_dir_copy from, to
97
+ def efficient_dir_copy from, to, override
98
+ return false if override # sftp doesn't support this behaviour
99
+
94
100
  from.storage.open_fs do |from_fs|
95
101
  to.storage.open_fs do |to_fs|
96
102
  if from_fs.local?
97
103
  sftp.upload! from.path, fix_path(to.path)
98
104
  true
99
105
  elsif to_fs.local?
100
- sftp.download! fix_path(to.path), from.path, :recursive => true
106
+ sftp.download! fix_path(from.path), to.path, :recursive => true
101
107
  true
102
108
  else
103
109
  false
@@ -5,7 +5,7 @@ module Vos
5
5
  {:DEBIAN_FRONTEND => 'noninteractive'}
6
6
  end
7
7
  def wrap_cmd env_str, cmd
8
- %(. #{env_file.path} && #{env_str}#{' && ' unless env_str.empty?}#{cmd})
8
+ %(source #{env_file.path} && #{env_str}#{' && ' unless env_str.empty?}#{cmd})
9
9
  end
10
10
 
11
11
  def env_file
@@ -34,14 +34,49 @@ module Vos
34
34
  end
35
35
 
36
36
  module Vfs
37
+ class Entry
38
+ def symlink_to entry, options = {}
39
+ raise "invalid argument!" unless entry.is_a? Entry
40
+ raise "can't use symlink ('#{self}' and '#{entry}' are on different storages)!" if self.storage != entry.storage
41
+ raise "symlink target '' not exist!" unless entry.exist?
42
+ storage.bash "ln -s#{'f' if options[:override]} #{entry.path} #{path}"
43
+ end
44
+
45
+ def symlink_to! entry
46
+ symlink_to entry, override: true
47
+ end
48
+ end
49
+
50
+ class Dir
51
+ def rsync_to entry
52
+ raise "invalid argument!" unless entry.is_a? Entry
53
+ raise "#{path} must be a Dir" unless dir?
54
+ raise "#{entry.path} can't be a File!" if entry.file?
55
+
56
+ if local? and !entry.local?
57
+ Box.local.bash("rsync -e 'ssh' -al --delete --stats --progress #{path}/ root@#{entry.storage.host}:#{entry.path}")
58
+ elsif entry.local? and !local?
59
+ Box.local.bash("rsync -e 'ssh' -al --delete --stats --progress root@#{storage.host}:#{path}/ #{entry.path}")
60
+ else
61
+ raise "invalid usage!"
62
+ end
63
+ end
64
+ end
65
+
37
66
  class File
38
67
  def append_to_environment_of box, reload = true
39
- raise "#{box} must be an Vos::Box" unless file.is_a? Vos::Box
68
+ raise "#{box} must be an Vos::Box" unless box.is_a? Vos::Box
40
69
 
41
- copy_to! box.dir('/etc/profile_ext').file(name)
70
+ remote_file = box.dir('/etc/profile_ext').file(name)
71
+ copy_to! remote_file
72
+
73
+ require_clause = <<-BASH
42
74
 
43
- require_clause = "source #{remote_file.path}"
44
- box.env_file.append "\n#{require_clause}\n" unless env_file.content.include? require_clause
75
+ # #{name}
76
+ source #{remote_file.path}
77
+ BASH
78
+
79
+ box.env_file.append require_clause unless box.env_file.content.include? require_clause
45
80
 
46
81
  box.reload_env if reload
47
82
  end
data/readme.md CHANGED
@@ -13,16 +13,15 @@ Currently, there are following implementations available:
13
13
  $ gem install vos
14
14
 
15
15
  ## Code samples:
16
- gem 'vos' # Virtual Operating System
16
+ gem 'vos' # Virtual Operating System
17
17
  require 'vos'
18
18
 
19
- # Connections, let's deploy our 'cool_app' project from our local box to remote server
20
- server = Vfs::Box.new(host: 'cool_app.com', ssh: {user: 'me', password: 'secret'})
19
+ server = Box.new('cool_app.com') # it will use id_rsa, or You can add {user: 'me', password: 'secret'}
21
20
 
22
- server.bash 'ls'
23
- server['apps/cool_app'].bash 'rails production'
21
+ server.bash 'ls' # ls /
22
+ server['apps/cool_app'].bash 'rails production' # cd /apps/cool_app && rails production
24
23
 
25
- For more details look also to [Virtual File System][vos] project.
24
+ For more details look also to [Virtual File System][vfs] project.
26
25
  Or checkout configuration I use to control my production servers [My Cluster][my_cluster] in conjunction with small
27
26
  configuration tool [Cluster Management][cluster_management].
28
27
 
@@ -39,6 +38,6 @@ configuration tool [Cluster Management][cluster_management].
39
38
  - process management (find/kill/filters/attributes)
40
39
  - other os resources management (disk)
41
40
 
42
- [vos]: http://github.com/alexeypetrushin/vos
41
+ [vfs]: http://github.com/alexeypetrushin/vfs
43
42
  [cluster_management]: http://github.com/alexeypetrushin/cluster_management
44
43
  [my_cluster]: http://github.com/alexeypetrushin/my_cluster
metadata CHANGED
@@ -1,12 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vos
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 1
8
- - 3
9
- version: 0.1.3
4
+ prerelease:
5
+ version: 0.1.4
10
6
  platform: ruby
11
7
  authors:
12
8
  - Alexey Petrushin
@@ -14,7 +10,7 @@ autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
12
 
17
- date: 2011-02-09 00:00:00 +03:00
13
+ date: 2011-02-16 00:00:00 +03:00
18
14
  default_executable:
19
15
  dependencies:
20
16
  - !ruby/object:Gem::Dependency
@@ -25,8 +21,6 @@ dependencies:
25
21
  requirements:
26
22
  - - ">="
27
23
  - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
24
  version: "0"
31
25
  type: :runtime
32
26
  version_requirements: *id001
@@ -38,8 +32,6 @@ dependencies:
38
32
  requirements:
39
33
  - - ">="
40
34
  - !ruby/object:Gem::Version
41
- segments:
42
- - 0
43
35
  version: "0"
44
36
  type: :runtime
45
37
  version_requirements: *id002
@@ -51,8 +43,6 @@ dependencies:
51
43
  requirements:
52
44
  - - ">="
53
45
  - !ruby/object:Gem::Version
54
- segments:
55
- - 0
56
46
  version: "0"
57
47
  type: :runtime
58
48
  version_requirements: *id003
@@ -102,21 +92,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
102
92
  requirements:
103
93
  - - ">="
104
94
  - !ruby/object:Gem::Version
105
- segments:
106
- - 0
107
95
  version: "0"
108
96
  required_rubygems_version: !ruby/object:Gem::Requirement
109
97
  none: false
110
98
  requirements:
111
99
  - - ">="
112
100
  - !ruby/object:Gem::Version
113
- segments:
114
- - 0
115
101
  version: "0"
116
102
  requirements: []
117
103
 
118
104
  rubyforge_project:
119
- rubygems_version: 1.3.7
105
+ rubygems_version: 1.5.1
120
106
  signing_key:
121
107
  specification_version: 3
122
108
  summary: Virtual Operating System