sahara 0.0.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.
@@ -0,0 +1,6 @@
1
+ .DS_Store
2
+ gems/*
3
+ pkg/*
4
+ tmp/*
5
+ .vagrant
6
+ Vagrantfile
data/.rvmrc ADDED
@@ -0,0 +1,5 @@
1
+ rvm use ruby-1.8.7
2
+ rvm_gemset_create_on_use_flag=1
3
+ rvm gemset use sahara
4
+ alias vagrant="bundle exec vagrant"
5
+ alias irb="bundle exec irb"
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "sahara", :path => "."
4
+
5
+ #gem "vagrant", :git => "git://github.com/mitchellh/vagrant.git"
@@ -0,0 +1,48 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ sahara (0.0.1)
5
+ popen4 (~> 0.1.2)
6
+ thor (~> 0.14.6)
7
+ vagrant (~> 0.7.0)
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ specs:
12
+ Platform (0.4.0)
13
+ abstract (1.0.0)
14
+ archive-tar-minitar (0.5.2)
15
+ erubis (2.6.6)
16
+ abstract (>= 1.0.0)
17
+ ffi (0.6.3)
18
+ rake (>= 0.8.7)
19
+ i18n (0.5.0)
20
+ json (1.5.1)
21
+ mario (0.0.6)
22
+ net-scp (1.0.4)
23
+ net-ssh (>= 1.99.1)
24
+ net-ssh (2.1.4)
25
+ open4 (1.0.1)
26
+ popen4 (0.1.2)
27
+ Platform (>= 0.4.0)
28
+ open4 (>= 0.4.0)
29
+ rake (0.8.7)
30
+ thor (0.14.6)
31
+ vagrant (0.7.3)
32
+ archive-tar-minitar (= 0.5.2)
33
+ erubis (~> 2.6.6)
34
+ i18n (~> 0.5.0)
35
+ json (~> 1.5.1)
36
+ mario (~> 0.0.6)
37
+ net-scp (~> 1.0.4)
38
+ net-ssh (~> 2.1.0)
39
+ thor (~> 0.14.6)
40
+ virtualbox (~> 0.8.3)
41
+ virtualbox (0.8.3)
42
+ ffi (~> 0.6.3)
43
+
44
+ PLATFORMS
45
+ ruby
46
+
47
+ DEPENDENCIES
48
+ sahara!
@@ -0,0 +1,19 @@
1
+ # Description
2
+
3
+ Sahara allows vagrant to operate in sandbox mode
4
+
5
+ Typical usage:
6
+
7
+ - Enter sandbox mode: <pre>vagrant sandbox on</pre>
8
+ - Do some stuff: <pre>vagrant ssh </pre>
9
+ - If satisfied apply the changes: <pre>vagrant sandbox commit</pre>
10
+ - If not satisfied you can rollback: <pre>vagrant sandbox rollback</pre>
11
+ - To leave sandbox mod: <pre>vagrant sandbox off</pre>
12
+
13
+ Many kudos go to the creators of [vagrant](http://vagrantup.com)
14
+
15
+ # Installation
16
+
17
+ This is now available as gem:
18
+
19
+ <pre>gem install sahara</pre>
@@ -0,0 +1,5 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ require 'bundler/setup'
4
+ Bundler::GemHelper.install_tasks
5
+
@@ -0,0 +1,2 @@
1
+ require 'vagrant'
2
+ require 'sahara/command'
@@ -0,0 +1,33 @@
1
+ require 'sahara/session'
2
+
3
+ module Sahara
4
+ class Command < Vagrant::Command::GroupBase
5
+ register "sandbox","Manages a sandbox"
6
+
7
+ desc "status [NAME]", "Shows the status of the sandbox"
8
+ def status(boxname=nil)
9
+ Sahara::Session.status(boxname)
10
+ end
11
+
12
+ desc "on [NAME]", "Enters sandbox state"
13
+ def on(boxname=nil)
14
+ Sahara::Session.on(boxname)
15
+ end
16
+
17
+ desc "commit [NAME]", "Commits changes - moves sandbox initial state to currentstate"
18
+ def commit(boxname=nil)
19
+ Sahara::Session.commit(boxname)
20
+ end
21
+
22
+ desc "rollback [NAME]", "Rollback changes since sandbox state was entered "
23
+ def rollback(boxname=nil)
24
+ Sahara::Session.rollback(boxname)
25
+ end
26
+
27
+ desc "off [NAME] ", "Leaves sandbox state"
28
+ def off(boxname=nil)
29
+ Sahara::Session.off(boxname)
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,178 @@
1
+ require 'pp'
2
+
3
+ require 'drift/shell'
4
+
5
+ module Drift
6
+ module Session
7
+
8
+ def self.determine_vboxcmd
9
+ return "VBoxManage"
10
+ end
11
+
12
+ def self.initialize
13
+ @vagrant_env=Vagrant::Environment.new
14
+ @vboxcmd=determine_vboxcmd
15
+ @sandboxname="drift-sandbox"
16
+ end
17
+
18
+ def self.status(selection)
19
+ self.initialize
20
+
21
+ on_selected_vms(selection) do |boxname|
22
+ if is_snapshot_mode_on?(boxname)
23
+ puts "[#{boxname}] - snapshot mode is on"
24
+ else
25
+ puts "[#{boxname}] - snapshot mode is off"
26
+ end
27
+ end
28
+
29
+ end
30
+
31
+ def self.on(selection)
32
+ self.initialize
33
+
34
+ on_selected_vms(selection) do |boxname|
35
+ if is_snapshot_mode_on?(boxname)
36
+ puts "[#{boxname}] - snapshot mode is already on"
37
+ else
38
+ instance_name="#{@vagrant_env.vms[boxname.to_sym].vm.name}"
39
+
40
+ #Creating a snapshot
41
+ puts "[#{boxname}] - Enabling sandbox"
42
+
43
+ execute("#{@vboxcmd} snapshot '#{instance_name}' take '#{@sandboxname}'")
44
+ end
45
+
46
+ end
47
+ end
48
+
49
+ def self.commit(selection)
50
+
51
+ self.initialize
52
+ on_selected_vms(selection) do |boxname|
53
+
54
+
55
+ if !is_snapshot_mode_on?(boxname)
56
+ puts "[#{boxname}] - this requires that sandbox mode is on."
57
+ else
58
+ instance_name="#{@vagrant_env.vms[boxname.to_sym].vm.name}"
59
+
60
+ #Discard snapshot so current state is the latest state
61
+ puts "[#{boxname}] - unwinding sandbox"
62
+ execute("#{@vboxcmd} snapshot '#{instance_name}' delete '#{@sandboxname}'")
63
+
64
+ #Now retake the snapshot
65
+ puts "[#{boxname}] - fastforwarding sandbox"
66
+
67
+ execute("#{@vboxcmd} snapshot '#{instance_name}' take '#{@sandboxname}'")
68
+
69
+ end
70
+
71
+ end
72
+
73
+ end
74
+
75
+ def self.rollback(selection)
76
+ self.initialize
77
+
78
+ on_selected_vms(selection) do |boxname|
79
+
80
+ if !is_snapshot_mode_on?(boxname)
81
+ puts "[#{boxname}] - this requires that sandbox mode is on."
82
+ else
83
+ instance_name="#{@vagrant_env.vms[boxname.to_sym].vm.name}"
84
+
85
+ puts "[#{boxname}] - powering off machine"
86
+
87
+ #Poweroff machine
88
+ execute("#{@vboxcmd} controlvm '#{instance_name}' poweroff")
89
+
90
+ puts "[#{boxname}] - roll back machine"
91
+
92
+ #Rollback until snapshot
93
+ execute("#{@vboxcmd} snapshot '#{instance_name}' restore '#{@sandboxname}'")
94
+
95
+ puts "[#{boxname}] - starting the machine again"
96
+
97
+ #Startvm again
98
+ execute("#{@vboxcmd} startvm --type headless '#{instance_name}' ")
99
+
100
+ end
101
+
102
+ end
103
+
104
+
105
+ end
106
+
107
+ def self.off(selection)
108
+ self.initialize
109
+
110
+ on_selected_vms(selection) do |boxname|
111
+
112
+
113
+ instance_name="#{@vagrant_env.vms[boxname.to_sym].vm.name}"
114
+
115
+ if !is_snapshot_mode_on?(boxname)
116
+ puts "[#{boxname}] - this requires that sandbox mode is on."
117
+ else
118
+ puts "[#{boxname}] - switching sandbox off"
119
+
120
+ # We might wanna check for sandbox changes or not
121
+
122
+ #Discard snapshot
123
+ execute("#{@vboxcmd} snapshot '#{instance_name}' delete '#{@sandboxname}' ")
124
+
125
+ end
126
+
127
+ end
128
+ end
129
+
130
+ def self.execute(command)
131
+ #puts "#{command}"
132
+ output=Sahara::Shell.execute("#{command}")
133
+ return output
134
+ end
135
+
136
+ def self.is_vm_created?(boxname)
137
+ return !@vagrant_env.vms[boxname.to_sym].vm.nil?
138
+ end
139
+
140
+ def self.list_snapshots(boxname)
141
+
142
+ instance_name="#{@vagrant_env.vms[boxname.to_sym].vm.name}"
143
+ snapshotlist=Array.new
144
+ snapshotresult=execute("#{@vboxcmd} showvminfo --machinereadable '#{instance_name}' |grep ^SnapshotName| cut -d '=' -f 2")
145
+ snapshotresult.each do |result|
146
+ clean=result.gsub(/\"/,'').chomp
147
+ snapshotlist << clean
148
+ end
149
+ return snapshotlist
150
+ end
151
+
152
+ def self.is_snapshot_mode_on?(boxname)
153
+ snapshots=list_snapshots(boxname)
154
+ return snapshots.include?(@sandboxname)
155
+ end
156
+
157
+ def self.on_selected_vms(selection,&block)
158
+ if selection.nil?
159
+ #puts "no selection was done"
160
+ @vagrant_env.vms.each do |name,vm|
161
+ #puts "Processing #{name}"
162
+ yield name
163
+ end
164
+ else
165
+ yield selection
166
+ end
167
+ end
168
+ end
169
+ end
170
+
171
+
172
+ #command="#{@vboxcmd} unregistervm '#{boxname}' --delete"
173
+ #puts command
174
+ #puts "Deleting vm #{boxname}"
175
+
176
+ #Exec and system stop the execution here
177
+ #Veewee::Shell.execute("#{command}")
178
+
@@ -0,0 +1,58 @@
1
+ #require 'open4'
2
+
3
+ module Sahara
4
+ class Shell
5
+
6
+ def self.execute(command,options = {})
7
+ STDOUT.sync = true
8
+ output=nil
9
+ result=IO.popen("#{command}") {|f| output=f.readlines}
10
+ #{ |f| print "#{f}, #{f.class}" }
11
+ # output=result.read
12
+ return output
13
+ end
14
+
15
+ #pty allows you to gradually see the output of a local command
16
+ #http://www.shanison.com/?p=415
17
+ def self.execute2(command, options = {} )
18
+ require "pty"
19
+ begin
20
+ PTY.spawn( command ) do |r, w, pid|
21
+ begin
22
+ #r.each { }
23
+ r.each { |line| print line;}
24
+
25
+ rescue Errno::EIO
26
+ end
27
+ end
28
+ rescue PTY::ChildExited => e
29
+ puts "The child process exited!"
30
+ end
31
+ end
32
+
33
+ #occassinally fails with 'no child processes
34
+ def self.execute3(command, options = {} )
35
+ defaults= { :port => "22", :exitcode => "0", :user => "root"}
36
+ options=defaults.merge(options)
37
+
38
+ status = POpen4::popen4(command) do |stdout,stderr,stdin|
39
+ stdout.each do |line|
40
+ puts line
41
+ end
42
+ end
43
+
44
+ @status=status.to_i
45
+
46
+ if (@status.to_s != options[:exitcode] )
47
+ if (options[:exitcode]=="*")
48
+ #its a test so we don't need to worry
49
+ else
50
+ raise "Exitcode was not what we expected"
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
57
+ end #Class
58
+ end #Module
@@ -0,0 +1,3 @@
1
+ module Sahara
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,6 @@
1
+ begin
2
+ require 'sahara'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ require 'sahara'
6
+ end
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path("../lib/sahara/version", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "sahara"
6
+ s.version = Sahara::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ["Patrick Debois"]
9
+ s.email = ["patrick.debois@jedi.be"]
10
+ s.homepage = "http://github.com/jedi4ever/sahara/"
11
+ s.summary = %q{Vagrant box creation}
12
+ s.description = %q{Allows you to sandbox your vagrant}
13
+
14
+ s.required_rubygems_version = ">= 1.3.6"
15
+ s.rubyforge_project = "sahara"
16
+
17
+ s.add_dependency "vagrant", "~> 0.7.0"
18
+ s.add_dependency "popen4", "~> 0.1.2"
19
+ s.add_dependency "thor", "~> 0.14.6"
20
+
21
+ s.add_development_dependency "bundler", ">= 1.0.0"
22
+
23
+ s.files = `git ls-files`.split("\n")
24
+ s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
25
+ s.require_path = 'lib'
26
+ end
27
+
metadata ADDED
@@ -0,0 +1,145 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sahara
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Patrick Debois
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-04-28 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ version_requirements: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ hash: 3
28
+ segments:
29
+ - 0
30
+ - 7
31
+ - 0
32
+ version: 0.7.0
33
+ type: :runtime
34
+ requirement: *id001
35
+ name: vagrant
36
+ prerelease: false
37
+ - !ruby/object:Gem::Dependency
38
+ version_requirements: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ hash: 31
44
+ segments:
45
+ - 0
46
+ - 1
47
+ - 2
48
+ version: 0.1.2
49
+ type: :runtime
50
+ requirement: *id002
51
+ name: popen4
52
+ prerelease: false
53
+ - !ruby/object:Gem::Dependency
54
+ version_requirements: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ~>
58
+ - !ruby/object:Gem::Version
59
+ hash: 43
60
+ segments:
61
+ - 0
62
+ - 14
63
+ - 6
64
+ version: 0.14.6
65
+ type: :runtime
66
+ requirement: *id003
67
+ name: thor
68
+ prerelease: false
69
+ - !ruby/object:Gem::Dependency
70
+ version_requirements: &id004 !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ hash: 23
76
+ segments:
77
+ - 1
78
+ - 0
79
+ - 0
80
+ version: 1.0.0
81
+ type: :development
82
+ requirement: *id004
83
+ name: bundler
84
+ prerelease: false
85
+ description: Allows you to sandbox your vagrant
86
+ email:
87
+ - patrick.debois@jedi.be
88
+ executables: []
89
+
90
+ extensions: []
91
+
92
+ extra_rdoc_files: []
93
+
94
+ files:
95
+ - .gitignore
96
+ - .rvmrc
97
+ - Gemfile
98
+ - Gemfile.lock
99
+ - README.md
100
+ - Rakefile
101
+ - lib/sahara.rb
102
+ - lib/sahara/command.rb
103
+ - lib/sahara/session.rb
104
+ - lib/sahara/shell.rb
105
+ - lib/sahara/version.rb
106
+ - lib/vagrant_init.rb
107
+ - sahara.gemspec
108
+ has_rdoc: true
109
+ homepage: http://github.com/jedi4ever/sahara/
110
+ licenses: []
111
+
112
+ post_install_message:
113
+ rdoc_options: []
114
+
115
+ require_paths:
116
+ - lib
117
+ required_ruby_version: !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ hash: 3
123
+ segments:
124
+ - 0
125
+ version: "0"
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ hash: 23
132
+ segments:
133
+ - 1
134
+ - 3
135
+ - 6
136
+ version: 1.3.6
137
+ requirements: []
138
+
139
+ rubyforge_project: sahara
140
+ rubygems_version: 1.4.2
141
+ signing_key:
142
+ specification_version: 3
143
+ summary: Vagrant box creation
144
+ test_files: []
145
+