storazzo 0.0.6 → 0.2.0
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.
- checksums.yaml +4 -4
- data/Gemfile +5 -0
- data/LICENSE +1 -0
- data/Makefile +46 -0
- data/README.md +19 -0
- data/Rakefile +32 -0
- data/VERSION +1 -0
- data/bin/ricdisk-magic +152 -0
- data/lib/storazzo/colors.rb +7 -3
- data/lib/storazzo/common.rb +12 -0
- data/lib/storazzo/debug.rb +10 -0
- data/lib/storazzo/hashify.rb +33 -0
- data/lib/storazzo/main.rb +69 -0
- data/lib/storazzo/parser/parser.rb +0 -0
- data/lib/storazzo/ric_disk.rb +358 -0
- data/lib/storazzo/ric_disk_config.rb +93 -0
- data/lib/storazzo/ric_disk_statsfile.rb +10 -0
- data/lib/storazzo/ric_disk_ugly.rb +251 -0
- data/lib/storazzo/version.rb +6 -0
- data/lib/storazzo.rb +29 -30
- data/storazzo.gemspec +18 -0
- data/test/test_storazzo.rb +34 -0
- data/var/test/README.md +1 -0
- data/var/test/disks/disk02-full/fake file.touch +0 -0
- data/var/test/disks/disk02-full/ls.txt +6 -0
- metadata +34 -8
- data/bin/ricdisk-magic.rb +0 -395
@@ -0,0 +1,251 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Storazzo
|
4
|
+
class Storazzo::RicDiskUgly
|
5
|
+
RICDISK_VERSION = "1.0ugly"
|
6
|
+
DEFAULT_MEDIA_DIRS = %w{
|
7
|
+
/media/riccardo/
|
8
|
+
/Volumes/
|
9
|
+
/mnt/
|
10
|
+
~/storazzo/var/test/disks/
|
11
|
+
}.append(Storazzo.root + "/var/test/disks/")
|
12
|
+
|
13
|
+
include Hashify
|
14
|
+
extend Storazzo::Colors
|
15
|
+
|
16
|
+
# todo substitute with protobuf..
|
17
|
+
attr_accessor :name, :description, :ricdisk_file, :local_mountpoint, :wr
|
18
|
+
|
19
|
+
def self.interesting_mount_points(opts={})
|
20
|
+
#https://unix.stackexchange.com/questions/177014/showing-only-interesting-mount-points-filtering-non-interesting-types
|
21
|
+
`mount | grep -Ev 'type (proc|sysfs|tmpfs|devpts|debugfs|rpc_pipefs|nfsd|securityfs|fusectl|devtmpfs) '`.split(/\n+/)
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize(path, ricdisk_file)
|
25
|
+
puts "[DEB] RicDiskUgly initialize.. path=#{path}"
|
26
|
+
@local_mountpoint = path
|
27
|
+
@description = "This is an automated RicDiskUgly description from v.#{VERSION}. Riccardo feel free to edit away with characteristicshs of this device.. Created on #{Time.now}'"
|
28
|
+
@ricdisk_version = VERSION
|
29
|
+
@ricdisk_file = ricdisk_file
|
30
|
+
#@questo_non_esiste = :sobenme
|
31
|
+
@label = path.split("/").last
|
32
|
+
@name = path.split("/").last
|
33
|
+
@wr = File.writable?("#{path}/#{ricdisk_file}" ) # .writeable?
|
34
|
+
@tags = 'ricdisk'
|
35
|
+
puts :beleza
|
36
|
+
@config = RicDiskConfig.instance.get_config
|
37
|
+
#puts @config if @config
|
38
|
+
find_info_from_mount(path)
|
39
|
+
find_info_from_df()
|
40
|
+
end
|
41
|
+
|
42
|
+
def ricdisk_absolute_path
|
43
|
+
@local_mountpoint + "/" + @ricdisk_file
|
44
|
+
end
|
45
|
+
|
46
|
+
def add_tag(tag)
|
47
|
+
@tags += ", #{tag}"
|
48
|
+
end
|
49
|
+
|
50
|
+
# might have other things in the future...
|
51
|
+
def find_info_from_mount(path)
|
52
|
+
mount_table_lines = interesting_mount_points()
|
53
|
+
mount_line = nil
|
54
|
+
mount_table_lines.each do |line|
|
55
|
+
next if line =~ /^map /
|
56
|
+
dev, on, mount_path, mode = line.split(/ /)
|
57
|
+
if mount_path==path
|
58
|
+
mount_line = line
|
59
|
+
else
|
60
|
+
@info_from_mount = false
|
61
|
+
end
|
62
|
+
end
|
63
|
+
@info_from_mount = ! (mount_line.nil?)
|
64
|
+
if @info_from_mount
|
65
|
+
#@mount_line = mount_line
|
66
|
+
@description += "\nMount line:\n" + mount_line
|
67
|
+
@remote_mountpoint = mount_line.split(/ /)[0]
|
68
|
+
@fstype = mount_line.split(/ /)[3].gsub(/[\(,]/, '')
|
69
|
+
add_tag(:synology) if @remote_mountpoint.match('1.0.1.10')
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def find_info_from_df()
|
74
|
+
path = @local_mountpoint
|
75
|
+
df_info = `df -h "#{path}"`
|
76
|
+
@df_info = df_info
|
77
|
+
lines = df_info.split(/\n+/)
|
78
|
+
raise "I need exactly TWO lines! Or no info is served here..." unless lines.size == 2
|
79
|
+
mount, @size_readable, used_size, avail_size, @disk_utilization, other = lines[1].split(/\s+/) # second line..
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
|
84
|
+
def self.sbrodola_ricdisk(subdir)
|
85
|
+
# given a path, if .ricdisk exists i do stuff with it..
|
86
|
+
disk_info = nil
|
87
|
+
unless self.ok_dir?(subdir)
|
88
|
+
puts("Nothing for me here. Existing")
|
89
|
+
return
|
90
|
+
end
|
91
|
+
if File.exists?( "#{subdir}/.ricdisk") and File.empty?( "#{subdir}/.ricdisk")
|
92
|
+
deb("Interesting1. Empty file! Now I write YAML with it.")
|
93
|
+
disk_info = RicDiskUgly.new(subdir, '.ricdisk')
|
94
|
+
#puts(x)
|
95
|
+
#puts(yellow x.to_yaml)
|
96
|
+
end
|
97
|
+
if File.exists?( "#{subdir}/.ricdisk.yaml") and File.empty?( "#{subdir}/.ricdisk.yaml")
|
98
|
+
deb("Interesting2. Empty file! TODO write YAML with it.")
|
99
|
+
disk_info = RicDiskUgly.new(subdir, '.ricdisk.yaml')
|
100
|
+
# todo write
|
101
|
+
#puts(x)
|
102
|
+
puts(yellow disk_info.to_yaml)
|
103
|
+
end
|
104
|
+
if disk_info
|
105
|
+
if File.empty?(disk_info.ricdisk_absolute_path) and (disk_info.wr)
|
106
|
+
puts(green("yay, we can now write the file '#{disk_info.ricdisk_absolute_path}' (which is R/W, I just checked!) with proper YAML content.."))
|
107
|
+
ret = File.write(disk_info.ricdisk_absolute_path, disk_info.to_yaml)
|
108
|
+
puts("Written file! ret=#{ret}")
|
109
|
+
else
|
110
|
+
puts(red("Nope, qualcosa non va.. #{File.empty?(disk_info.ricdisk_absolute_path)}"))
|
111
|
+
puts("File size: #{File.size(disk_info.ricdisk_absolute_path)}")
|
112
|
+
end
|
113
|
+
end
|
114
|
+
if File.exists?( "#{subdir}/.ricdisk") and ! File.empty?( "#{subdir}/.ricdisk")
|
115
|
+
puts("Config File found with old-style name: '#{subdir}/.ricdisk' !")
|
116
|
+
#puts(white `cat "#{subdir}/.ricdisk"`)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# separiamo cosi usiamo meglio...
|
121
|
+
def self.ok_dir?(subdir)
|
122
|
+
File.exists?( "#{subdir}/.ricdisk") or File.exists?( "#{subdir}/.ricdisk.yaml")
|
123
|
+
end
|
124
|
+
|
125
|
+
def self.obsolescence_seconds file_path
|
126
|
+
creation_time = File.stat(file_path).ctime
|
127
|
+
deb("[obsolescence_seconds] File #{file_path}: #{creation_time} - #{(Time.now - creation_time)} seconds ago")
|
128
|
+
(Time.now - creation_time).to_i
|
129
|
+
end
|
130
|
+
def self.obsolescence_days(file_path)
|
131
|
+
return obsolescence_seconds(file_path) / 86400
|
132
|
+
end
|
133
|
+
|
134
|
+
def self.backquote_execute(cmd)
|
135
|
+
# executed a command wrapped by dryrun though
|
136
|
+
return "DRYRUN backquote_execute(#{cmd})" if $opts[:dryrun]
|
137
|
+
`#{cmd}`
|
138
|
+
end
|
139
|
+
|
140
|
+
def self.upload_to_gcs(file, opts={})
|
141
|
+
deb("upload_to_gcs(#{file}). TODO(ricc) after breafast upload to GCS : #{file}")
|
142
|
+
mount_name = file.split('/')[-2]
|
143
|
+
filename = "#{mount_name}-#{File.basename file}"
|
144
|
+
hostname = Socket.gethostname[/^[^.]+/]
|
145
|
+
command = "gsutil cp '#{file}' gs://#{$gcs_bucket}/backup/ricdisk-magic/#{ hostname }-#{filename}"
|
146
|
+
deb("Command: #{command}")
|
147
|
+
ret = backquote_execute(command)
|
148
|
+
# if $opts[:debug] do
|
149
|
+
# puts "+ Current list of files:"
|
150
|
+
# ret = backquote_execute("gsutil ls -al gs://#{$gcs_bucket}/backup/ricdisk-magic/")
|
151
|
+
# puts ret
|
152
|
+
# end
|
153
|
+
ret
|
154
|
+
end
|
155
|
+
|
156
|
+
# Create RDS file.
|
157
|
+
def self.calculate_stats_files(dir, opts={})
|
158
|
+
opts_upload_to_gcs = opts.fetch :upload_to_gcs, true
|
159
|
+
full_file_path = "#{dir}/#{$stats_file}"
|
160
|
+
|
161
|
+
puts("calculate_stats_files(#{white dir}): #{white full_file_path}")
|
162
|
+
puts "TEST1 DIR EXISTS: #{dir} -> #{File.directory? dir}"
|
163
|
+
Dir.chdir(dir)
|
164
|
+
if File.exists?(full_file_path) and ($opts[:force] == false)
|
165
|
+
puts "File '#{$stats_file}' exists already." # - now should see if its too old, like more than 1 week old"
|
166
|
+
# TODO check for file time...
|
167
|
+
print "Lines found: #{yellow `wc -l "#{full_file_path}" `.chomp }. File obsolescence (days): #{yellow obsolescence_days(full_file_path)}."
|
168
|
+
if obsolescence_days(full_file_path) > 7
|
169
|
+
puts("*** ACHTUNG *** FIle is pretty old. You might consider rotating: #{yellow "mv #{full_file_path} #{full_file_path}_old"}. Or invoke with --force")
|
170
|
+
end
|
171
|
+
upload_to_gcs(full_file_path) if opts_upload_to_gcs
|
172
|
+
else
|
173
|
+
puts "Crunching data stats from '#{dir}' into '#{$stats_file}' ... please bear with me.. [maybe file didnt exist, maybe $opts[:force] is true]"
|
174
|
+
command = "find . -print0 | xargs -0 stats-with-md5.rb --no-color | tee '#{full_file_path}'"
|
175
|
+
puts("[#{`pwd`.chomp}] Executing: #{azure command}")
|
176
|
+
ret = backquote_execute command
|
177
|
+
puts "Done. #{ret.split("\n").count} files processed."
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
def self.find_active_dirs(base_dirs=nil, also_mountpoints=true)
|
182
|
+
base_dirs = DEFAULT_MEDIA_DIRS if base_dirs.nil?
|
183
|
+
active_dirs = []
|
184
|
+
base_dirs.each do |ugly_dir|
|
185
|
+
# https://stackoverflow.com/questions/1899072/getting-a-list-of-folders-in-a-directory#:~:text=Dir.chdir(%27/destination_directory%27)%0ADir.glob(%27*%27).select%20%7B%7Cf%7C%20File.directory%3F%20f%7D
|
186
|
+
dir = File.expand_path(ugly_dir)
|
187
|
+
begin
|
188
|
+
x=[]
|
189
|
+
# puts "TEST2 DIR EXISTS: #{dir} -> #{Dir.exists?(dir)}"
|
190
|
+
unless Dir.exists?(dir)
|
191
|
+
deb "Dir doesnt exist, skipping: #{dir}"
|
192
|
+
next
|
193
|
+
end
|
194
|
+
Dir.chdir(dir)
|
195
|
+
x = Dir.glob('*').select {|f| File.directory? f}
|
196
|
+
subdirs = x.map{|subdir| "#{dir}#{subdir}"}
|
197
|
+
subdirs.each{|subdir|
|
198
|
+
#puts `ls -al "#{subdir}"`
|
199
|
+
active_dirs << subdir if self.ok_dir?(subdir)
|
200
|
+
}
|
201
|
+
#puts(white x)
|
202
|
+
rescue Exception => e # optionally: `rescue Exception => ex`
|
203
|
+
puts "Exception: '#{e}'"
|
204
|
+
ensure # will always get executed
|
205
|
+
#deb 'Always gets executed.'
|
206
|
+
#x = []
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
if also_mountpoints
|
211
|
+
=begin
|
212
|
+
Example output from mount:
|
213
|
+
|
214
|
+
devfs on /dev (devfs, local, nobrowse)
|
215
|
+
/dev/disk3s6 on /System/Volumes/VM (apfs, local, noexec, journaled, noatime, nobrowse)
|
216
|
+
/dev/disk3s2 on /System/Volumes/Preboot (apfs, local, journaled, nobrowse)
|
217
|
+
/dev/disk3s4 on /System/Volumes/Update (apfs, local, journaled, nobrowse)
|
218
|
+
/dev/disk1s2 on /System/Volumes/xarts (apfs, local, noexec, journaled, noatime, nobrowse)
|
219
|
+
/dev/disk1s1 on /System/Volumes/iSCPreboot (apfs, local, journaled, nobrowse)
|
220
|
+
/dev/disk1s3 on /System/Volumes/Hardware (apfs, local, journaled, nobrowse)
|
221
|
+
/dev/disk3s5 on /System/Volumes/Data (apfs, local, journaled, nobrowse, protect)
|
222
|
+
map auto_home on /System/Volumes/Data/home (autofs, automounted, nobrowse)
|
223
|
+
//riccardo@1.0.1.10/video on /Volumes/video (afpfs, nodev, nosuid, mounted by ricc)
|
224
|
+
//riccardo@1.0.1.10/photo on /Volumes/photo (afpfs, nodev, nosuid, mounted by ricc)
|
225
|
+
=end
|
226
|
+
# add directories from current mountpoints...
|
227
|
+
mount_table_lines = interesting_mount_points()
|
228
|
+
mount_table_lines.each{|line|
|
229
|
+
next if line =~ /^map /
|
230
|
+
dev, on, path, mode = line.split(/ /)
|
231
|
+
#puts line
|
232
|
+
#deb yellow(path)
|
233
|
+
active_dirs << path if self.ok_dir?(path)
|
234
|
+
}
|
235
|
+
end
|
236
|
+
active_dirs.uniq!
|
237
|
+
puts("find_active_dirs(): found dirs " + green(active_dirs))
|
238
|
+
return active_dirs
|
239
|
+
end
|
240
|
+
|
241
|
+
|
242
|
+
def analyze_local_system()
|
243
|
+
puts :TODO
|
244
|
+
puts "1. Interesting Mounts: #{green interesting_mount_points}"
|
245
|
+
puts "2. Sbrodoling everything: :TODO"
|
246
|
+
# find_info_from_mount(path)
|
247
|
+
# find_info_from_df()
|
248
|
+
end
|
249
|
+
|
250
|
+
end
|
251
|
+
end
|
data/lib/storazzo.rb
CHANGED
@@ -1,43 +1,42 @@
|
|
1
|
-
#
|
1
|
+
# Inspired from https://guides.rubygems.org/make-your-own-gem/#introduction
|
2
2
|
|
3
|
-
#require 'storazzo/colors'
|
4
3
|
|
5
|
-
module
|
6
|
-
VERSION = File.read('./VERSION').chomp # "10.0.0"
|
4
|
+
module Storazzo
|
5
|
+
#VERSION = File.read('./VERSION').chomp # "10.0.0"
|
7
6
|
#require 'storazzo/translator'
|
8
7
|
|
9
|
-
def
|
8
|
+
def latest_parser_version
|
10
9
|
"1.2"
|
11
10
|
end
|
12
|
-
end
|
13
11
|
|
14
|
-
|
15
|
-
|
12
|
+
# Finds RAILS_ROOT for Storazzo Gem. Copied from:
|
13
|
+
# https://stackoverflow.com/questions/10132949/finding-the-gem-root
|
14
|
+
def self.root
|
15
|
+
File.expand_path '../..', __FILE__
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
puts "Hello from Storazzo v#{StorazzoMod::VERSION rescue :ERROR}!"
|
18
|
+
def self.version
|
19
|
+
File.read(self.root + '/VERSION').chomp # "10.0.0"
|
20
20
|
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
#include Storazzo::Colors
|
26
|
-
extend Storazzo::Colors
|
27
|
-
|
28
|
-
pwhite "All tests BEGIN"
|
29
|
-
deb "Maybe debug is enabled?"
|
30
|
-
#puts "This is Storazzo v#{StorazzoMod::VERSION}"
|
31
|
-
hi
|
32
|
-
# This works with EXTEND..
|
33
|
-
puts(yellow "Just YELLOW 0")
|
34
|
-
# This reqwuires a INCLUDE.
|
35
|
-
#puts(Storazzo::Colors.yellow "Test YELLOW 1 self")
|
36
|
-
#puts(Colors.yellow "Test YELLOW 1 self")
|
37
|
-
#puts(Colors.green "Test YELLOW 2 ohne self")
|
38
|
-
pwhite "All tests END"
|
39
|
-
#puts "All tests END"
|
22
|
+
# alias_method :VERSION, :version
|
23
|
+
def self.VERSION
|
24
|
+
version
|
40
25
|
end
|
41
|
-
|
26
|
+
end
|
42
27
|
|
28
|
+
# nice to paste nice output
|
29
|
+
require 'pp'
|
30
|
+
|
31
|
+
require 'storazzo/common'
|
32
|
+
require 'storazzo/colors'
|
33
|
+
require 'storazzo/hashify'
|
34
|
+
require 'storazzo/ric_disk' # NEW and will build from ground up using multiple files..
|
35
|
+
require 'storazzo/ric_disk_ugly' # OLD and 90% working
|
36
|
+
require 'storazzo/ric_disk_config'
|
37
|
+
require 'storazzo/ric_disk_statsfile'
|
38
|
+
require 'storazzo/main'
|
43
39
|
require 'storazzo/translator'
|
40
|
+
|
41
|
+
puts Storazzo::Main.hi
|
42
|
+
|
data/storazzo.gemspec
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "storazzo"
|
3
|
+
# TOSDO: copy approach from here to dry version calculating: https://github.com/rails/strong_parameters/blob/master/strong_parameters.gemspec#L15
|
4
|
+
s.version = File.read("VERSION").chomp # TODO cat version File.read(@,.VERSION).chomp
|
5
|
+
s.summary = "storazzo is an amazing gem. Code is in https://github.com/palladius/storazzo"
|
6
|
+
s.description = "A simple gem to manage your external hard drives and extract MD5 and common stuff from them."
|
7
|
+
s.authors = ["Riccardo Carlesso"]
|
8
|
+
s.email = "name dot surname at popular Google-owned Mail"
|
9
|
+
# Autoglob as per https://stackoverflow.com/questions/11873294/determining-the-gems-list-of-files-for-the-specification
|
10
|
+
s.files = %w(Gemfile LICENSE README.md Makefile Rakefile storazzo.gemspec VERSION) + Dir["{bin,lib,test,var}/**/*"]
|
11
|
+
s.test_files = Dir["test/**/*"] + Dir["var/test/**/*"]
|
12
|
+
s.executables << "ricdisk-magic"
|
13
|
+
|
14
|
+
s.homepage = "https://rubygems.org/gems/storazzo" # maybe https://github.com/palladius/storazzo
|
15
|
+
s.license = "MIT"
|
16
|
+
|
17
|
+
#s.add_dependency "activesupport", "~> 3.0"
|
18
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "storazzo"
|
3
|
+
|
4
|
+
class StorazzoTest < Minitest::Test
|
5
|
+
def test_storazzo_hi_with_argument
|
6
|
+
assert_match "Hello from Storazzo", Storazzo::Main.hi("ruby this should fail")
|
7
|
+
assert_match "ruby this should fail", Storazzo::Main.hi("ruby this should fail")
|
8
|
+
end
|
9
|
+
def test_storazzo_hi_without_argument
|
10
|
+
assert_match "Hello from Storazzo", Storazzo::Main.hi()
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_storazzo_version_should_have_3_numbers_and_2_dots
|
14
|
+
# puts Storazzo::version
|
15
|
+
assert_equal Storazzo::version.split('.').size , 3, "should be 3 parts, like A.B.C"
|
16
|
+
#major, minor, minuscule = Storazzo::VERSION.split('.')
|
17
|
+
# assert_match Storazzo::VERSION, "....."
|
18
|
+
end
|
19
|
+
|
20
|
+
# def test_english_hello
|
21
|
+
# assert_equal "hello world",
|
22
|
+
# Hola.hi("english")
|
23
|
+
# end
|
24
|
+
|
25
|
+
# def test_any_hello
|
26
|
+
# assert_equal "hello world",
|
27
|
+
# Hola.hi("ruby")
|
28
|
+
# end
|
29
|
+
|
30
|
+
# def test_spanish_hello
|
31
|
+
# assert_equal "hola mundo",
|
32
|
+
# Hola.hi("spanish")
|
33
|
+
# end
|
34
|
+
end
|
data/var/test/README.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Just to test two disks: one with stuff and one empty.
|
File without changes
|
@@ -0,0 +1,6 @@
|
|
1
|
+
total 0
|
2
|
+
drwxr-xr-x 5 ricc primarygroup 160 Jul 13 07:18 .
|
3
|
+
drwxr-xr-x 4 ricc primarygroup 128 Jul 13 07:17 ..
|
4
|
+
-rw-r--r-- 1 ricc primarygroup 0 Jul 13 07:17 .ricdisk
|
5
|
+
-rw-r--r-- 1 ricc primarygroup 0 Jul 13 07:18 fake file.touch
|
6
|
+
-rw-r--r-- 1 ricc primarygroup 0 Jul 13 07:18 ls.txt
|
metadata
CHANGED
@@ -1,31 +1,53 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: storazzo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Riccardo Carlesso
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-07-
|
11
|
+
date: 2022-07-13 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A simple gem to manage your external hard drives and extract MD5 and
|
14
14
|
common stuff from them.
|
15
15
|
email: name dot surname at popular Google-owned Mail
|
16
|
-
executables:
|
16
|
+
executables:
|
17
|
+
- ricdisk-magic
|
17
18
|
extensions: []
|
18
19
|
extra_rdoc_files: []
|
19
20
|
files:
|
20
|
-
-
|
21
|
+
- Gemfile
|
22
|
+
- LICENSE
|
23
|
+
- Makefile
|
24
|
+
- README.md
|
25
|
+
- Rakefile
|
26
|
+
- VERSION
|
27
|
+
- bin/ricdisk-magic
|
21
28
|
- lib/storazzo.rb
|
22
29
|
- lib/storazzo/colors.rb
|
30
|
+
- lib/storazzo/common.rb
|
31
|
+
- lib/storazzo/debug.rb
|
32
|
+
- lib/storazzo/hashify.rb
|
33
|
+
- lib/storazzo/main.rb
|
34
|
+
- lib/storazzo/parser/parser.rb
|
35
|
+
- lib/storazzo/ric_disk.rb
|
36
|
+
- lib/storazzo/ric_disk_config.rb
|
37
|
+
- lib/storazzo/ric_disk_statsfile.rb
|
38
|
+
- lib/storazzo/ric_disk_ugly.rb
|
23
39
|
- lib/storazzo/translator.rb
|
40
|
+
- lib/storazzo/version.rb
|
41
|
+
- storazzo.gemspec
|
42
|
+
- test/test_storazzo.rb
|
43
|
+
- var/test/README.md
|
44
|
+
- var/test/disks/disk02-full/fake file.touch
|
45
|
+
- var/test/disks/disk02-full/ls.txt
|
24
46
|
homepage: https://rubygems.org/gems/storazzo
|
25
47
|
licenses:
|
26
48
|
- MIT
|
27
49
|
metadata: {}
|
28
|
-
post_install_message:
|
50
|
+
post_install_message:
|
29
51
|
rdoc_options: []
|
30
52
|
require_paths:
|
31
53
|
- lib
|
@@ -41,7 +63,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
41
63
|
version: '0'
|
42
64
|
requirements: []
|
43
65
|
rubygems_version: 3.1.4
|
44
|
-
signing_key:
|
66
|
+
signing_key:
|
45
67
|
specification_version: 4
|
46
68
|
summary: storazzo is an amazing gem. Code is in https://github.com/palladius/storazzo
|
47
|
-
test_files:
|
69
|
+
test_files:
|
70
|
+
- test/test_storazzo.rb
|
71
|
+
- var/test/README.md
|
72
|
+
- var/test/disks/disk02-full/fake file.touch
|
73
|
+
- var/test/disks/disk02-full/ls.txt
|