frachtraum 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YTNlZjE2YmIwY2NhMmFiNzYyNzA4MTYyNTJmNTRhN2E5YTFmNzRkNw==
4
+ YzA0MGRkZTg3NzhjZGE3NzE0ODI1NmFiZTgxM2JhMWM2ZjM3YWE0Mg==
5
5
  data.tar.gz: !binary |-
6
- NWY4N2NmYzQyZTM0MGExN2M1ZGZlMjYxODZiMDlmYmNjZTcxMTljMg==
6
+ MDM4OGU4ZjQyMTBhODA1YzgxOGI2ZDY2MWI4Y2NkZjViZTdhZTQ2ZQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MTVjNzg3YzY0MmQ5ZWYzNDE1NzcxNDU2NGY1MWUxMWQxOTMzMjE1NTQ1YjE1
10
- ZmEwYmNkNjQyZjYyZDA0YTY4N2I2MGM2YzliZjg2M2U0MmQzNmFmODBmYmQy
11
- ZDQxMGYxMTM1ZDEyZDhhMGE3NmZmN2RkZjI5NmEwYTBlNDlmNjc=
9
+ ZWFlYTE2NTRjNmE1MzUzMmEyMzFiNzZkZmY5YzkyZTc3ZDI5ODRiMDQzNjFm
10
+ ODNiZWU3NGVkYmFmMzc5ZmE3MjNlYjhhYmQzMjA5ZWQ3Mjg0MDU0MTc3ZTVk
11
+ NzgwMjNmMzY1ODU5Y2ZjOTJiMGRiNzhkMWIzMjFjNzllYzRiZDY=
12
12
  data.tar.gz: !binary |-
13
- NmE4NjFmZDhhNWNhNmUyZjFjMzFjYzMxYjlkNmQxNmU1OWQwNjY1ZjA4YTQx
14
- ZDRkZjA4MWYxZmU0YWJlYzJmZGFlMDA2NTZkZjJlNzhkZTBmZGZhOGFlZmNj
15
- MDdmOWI0ODkyZTQ1ZTVhMjgxZWE0YmU1MTU5MDA1M2Y3YWZkOTc=
13
+ NTNhNmI5M2Y1MDZiNmY5ODUyOWIwMGU1ZDkxNjE5ZWI5OGM3ZmUwMWQzYjJi
14
+ ZmYzODRlZWFkYTE4ZWYxNjE5NzJkNWQ5MmQ1ZTUzNWYwMTAwNDAzMmY4ZDNh
15
+ ZTMxZmMyZDFmYmViMzFhYTQ0OTY2NDI2NWYzOTA5MTNhNjVhM2Y=
data/.gitignore ADDED
@@ -0,0 +1,34 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /test/tmp/
9
+ /test/version_tmp/
10
+ /tmp/
11
+
12
+ ## Specific to RubyMotion:
13
+ .dat*
14
+ .repl_history
15
+ build/
16
+
17
+ ## Documentation cache and generated files:
18
+ /.yardoc/
19
+ /_yardoc/
20
+ /doc/
21
+ /rdoc/
22
+
23
+ ## Environment normalisation:
24
+ /.bundle/
25
+ /lib/bundler/man/
26
+
27
+ # for a library or gem, you might want to ignore these files since the code is
28
+ # intended to run in multiple environments; otherwise, check them in:
29
+ # Gemfile.lock
30
+ # .ruby-version
31
+ # .ruby-gemset
32
+
33
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
34
+ .rvmrc
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in fsinv.gemspec
3
+ # Specify your gem's dependencies in frachtraum.gemspec
4
4
  gemspec
data/bin/frachtraum CHANGED
@@ -2,198 +2,5 @@
2
2
  # -*- encoding : utf-8 -*-
3
3
 
4
4
  require 'frachtraum'
5
- require 'thor'
6
- require 'highline/import'
7
- require 'rainbow'
8
5
 
