boxafe 0.0.1 → 0.1.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.
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2011 Alpha Hydrae
1
+ Copyright (c) 2013 Simon Oulevay (Alpha Hydrae)
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,6 +1,123 @@
1
1
  # boxafe
2
2
 
3
- **Secure your Dropbox with encfs.**
3
+ [![Gem Version](https://badge.fury.io/rb/boxafe.png)](http://badge.fury.io/rb/boxafe)
4
+ [![Dependency Status](https://gemnasium.com/AlphaHydrae/boxafe.png)](https://gemnasium.com/AlphaHydrae/boxafe)
5
+ [![Build Status](https://secure.travis-ci.org/AlphaHydrae/boxafe.png)](http://travis-ci.org/AlphaHydrae/boxafe)
6
+
7
+ Boxafe mounts EncFS filesystems or "boxes" that you define in a configuration file with a friendly DSL.
8
+ It can also mount them on startup.
9
+
10
+ **Note: Currently supports OS X. Partial Linux support.**
11
+
12
+ ## Installation
13
+
14
+ gem install boxafe
15
+
16
+ ## Configuration
17
+
18
+ Location: `~/.boxafe.rb`
19
+
20
+ ```rb
21
+ # mount a box (this will prompt for your password)
22
+ box do
23
+ name 'A box'
24
+ root '/secure/abox'
25
+ mount '/Volumes/abox'
26
+ end
27
+ # this command is run:
28
+ # encfs "/secure/abox" "/Volumes/abox" -- -ovolname="A box"
29
+
30
+ # get the password from the OS X keychain
31
+ box do
32
+ name 'Keychain box'
33
+ root '/secure/keychain-box'
34
+ mount '/Volumes/keychain-box'
35
+ keychain 'keychain-box-password'
36
+ end
37
+ # adds an extpass to the command:
38
+ # --extpass="security 2>&1 >/dev/null find-generic-password -gl 'keychain-box-password'
39
+
40
+ # specify a custom path to the encfs XML configuration file
41
+ box do
42
+ name 'Custom box'
43
+ root '/secure/custom-box'
44
+ mount '/Volumes/custom-box'
45
+ encfs_config '/secure/.custom-box.encfs6.xml'
46
+ end
47
+ # adds an environment variable:
48
+ # ENCFS6_CONFIG="/secure/.custom-box.encfs6.xml"
49
+
50
+ # use a volume name different than the name
51
+ box do
52
+ name 'Volume box'
53
+ root '/secure/volume-box'
54
+ mount '/Volumes/volume-box'
55
+ volume 'Secure Volume'
56
+ end
57
+ # changes the ovolname option
58
+
59
+ # use a hash configuration
60
+ config = {
61
+ name: 'Hash box',
62
+ root: '/secure/hash-box',
63
+ mount: '/Volumes/hash-box'
64
+ }
65
+ box config
66
+
67
+ # load configuration from environment variables
68
+ box env(:box_name, :box_root, :box_mount) # Reads $BOX_NAME, $BOX_ROOT, $BOX_MOUNT
69
+
70
+ # customize path to binaries
71
+ encfs '/opt/local/bin/encfs'
72
+ umount '/usr/local/bin/umount'
73
+ ```
74
+
75
+ ## Usage
76
+
77
+ ```bash
78
+ # mount/unmount all defined boxes
79
+ boxafe mount
80
+ boxafe unmount
81
+
82
+ # mount/unmount one box
83
+ boxafe mount 'A box'
84
+ boxafe unmount 'A box'
85
+
86
+ # check what boxes are mounted
87
+ boxafe status
88
+
89
+ # mount all boxes on startup (currently only on OS X)
90
+ boxafe start
91
+
92
+ # stop boxes from mounting on startup
93
+ boxafe stop
94
+ ```
95
+
96
+ ## Compatibility
97
+
98
+ Boxafe is currently geared towards OS X with partial Linux support.
99
+
100
+ Cron scheduling is partially implemented with [whenever](https://github.com/javan/whenever),
101
+ and other extpass methods like a password file would be helpful.
102
+
103
+ ## Contributing
104
+
105
+ * [Fork](https://help.github.com/articles/fork-a-repo)
106
+ * Create a topic branch - `git checkout -b my_branch`
107
+ * Push to your branch - `git push origin my_branch`
108
+ * Create a [pull request](http://help.github.com/pull-requests/) from your branch
109
+
110
+ Please add a changelog entry for new features and bug fixes.
111
+
112
+ Writing specs will get your code pulled faster.
113
+
114
+ ## Roadmap
115
+
116
+ This is the list of planned features/changes:
117
+
118
+ * Complete test suite.
119
+ * Get password from a file.
120
+ * Cron scheduling with [whenever](https://github.com/javan/whenever).
4
121
 
5
122
  ## Meta
6
123
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.1.0
data/bin/boxafe CHANGED
@@ -1,2 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
- require File.join(File.dirname(__FILE__), '..', 'lib', 'program')
2
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'boxafe')
3
+ Boxafe::Program.new.run!
data/lib/boxafe/box.rb ADDED
@@ -0,0 +1,104 @@
1
+ # encoding: UTF-8
2
+ require 'fileutils'
3
+
4
+ class Boxafe::Box
5
+
6
+ OPTION_KEYS = [ :name, :root, :mount, :volume, :config, :keychain ]
7
+
8
+ def initialize options = {}
9
+
10
+ raise Boxafe::Error, "The :name option is required" unless options[:name]
11
+
12
+ @options = options
13
+ end
14
+
15
+ def name
16
+ @options[:name]
17
+ end
18
+
19
+ def mount
20
+ system encfs.command
21
+ end
22
+
23
+ def unmount
24
+ opts = options
25
+ result = system "#{opts[:umount]} #{opts[:mount]}"
26
+ sleep opts[:umount_delay] if opts[:umount_delay] and opts[:umount_delay] > 0
27
+ result
28
+ end
29
+
30
+ def encfs
31
+ Boxafe::Encfs.new options
32
+ end
33
+
34
+ def ensure_mount_point
35
+ FileUtils.mkdir_p options[:mount]
36
+ end
37
+
38
+ def description verbose = false
39
+ opts = options
40
+ String.new.tap do |s|
41
+
42
+ s << Paint["## #{name}", :cyan, :bold]
43
+ s << "\nEncrypted Root: "
44
+ s << if File.directory?(opts[:root])
45
+ Paint["#{opts[:root]}", :green]
46
+ elsif File.exists?(opts[:root])
47
+ Paint["#{opts[:root]} (not a directory)", :red]
48
+ else
49
+ Paint["#{opts[:root]} (doesn't exist)", :red]
50
+ end
51
+
52
+ s << "\nMount Point: "
53
+ s << case mount_status
54
+ when :mounted
55
+ Paint["#{opts[:mount]}", :green]
56
+ when :invalid
57
+ Paint["#{opts[:mount]} (not a directory)", :red]
58
+ else
59
+ Paint["#{opts[:mount]} (not mounted)", :yellow]
60
+ end
61
+
62
+ s << "\nVolume Name: #{opts[:volume]}"
63
+ s << "\nKeychain Password: #{opts[:keychain]}" if opts[:keychain]
64
+ s << "\nEncFS Config: #{opts[:config]}" if opts[:config]
65
+
66
+ s << "\nCommand: #{Paint[encfs.command, :yellow]}" if verbose
67
+ end
68
+ end
69
+
70
+ def mount_status
71
+ if File.directory? options[:mount]
72
+ :mounted
73
+ elsif File.exists? options[:mount]
74
+ :invalid
75
+ else
76
+ :unmounted
77
+ end
78
+ end
79
+
80
+ def configure options = {}, &block
81
+ @options.merge! options
82
+ DSL.new(@options).instance_eval &block if block
83
+ self
84
+ end
85
+
86
+ def options
87
+ @options.tap do |opts|
88
+ opts[:root] = File.expand_path opts[:root] || "~/Dropbox/#{opts[:name]}"
89
+ opts[:mount] = File.expand_path opts[:mount] || "/Volumes/#{opts[:name]}"
90
+ opts[:config] = File.expand_path opts[:config] if opts[:config]
91
+ opts[:volume] ||= opts[:name]
92
+ opts[:keychain] = opts[:name] if opts[:keychain] == true
93
+ end
94
+ end
95
+
96
+ class DSL
97
+
98
+ def initialize options
99
+ @options = options
100
+ end
101
+
102
+ OPTION_KEYS.each{ |name| define_method(name){ |value| @options[name] = value } }
103
+ end
104
+ end
data/lib/boxafe/cli.rb ADDED
@@ -0,0 +1,93 @@
1
+ # encoding: UTF-8
2
+ class Boxafe::CLI
3
+
4
+ def start options = {}
5
+ # TODO: allow to mount only specific boxes
6
+ # TODO: only allow boxes with an extpass
7
+ Boxafe::Scheduler.platform_scheduler(options).start
8
+ end
9
+
10
+ def stop options = {}
11
+ Boxafe::Scheduler.platform_scheduler(options).stop
12
+ end
13
+
14
+ def status options = {}
15
+
16
+ config = load_config options
17
+
18
+ puts
19
+ puts Paint["# Boxafe v#{Boxafe::VERSION}", :bold]
20
+
21
+ config.boxes.each do |box|
22
+ puts
23
+ puts box.description(options[:verbose])
24
+ end
25
+
26
+ puts
27
+ end
28
+
29
+ def mount *args
30
+
31
+ options = args.last.kind_of?(Hash) ? args.pop : {}
32
+ config = load_config options
33
+
34
+ # FIXME: crashes with unknown box names
35
+ boxes = args.empty? ? config.boxes : args.collect{ |arg| config.boxes.find{ |box| box.name == arg } }
36
+
37
+ puts
38
+ boxes.each do |box|
39
+
40
+ print "Mounting #{box.name}... "
41
+ case box.mount_status
42
+ when :mounted
43
+ puts Paint['already mounted', :green]
44
+ next
45
+ when :invalid
46
+ puts Paint['invalid mount point', :red]
47
+ next
48
+ end
49
+
50
+ box.ensure_mount_point
51
+ box.mount
52
+
53
+ puts case box.mount_status
54
+ when :mounted
55
+ Paint['mounted', :green]
56
+ else
57
+ Paint['could not be mounted', :red]
58
+ end
59
+ end
60
+
61
+ puts
62
+ end
63
+
64
+ def unmount *args
65
+
66
+ options = args.last.kind_of?(Hash) ? args.pop : {}
67
+ config = load_config options
68
+
69
+ boxes = args.empty? ? config.boxes : args.collect{ |arg| config.boxes.find{ |box| box.name == arg } }
70
+
71
+ puts
72
+ boxes.each do |box|
73
+
74
+ print "Umounting #{box.name}... "
75
+ box.unmount
76
+
77
+ puts case box.mount_status
78
+ when :unmounted
79
+ Paint['unmounted', :green]
80
+ else
81
+ Paint['could not be unmounted', :red]
82
+ end
83
+ end
84
+
85
+ puts
86
+ end
87
+
88
+ private
89
+
90
+ def load_config options = {}
91
+ Boxafe::Config.new(options).load
92
+ end
93
+ end
@@ -0,0 +1,50 @@
1
+ # encoding: UTF-8
2
+ class Boxafe::Config
3
+
4
+ # TODO: document unmount_delay
5
+ OPTION_KEYS = [ :encfs, :umount, :umount_delay ]
6
+
7
+ attr_reader :boxes, :options
8
+
9
+ def initialize options = {}
10
+ @boxes = []
11
+ @options = { encfs: 'encfs', umount: 'umount', umount_delay: 0.5 }.merge options
12
+ end
13
+
14
+ def configure file = nil, &block
15
+ DSL.new(self).tap do |dsl|
16
+ dsl.instance_eval File.read(file), file if file
17
+ dsl.instance_eval &block if block
18
+ end
19
+ self
20
+ end
21
+
22
+ def load
23
+ configure file
24
+ end
25
+
26
+ def file
27
+ File.expand_path [ @options[:config], ENV['BOXAFE_CONFIG'], "~/.boxafe.rb" ].compact.first
28
+ end
29
+
30
+ class DSL
31
+
32
+ def initialize config
33
+ @config = config
34
+ end
35
+
36
+ def box options = {}, &block
37
+ Boxafe::Box.new(@config.options.merge(options)).tap do |box|
38
+ @config.boxes << box.configure(&block)
39
+ end
40
+ end
41
+
42
+ def env *args
43
+ Mutaconf.env *args
44
+ end
45
+
46
+ OPTION_KEYS.each do |name|
47
+ define_method(name){ |value| @config.options[name.to_sym] = value }
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: UTF-8
2
+ require 'fileutils'
3
+
4
+ class Boxafe::Encfs
5
+
6
+ def initialize options = {}
7
+ @options = options
8
+ end
9
+
10
+ def command
11
+ [ encfs_config, @options[:encfs], %/"#{@options[:root]}"/, %/"#{@options[:mount]}"/, extpass, '--', volname ].compact.join ' '
12
+ end
13
+
14
+ private
15
+
16
+ def volname
17
+ %/-ovolname="#{@options[:volume]}"/
18
+ end
19
+
20
+ def extpass
21
+ if @options[:keychain]
22
+ %*--extpass="security 2>&1 >/dev/null find-generic-password -gl '#{@options[:keychain]}' |grep password|cut -d \\\\\\" -f 2"*
23
+ else
24
+ nil
25
+ end
26
+ end
27
+
28
+ def encfs_config
29
+ @options[:encfs_config] ? %/ENCFS6_CONFIG="#{File.expand_path @options[:encfs_config]}"/ : nil
30
+ end
31
+ end
@@ -0,0 +1,96 @@
1
+ # encoding: UTF-8
2
+ require 'commander'
3
+
4
+ class Boxafe::Program < Commander::Runner
5
+
6
+ GLOBAL_OPTIONS = [ :config, :verbose ]
7
+ BACKTRACE_NOTICE = ' (use --trace to view backtrace)'
8
+
9
+ include Commander::UI
10
+ include Commander::UI::AskForClass
11
+
12
+ def initialize argv = ARGV
13
+ super argv
14
+
15
+ program :name, 'boxafe'
16
+ program :version, Boxafe::VERSION
17
+ program :description, 'Secure your Dropbox with encfs.'
18
+
19
+ global_option '-c', '--config PATH', 'Use a custom configuration file (defaults to ~/.boxafe.rb)'
20
+ global_option '--verbose', 'Increase verbosity'
21
+
22
+ command :status do |c|
23
+ c.syntax = 'boxafe status'
24
+ c.description = 'Display the current status and configuration'
25
+ c.action do |args,options|
26
+ to_trace_or_not_to_trace do
27
+ cli.status extract(options)
28
+ end
29
+ end
30
+ end
31
+
32
+ command :mount do |c|
33
+ c.syntax = 'boxafe mount'
34
+ c.description = 'Mount configured boxes with EncFS'
35
+ c.action do |args,options|
36
+ to_trace_or_not_to_trace do
37
+ cli.mount *args
38
+ end
39
+ end
40
+ end
41
+
42
+ command :unmount do |c|
43
+ c.syntax = 'boxafe unmount'
44
+ c.description = 'Unmount configured boxes'
45
+ c.action do |args,options|
46
+ to_trace_or_not_to_trace do
47
+ cli.unmount *args
48
+ end
49
+ end
50
+ end
51
+
52
+ command :start do |c|
53
+ c.syntax = 'boxafe start'
54
+ c.description = 'Configure boxafe to run on startup'
55
+ c.action do |args,options|
56
+ to_trace_or_not_to_trace do
57
+ cli.start *(args.push extract(options))
58
+ end
59
+ end
60
+ end
61
+
62
+ command :stop do |c|
63
+ c.syntax = 'boxafe stop'
64
+ c.description = 'Stop boxafe from running on startup'
65
+ c.action do |args,options|
66
+ to_trace_or_not_to_trace do
67
+ cli.stop *(args.push extract(options))
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ def cli
76
+ Boxafe::CLI.new
77
+ end
78
+
79
+ def to_trace_or_not_to_trace trace = false
80
+ begin
81
+ yield
82
+ rescue Boxafe::Error => e
83
+ if trace
84
+ raise e
85
+ else
86
+ warn Paint["#{e.message}#{BACKTRACE_NOTICE}", :red]
87
+ exit e.code
88
+ end
89
+ end
90
+ end
91
+
92
+ def extract *args
93
+ options = args.pop
94
+ (args | GLOBAL_OPTIONS).inject({}){ |memo,k| memo[k] = options.__send__(k); memo }.reject{ |k,v| v.nil? }
95
+ end
96
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: UTF-8
2
+ #require 'whenever'
3
+
4
+ class Boxafe::Scheduler::Cron < Boxafe::Scheduler
5
+
6
+ def start
7
+ raise 'Not yet implemented on this operating system'
8
+ Whenever::CommandLine.execute block: mount_schedule, write: true, identifier: 'boxafe-mount'
9
+ end
10
+
11
+ def stop
12
+ raise 'Not yet implemented on this operating system'
13
+ Whenever::CommandLine.execute block: mount_schedule, clear: true, identifier: 'boxafe-mount'
14
+ end
15
+
16
+ private
17
+
18
+ def self.mount_schedule
19
+ Proc.new do
20
+ every 1.minute do
21
+ command 'echo $(date) > /Users/unknow/Projects/boxafe/bar.txt'
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,39 @@
1
+ # encoding: UTF-8
2
+ require 'launchdr'
3
+ require 'fileutils'
4
+
5
+ class Boxafe::Scheduler::Launchd < Boxafe::Scheduler
6
+
7
+ def start
8
+ stop
9
+ plist.dump USER_AGENT
10
+ plist.load!
11
+ end
12
+
13
+ def stop
14
+ return false unless plist_exists?
15
+ plist.unload!
16
+ FileUtils.rm_f plist.file
17
+ end
18
+
19
+ private
20
+
21
+ LABEL = 'com.alphahydrae.boxafe'
22
+ USER_AGENT = LaunchDr::Launchd::Paths[:user_agent]
23
+
24
+ def plist_exists?
25
+ begin
26
+ File.exists? plist.file
27
+ rescue
28
+ false
29
+ end
30
+ end
31
+
32
+ def plist
33
+ @plist ||= LaunchDr::Launchd.new(LABEL).tap do |plist|
34
+ plist[:ProgramArguments] = [ 'boxafe', 'mount' ]
35
+ plist[:RunAtLoad] = true
36
+ plist[:EnvironmentVariables] = { 'PATH' => ENV['PATH'] } # TODO: add path option
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,18 @@
1
+ # encoding: UTF-8
2
+ class Boxafe::Scheduler
3
+
4
+ def self.platform_scheduler options = {}
5
+ case RbConfig::CONFIG['host_os']
6
+ when /darwin/i
7
+ Boxafe::Scheduler::Launchd.new options
8
+ else
9
+ Boxafe::Scheduler::Cron.new options
10
+ end
11
+ end
12
+
13
+ def initialize options = {}
14
+ @options = options
15
+ end
16
+ end
17
+
18
+ Dir[File.join File.dirname(__FILE__), File.basename(__FILE__, '.*'), '*.rb'].each{ |lib| require lib }
data/lib/boxafe.rb CHANGED
@@ -1,8 +1,20 @@
1
1
  # encoding: UTF-8
2
2
  require 'paint'
3
+ require 'dotenv'
4
+ require 'mutaconf'
3
5
 
4
6
  module Boxafe
5
- VERSION = '0.0.1'
7
+ VERSION = '0.1.0'
8
+
9
+ # TODO: add detailed error description for non-trace mode
10
+ class Error < StandardError
11
+ attr_reader :code
12
+
13
+ def initialize msg, code = 1
14
+ super msg
15
+ @code = code
16
+ end
17
+ end
6
18
  end
7
19
 
8
20
  Dir[File.join File.dirname(__FILE__), File.basename(__FILE__, '.*'), '*.rb'].each{ |lib| require lib }
metadata CHANGED
@@ -1,18 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: boxafe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
- - AlphaHydrae
8
+ - Simon Oulevay (AlphaHydrae)
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-04-11 00:00:00.000000000 Z
12
+ date: 2013-07-09 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: paint
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
19
  - - ~>
18
20
  - !ruby/object:Gem::Version
@@ -20,6 +22,7 @@ dependencies:
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
27
  - - ~>
25
28
  - !ruby/object:Gem::Version
@@ -27,6 +30,7 @@ dependencies:
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: commander
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
35
  - - ~>
32
36
  - !ruby/object:Gem::Version
@@ -34,183 +38,118 @@ dependencies:
34
38
  type: :runtime
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
43
  - - ~>
39
44
  - !ruby/object:Gem::Version
40
45
  version: 4.1.2
41
46
  - !ruby/object:Gem::Dependency
42
- name: whenever
47
+ name: which_works
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
51
  - - ~>
46
52
  - !ruby/object:Gem::Version
47
- version: 0.8.2
53
+ version: 1.0.0
48
54
  type: :runtime
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
59
  - - ~>
53
60
  - !ruby/object:Gem::Version
54
- version: 0.8.2
61
+ version: 1.0.0
55
62
  - !ruby/object:Gem::Dependency
56
- name: bundler
63
+ name: dotenv
57
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
58
66
  requirements:
59
- - - '>='
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - '>='
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: rake
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - '>='
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - '>='
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: rspec
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - '>='
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - '>='
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: jeweler
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - '>='
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - '>='
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: gemcutter
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - '>='
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - '>='
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
- - !ruby/object:Gem::Dependency
126
- name: gem-release
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - '>='
67
+ - - ~>
130
68
  - !ruby/object:Gem::Version
131
- version: '0'
132
- type: :development
69
+ version: 0.8.0
70
+ type: :runtime
133
71
  prerelease: false
134
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
135
74
  requirements:
136
- - - '>='
75
+ - - ~>
137
76
  - !ruby/object:Gem::Version
138
- version: '0'
77
+ version: 0.8.0
139
78
  - !ruby/object:Gem::Dependency
140
- name: rake-version
79
+ name: mutaconf
141
80
  requirement: !ruby/object:Gem::Requirement
81
+ none: false
142
82
  requirements:
143
- - - '>='
83
+ - - ~>
144
84
  - !ruby/object:Gem::Version
145
- version: '0'
146
- type: :development
85
+ version: 0.2.0
86
+ type: :runtime
147
87
  prerelease: false
148
88
  version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
149
90
  requirements:
150
- - - '>='
91
+ - - ~>
151
92
  - !ruby/object:Gem::Version
152
- version: '0'
93
+ version: 0.2.0
153
94
  - !ruby/object:Gem::Dependency
154
- name: simplecov
95
+ name: launchdr
155
96
  requirement: !ruby/object:Gem::Requirement
97
+ none: false
156
98
  requirements:
157
- - - '>='
99
+ - - '='
158
100
  - !ruby/object:Gem::Version
159
- version: '0'
160
- type: :development
101
+ version: '3'
102
+ type: :runtime
161
103
  prerelease: false
162
104
  version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
163
106
  requirements:
164
- - - '>='
107
+ - - '='
165
108
  - !ruby/object:Gem::Version
166
- version: '0'
167
- description: Boxafe encrypts and auto-mounts a folder with encfs and whenever.
168
- email: hydrae.alpha@gmail.com
169
- executables:
170
- - boxafe
109
+ version: '3'
110
+ description: Boxafe mounts EncFS filesystems or "boxes" that you define in a configuration
111
+ file with a friendly DSL.
112
+ email: contact@alphahydrae.com
113
+ executables: []
171
114
  extensions: []
172
- extra_rdoc_files:
173
- - LICENSE.txt
174
- - README.md
115
+ extra_rdoc_files: []
175
116
  files:
176
- - .rspec
177
- - .ruby-gemset
178
- - .ruby-version
179
- - .screenrc
180
- - .travis.yml
181
- - Gemfile
182
- - Gemfile.lock
117
+ - bin/boxafe
118
+ - lib/boxafe.rb
119
+ - lib/boxafe/box.rb
120
+ - lib/boxafe/cli.rb
121
+ - lib/boxafe/config.rb
122
+ - lib/boxafe/encfs.rb
123
+ - lib/boxafe/program.rb
124
+ - lib/boxafe/scheduler.rb
125
+ - lib/boxafe/scheduler/cron.rb
126
+ - lib/boxafe/scheduler/launchd.rb
183
127
  - LICENSE.txt
184
128
  - README.md
185
- - Rakefile
186
129
  - VERSION
187
- - bin/boxafe
188
- - lib/boxafe.rb
189
- - lib/program.rb
190
- - spec/helper.rb
191
- - spec/version_spec.rb
192
130
  homepage: http://github.com/AlphaHydrae/boxafe
193
131
  licenses:
194
132
  - MIT
195
- metadata: {}
196
133
  post_install_message:
197
134
  rdoc_options: []
198
135
  require_paths:
199
136
  - lib
200
137
  required_ruby_version: !ruby/object:Gem::Requirement
138
+ none: false
201
139
  requirements:
202
- - - '>='
140
+ - - ! '>='
203
141
  - !ruby/object:Gem::Version
204
142
  version: '0'
205
143
  required_rubygems_version: !ruby/object:Gem::Requirement
144
+ none: false
206
145
  requirements:
207
- - - '>='
146
+ - - ! '>='
208
147
  - !ruby/object:Gem::Version
209
148
  version: '0'
210
149
  requirements: []
211
150
  rubyforge_project:
212
- rubygems_version: 2.0.3
151
+ rubygems_version: 1.8.25
213
152
  signing_key:
214
- specification_version: 4
215
- summary: Secure your Dropbox with encfs.
153
+ specification_version: 3
154
+ summary: Secure your Dropbox with EncFS.
216
155
  test_files: []
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 4de5c77095d8c7c91c9b6169b98c67b020e2d397
4
- data.tar.gz: cd7ea69c1b18cd33717a5f1fc02e42752aee9f16
5
- SHA512:
6
- metadata.gz: 512a2e21e634c9d949eee1c3c27e691e96e58040f55995ba9535b94fb026ff44111faf925a22031819be4dcf1c3d171eb4de105a0dda45b4315a0c431d9e8f28
7
- data.tar.gz: 1e6c18d68ab00611a7ca82c62023df3e5e3691c7df775ca58245f1de108d6ecd68617e4701379fa97da8993aa6c7bd225d6c37171f2d2bc26b19deb4cf0e56ec
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --color
2
- --format doc
data/.ruby-gemset DELETED
@@ -1 +0,0 @@
1
- boxafe
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- 2.0.0
data/.screenrc DELETED
@@ -1,8 +0,0 @@
1
- source $HOME/.screenrc
2
-
3
- screen -t vim 0
4
- stuff "\${PROJECT_EDITOR-\$EDITOR}\012"
5
- screen -t zsh 1
6
- screen -t spec 2
7
- stuff "rake"
8
- select vim
data/.travis.yml DELETED
@@ -1,5 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 1.8.7
4
- - 1.9.2
5
- - 1.9.3
data/Gemfile DELETED
@@ -1,21 +0,0 @@
1
- source "http://rubygems.org"
2
- # Add dependencies required to use your gem here.
3
- # Example:
4
- # gem "activesupport", ">= 2.3.5"
5
-
6
- gem 'paint', '~> 0.8.5'
7
- gem 'commander', '~> 4.1.2'
8
- gem 'whenever', '~> 0.8.2'
9
-
10
- # Add dependencies to develop your gem here.
11
- # Include everything needed to run rake, tests, features, etc.
12
- group :development do
13
- gem 'bundler'
14
- gem 'rake'
15
- gem 'rspec'
16
- gem 'jeweler'
17
- gem 'gemcutter'
18
- gem 'gem-release'
19
- gem 'rake-version'
20
- gem 'simplecov'
21
- end
data/Gemfile.lock DELETED
@@ -1,59 +0,0 @@
1
- GEM
2
- remote: http://rubygems.org/
3
- specs:
4
- activesupport (3.2.13)
5
- i18n (= 0.6.1)
6
- multi_json (~> 1.0)
7
- chronic (0.9.1)
8
- commander (4.1.3)
9
- highline (~> 1.6.11)
10
- diff-lcs (1.2.2)
11
- gem-release (0.5.3)
12
- gemcutter (0.7.1)
13
- git (1.2.5)
14
- highline (1.6.16)
15
- i18n (0.6.1)
16
- jeweler (1.8.4)
17
- bundler (~> 1.0)
18
- git (>= 1.2.5)
19
- rake
20
- rdoc
21
- json (1.7.7)
22
- multi_json (1.7.2)
23
- paint (0.8.5)
24
- rake (10.0.4)
25
- rake-version (0.3.1)
26
- rake (~> 10)
27
- rdoc (4.0.1)
28
- json (~> 1.4)
29
- rspec (2.13.0)
30
- rspec-core (~> 2.13.0)
31
- rspec-expectations (~> 2.13.0)
32
- rspec-mocks (~> 2.13.0)
33
- rspec-core (2.13.1)
34
- rspec-expectations (2.13.0)
35
- diff-lcs (>= 1.1.3, < 2.0)
36
- rspec-mocks (2.13.1)
37
- simplecov (0.7.1)
38
- multi_json (~> 1.0)
39
- simplecov-html (~> 0.7.1)
40
- simplecov-html (0.7.1)
41
- whenever (0.8.2)
42
- activesupport (>= 2.3.4)
43
- chronic (>= 0.6.3)
44
-
45
- PLATFORMS
46
- ruby
47
-
48
- DEPENDENCIES
49
- bundler
50
- commander (~> 4.1.2)
51
- gem-release
52
- gemcutter
53
- jeweler
54
- paint (~> 0.8.5)
55
- rake
56
- rake-version
57
- rspec
58
- simplecov
59
- whenever (~> 0.8.2)
data/Rakefile DELETED
@@ -1,51 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'rubygems'
4
- require 'bundler'
5
- begin
6
- Bundler.setup(:default, :development)
7
- rescue Bundler::BundlerError => e
8
- $stderr.puts e.message
9
- $stderr.puts "Run `bundle install` to install missing gems"
10
- exit e.status_code
11
- end
12
- require 'rake'
13
-
14
- require 'jeweler'
15
- Jeweler::Tasks.new do |gem|
16
- # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
- gem.name = "boxafe"
18
- gem.homepage = "http://github.com/AlphaHydrae/boxafe"
19
- gem.license = "MIT"
20
- gem.summary = %Q{Secure your Dropbox with encfs.}
21
- gem.description = %Q{Boxafe encrypts and auto-mounts a folder with encfs and whenever.}
22
- gem.email = "hydrae.alpha@gmail.com"
23
- gem.authors = ["AlphaHydrae"]
24
- # dependencies defined in Gemfile
25
- end
26
- Jeweler::RubygemsDotOrgTasks.new
27
-
28
- Rake::TaskManager.class_eval do
29
- def remove_task(task_name)
30
- @tasks.delete(task_name.to_s)
31
- end
32
- end
33
-
34
- [ 'version', 'version:bump:major', 'version:bump:minor', 'version:bump:patch', 'version:write' ].each do |task|
35
- Rake.application.remove_task task
36
- end
37
-
38
- # version tasks
39
- require 'rake-version'
40
- RakeVersion::Tasks.new do |v|
41
- v.copy 'lib/boxafe.rb'
42
- end
43
-
44
- require 'rspec/core/rake_task'
45
- desc "Run specs"
46
- RSpec::Core::RakeTask.new do |t|
47
- #t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
48
- # Put spec opts in a file named .rspec in root
49
- end
50
-
51
- task :default => :spec
data/lib/program.rb DELETED
@@ -1,18 +0,0 @@
1
- require File.join File.dirname(__FILE__), 'boxafe'
2
- require 'commander/import'
3
-
4
- program :name, 'boxafe'
5
- program :version, Boxafe::VERSION
6
- program :description, 'Secure your Dropbox with encfs.'
7
-
8
- #global_option '-c', '--config PATH', 'Use a custom configuration file (defaults to ~/.boxafe.rb)'
9
-
10
- command :info do |c|
11
- c.syntax = 'boxafe info'
12
- c.description = 'Display the current configuration (default action)'
13
- c.action do |args,options|
14
- puts 'Not yet implemented'
15
- end
16
- end
17
-
18
- default_command :info
data/spec/helper.rb DELETED
@@ -1,16 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler'
3
-
4
- begin
5
- Bundler.setup(:default, :development)
6
- rescue Bundler::BundlerError => e
7
- $stderr.puts e.message
8
- $stderr.puts "Run `bundle install` to install missing gems"
9
- exit e.status_code
10
- end
11
-
12
- require 'simplecov'
13
- SimpleCov.start
14
-
15
- require 'rspec'
16
- require 'boxafe'
data/spec/version_spec.rb DELETED
@@ -1,9 +0,0 @@
1
- require 'helper'
2
-
3
- describe "Version" do
4
-
5
- it "should be correct" do
6
- version_file = File.join File.dirname(__FILE__), '..', 'VERSION'
7
- Boxafe::VERSION.should == File.open(version_file, 'r').read
8
- end
9
- end