revenc 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitattributes +1 -0
- data/.gitignore +30 -0
- data/CLONING.rdoc +108 -0
- data/LICENSE +20 -0
- data/README.rdoc +198 -0
- data/Rakefile +64 -0
- data/VERSION +1 -0
- data/bin/revenc +81 -0
- data/config/cucumber.yml +7 -0
- data/examples/rsync/encrypted_data/key/encfs6.xml +35 -0
- data/examples/rsync/revenc.conf +18 -0
- data/examples/rsync/scripts/passphrase +1 -0
- data/examples/rsync/unencrypted_data/test_file1.txt +1 -0
- data/examples/rsync/unencrypted_data/test_file2.txt +1 -0
- data/examples/simple/encfs6.xml +35 -0
- data/examples/simple/passphrase +1 -0
- data/examples/simple/unencrypted_data/test_file1.txt +1 -0
- data/examples/simple/unencrypted_data/test_file2.txt +1 -0
- data/features/app.feature +59 -0
- data/features/bin.feature +35 -0
- data/features/configuration.feature +98 -0
- data/features/copy.feature +169 -0
- data/features/generator.feature +15 -0
- data/features/mount.feature +133 -0
- data/features/step_definitions/.gitignore +0 -0
- data/features/step_definitions/revenc_steps.rb +64 -0
- data/features/support/aruba.rb +21 -0
- data/features/support/env.rb +4 -0
- data/features/support/hooks.rb +6 -0
- data/features/unmount.feature +58 -0
- data/lib/revenc/app.rb +128 -0
- data/lib/revenc/encfs_wrapper.rb +96 -0
- data/lib/revenc/errors.rb +78 -0
- data/lib/revenc/io.rb +265 -0
- data/lib/revenc/lockfile.rb +66 -0
- data/lib/revenc.rb +22 -0
- data/spec/revenc/error_spec.rb +50 -0
- data/spec/revenc/io_spec.rb +185 -0
- data/spec/revenc/lockfile_spec.rb +44 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/watchr.rb +142 -0
- metadata +179 -0
data/.document
ADDED
data/.gitattributes
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
*.rb diff=ruby
|
data/.gitignore
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
## mac os
|
2
|
+
.DS_Store
|
3
|
+
|
4
|
+
## textmate
|
5
|
+
*.tmproj
|
6
|
+
tmtags
|
7
|
+
|
8
|
+
## emacs
|
9
|
+
*~
|
10
|
+
\#*
|
11
|
+
.\#*
|
12
|
+
|
13
|
+
## vim
|
14
|
+
*.swp
|
15
|
+
|
16
|
+
## project::general
|
17
|
+
coverage
|
18
|
+
rdoc
|
19
|
+
pkg
|
20
|
+
*.gemspec
|
21
|
+
|
22
|
+
## cucumber
|
23
|
+
rerun.txt
|
24
|
+
|
25
|
+
## ctags
|
26
|
+
tags
|
27
|
+
|
28
|
+
## project::specific
|
29
|
+
tmp/fixtures
|
30
|
+
tmp/aruba
|
data/CLONING.rdoc
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
= Cloning from BasicApp
|
2
|
+
|
3
|
+
BasicApp provides no stand-alone functionality. It purpose is to
|
4
|
+
provide a repository for jump-starting a new RubyGem based CLI
|
5
|
+
application and provide a point to cloned applications to facilitate
|
6
|
+
pulling in future enhancements and fixes.
|
7
|
+
|
8
|
+
== Features/Dependencies
|
9
|
+
|
10
|
+
* Jeweler for RubyGem management http://github.com/technicalpickles/jeweler
|
11
|
+
* Rspec for unit testing http://github.com/dchelimsky/rspec
|
12
|
+
* Cucumber for functional testing http://github.com/tpope/vim-cucumber
|
13
|
+
* Aruba for CLI testing http://github.com/aslakhellesoy/aruba
|
14
|
+
|
15
|
+
== Jump-starting a new project with BasicApp
|
16
|
+
|
17
|
+
The following steps illustrate creating a new application called "oct." Oct
|
18
|
+
is a simple command line utility that prints file listing permissions in octal
|
19
|
+
notation.
|
20
|
+
|
21
|
+
cd ~/workspace
|
22
|
+
git clone git://github.com/robertwahler/basic_app.git oct
|
23
|
+
cd oct
|
24
|
+
|
25
|
+
=== Setup repository for cloned project
|
26
|
+
|
27
|
+
We are going to change the origin URL to our own server and setup a remote
|
28
|
+
for pulling in future BasicApp changes. If our own repo is setup at
|
29
|
+
git@red:oct.git, change the URL with sed:
|
30
|
+
|
31
|
+
sed -i 's/url =.*\.git$/url = git@red:oct.git/' .git/config
|
32
|
+
|
33
|
+
Push it up
|
34
|
+
|
35
|
+
git push origin master:refs/heads/master
|
36
|
+
|
37
|
+
Add BasicApp as remote
|
38
|
+
|
39
|
+
git remote add basic_app git://github.com/robertwahler/basic_app.git
|
40
|
+
|
41
|
+
=== Rename your application
|
42
|
+
|
43
|
+
We need to change the name of the application from basic_app to oct
|
44
|
+
|
45
|
+
git mv bin/basic_app bin/oct
|
46
|
+
git mv lib/basic_app.rb lib/oct.rb
|
47
|
+
git mv lib/basic_app lib/oct
|
48
|
+
|
49
|
+
# BasicApp => Oct
|
50
|
+
find ./bin -type f -exec sed -i 's/BasicApp/Oct/' '{}' +
|
51
|
+
find . -name *.rb -exec sed -i 's/BasicApp/Oct/' '{}' +
|
52
|
+
find . -name Rakefile -exec sed -i 's/BasicApp/Oct/' '{}' +
|
53
|
+
# basic_app => oct
|
54
|
+
find ./bin -type f -exec sed -i 's/basic_app/oct/' '{}' +
|
55
|
+
find ./spec -type f -exec sed -i 's/basic_app/oct/' '{}' +
|
56
|
+
find . -name *.rb -exec sed -i 's/basic_app/oct/' '{}' +
|
57
|
+
find . -name *.feature -exec sed -i 's/basic_app/oct/' '{}' +
|
58
|
+
find . -name Rakefile -exec sed -i 's/basic_app/oct/' '{}' +
|
59
|
+
|
60
|
+
Replace TODO's and update documentation
|
61
|
+
|
62
|
+
* Replace README.rdoc
|
63
|
+
* Replace LICENSE
|
64
|
+
* (OPTIONAL) git rm CLONING.rdoc
|
65
|
+
* Replace the TODO's in Rakefile and bin
|
66
|
+
|
67
|
+
Application should now be functional, lets test it
|
68
|
+
|
69
|
+
cucumber
|
70
|
+
|
71
|
+
Looks OK, commit it
|
72
|
+
|
73
|
+
git commit -a -m "renamed basic_app to oct"
|
74
|
+
|
75
|
+
== Merging of future BasicApp changes
|
76
|
+
|
77
|
+
Cherry picking method
|
78
|
+
|
79
|
+
git fetch basic_app
|
80
|
+
git cherry-pick a0f9745
|
81
|
+
|
82
|
+
Merge 2-step method
|
83
|
+
|
84
|
+
git fetch basic_app
|
85
|
+
git merge basic_app/master
|
86
|
+
|
87
|
+
Trusting pull of HEAD
|
88
|
+
|
89
|
+
git pull basic_app HEAD
|
90
|
+
|
91
|
+
Conflicted?
|
92
|
+
|
93
|
+
git mergetool
|
94
|
+
git commit
|
95
|
+
|
96
|
+
== Note on Patches/Pull Requests
|
97
|
+
|
98
|
+
* Fork the project.
|
99
|
+
* Make your feature addition or bug fix.
|
100
|
+
* Add tests for it. This is important so I don't break it in a
|
101
|
+
future version unintentionally.
|
102
|
+
* Commit, do not mess with rakefile, version, or history.
|
103
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
104
|
+
* Send me a pull request. Bonus points for topic branches.
|
105
|
+
|
106
|
+
== Copyright
|
107
|
+
|
108
|
+
Copyright (c) 2010 GearheadForHire, LLC. See LICENSE for details.
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010 GearheadForHire, LLC
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,198 @@
|
|
1
|
+
= Revenc
|
2
|
+
|
3
|
+
Mount an unencrypted folder as encrypted using EncFS and copy/synchronize the
|
4
|
+
encrypted files to untrusted destinations using rsync/cp
|
5
|
+
|
6
|
+
== Background
|
7
|
+
|
8
|
+
EncFS in reverse mode facilitates mounting an encrypted file system
|
9
|
+
from an unencrypted source folder. This allows keeping your files unencrypted
|
10
|
+
in a trusted environment while gaining the ability to encrypt on demand
|
11
|
+
i.e. when you want to rsync encrypted files off-site to an untrusted system.
|
12
|
+
|
13
|
+
== Why Revenc?
|
14
|
+
|
15
|
+
Revenc facilitates scripting EncFS reverse mounting and synchronizing by
|
16
|
+
providing a configuration framework and validating mounts before running tools
|
17
|
+
like rsync.
|
18
|
+
|
19
|
+
=== Benefits
|
20
|
+
|
21
|
+
* Provides conventions for EncFS reverse mounting
|
22
|
+
* Validates mountpoints before copying to prevent "rsync --delete" commands
|
23
|
+
from trying to sync empty folders
|
24
|
+
* Mount, unmount, and copy actions are protected by a mutex to prevent
|
25
|
+
recursion on long running copy/sync operations. (mount, unmount and
|
26
|
+
copy actions will fail if another instance of revenc is blocking)
|
27
|
+
* Allow short, easy to remember command lines when used with configuration files.
|
28
|
+
i.e. revenc mount, revenc unmount, revenc copy
|
29
|
+
|
30
|
+
== Installation
|
31
|
+
|
32
|
+
sudo gem install revenc
|
33
|
+
|
34
|
+
== Usage
|
35
|
+
|
36
|
+
revenc action [options]
|
37
|
+
|
38
|
+
=== Actions
|
39
|
+
|
40
|
+
==== Mount
|
41
|
+
|
42
|
+
Reverse mount using EncFS. Source and mountpoint are not required when
|
43
|
+
using a configuration file.
|
44
|
+
|
45
|
+
Mount: revenc mount <unencrypted source> <empty mountpoint>
|
46
|
+
|
47
|
+
This calls the executable "encfs" with the following by default:
|
48
|
+
|
49
|
+
cat <%= passphrasefile.name %> | ENCFS6_CONFIG=<%= keyfile.name %> \
|
50
|
+
<%= executable %> --stdinpass --reverse <%= source.name %> \
|
51
|
+
<%= mountpoint.name %> -- -o ro
|
52
|
+
|
53
|
+
==== Unmount
|
54
|
+
|
55
|
+
Unmount using EncFS. Mountpoint is required when specified by revenc.conf.
|
56
|
+
|
57
|
+
Unmount: revenc unmount <mountpoint>
|
58
|
+
|
59
|
+
This calls the executable "fusermount" with the following by default:
|
60
|
+
|
61
|
+
<%= executable %> -u <%= mountpoint.name %>
|
62
|
+
|
63
|
+
==== Copy
|
64
|
+
|
65
|
+
Recursive copy with "cp -r", for rsync copy, see examples. Source and destination
|
66
|
+
are not required when specified by revenc.conf.
|
67
|
+
|
68
|
+
Copy: revenc copy <source> <destination>
|
69
|
+
|
70
|
+
This calls the executable "cp" with the following by default:
|
71
|
+
|
72
|
+
<%= executable %> -r <%= source.name %> <%= destination.name %>
|
73
|
+
|
74
|
+
=== Setup
|
75
|
+
|
76
|
+
The following is a walk through of the steps used to create the example project
|
77
|
+
"simple" in the examples folder.
|
78
|
+
|
79
|
+
mkdir -p revenc/examples/simple/encrypted_mountpoint
|
80
|
+
mkdir -p revenc/examples/simple/unencrypted_data
|
81
|
+
mkdir -p revenc/examples/simple/copy_destination
|
82
|
+
|
83
|
+
cd revenc/examples/simple
|
84
|
+
|
85
|
+
echo "some stuff" > unencrypted_data/test_file1.txt
|
86
|
+
echo "some more stuff" > unencrypted_data/test_file2.txt
|
87
|
+
|
88
|
+
=== Create the EncFS passphrase file
|
89
|
+
|
90
|
+
You must supply EncFS with a passphrase in plain text. The passphrase is piped in on the command line
|
91
|
+
to EncFS. This file can be stored anywhere on your trusted system. Revenc expects it in the
|
92
|
+
current folder, use revenc.conf to supply a different location.
|
93
|
+
|
94
|
+
echo "my_super_secret_PassPHRase" > passphrase
|
95
|
+
chmod 600 passphrase
|
96
|
+
|
97
|
+
=== Generate the EncFS key file
|
98
|
+
|
99
|
+
Generation of your key file is done once. The same key is used for each mount action on the same
|
100
|
+
unencrypted source folder. You need to keep a copy of your key available in order to restore encrypted files.
|
101
|
+
EncFS doesn't supply a method to fully automate the generation of the key file with so it needs
|
102
|
+
to be done manually.
|
103
|
+
|
104
|
+
NOTE: The ENCFS6_CONFIG var is needed to control where the key file is created. The "${PWD}" is
|
105
|
+
used because EncFS expects full paths from the root folder.
|
106
|
+
|
107
|
+
ENCFS6_CONFIG=./encfs6.xml encfs --reverse ${PWD}/unencrypted_data ${PWD}/encrypted_mountpoint -- -o ro
|
108
|
+
|
109
|
+
You will see a message about encfs6.xml failing to load, this is OK. You should now be at the EncFS
|
110
|
+
command prompt. You can complete the key generation any way you like. The following are the responses
|
111
|
+
used to generate the sample key. Note the I opted to store filenames in plain text for clarity.
|
112
|
+
|
113
|
+
EncFS command prompt responses:
|
114
|
+
|
115
|
+
x # expert mode
|
116
|
+
1 # AES
|
117
|
+
128 # key size
|
118
|
+
1024 # block size
|
119
|
+
2 # Null => no encryption of filenames
|
120
|
+
my_super_secret_PassPHRase # passphrase we stored in the step above
|
121
|
+
my_super_secret_PassPHRase # confirm passphrase
|
122
|
+
|
123
|
+
|
124
|
+
EncFS should generate encfs6.xml, mount the folder and return you to the command prompt. You can
|
125
|
+
now work with your encrypted files.
|
126
|
+
|
127
|
+
ls encrypted_mountpoint
|
128
|
+
|
129
|
+
test_file1.txt test_file2.txt
|
130
|
+
|
131
|
+
revenc unmount encrypted_mountpoint
|
132
|
+
ls encrypted_mountpoint
|
133
|
+
|
134
|
+
<no files here>
|
135
|
+
|
136
|
+
revenc mount unencrypted_data encrypted_mountpoint
|
137
|
+
ls encrypted_mountpoint
|
138
|
+
|
139
|
+
test_file1.txt test_file2.txt
|
140
|
+
|
141
|
+
|
142
|
+
revenc copy encrypted_mountpoint copy_to_destination
|
143
|
+
ls copy_to_destination
|
144
|
+
|
145
|
+
test_file1.txt test_file2.txt
|
146
|
+
|
147
|
+
|
148
|
+
=== Configuration files
|
149
|
+
|
150
|
+
Revenc expects a passphrase file and the key file "encfs6.xml" to exist in the
|
151
|
+
current folder. You can override these locations using the revenc.conf file. Revenc
|
152
|
+
looks for its configuration file in the current folder. When you use configuration file,
|
153
|
+
you can ommit action parameters. For example:
|
154
|
+
|
155
|
+
cd examples/rsync
|
156
|
+
|
157
|
+
revenc mount
|
158
|
+
revenc copy
|
159
|
+
revenc unmount
|
160
|
+
|
161
|
+
The configuration file is YAML http://www.yaml.org/ format with ERB processing. You must
|
162
|
+
escape ERB in the action commands. These need to be lazy loaded by Revenc. Unescaped
|
163
|
+
ERB is evaluated as the configuration file is read but before Revenc parses the commands.
|
164
|
+
See the example configuration file examples/rsync/revenc.conf.
|
165
|
+
|
166
|
+
The file features/configuration.feature has more details.
|
167
|
+
|
168
|
+
|
169
|
+
== System Requirements
|
170
|
+
|
171
|
+
* POSIX system
|
172
|
+
* EncFS http://www.arg0.net/encfs
|
173
|
+
|
174
|
+
== Runtime Dependencies
|
175
|
+
|
176
|
+
* term-ansicolor
|
177
|
+
* configatron
|
178
|
+
|
179
|
+
== Development Dependencies
|
180
|
+
|
181
|
+
* rspec for unit testing http://github.com/dchelimsky/rspec
|
182
|
+
* cucumber for functional testing http://github.com/tpope/vim-cucumber
|
183
|
+
* aruba for CLI testing http://github.com/aslakhellesoy/aruba
|
184
|
+
|
185
|
+
== Note on Patches/Pull Requests
|
186
|
+
|
187
|
+
* Fork the project.
|
188
|
+
* Make your feature addition or bug fix.
|
189
|
+
* Add tests for it. This is important so I don't break it in a
|
190
|
+
future version unintentionally.
|
191
|
+
* Commit, do not mess with rakefile, version, or history.
|
192
|
+
(if you want to have your own version, that is fine but bump version
|
193
|
+
in a commit by itself I can ignore when I pull)
|
194
|
+
* Send me a pull request. Bonus points for topic branches.
|
195
|
+
|
196
|
+
== Copyright
|
197
|
+
|
198
|
+
Copyright (c) 2010 GearheadForHire, LLC. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "revenc"
|
8
|
+
gem.summary = %Q{Helper for reverse mounting encrypted file systems}
|
9
|
+
gem.description = %Q{Mount, unmount, and copy/synchronize encrypted files to
|
10
|
+
untrusted destinations using EncFS and rsync}
|
11
|
+
gem.email = "robert@gearheadforhire.com"
|
12
|
+
gem.homepage = "http://github.com/robertwahler/revenc"
|
13
|
+
gem.authors = ["Robert Wahler"]
|
14
|
+
|
15
|
+
gem.add_dependency 'term-ansicolor', '>= 1.0.4'
|
16
|
+
gem.add_dependency 'configatron', '>= 2.5.1'
|
17
|
+
|
18
|
+
gem.add_development_dependency "rspec", ">= 1.2.9"
|
19
|
+
gem.add_development_dependency "cucumber", ">= 0.6"
|
20
|
+
gem.add_development_dependency "aruba", ">= 0.1.7"
|
21
|
+
|
22
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
23
|
+
end
|
24
|
+
Jeweler::GemcutterTasks.new
|
25
|
+
rescue LoadError
|
26
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
27
|
+
end
|
28
|
+
|
29
|
+
require 'spec/rake/spectask'
|
30
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
31
|
+
spec.libs << 'lib' << 'spec'
|
32
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
33
|
+
end
|
34
|
+
|
35
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
36
|
+
spec.libs << 'lib' << 'spec'
|
37
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
38
|
+
spec.rcov = true
|
39
|
+
end
|
40
|
+
|
41
|
+
task :spec => :check_dependencies
|
42
|
+
|
43
|
+
begin
|
44
|
+
require 'cucumber/rake/task'
|
45
|
+
Cucumber::Rake::Task.new(:features)
|
46
|
+
|
47
|
+
task :features => :check_dependencies
|
48
|
+
rescue LoadError
|
49
|
+
task :features do
|
50
|
+
abort "Cucumber is not available. In order to run features, you must: sudo gem install cucumber"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
task :default => :spec
|
55
|
+
|
56
|
+
require 'rake/rdoctask'
|
57
|
+
Rake::RDocTask.new do |rdoc|
|
58
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
59
|
+
|
60
|
+
rdoc.rdoc_dir = 'rdoc'
|
61
|
+
rdoc.title = "Revenc #{version}"
|
62
|
+
rdoc.rdoc_files.include('README*')
|
63
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
64
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.2
|
data/bin/revenc
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
4
|
+
|
5
|
+
require 'revenc'
|
6
|
+
require 'optparse'
|
7
|
+
require 'term/ansicolor'
|
8
|
+
|
9
|
+
available_actions = Revenc::AVAILABLE_ACTIONS
|
10
|
+
|
11
|
+
banner = <<BANNER
|
12
|
+
Revenc is an encfs helper
|
13
|
+
|
14
|
+
Usage: revenc action [options]
|
15
|
+
BANNER
|
16
|
+
banner << "\nActions: #{available_actions.join(' ')}\n" unless available_actions.empty?
|
17
|
+
|
18
|
+
help = banner
|
19
|
+
help += <<HELP
|
20
|
+
Mount: revenc mount <unencrypted source> <empty mountpoint>
|
21
|
+
Unmount: revenc unmount <mounted encypted folder>
|
22
|
+
Copy: revenc copy <encrypted source> <destination>
|
23
|
+
Note: Copying is normally done via rsync
|
24
|
+
|
25
|
+
Options:
|
26
|
+
|
27
|
+
HELP
|
28
|
+
|
29
|
+
options = {}
|
30
|
+
OptionParser.new do |opts|
|
31
|
+
opts.banner = help
|
32
|
+
|
33
|
+
# set defaults
|
34
|
+
options[:verbose] = false
|
35
|
+
options[:coloring] = true
|
36
|
+
|
37
|
+
opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
|
38
|
+
options[:verbose] = v
|
39
|
+
end
|
40
|
+
|
41
|
+
opts.on("-c", "--[no-]coloring", "Ansi color in output") do |c|
|
42
|
+
options[:coloring] = c
|
43
|
+
end
|
44
|
+
|
45
|
+
opts.on("--version", "Display current version") do
|
46
|
+
puts "revenc, version " + Revenc.version
|
47
|
+
exit 0
|
48
|
+
end
|
49
|
+
|
50
|
+
opts.on("-d", "--dry-run", "Run action but omit the final execute step. Useful combined with --verbose") do |d|
|
51
|
+
options[:dry_run] = d
|
52
|
+
end
|
53
|
+
|
54
|
+
opts.on("--config FILE", "Load configuration options from FILE") do |file|
|
55
|
+
options[:config] = file
|
56
|
+
end
|
57
|
+
|
58
|
+
# no argument, shows at tail. This will print an options summary.
|
59
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
60
|
+
puts opts
|
61
|
+
exit 0
|
62
|
+
end
|
63
|
+
|
64
|
+
begin
|
65
|
+
opts.parse!
|
66
|
+
rescue OptionParser::InvalidOption => e
|
67
|
+
puts "revenc #{e}"
|
68
|
+
puts "revenc --help for more information"
|
69
|
+
exit 1
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
if STDOUT.isatty
|
75
|
+
Term::ANSIColor::coloring = options[:coloring]
|
76
|
+
else
|
77
|
+
Term::ANSIColor::coloring = false
|
78
|
+
end
|
79
|
+
|
80
|
+
app = Revenc::App.new(FileUtils.pwd, options)
|
81
|
+
app.run
|
data/config/cucumber.yml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
<%
|
2
|
+
rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
|
3
|
+
rerun_opts = rerun.to_s.strip.empty? ? "--format pretty features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
|
4
|
+
std_opts = "#{rerun_opts} --format rerun --out rerun.txt --strict --tags ~@wip"
|
5
|
+
%>
|
6
|
+
default: <%= std_opts %> --no-diff
|
7
|
+
wip: --tags @wip:3 --wip features
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
2
|
+
<!DOCTYPE boost_serialization>
|
3
|
+
<boost_serialization signature="serialization::archive" version="4">
|
4
|
+
<config class_id="0" tracking_level="1" version="20080816" object_id="_0">
|
5
|
+
<creator>EncFS 1.5</creator>
|
6
|
+
<cipherAlg class_id="1" tracking_level="0" version="0">
|
7
|
+
<name>ssl/aes</name>
|
8
|
+
<major>2</major>
|
9
|
+
<minor>2</minor>
|
10
|
+
</cipherAlg>
|
11
|
+
<nameAlg>
|
12
|
+
<name>nameio/null</name>
|
13
|
+
<major>1</major>
|
14
|
+
<minor>0</minor>
|
15
|
+
</nameAlg>
|
16
|
+
<keySize>128</keySize>
|
17
|
+
<blockSize>1024</blockSize>
|
18
|
+
<uniqueIV>0</uniqueIV>
|
19
|
+
<chainedNameIV>0</chainedNameIV>
|
20
|
+
<externalIVChaining>0</externalIVChaining>
|
21
|
+
<blockMACBytes>0</blockMACBytes>
|
22
|
+
<blockMACRandBytes>0</blockMACRandBytes>
|
23
|
+
<allowHoles>1</allowHoles>
|
24
|
+
<encodedKeySize>36</encodedKeySize>
|
25
|
+
<encodedKeyData>
|
26
|
+
unVmAfPQFd5t4cakBxbE7uosu4tzZbo8B513iGGNynzArOKM=
|
27
|
+
</encodedKeyData>
|
28
|
+
<saltLen>20</saltLen>
|
29
|
+
<saltData>
|
30
|
+
IcFy11sZw/w7juCI+Cro8AZVp6Q
|
31
|
+
</saltData>
|
32
|
+
<kdfIterations>97493</kdfIterations>
|
33
|
+
<desiredKDFDuration>500</desiredKDFDuration>
|
34
|
+
</config>
|
35
|
+
</boost_serialization>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
mount:
|
2
|
+
source:
|
3
|
+
name: unencrypted_data
|
4
|
+
mountpoint:
|
5
|
+
name: encrypted_data/mountpoint
|
6
|
+
passphrasefile:
|
7
|
+
name: scripts/passphrase
|
8
|
+
keyfile:
|
9
|
+
name: encrypted_data/key/encfs6.xml
|
10
|
+
cmd: cat <%%= passphrasefile.name %> | ENCFS6_CONFIG=<%%= keyfile.name %> <%%= executable %> --stdinpass --reverse <%%= source.name %> <%%= mountpoint.name %> -- -o ro
|
11
|
+
copy:
|
12
|
+
source:
|
13
|
+
name: encrypted_data # sync the encrypted data as well as the key
|
14
|
+
destination:
|
15
|
+
name: copy_destination # could be a remote host instead of a folder, i.e. user1@example.com:backups/here
|
16
|
+
executable: rsync
|
17
|
+
cmd: <%%= executable %> --perms --links --times --recursive --verbose --compress --stats --human-readable --inplace <%%= source.name %> <%%= destination.name %>
|
18
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
test
|
@@ -0,0 +1 @@
|
|
1
|
+
some stuff
|
@@ -0,0 +1 @@
|
|
1
|
+
some more stuff
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
2
|
+
<!DOCTYPE boost_serialization>
|
3
|
+
<boost_serialization signature="serialization::archive" version="4">
|
4
|
+
<config class_id="0" tracking_level="1" version="20080816" object_id="_0">
|
5
|
+
<creator>EncFS 1.5</creator>
|
6
|
+
<cipherAlg class_id="1" tracking_level="0" version="0">
|
7
|
+
<name>ssl/aes</name>
|
8
|
+
<major>2</major>
|
9
|
+
<minor>2</minor>
|
10
|
+
</cipherAlg>
|
11
|
+
<nameAlg>
|
12
|
+
<name>nameio/null</name>
|
13
|
+
<major>1</major>
|
14
|
+
<minor>0</minor>
|
15
|
+
</nameAlg>
|
16
|
+
<keySize>128</keySize>
|
17
|
+
<blockSize>1024</blockSize>
|
18
|
+
<uniqueIV>0</uniqueIV>
|
19
|
+
<chainedNameIV>0</chainedNameIV>
|
20
|
+
<externalIVChaining>0</externalIVChaining>
|
21
|
+
<blockMACBytes>0</blockMACBytes>
|
22
|
+
<blockMACRandBytes>0</blockMACRandBytes>
|
23
|
+
<allowHoles>1</allowHoles>
|
24
|
+
<encodedKeySize>36</encodedKeySize>
|
25
|
+
<encodedKeyData>
|
26
|
+
BjZ2dl0VE8ezDBvAwgxLo1ODmnrLlawYrlfhG8Fe3wcQBzZu=
|
27
|
+
</encodedKeyData>
|
28
|
+
<saltLen>20</saltLen>
|
29
|
+
<saltData>
|
30
|
+
tPmiXlNgrbvvSlnGcqe4aCjGWGY
|
31
|
+
</saltData>
|
32
|
+
<kdfIterations>83342</kdfIterations>
|
33
|
+
<desiredKDFDuration>500</desiredKDFDuration>
|
34
|
+
</config>
|
35
|
+
</boost_serialization>
|
@@ -0,0 +1 @@
|
|
1
|
+
my_super_secret_PassPHRase
|
@@ -0,0 +1 @@
|
|
1
|
+
some stuff
|
@@ -0,0 +1 @@
|
|
1
|
+
some more stuff
|