9
- def prompt_password(prompt="Password: ")
10
- HighLine.ask(prompt) { |q|
11
- q.echo = false
12
- # q.echo = "*"
13
- }
14
- end
15
-
16
- class FrachtraumCLI < Thor
17
-
18
- desc "attach [DEPOT]", "decrypt and mount depot(s)"
19
- long_desc <<-LONGDESC
20
- `frachtraum attach` will prompt you for a password.
21
-
22
- The password is used to decrypt all depots specified
23
- in #{Frachtraum::CONFIG_FILE}
24
-
25
- You can optionally specify a single depot. In this case
26
- only this depot will be decrypted and mounted.
27
- LONGDESC
28
- def attach(depot=nil)
29
-
30
- password = prompt_password
31
-
32
- Frachtraum.attach password, depot
33
- end
34
-
35
- # --------------
36
-
37
- desc "capacity [OPTION]", "calculate storage capacity"
38
- long_desc <<-LONGDESC
39
- `frachtraum capacity` will output capacity...
40
-
41
- lorem ipsum
42
- LONGDESC
43
- def capacity(option=nil)
44
- c = Frachtraum.capacity
45
-
46
- case option
47
- when "smb", "samba"
48
- puts "#{c[:total]/1000} #{c[:avail]/1000}"
49
- else
50
- puts ""
51
- puts "Capacity:"
52
- puts " Available: #{Frachtraum.pretty_SI_bytes(c[:avail])}"
53
- puts " Used: #{Frachtraum.pretty_SI_bytes(c[:used])}"
54
- puts " Total: #{Frachtraum.pretty_SI_bytes(c[:total])}"
55
- puts ""
56
- end
57
- end
58
-
59
- # --------------
60
-
61
- desc "list", "list depots and/or timemachine targets"
62
- long_desc <<-LONGDESC
63
- lorem ipsum
64
- LONGDESC
65
- option :simple, :type => :boolean
66
- def list(subset=nil)
67
-
68
- list_width = 60 # character length of list
69
-
70
- if subset == "depot" || subset == "depots" || subset.nil?
71
- if options[:simple]
72
- Frachtraum::DEPOTS.each{ |depot| puts depot }
73
- else
74
- puts "" # empty line
75
- puts "Depots:"
76
- puts "" # empty line
77
- Frachtraum::DEPOTS.each{ |dataset|
78
- status =
79
- if Frachtraum.zfs_dataset_exists?(dataset)
80
- Rainbow("attached").green
81
- else
82
- Rainbow("UNAVAILABLE").red
83
- end
84
- status = "[#{status}]".rjust(list_width-dataset.length)
85
- puts " #{dataset}#{status}"
86
- }
87
- puts "" # empty line
88
- end
89
- end
90
-
91
- if subset == "timemachine" || subset == "tm" || subset.nil?
92
- if options[:simple]
93
- Frachtraum::TIMEMACHINE_TARGETS.each{ |depot| puts depot }
94
- else
95
- puts "" unless subset.nil? # empty line
96
- puts "Timemachine targets:"
97
- puts "" # empty line
98
- Frachtraum::TIMEMACHINE_TARGETS.each{ |dataset|
99
- status =
100
- if Frachtraum.zfs_dataset_exists?(dataset)
101
- Rainbow("attached").green
102
- else
103
- Rainbow("UNAVAILABLE").red
104
- end
105
- status = "[#{status}]".rjust(list_width-dataset.length)
106
- puts " #{dataset}#{status}"
107
- }
108
- puts "" # empty line
109
- end
110
- end
111
- end
112
-
113
- # --------------
114
-
115
- desc "report", "lorem ipsum"
116
- long_desc <<-LONGDESC
117
- lorem ipsum
118
- LONGDESC
119
- def report()
120
- # TODO
121
- end
122
-
123
- # --------------
124
-
125
- desc "setupdisk", "setup a device as a new depot"
126
- long_desc <<-LONGDESC
127
- `frachtraum setup dev label` will setup...
128
-
129
- lorem ispum
130
- LONGDESC
131
- options :compression => :string, :encryption => :string, :keylength => :integer, :mountpoint => :string
132
- def setupdisk(dev,label)
133
-
134
- compression = options[:compression] ? options[:compression] : Frachtraum::COMPRESSION
135
- encryption = options[:encryption] ? options[:encryption] : Frachtraum::ENCRYPTION
136
- keylength = options[:keylength] ? options[:keylength] : Frachtraum::KEYLENGTH
137
- mountpoint = options[:mountpoint] ? options[:mountpoint] : Frachtraum::MOUNTPOINT
138
-
139
- password1 = prompt_password("enter encryption password: ")
140
- password2 = prompt_password("enter password again: ")
141
- if password1.match(password2)
142
- password = password1
143
- else
144
- abort "passwords not equal!"
145
- end
146
-
147
- puts ""
148
- puts "Device: #{dev}"
149
- puts "Label: #{label}"
150
- puts "Compression: #{compression}"
151
- puts "Encryption: #{encryption}"
152
- puts "Keylength: #{keylength}"
153
- puts "Mountpoint: #{mountpoint}"
154
- puts ""
155
- puts "ATTENTION! This is a destructive action. All data on the device will be"
156
- puts "wiped. If you forget you password, you will not be able to access any"
157
- puts "containing data any more."
158
- puts ""
159
-
160
- answer = HighLine.ask("Are you sure you want to continue? (type 'yes'): ") { |q| q.echo = true }
161
-
162
- if answer.downcase.match("yes")
163
- Frachtraum.setupdisk dev, label, password, compression, encryption, keylength, mountpoint
164
- else
165
- abort "ABORT -- device will not pe processed!"
166
- end
167
- end
168
-
169
- # --------------
170
-
171
- desc "sweep", "sweep the depots!"
172
- long_desc <<-LONGDESC
173
- `frachtraum sweep` will ...
174
-
175
- lorem ipsum
176
- LONGDESC
177
- def sweep()
178
- # TODO
179
- Frachtraum::DEPOTS.each do |depot|
180
-
181
-
182
- end
183
- end
184
-
185
- # --------------
186
-
187
- desc "test", "test system for compatibility"
188
- long_desc <<-LONGDESC
189
- `frachtraum test` will test...
190
-
191
- lorem ipsum
192
- LONGDESC
193
- def test()
194
- Frachtraum.run_system_test
195
- end
196
-
197
- end
198
-
199
- FrachtraumCLI.start(ARGV)
6
+ Frachtraum::CLI.start(ARGV)
@@ -3,8 +3,8 @@
3
3
  # Copy it to ~/.frachtraum.conf and edit it to your own needs
