freydis 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: '0381ec85064f282916907626e1a1783ee8a86ce5df1769deb91f4e1b0e5eb4dc'
4
+ data.tar.gz: 8c100e7428ec1fc7261a271a677d77fafe84b337541b507c8a9c71d964524e10
5
+ SHA512:
6
+ metadata.gz: 135daf7438ab4439396d45a99dc2300c916edcb2d2fcdef97dbaf907c19add34503d027b3b4d51836b92aaca979b5953d674609e411c1b1249bb0d589938b4e3
7
+ data.tar.gz: 8a0e398ca35e07f161bb0c02a0c33bbe68c09f16f492633a36707304720bb8690c41e087dbe34bfc61be410fe23e73af663c349d464cab5c95a27bdc6a0b563e
data/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
1
+ ## 0.0.2, release 2021/05/18
2
+ * New options `--open` and `--close`.
3
+ * Encrypt/Decrypt with `cryptsetup`.
4
+ * Add Rsync for backup and restore.
5
+ * Can add/remove paths with the `--cli`.
6
+ * Can (u)mount the encrypted device at the default `/mnt/freydis`.
7
+ * Checking all ID (partuuid, uuid, id) from a given device.
8
+ * YAML config file in ~/.config/freydis/freydis.yaml.
9
+
10
+ ## 0.0.1, release 2021/05/04
11
+ * Initial push, code freeying !
12
+
data/LICENSE ADDED
@@ -0,0 +1,10 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021 szorfein
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
10
+
data/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # Freydis
2
+ Backup and restore data on encrypted device.
3
+
4
+ ## Requirements
5
+ Freydis use `rsync` and `cryptsetup`.
6
+
7
+ ## Gem build
8
+
9
+ gem build freydis.gemspec
10
+
11
+ ## Install freydis locally
12
+
13
+ gem install freydis-0.0.1.gem -P HighSecurity
14
+
15
+ ## Usage
16
+
17
+ #### 0x01 - Config file
18
+ First, you need a config file. You can use `freydis --init` or make one with your favorite editor.
19
+ The config file should be placed at `~/.config/freydis/freydis.yaml`.
20
+
21
+ An example of final config:
22
+
23
+ ```yaml
24
+ ---
25
+ :disk: sdc
26
+ :disk_id: usb-SABRENT_SABRENT_DB9876543214E-0:0
27
+ :disk_uuid: 10f531df-51dc-x19e-9bd1-bbd6659f0c3f
28
+ :disk_partuuid: ''
29
+ :paths:
30
+ - "/home/daggoth/labs"
31
+ - "/home/daggoth/musics"
32
+ - "/home/daggoth/.password-store"
33
+ - "/home/daggoth/documents"
34
+ ```
35
+
36
+ As you see:
37
+ + disk: sdc -> Use only `sd[a-z]` without partition.
38
+ + disk_id -> (Optionnal), freydis will find it if void.
39
+ + disk_uuid -> (Optionnal)
40
+ + disk_partuuid -> (Optionnal)
41
+ + paths -> Contain a list of absolute paths on each line.
42
+
43
+ #### 0x02 - Encrypt the disk
44
+ Freydis will use `cryptsetup` with `luks2` and format the disk with `ext4`:
45
+
46
+ $ freydis --encrypt
47
+
48
+ #### 0x03 - Other options
49
+ Make an incremental backup, will copy all `paths` include in the config file:
50
+
51
+ $ freydis --backup
52
+
53
+ Restore files in your system `/`:
54
+
55
+ $ freydis --restore
56
+
57
+ If you lost the config file, `freydis` has made a copy on your device when you're done your first `--backup`:
58
+
59
+ $ freydis --open --disk sdc
60
+ $ cp -a /mnt/freydis/home/user/.config/freydis ~/.config/
61
+
62
+ And you can use `freydis` normally.
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ # https://github.com/seattlerb/minitest#running-your-tests-
2
+ require "rake/testtask"
3
+ require File.dirname(__FILE__) + "/lib/freydis/version"
4
+
5
+ Rake::TestTask.new(:test) do |t|
6
+ t.libs << "test"
7
+ t.libs << "lib"
8
+ t.test_files = FileList["test/test_*.rb"]
9
+ end
10
+
11
+ # Usage: rake gem:build
12
+ namespace :gem do
13
+ desc "build the gem"
14
+ task :build do
15
+ Dir["freydis*.gem"].each {|f| File.unlink(f) }
16
+ system("gem build freydis.gemspec")
17
+ system("gem install freydis-#{Freydis::VERSION}.gem")
18
+ end
19
+ end
20
+
21
+ task :default => :test
data/bin/freydis ADDED
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env ruby
2
+ require "freydis"
3
+
4
+ puts "Freydis v." + Freydis::VERSION
5
+
6
+ cli = Freydis::Options.new(ARGV)
7
+ data = Freydis::Data.new
8
+ data.load
9
+
10
+ if cli.disk
11
+ data.options[:disk] = cli.disk
12
+ end
13
+
14
+ if cli.init
15
+ Freydis::Init.run(data.options)
16
+ data.save
17
+ exit 0
18
+ end
19
+
20
+ if !cli.backup && !cli.restore && !cli.encrypt &&
21
+ !cli.open && !cli.close
22
+ puts "Ok... glad to see you too."
23
+ exit 1
24
+ end
25
+
26
+ if cli.encrypt
27
+ puts "Encrypting disk #{data.options[:disk]}..."
28
+ disk = Freydis::Disk.new(data.options[:disk])
29
+ disk.encrypt(data)
30
+ data.save
31
+ elsif cli.backup
32
+ puts "Saving..."
33
+ disk = Freydis::Disk.new(data.options[:disk])
34
+ disk.open(data)
35
+ rsync = Freydis::Rsync.new(data)
36
+ rsync.backup
37
+ disk.close(data)
38
+ elsif cli.restore
39
+ puts "Restoring..."
40
+ disk = Freydis::Disk.new(data.options[:disk])
41
+ disk.open(data)
42
+ rsync = Freydis::Rsync.new(data)
43
+ rsync.restore
44
+ disk.close(data)
45
+ elsif cli.open
46
+ puts "Opening disk #{data.options[:disk]}."
47
+ disk = Freydis::Disk.new(data.options[:disk])
48
+ disk.open(data)
49
+ elsif cli.close
50
+ puts "Closing disk #{data.options[:disk]}."
51
+ disk = Freydis::Disk.new(data.options[:disk])
52
+ disk.close(data)
53
+ end
data/freydis.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ require File.dirname(__FILE__) + "/lib/freydis/version"
2
+
3
+ # https://guides.rubygems.org/specification-reference/
4
+ Gem::Specification.new do |s|
5
+ s.files = `git ls-files`.split(" ")
6
+ s.files.reject! { |fn| fn.include? "certs" }
7
+ s.name = "freydis"
8
+ s.summary = "Backup and Restore data from encrypted device."
9
+ s.version = Freydis::VERSION
10
+ s.description = <<-EOF
11
+ Freydis is a CLI tool to encrypt a disk device, backup and restore easyly. Freydis use `cryptsetup` and `rsync` mainly.
12
+ EOF
13
+ s.email = "szorfein@protonmail.com"
14
+ s.homepage = "https://github.com/szorfein/freydis"
15
+ s.license = "MIT"
16
+ s.metadata = {
17
+ "bug_tracker_uri" => "https://github.com/szorfein/freydis/issues",
18
+ "changelog_uri" => "https://github.com/szorfein/freydis/blob/master/CHANGELOG.md",
19
+ "source_code_uri" => "https://github.com/szorfein/freydis",
20
+ "wiki_uri" => "https://github.com/szorfein/freydis/wiki",
21
+ "funding_uri" => "https://patreon.com/szorfein",
22
+ }
23
+ s.author = "szorfein"
24
+ s.bindir = "bin"
25
+ s.cert_chain = ["certs/szorfein.pem"]
26
+ s.executables << "freydis"
27
+ s.extra_rdoc_files = ['README.md']
28
+ s.required_ruby_version = ">=2.6"
29
+ s.requirements << 'cryptsetup, v2.3'
30
+ s.requirements << 'rsync, v3.2'
31
+ s.signing_key = File.expand_path("~/.ssh/gem-private_key.pem") if $@ =~ /gem\z/
32
+ end
33
+
data/lib/freydis.rb ADDED
@@ -0,0 +1,12 @@
1
+ require_relative 'freydis/version'
2
+ require_relative 'freydis/options'
3
+ require_relative 'freydis/init'
4
+ require_relative 'freydis/data'
5
+ require_relative 'freydis/disk'
6
+ require_relative 'freydis/cryptsetup'
7
+ require_relative 'freydis/rsync'
8
+ require_relative 'freydis/guard'
9
+
10
+ module Freydis
11
+ end
12
+
@@ -0,0 +1,74 @@
1
+ # lib/cryptsetup.rb
2
+
3
+ module Freydis
4
+ class Cryptsetup
5
+ def initialize(data)
6
+ @data = data
7
+ @dev_ids = [
8
+ "/dev/disk/by-id/" + @data.options[:disk_id] ||= " ",
9
+ "/dev/disk/by-uuid/" + @data.options[:disk_uuid] ||= " ",
10
+ "/dev/disk/by-partuuid/" + @data.options[:disk_partuuid] ||= " ",
11
+ "/dev/" + @data.options[:disk]
12
+ ]
13
+ @mapper_name = "freydis-enc"
14
+ @mountpoint ="/mnt/freydis"
15
+ end
16
+
17
+ def encrypt
18
+ @dev_ids.each { |f|
19
+ if File.exists? f
20
+ exec "cryptsetup -v --type luks2 --verify-passphrase luksFormat #{f}"
21
+ break if $?.success?
22
+ end
23
+ }
24
+ end
25
+
26
+ def open
27
+ @dev_ids.each { |f|
28
+ if File.exists? f
29
+ exec "cryptsetup -v open #{f} #{@mapper_name}"
30
+ break if $?.success?
31
+ end
32
+ }
33
+ end
34
+
35
+ def close
36
+ umount
37
+ exec "cryptsetup -v close #{@mapper_name}" if File.exists? "/dev/mapper/#{@mapper_name}"
38
+ end
39
+
40
+ def format
41
+ exec "mkfs.ext4 /dev/mapper/#{@mapper_name}"
42
+ end
43
+
44
+ def mount
45
+ create_mountpoint
46
+ puts "Mounting disk at #{@mountpoint}"
47
+ exec "mount -t ext4 /dev/mapper/#{@mapper_name} #{@mountpoint}"
48
+ end
49
+
50
+ private
51
+
52
+ def create_mountpoint
53
+ if Process.uid === 0
54
+ Dir.mkdir @mountpoint unless Dir.exist? @mountpoint
55
+ else
56
+ exec "mkdir -p #{@mountpoint}" unless Dir.exist? @mountpoint
57
+ end
58
+ end
59
+
60
+ def umount
61
+ dir_length = Dir.glob("#{@mountpoint}/*").length
62
+ if dir_length >= 1 # should contain lost+found if mount
63
+ exec "umount #{@mountpoint}"
64
+ end
65
+ end
66
+
67
+ def exec(command)
68
+ sudo = Process.uid != 0 ? 'sudo' : ''
69
+ if !system("#{sudo} #{command}")
70
+ raise StandardError, "[-] #{command}"
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,39 @@
1
+ # lib/data.rb
2
+
3
+ require 'yaml'
4
+
5
+ module Freydis
6
+ class Data
7
+ attr_accessor :options
8
+
9
+ def initialize
10
+ @config_file = "#{ENV['HOME']}/.config/freydis/freydis.yaml"
11
+ @options = {
12
+ :disk => "",
13
+ :disk_id => "",
14
+ :disk_uuid => "",
15
+ :disk_partuuid => "",
16
+ :paths => []
17
+ }
18
+ end
19
+
20
+ def load
21
+ if File.exist? @config_file
22
+ options_config = YAML.load_file @config_file
23
+ @options.merge!(options_config)
24
+ else
25
+ save
26
+ STDERR.puts "Initialized config at #{@config_file}"
27
+ end
28
+ end
29
+
30
+ def save
31
+ conf_dir = "#{ENV['HOME']}/.config/freydis"
32
+ Dir.mkdir conf_dir if !Dir.exists? conf_dir
33
+
34
+ File.open(@config_file, 'w') { |f|
35
+ YAML::dump(@options, f)
36
+ }
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,81 @@
1
+ # lib/disk.rb
2
+
3
+ module Freydis
4
+ class Disk
5
+ def initialize(dev)
6
+ @disk = dev.match(/sd[a-z]{1}/)
7
+ @dev = "/dev/#{@disk}"
8
+ @mountpoint = "/mnt/freydis"
9
+ end
10
+
11
+ def size
12
+ `lsblk -dno SIZE #{@dev}`.chomp
13
+ end
14
+
15
+ def complete_info
16
+ `lsblk -dno "NAME,LABEL,FSTYPE,SIZE" #{@dev}`.chomp
17
+ end
18
+
19
+ def populate_data(data)
20
+ puts "Checking IDs on #{@disk}..."
21
+ search_uuid(data)
22
+ search_id(data)
23
+ search_partuuid(data)
24
+ end
25
+
26
+ def encrypt(data)
27
+ populate_data(data)
28
+ puts "id -> #{data.options[:disk_id]}"
29
+ puts "uuid -> #{data.options[:disk_uuid]}"
30
+ puts "partuuid -> #{data.options[:disk_partuuid]}"
31
+ data.save
32
+
33
+ cryptsetup = Freydis::Cryptsetup.new(data)
34
+ cryptsetup.close
35
+
36
+ cryptsetup.encrypt
37
+ cryptsetup.open
38
+ cryptsetup.format
39
+
40
+ cryptsetup.close
41
+ end
42
+
43
+ def open(data)
44
+ cryptsetup = Freydis::Cryptsetup.new(data)
45
+ cryptsetup.close
46
+ cryptsetup.open
47
+ cryptsetup.mount
48
+ end
49
+
50
+ def close(data)
51
+ cryptsetup = Freydis::Cryptsetup.new(data)
52
+ cryptsetup.close
53
+ end
54
+
55
+ private
56
+
57
+ def search_uuid(data)
58
+ Dir.glob("/dev/disk/by-uuid/*").each { |f|
59
+ if File.readlink(f).match(/#{@disk}/)
60
+ data.options[:disk_uuid] = f.delete_prefix("/dev/disk/by-uuid/")
61
+ end
62
+ }
63
+ end
64
+
65
+ def search_id(data)
66
+ Dir.glob("/dev/disk/by-id/*").each { |f|
67
+ if File.readlink(f).match(/#{@disk}/)
68
+ data.options[:disk_id] = f.delete_prefix("/dev/disk/by-id/")
69
+ end
70
+ }
71
+ end
72
+
73
+ def search_partuuid(data)
74
+ Dir.glob("/dev/disk/by-partuuid/*").each { |f|
75
+ if File.readlink(f).match(/#{@disk}/)
76
+ data.options[:disk_partuuid] = f.delete_prefix("/dev/disk/by-partuuid/")
77
+ end
78
+ }
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,9 @@
1
+ module Freydis
2
+ module Guard
3
+ def self.disk?(name)
4
+ raise ArgumentError, "Bad name #{name}, should match with sdX" if !name.match(/^sd[a-z]{1}$/)
5
+ raise ArgumentError, "No disk /dev/#{name}" if !File.exist? "/dev/#{name}"
6
+ true
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,78 @@
1
+ # lib/init.rb
2
+
3
+ module Freydis
4
+ module Init
5
+
6
+ puts "===> Starting Init"
7
+
8
+ def self.run(options)
9
+ loop do
10
+ puts %q{Please select an option:
11
+
12
+ 1. Choose a disk (plug on)
13
+ 2. Add more paths
14
+ 3. Reset paths
15
+ 4. Show options
16
+ 5. Save & Quit}
17
+
18
+ case gets.chomp
19
+ when '1'
20
+ select_disk(options)
21
+ when '2'
22
+ puts "Add a path..."
23
+ add_path(options)
24
+ when '3'
25
+ puts "Reseting paths..."
26
+ options[:paths] = []
27
+ when '4'
28
+ show_options(options)
29
+ else
30
+ puts "Quit."
31
+ return
32
+ end
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def self.select_disk(options)
39
+ disks_list = Dir.glob("/dev/sd?")
40
+ puts "Available disks: (only type sdX)"
41
+ disks_list.each { |d|
42
+ your_disk = Freydis::Disk.new(d)
43
+ puts "+ " + your_disk.complete_info
44
+ }
45
+ print "> "
46
+ answer = $stdin.gets
47
+ disk = answer.chomp
48
+ if File.exist? "/dev/#{disk}"
49
+ options[:disk] = disk
50
+ puts "Disk #{disk} added."
51
+ else
52
+ puts "No disk #{disk} found."
53
+ end
54
+ end
55
+
56
+ def self.add_path(options)
57
+ print "> "
58
+ answer = $stdin.gets
59
+ new_path = answer.chomp if answer
60
+ if Dir.exists? new_path
61
+ options[:paths] << new_path
62
+ puts "Path '#{new_path}' added"
63
+ display_path(options)
64
+ else
65
+ puts "#{new_path} no found"
66
+ end
67
+ end
68
+
69
+ def self.display_path(options)
70
+ puts "Current paths:"
71
+ options[:paths].each { |p| puts "+ #{p}" }
72
+ end
73
+
74
+ def self.show_options(options)
75
+ puts options
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,62 @@
1
+ require 'optparse'
2
+
3
+ module Freydis
4
+ class Options
5
+ attr_accessor :init, :backup, :restore, :encrypt,
6
+ :open, :close,
7
+ :disk
8
+
9
+ def initialize(args)
10
+ @init = false
11
+ @backup = false
12
+ @restore = false
13
+ @encrypt = false
14
+ @open = false
15
+ @close = false
16
+ @disk = nil
17
+ parse(args)
18
+ end
19
+
20
+ private
21
+
22
+ def parse(argv)
23
+ OptionParser.new do |opts|
24
+ opts.banner = "Usage: freydis.rb [options]"
25
+
26
+ opts.on("-i", "--init", "Create a config file.") do
27
+ @init = true
28
+ end
29
+
30
+ opts.on("-b", "--backup", "Perform a backup.") do
31
+ @backup = true
32
+ end
33
+
34
+ opts.on("-r", "--restore", "Restore saved datas on your system.") do
35
+ @restore = true
36
+ end
37
+
38
+ opts.on("-e", "--encrypt", "Encrypt your device.") do
39
+ @encrypt = true
40
+ end
41
+
42
+ opts.on("-o", "--open", "Open and mount encrypted device at /mnt/freydis.") do
43
+ @open = true
44
+ end
45
+
46
+ opts.on("-c", "--close", "Umount & close encrypted device.") do
47
+ @close = true
48
+ end
49
+
50
+ opts.on("-dNAME", "--disk NAME", "To use the disk NAME (e.g: sda, sdb).") do |disk|
51
+ @disk = disk if Freydis::Guard.disk? disk
52
+ end
53
+
54
+ begin
55
+ opts.parse!(argv)
56
+ rescue OptionParser::ParseError => e
57
+ STDERR.puts e.message, "\n", opts
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,53 @@
1
+ # lib/rsync.rb
2
+
3
+ module Freydis
4
+ class Rsync
5
+ def initialize(data)
6
+ @data = data
7
+ @mountpoint = '/mnt/freydis'
8
+ @exclude_paths = [
9
+ "/dev/*",
10
+ "/proc/*",
11
+ "/sys/*",
12
+ "/tmp/*",
13
+ "/run/*",
14
+ "/mnt/*",
15
+ "/media/*",
16
+ "/home/*/.thumbnails/*",
17
+ "/home/*/.cache/mozilla/*",
18
+ "/home/*/.cache/chromium/*",
19
+ "/home/*/.local/share/Trash/*",
20
+ "/lost+found",
21
+ ]
22
+ @opts = "-aAXHv"
23
+ end
24
+
25
+ def backup
26
+ add_config
27
+ exil = @exclude_paths * ","
28
+ save = @data.options[:paths] * " "
29
+ @opts += " --delete"
30
+ exec("rsync #{@opts} --exclude={#{exil}} #{save} #{@mountpoint}")
31
+ end
32
+
33
+ def restore
34
+ exil = @exclude_paths * ","
35
+ exec("rsync #{@opts} --exclude={#{exil}} #{@mountpoint} /")
36
+ end
37
+
38
+ private
39
+
40
+ def add_config
41
+ if !@data.options[:paths].include?("#{ENV['HOME']}/.config/freydis")
42
+ @data.options[:paths] << "#{ENV['HOME']}/.config/freydis"
43
+ end
44
+ end
45
+
46
+ def exec(command)
47
+ sudo = Process.uid != 0 ? 'sudo' : ''
48
+ if !system("#{sudo} #{command}")
49
+ raise StandardError, "[-] #{command}"
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,4 @@
1
+ module Freydis
2
+ VERSION = '0.0.2'.freeze
3
+ end
4
+
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: freydis
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - szorfein
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - certs/szorfein.pem
12
+ date: 2021-05-18 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: " Freydis is a CLI tool to encrypt a disk device, backup and restore
15
+ easyly. Freydis use `cryptsetup` and `rsync` mainly.\n"
16
+ email: szorfein@protonmail.com
17
+ executables:
18
+ - freydis
19
+ extensions: []
20
+ extra_rdoc_files:
21
+ - README.md
22
+ files:
23
+ - CHANGELOG.md
24
+ - LICENSE
25
+ - README.md
26
+ - Rakefile
27
+ - bin/freydis
28
+ - freydis.gemspec
29
+ - lib/freydis.rb
30
+ - lib/freydis/cryptsetup.rb
31
+ - lib/freydis/data.rb
32
+ - lib/freydis/disk.rb
33
+ - lib/freydis/guard.rb
34
+ - lib/freydis/init.rb
35
+ - lib/freydis/options.rb
36
+ - lib/freydis/rsync.rb
37
+ - lib/freydis/version.rb
38
+ homepage: https://github.com/szorfein/freydis
39
+ licenses:
40
+ - MIT
41
+ metadata:
42
+ bug_tracker_uri: https://github.com/szorfein/freydis/issues
43
+ changelog_uri: https://github.com/szorfein/freydis/blob/master/CHANGELOG.md
44
+ source_code_uri: https://github.com/szorfein/freydis
45
+ wiki_uri: https://github.com/szorfein/freydis/wiki
46
+ funding_uri: https://patreon.com/szorfein
47
+ post_install_message:
48
+ rdoc_options: []
49
+ require_paths:
50
+ - lib
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '2.6'
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ requirements:
62
+ - cryptsetup, v2.3
63
+ - rsync, v3.2
64
+ rubygems_version: 3.0.9
65
+ signing_key:
66
+ specification_version: 4
67
+ summary: Backup and Restore data from encrypted device.
68
+ test_files: []