vos 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
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