4
4
  #
5
5
  compression = lz4
6
- depots = depot1,depot2,depot3
6
+ volumes = volume1,volume2,volume3
7
7
  encryption = AES-XTS
8
8
  keylength = 4096
9
9
  mountpoint = /frachtraum
10
- tmtargets = depot1/TimeMachine/user1,depot1/TimeMachine/user2
10
+ tmtargets = volume1/TimeMachine/user1,volume1/TimeMachine/user2
data/frachtraum.gemspec CHANGED
@@ -24,5 +24,6 @@ Gem::Specification.new do |spec|
24
24
  spec.add_dependency 'highline', '~> 1.6.21'
25
25
  spec.add_dependency 'parseconfig', '~> 1.0.4'
26
26
  spec.add_dependency 'rainbow', '~> 2.0.0'
27
+ spec.add_dependency 'terminal-table', '~> 1.4.5'
27
28
 
28
29
  end
@@ -2,29 +2,28 @@ module Frachtraum
2
2
 
3
3
  REQUIRED_TOOLS_BSD = ['dd','grep','gpart','glabel','geli','zfs','zpool']
4
4
 
5
-
6
- def attach_bsd(password, depot=nil)
5
+ def attach_bsd(password, volume=nil)
7
6
 
8
7
  # if we provided a specific depot, run procedure only on that one
9
- depots = depot.nil? ? DEPOTS : [ depot ]
8
+ volumes = volume.nil? ? Frachtraum::VOLUMES : [ volume ]
10
9
 
11
10
  # first of all, decrypt and mount all depots
