freydis 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +12 -0
- data/LICENSE +10 -0
- data/README.md +62 -0
- data/Rakefile +21 -0
- data/bin/freydis +53 -0
- data/freydis.gemspec +33 -0
- data/lib/freydis.rb +12 -0
- data/lib/freydis/cryptsetup.rb +74 -0
- data/lib/freydis/data.rb +39 -0
- data/lib/freydis/disk.rb +81 -0
- data/lib/freydis/guard.rb +9 -0
- data/lib/freydis/init.rb +78 -0
- data/lib/freydis/options.rb +62 -0
- data/lib/freydis/rsync.rb +53 -0
- data/lib/freydis/version.rb +4 -0
- metadata +68 -0
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
|
data/lib/freydis/data.rb
ADDED
@@ -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
|
data/lib/freydis/disk.rb
ADDED
@@ -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
|
data/lib/freydis/init.rb
ADDED
@@ -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
|
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: []
|