12
- depots.each do |depot|
13
- print "decrypting /dev/label/#{depot}..."
11
+ volumes.each do |v|
12
+ print "decrypting /dev/label/#{v}...".ljust(35,".") # TODO: the length should be dynamically calculated, for tm targets as well
14
13
 
15
- output = %x( echo #{password} | geli attach -d -j - /dev/label/#{depot} 2>&1 )
14
+ output = %x( echo #{password} | geli attach -d -j - /dev/label/#{v} 2>&1 )
16
15
  if $?.success?
17
- output = %x( zfs mount #{depot} 2>&1 )
18
- if $?.success? then puts "DONE"
19
- else puts "FAILED! --> #{output}" end
16
+ output = %x( zfs mount #{v} 2>&1 )
17
+ if $?.success? then puts Rainbow("DONE").green
18
+ else puts Rainbow("FAILED!").red + " --> #{output}" end
20
19
  else
21
- puts "FAILED! --> #{output}"
20
+ puts Rainbow("FAILED!").red + " --> #{output}"
22
21
  end
23
22
  end # each
24
23
 
25
24
  # mount timemachine targets as well
26
- TIMEMACHINE_TARGETS.each do |tmtarget|
27
- print "mounting timemachine target #{tmtarget}..."
25
+ Frachtraum::TIMEMACHINE_TARGETS.each do |tmtarget|
26
+ print "mounting timemachine target #{tmtarget}...".ljust(35,".") # TODO: the length should be dynamically calculated, for tm targets as well
28
27
 
29
28
  output = %x( zfs mount #{tmtarget} 2>&1 )
30
29
  if $?.success? then puts "DONE"
@@ -34,8 +33,8 @@ module Frachtraum
34
33
  # restart samba so it reports the correct pool size
35
34
  print "restarting samba server..."
36
35
  output = %x( /usr/local/etc/rc.d/samba restart 2>&1 )
37
- if $?.success? then puts "DONE"
38
- else puts "FAILED! --> #{output}" end
36
+ if $?.success? then puts Rainbow("DONE").green
37
+ else puts Rainbow("FAILED!").red + " --> #{output}" end
39
38
  end
40
39
 
41
40
  def setupdisk_bsd(dev, label, password, compression, encryption, keylength, mountpoint)
@@ -72,4 +71,8 @@ module Frachtraum
72
71
 
73
72
  end # setupdisk_bsd
74
73
 
74
+ # well, we need this line so attach can call attach_bsd
75
+ # but I honestly don't know why...
76
+ extend self
77
+
75
78
  end
@@ -0,0 +1,210 @@
1
+
2
+ require 'thor'
3
+ require 'highline/import'
4
+ require 'rainbow'
5
+ require 'terminal-table'
6
+
7
+ def prompt_password(prompt="Password: ")
8
+ HighLine.ask(prompt) { |q| q.echo = false }
9
+ end
10
+
11
+ module Frachtraum
12
+
13
+ class Frachtraum::CLI < Thor
14
+
15
+ desc "attach [VOLUME]", "decrypt and mount volume(s)"
16
+ long_desc <<-LONGDESC
17
+ `frachtraum attach` will prompt you for a password.
18
+
19
+ The password is used to decrypt all volume specified
20
+ in #{Frachtraum::CONFIG_FILE}
21
+
22
+ You can optionally specify a single volume. In this case
23
+ only this volume will be decrypted and mounted.
24
+ LONGDESC
25
+ def attach(volume=nil)
26
+
27
+ password = prompt_password
28
+
29
+ Frachtraum.attach password, volume
30
+ end
31
+
32
+ # --------------
33
+
34
+ desc "capacity [OPTION]", "show overall storage capacity"
35
+ long_desc <<-LONGDESC
36
+ `frachtraum capacity` will output capacity...
37
+
38
+ lorem ipsum
39
+ LONGDESC
40
+ def capacity(option=nil)
41
+ c = Frachtraum.capacity
42
+
43
+ case option
44
+ when "smb", "samba"
45
+ puts "#{c[:total]/1000} #{c[:avail]/1000}"
46
+ else
47
+ puts ""
48
+ puts "Capacity:"
49
+ puts " Available: #{Frachtraum.pretty_SI_bytes(c[:avail])}"
50
+ puts " Used: #{Frachtraum.pretty_SI_bytes(c[:used])}"
51
+ puts " Total: #{Frachtraum.pretty_SI_bytes(c[:total])}"
52
+ puts ""
53
+ end
54
+ end
55
+
56
+ # --------------
57
+
58
+ desc "list", "list volumes and/or timemachine targets"
59
+ long_desc <<-LONGDESC
60
+ lorem ipsum
61
+ LONGDESC
62
+ option :simple, :type => :boolean
63
+ def list(subset=nil)
64
+
65
+ # TODO: this needs to be a constant, or calculated as CONST + max length of volume/tm
66
+ list_width = 60 # character length of list
67
+
68
+ if subset == "volume" || subset == "volumes" || subset.nil?
69
+ if options[:simple]
70
+ Frachtraum::VOLUMES.each{ |volume| puts volume }
71
+ else
72
+ puts "" # empty line
73
+ puts "Volumes:"
74
+ puts "" # empty line
75
+ Frachtraum::VOLUMES.each{ |volume|
76
+ status =
77
+ if Frachtraum.zfs_dataset_exists?(volume)
78
+ Rainbow("attached").green
79
+ else
80
+ Rainbow("UNAVAILABLE").red
81
+ end
82
+ status = "[#{status}]".rjust(list_width-volume.length)
83
+ puts " #{volume}#{status}"
84
+ }
85
+ puts "" # empty line
86
+ end
87
+ end
88
+
89
+ if subset == "timemachine" || subset == "tm" || subset.nil?
90
+ if options[:simple]
91
+ Frachtraum::TIMEMACHINE_TARGETS.each{ |dataset| puts dataset }
92
+ else
93
+ puts "" unless subset.nil? # empty line
94
+ puts "Timemachine targets:"
95
+ puts "" # empty line
96
+ Frachtraum::TIMEMACHINE_TARGETS.each{ |dataset|
97
+ status =
98
+ if Frachtraum.zfs_dataset_exists?(dataset)
99
+ Rainbow("attached").green
100
+ else
101
+ Rainbow("UNAVAILABLE").red
102
+ end
103
+ status = "[#{status}]".rjust(list_width-dataset.length)
104
+ puts " #{dataset}#{status}"
105
+ }
106
+ puts "" # empty line
107
+ end
108
+ end
109
+ end
110
+
111
+ # --------------
112
+
113
+ desc "report", "Print a detailed report on your frachtraum"
114
+ long_desc <<-LONGDESC
115
+ lorem ipsum
116
+ LONGDESC
117
+ def report()
118
+
119
+ report_rows = []
120
+ report_data = Frachtraum.report
121
+ report_data.keys.each do |volume|
122
+ volume_h = report_data[volume]
123
+ report_rows << [ volume,
124
+ Frachtraum.pretty_SI_bytes(volume_h[:used].to_i),
125
+ Frachtraum.pretty_SI_bytes(volume_h[:available].to_i),
126
+ volume_h[:compression],
127
+ volume_h[:compressratio]
128
+ ]
129
+ end
130
+
131
+ # TODO
132
+ table = Terminal::Table.new :headings => ["VOLUMES", "USED", "AVAILABLE", "COMPRESSION", "COMPRESSRATIO"], :rows => report_rows
133
+ puts table
134
+ self.capacity
135
+
136
+ end
137
+
138
+ # --------------
139
+
140
+ desc "setupdisk", "setup a device as a new volume"
141
+ long_desc <<-LONGDESC
142
+ `frachtraum setup dev label` will setup...
143
+
144
+ lorem ispum
145
+ LONGDESC
146
+ options :compression => :string, :encryption => :string, :keylength => :integer, :mountpoint => :string
147
+ def setupdisk(dev,label)
148
+
149
+ compression = options[:compression] ? options[:compression] : Frachtraum::COMPRESSION
150
+ encryption = options[:encryption] ? options[:encryption] : Frachtraum::ENCRYPTION
151
+ keylength = options[:keylength] ? options[:keylength] : Frachtraum::KEYLENGTH
152
+ mountpoint = options[:mountpoint] ? options[:mountpoint] : Frachtraum::MOUNTPOINT
153
+
154
+ password1 = prompt_password("enter encryption password: ")
155
+ password2 = prompt_password("enter password again: ")
156
+ if password1.match(password2)
157
+ password = password1
158
+ else
159
+ abort "passwords not equal!"
160
+ end
161
+
162
+ puts ""
163
+ puts "Device: #{dev}"
164
+ puts "Label: #{label}"
165
+ puts "Compression: #{compression}"
166
+ puts "Encryption: #{encryption}"
167
+ puts "Keylength: #{keylength}"
168
+ puts "Mountpoint: #{mountpoint}"
169
+ puts ""
170
+ puts "ATTENTION! This is a destructive action. All data on the device will be"
171
+ puts "wiped. If you forget you password, you will not be able to access any"
172
+ puts "containing data any more."
173
+ puts ""
174
+
175
+ answer = HighLine.ask("Are you sure you want to continue? (type 'yes'): ") { |q| q.echo = true }
176
+
177
+ if answer.downcase.match("yes")
178
+ Frachtraum.setupdisk dev, label, password, compression, encryption, keylength, mountpoint
179
+ else
180
+ abort "ABORT -- device will not pe processed!"
181
+ end
182
+ end
183
+
184
+ # --------------
185
+
186
+ desc "sweep [VOLUME]", "sweep the volumes!"
187
+ long_desc <<-LONGDESC
188
+ `frachtraum sweep` will ...
189
+
190
+ lorem ipsum
191
+ LONGDESC
192
+ def sweep(volume=nil)
193
+ Frachtraum.sweep volume
194
+ end
195
+
196
+ # --------------
197
+
198
+ desc "test", "test system for compatibility"
199
+ long_desc <<-LONGDESC
200
+ `frachtraum test` will test...
201
+
202
+ lorem ipsum
203
+ LONGDESC
204
+ def test()
205
+ Frachtraum.run_system_test
206
+ end
207
+
208
+ end
209
+
210
+ end
@@ -10,7 +10,7 @@ module Frachtraum
10
10
  KEYLENGTH = config['keylength']
11
11
  MOUNTPOINT = config['mountpoint']
12
12
 
13
- DEPOTS = config['depots'].split(',')
13
+ VOLUMES = config['volumes'].split(',')
14
14
  TIMEMACHINE_TARGETS = config['tmtargets'].split(',')
15
15
  else
16
16
  COMPRESSION = 'lz4'
@@ -18,7 +18,7 @@ module Frachtraum
18
18
  KEYLENGTH = 4096
19
19
  MOUNTPOINT = '/frachtraum'
20
20
 
21
- DEPOTS = []
21
+ VOLUMES = []
22
22
  TIMEMACHINE_TARGETS = []
23
23
  end
24
24
  end
@@ -2,7 +2,7 @@ module Frachtraum
2
2
 
3
3
  REQUIRED_TOOLS_LINUX = [] # not yet supported
4
4
 
5
- def attach_linux(password, depot)
5
+ def attach_linux(password, volume)
6
6
  # TODO
7
7
  abort "not yet implemented"
8
8
  end
@@ -12,4 +12,6 @@ module Frachtraum
12
12
  abort "not yet implemented"
13
13
  end # setupdisk_linux
14
14
 
15
+ extend self
16
+
15
17
  end
@@ -8,7 +8,7 @@ module Frachtraum
8
8
 
9
9
  REQUIRED_TOOLS_OSX = [] # not yet supported
10
10
 
11
- def attach_osx(password, depot)
11
+ def attach_osx(password, volume)
12
12
  # TODO
13
13
  abort "not yet implemented"
14
14
  end
@@ -18,4 +18,6 @@ module Frachtraum
18
18
  abort "not yet implemented"
19
19
  end # setupdisk_osx
20
20
 
21
+ extend self
22
+
21
23
  end
data/lib/frachtraum.rb CHANGED
@@ -7,15 +7,15 @@ require 'open3'
7
7
  require 'parseconfig'
8
8
 
9
9
  require 'frachtraum/config'
10
+ require 'frachtraum/cli'
10
11
  require 'frachtraum/bsd'
11
12
  require 'frachtraum/linux'
12
-
13
+ require 'frachtraum/osx'
13
14
 
14
15
  module Frachtraum
15
16
 
16
- VERSION = '0.0.1'.freeze
17
+ VERSION = '0.0.2'.freeze
17
18
 
18
-
19
19
  # Kibibyte, Mebibyte, Gibibyte, etc... all the IEC sizes
20
20
  BYTES_IN_KiB = 2**10
21
21
  BYTES_IN_MiB = 2**20
@@ -38,9 +38,9 @@ module Frachtraum
38
38
 
39
39
  exit_status = wait_thr.value
40
40
  if exit_status.success?
41
- puts "done"
41
+ puts Rainbow("done").green
42
42
  else
43
- abort "FAILED! --> #{stdout_err}"
43
+ abort Rainbow("FAILED!").red + " --> #{stdout_err}"
44
44
  end
45
45
  end
46
46
  end # exec_cmd
@@ -65,10 +65,12 @@ module Frachtraum
65
65
  end
66
66
  module_function :pretty_IEC_bytes
67
67
 
68
- def attach(password, depot=nil)
68
+ def attach(password, volume=nil)
69
69
  case RUBY_PLATFORM
70
- when /bsd/ then attach_bsd password, depot
71
- when /linux/ then attach_linux password, depot
70
+ when /bsd/ then attach_bsd password, volume
71
+ when /linux/ then attach_linux password, volume
72
+ #when /darwin/ then attach_osx password, volume
73
+ else abort "OS not supported"
72
74
  end
73
75
  end
74
76
  module_function :attach
@@ -76,9 +78,9 @@ module Frachtraum
76
78
  def capacity()
77
79
  total_used = 0
78
80
  total_avail = 0
79
- DEPOTS.each do |depot|
80
- used = %x( zfs get -o value -Hp used #{MOUNTPOINT}/#{depot} )
81
- avail = %x( zfs get -o value -Hp available #{MOUNTPOINT}/#{depot} )
81
+ Frachtraum::VOLUMES.each do |volume|
82
+ used = %x( zfs get -o value -Hp used #{volume} 2>&1 )
83
+ avail = %x( zfs get -o value -Hp available #{volume} 2>&1 )
82
84
 
83
85
  total_used += (used =="" ? 0 : used).to_i # / 1000 # 1024
84
86
  total_avail += (avail=="" ? 0 : avail).to_i # / 1000 # 1024
@@ -90,31 +92,67 @@ module Frachtraum
90
92
  end
91
93
  module_function :capacity
92
94
 
95
+ def report()
96
+
97
+ report_table = {}
98
+ reported_values = [:used,:available,:compression,:compressratio]
99
+
100
+ (Frachtraum::VOLUMES + Frachtraum::TIMEMACHINE_TARGETS).each do |dataset|
101
+ dataset_info = {}
102
+ if zfs_dataset_exists?(dataset)
103
+ reported_values.each do |repval|
104
+ dataset_info[repval] = %x( zfs get -o value -Hp #{repval.to_s} #{dataset} )
105
+ end
106
+ else
107
+ reported_values.each {|repval| dataset_info[repval] = "N/A" }
108
+ end
109
+ report_table[dataset] = dataset_info
110
+ end
111
+
112
+ return report_table
113
+ end
114
+ module_function :report
115
+
93
116
 
94
117
  def setupdisk(dev, label, password, compression, encryption, keylength, mountpoint)
95
118
 
96
119
  abort "untested procedure -- won't continue"
97
120
 
98
121
  case RUBY_PLATFORM
99
- when /bsd/ then setupdisk_bsd dev, label, password, compression, encryption, keylength, mountpoint
100
- when /linux/ then setupdisk_linux dev, label, password, compression, encryption, keylength, mountpoint
122
+ when /bsd/ then setupdisk_bsd dev, label, password, compression, encryption, keylength, mountpoint
123
+ when /linux/ then setupdisk_linux dev, label, password, compression, encryption, keylength, mountpoint
124
+ #when /darwin/ then setupdisk_osx dev, label, password, compression, encryption, keylength, mountpoint
101
125
  else abort "OS not supported"
102
126
  end
103
127
  end
104
128
  module_function :setupdisk
105
129
 
130
+ def sweep(volume)
131
+
132
+ target_volumes = volume.nil? ? Frachtraum::VOLUMES : volume
133
+
134
+ # TODO
135
+ abort "sweeping not supported yet"
136
+
137
+ target_volumes.each do |volume|
138
+ if zfs_dataset_exists?(volume)
139
+ # TODO
140
+ end
141
+ end
142
+ end
143
+ module_function :sweep
144
+
106
145
 
107
146
  def run_system_test()
108
147
  tool_list = []
109
148
  case RUBY_PLATFORM
110
- when /bsd/ then tool_list = REQUIRED_TOOLS_BSD
111
- when /linux/ then tool_list = REQUIRED_TOOLS_LINUX
149
+ when /bsd/ then tool_list = REQUIRED_TOOLS_BSD
150
+ when /linux/ then tool_list = REQUIRED_TOOLS_LINUX
151
+ #when /darwin/ then tool_list = REQUIRED_TOOLS_OSX
112
152
  else abort "OS not supported"
113
153
  end
114
154
 
115
- tool_list.each do |tool|
116
- find_executable tool
117
- end
155
+ tool_list.each { |tool| find_executable tool }
118
156
 
119
157
  # find_executable seems to create such file in case executable is not found
120
158
  File.delete 'mkmf.log' if File.exists?('mkmf.log')
@@ -125,30 +163,16 @@ module Frachtraum
125
163
  def zfs_dataset_exists?(dataset)
126
164
  output = %x( zfs get -H mounted #{dataset} 2>&1 )
127
165
  case output
128
- when /yes/
129
- return true
130
- when /dataset does not exist/, /permission denied/
131
- return false
132
- else
133
- abort "can't handle output of zfs_dataset_exists?: #{output}"
166
+ when /yes/
167
+ return true
168
+ when /dataset does not exist/, /permission denied/
169
+ return false
170
+ else
171
+ abort "can't handle output of zfs_dataset_exists?: #{output}"
134
172
  end
135
173
  end
136
174
  module_function :zfs_dataset_exists?
137
175
 
138
- def zfs_dataset_compression_ratio(dataset)
139
- cmd = "zfs get compressratio #{dataset} | grep compressratio"
140
- Open3.popen2e(cmd) do |stdin, stdout_err, wait_thr|
141
- output = stdout_err.gets
142
- if output == ""
143
- return "N/A"
144
- else
145
- parts = output.split(' ')
146
- return parts[2] # => ratio
147
- end
148
- end
149
- end
150
- module_function :zfs_dataset_compression_ratio
151
-
152
176
  end # Frachtraum
153
177
 
154
178
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: frachtraum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maximilian Irro
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ~>
67
67
  - !ruby/object:Gem::Version
68
68
  version: 2.0.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: terminal-table
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: 1.4.5
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: 1.4.5
69
83
  description: lorem ipsum
70
84
  email: max@disposia.org
71
85
  executables:
@@ -73,6 +87,7 @@ executables:
73
87
  extensions: []
74
88
  extra_rdoc_files: []
75
89
  files:
90
+ - .gitignore
76
91
  - Gemfile
77
92
  - LICENSE
78
93
  - README.md
@@ -81,6 +96,7 @@ files:
81
96
  - frachtraum.gemspec
82
97
  - lib/frachtraum.rb
83
98
  - lib/frachtraum/bsd.rb
99
+ - lib/frachtraum/cli.rb
84
100
  - lib/frachtraum/config.rb
85
101
  - lib/frachtraum/linux.rb
86
102
  - lib/frachtraum/osx.rb