freezer_burn 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +38 -0
- data/.ruby-gemset +1 -0
- data/.travis.yml +12 -0
- data/Gemfile +9 -0
- data/LICENSE +22 -0
- data/README.md +47 -0
- data/Rakefile +13 -0
- data/bin/freezer_burn +13 -0
- data/build-gem.sh +16 -0
- data/freezer_burn.gemspec +33 -0
- data/lib/ext/object.rb +7 -0
- data/lib/ext/time.rb +30 -0
- data/lib/freezer_burn.rb +19 -0
- data/lib/freezer_burn/cli.rb +89 -0
- data/lib/freezer_burn/parsers/cxtracker.rb +36 -0
- data/lib/freezer_burn/parsers/passivedns.rb +36 -0
- data/lib/freezer_burn/rotation.rb +87 -0
- data/lib/freezer_burn/settings.rb +87 -0
- data/lib/freezer_burn/version.rb +3 -0
- data/test/data/stats.bge1.1429901795 +0 -0
- data/test/data/stats.bge1.1429901797 +0 -0
- data/test/data/stats.bge1.1429901799 +0 -0
- data/test/test_cxtracker.rb +28 -0
- data/test/test_helper.rb +24 -0
- data/test/test_rotation.rb +16 -0
- data/test/test_settings.rb +27 -0
- metadata +176 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c3074df8767d023fdd3755f329e142cb8593e9ce
|
4
|
+
data.tar.gz: 486cb77b297dbff806fc7b0b5b2c69a8258a5a58
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f27e8fb210bb5d08332182a6e0b8924079bf39549232baa77770974f3985fed37a2db8422fb5e5c521ccc0d802c2d8432f8d2a6350fd79004ea69e80667681f2
|
7
|
+
data.tar.gz: 54b37ab961bdfc5d9c270d20bd062714914551311a7bb90696c5ecafb7e34cae88c9ecd43cc82416962c549bb1128019c21f56199d75897194d1be70fb227ca2
|
data/.gitignore
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
Gemfile.lock
|
4
|
+
|
5
|
+
/.config
|
6
|
+
/coverage/
|
7
|
+
/InstalledFiles
|
8
|
+
/pkg/
|
9
|
+
/spec/reports/
|
10
|
+
/test/tmp/
|
11
|
+
/test/data/freezer/
|
12
|
+
/test/version_tmp/
|
13
|
+
/tmp/
|
14
|
+
|
15
|
+
## Specific to RubyMotion:
|
16
|
+
.dat*
|
17
|
+
.repl_history
|
18
|
+
build/
|
19
|
+
|
20
|
+
## Documentation cache and generated files:
|
21
|
+
/.yardoc/
|
22
|
+
/_yardoc/
|
23
|
+
/doc/
|
24
|
+
/rdoc/
|
25
|
+
|
26
|
+
## Environment normalisation:
|
27
|
+
/.bundle/
|
28
|
+
/vendor/bundle
|
29
|
+
/lib/bundler/man/
|
30
|
+
|
31
|
+
# for a library or gem, you might want to ignore these files since the code is
|
32
|
+
# intended to run in multiple environments; otherwise, check them in:
|
33
|
+
# Gemfile.lock
|
34
|
+
# .ruby-version
|
35
|
+
# .ruby-gemset
|
36
|
+
|
37
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
38
|
+
.rvmrc
|
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
freezer_burn
|
data/.travis.yml
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
language: ruby
|
2
|
+
before_install: gem install bundler
|
3
|
+
install: bundle install
|
4
|
+
script: rake
|
5
|
+
rvm:
|
6
|
+
- 2.0.0
|
7
|
+
- 2.1.1
|
8
|
+
- 2.2.0
|
9
|
+
- 2.3.0
|
10
|
+
notifications:
|
11
|
+
slack:
|
12
|
+
secure: tsYjJ2lHbYChbhHCFqY8SuJ85ZKtjho7hPO2ezghCqOmn2b/wNM60jo47VX8dLmDz9h1t/BcO3eeiaE4YC3E1bAdq/VaC481ZCcsCH61TVXCFmIDgJTLGutRWYDc2jH4/URpaZztDTz6DHt3dmvHzsle3snUj4OahLA9nLGkOTmqG+/VVf0/rSx/VjG6AMItYHQpHozdDZaTNdCmpW6kvhkSMvr7MlKmjfgdSCN5oYcbqvVYErFU8e8Ve4muMJ1KXSUp7VTx/X4ECTaqTIQQL5F1eNH9nWz3ftzipd/0EDgJTVWljpzyHpRZU/RgFgHole/5Xl0eMGInDhzUaRgz5hl6AU21GRNxMsCwytc/lUS1i/91JEyXfTqJpmbhsa8k4bSyQGJ5546b0+CET1JsSiD4b6KIO/l3AEOjC/aPFXkxtFQBYS33OJW/LB6rhyiDvRECSvGmliIsZshVaG1Wv+hJQKg24ZWI5bnSTgf/ZPcBjawqLVEaUByeSMV5LlX3/BKEHopgv049E5z05ptcAsG/iA7I26PQvHXDuTI+PclWgONgW15Cfi4kuXtFC8NET2hdIxvrNVD3YMnwZehtS5cFcWFu4Aa3uYETNKNFjTOkuP/zE6erJD/0qTSGE/cr2rJUYZyJeBcm70/BZL1qFJ3MGM+f03IiTDdavFdPej8=
|
data/Gemfile
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
#gem 'pry-nav', group: [:development, :test]
|
7
|
+
|
8
|
+
# Put other dynamic build / pre-release gems here.
|
9
|
+
# Putting gems in a Gemfile does not install them during gem install foo! - Only developement hybrid environments use this.
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015 shadowbq
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
22
|
+
|
data/README.md
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# freezer_burn
|
2
|
+
Rough management of compressed log files.
|
3
|
+
|
4
|
+
## Code Status
|
5
|
+
|
6
|
+
[](https://travis-ci.org/shadowbq/freezer_burn)
|
7
|
+
[](https://codeclimate.com/github/shadowbq/freezer_burn)
|
8
|
+
[](https://codeclimate.com/github/shadowbq/freezer_burn)
|
9
|
+
[](http://github.com/shadowbq/freezer_burn)
|
10
|
+
|
11
|
+
## Usage
|
12
|
+
```shell
|
13
|
+
$> freezer_burn -h
|
14
|
+
Rough management for compressing and managing log files.
|
15
|
+
|
16
|
+
Usage:
|
17
|
+
./bin/freezer_burn passivedns [-vdk] [--version] [-f <fridge>] [-F <freezer>]
|
18
|
+
./bin/freezer_burn cxtracker [-vdk] [--version] [-f <fridge>] [-F <freezer>]
|
19
|
+
./bin/freezer_burn -h | --help
|
20
|
+
|
21
|
+
Options:
|
22
|
+
-f <fridge> look for logs here
|
23
|
+
-F <freezer> store file here
|
24
|
+
-k --keep-files keep original files in the fridge
|
25
|
+
-h --help show this help message and exit
|
26
|
+
--version show version and exit
|
27
|
+
-d --dry-run simulate without moving files
|
28
|
+
-v --verbose print status messages
|
29
|
+
```
|
30
|
+
|
31
|
+
## Example Usage
|
32
|
+
|
33
|
+
```shell
|
34
|
+
$> freezer_burn -dvk -F /man
|
35
|
+
Searching 1436932800 -> 1437019200: 0 files
|
36
|
+
|
37
|
+
$> freezer_burn passivedns -dv -F /man --version
|
38
|
+
version => 0.0.4
|
39
|
+
verbose => true
|
40
|
+
dryrun => true
|
41
|
+
fridge => /var/db/yard/pdns.*
|
42
|
+
freezer => /man
|
43
|
+
gnu_tar_command => gtar
|
44
|
+
remove_files => --remove-files
|
45
|
+
prefix => passivedns
|
46
|
+
max_scan_time_in_sec => 31536000
|
47
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
|
2
|
+
#!/usr/bin/env rake
|
3
|
+
require "bundler/gem_tasks"
|
4
|
+
require "rake/testtask"
|
5
|
+
|
6
|
+
task :default => [:test]
|
7
|
+
|
8
|
+
Rake::TestTask.new do |test|
|
9
|
+
#test.libs << "lib"
|
10
|
+
test.libs << "test"
|
11
|
+
test.test_files = Dir[ "test/test_*.rb" ]
|
12
|
+
test.verbose = true
|
13
|
+
end
|
data/bin/freezer_burn
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
begin
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
Bundler.setup(:default)
|
6
|
+
rescue LoadError
|
7
|
+
raise 'Could not load the bundler gem. Install it with `gem install bundler`.'
|
8
|
+
end
|
9
|
+
|
10
|
+
# Executable with absolute path to lib for hacking and development
|
11
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'freezer_burn', 'cli')
|
12
|
+
|
13
|
+
FreezerBurn::CLI.invoke
|
data/build-gem.sh
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
if [ -f ./README.md ] && [ -f ./LICENSE ];
|
4
|
+
then
|
5
|
+
echo "Removing old gem.."
|
6
|
+
gem uninstall -x freezer_burn
|
7
|
+
echo "Building gem.."
|
8
|
+
gem build freezer_burn.gemspec
|
9
|
+
echo "Installing gem.."
|
10
|
+
gem install freezer_burn-`bump current |grep -o [0-9].*`.gem
|
11
|
+
git status
|
12
|
+
echo "Validating gem.."
|
13
|
+
gem list --local |grep freezer_burn
|
14
|
+
else
|
15
|
+
echo "not in root gem directory, existing."
|
16
|
+
fi
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#gem 'docopt', '~> 0.5.0'
|
2
|
+
$LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
|
3
|
+
name = "freezer_burn"
|
4
|
+
require "#{name}/version"
|
5
|
+
|
6
|
+
|
7
|
+
Gem::Specification.new do |gem|
|
8
|
+
gem.platform = Gem::Platform::RUBY
|
9
|
+
gem.authors = ["shadowbq"]
|
10
|
+
gem.email = ["shadowbq@gmail.com"]
|
11
|
+
gem.description = %q{rough management of compressed gems}
|
12
|
+
gem.summary = gem.description
|
13
|
+
gem.homepage = "https://github.com/shadowbq/freezer_burn"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($\)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.name = "freezer_burn"
|
19
|
+
gem.require_paths = ["lib"]
|
20
|
+
gem.version = FreezerBurn::VERSION
|
21
|
+
gem.license = 'MIT'
|
22
|
+
|
23
|
+
#Gonna is a mechanize example bin that fetches are parses a fake page.
|
24
|
+
gem.add_dependency('docopt', '~> 0.5.0')
|
25
|
+
|
26
|
+
# gem.add_development_dependency('pry')
|
27
|
+
gem.add_development_dependency('bump')
|
28
|
+
gem.add_development_dependency('minitest-colorize')
|
29
|
+
gem.add_development_dependency('ansi')
|
30
|
+
gem.add_development_dependency('simplecov')
|
31
|
+
gem.add_development_dependency('travis')
|
32
|
+
gem.add_development_dependency('codeclimate-test-reporter')
|
33
|
+
end
|
data/lib/ext/object.rb
ADDED
data/lib/ext/time.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
class Time
|
2
|
+
def change(options)
|
3
|
+
new_year = options.fetch(:year, year)
|
4
|
+
new_month = options.fetch(:month, month)
|
5
|
+
new_day = options.fetch(:day, day)
|
6
|
+
new_hour = options.fetch(:hour, hour)
|
7
|
+
new_min = options.fetch(:min, options[:hour] ? 0 : min)
|
8
|
+
new_sec = options.fetch(:sec, (options[:hour] || options[:min]) ? 0 : sec)
|
9
|
+
|
10
|
+
if new_nsec = options[:nsec]
|
11
|
+
fail ArgumentError, "Can't change both :nsec and :usec at the same time: #{options.inspect}" if options[:usec]
|
12
|
+
new_usec = Rational(new_nsec, 1000)
|
13
|
+
else
|
14
|
+
new_usec = options.fetch(:usec, (options[:hour] || options[:min] || options[:sec]) ? 0 : Rational(nsec, 1000))
|
15
|
+
end
|
16
|
+
|
17
|
+
if utc?
|
18
|
+
::Time.utc(new_year, new_month, new_day, new_hour, new_min, new_sec, new_usec)
|
19
|
+
elsif zone
|
20
|
+
::Time.local(new_year, new_month, new_day, new_hour, new_min, new_sec, new_usec)
|
21
|
+
else
|
22
|
+
fail ArgumentError, 'argument out of range' if new_usec >= 1_000_000
|
23
|
+
::Time.new(new_year, new_month, new_day, new_hour, new_min, new_sec + (new_usec.to_r / 1_000_000), utc_offset)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def seconds_since_midnight
|
28
|
+
to_i - change(hour: 0).to_i + (usec / 1.0e+6)
|
29
|
+
end
|
30
|
+
end
|
data/lib/freezer_burn.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# STDLIBS
|
2
|
+
require 'rubygems'
|
3
|
+
module FreezerBurn
|
4
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
5
|
+
|
6
|
+
class ClassError < StandardError; end
|
7
|
+
class UnknownParser < StandardError; end
|
8
|
+
|
9
|
+
MAX_FILEPATH_BUF = 1024
|
10
|
+
UINT32_t = 4
|
11
|
+
|
12
|
+
require 'ext/object'
|
13
|
+
require 'ext/time'
|
14
|
+
require 'freezer_burn/settings'
|
15
|
+
require 'freezer_burn/version'
|
16
|
+
require 'freezer_burn/rotation'
|
17
|
+
require 'freezer_burn/parsers/cxtracker'
|
18
|
+
require 'freezer_burn/parsers/passivedns'
|
19
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'docopt'
|
3
|
+
require 'freezer_burn'
|
4
|
+
|
5
|
+
module FreezerBurn
|
6
|
+
class CLI
|
7
|
+
def self.invoke
|
8
|
+
new
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
|
13
|
+
@parsers = [:cxtracker, :passivedns]
|
14
|
+
|
15
|
+
doc = <<DOCOPT
|
16
|
+
Rough management of compressed log files.
|
17
|
+
|
18
|
+
Usage:
|
19
|
+
DOCOPT
|
20
|
+
|
21
|
+
@parsers.each do |parser|
|
22
|
+
doc += "freezer_burn #{parser} [-vdk] [--version] [-f <fridge>] [-F <freezer>] \n"
|
23
|
+
end
|
24
|
+
|
25
|
+
doc_part2 = <<DOCOPT
|
26
|
+
|
27
|
+
freezer_burn -h | --help
|
28
|
+
|
29
|
+
Options:
|
30
|
+
-f <fridge> look for logs here
|
31
|
+
-F <freezer> store file here
|
32
|
+
-k --keep-files keep original files in the fridge
|
33
|
+
-h --help show this help message and exit
|
34
|
+
--version show version and exit
|
35
|
+
-d --dry-run simulate without moving files
|
36
|
+
-v --verbose print status messages
|
37
|
+
|
38
|
+
DOCOPT
|
39
|
+
|
40
|
+
@options = {}
|
41
|
+
begin
|
42
|
+
@options = Docopt.docopt(doc+doc_part2)
|
43
|
+
rescue Docopt::Exit => e
|
44
|
+
puts e.message
|
45
|
+
exit 1
|
46
|
+
end
|
47
|
+
|
48
|
+
# Boolean switch
|
49
|
+
FreezerBurn::Settings.verbose = @options['--verbose'] ? true : false
|
50
|
+
FreezerBurn::Settings.dryrun = @options['--dry-run'] ? true : false
|
51
|
+
|
52
|
+
# Maintain defaults
|
53
|
+
FreezerBurn::Settings.remove_files = '' if @options['--keep-files']
|
54
|
+
FreezerBurn::Settings.fridge = @options['-f'] if @options['-f']
|
55
|
+
FreezerBurn::Settings.freezer = @options['-F'] if @options['-F']
|
56
|
+
|
57
|
+
if @options['--version']
|
58
|
+
_version
|
59
|
+
exit 0
|
60
|
+
end
|
61
|
+
|
62
|
+
_meta_parser("rotate")
|
63
|
+
|
64
|
+
end # def
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def _version
|
69
|
+
puts 'version => ' + FreezerBurn::VERSION.to_s
|
70
|
+
if FreezerBurn::Settings.verbose
|
71
|
+
_meta_parser("update_settings!")
|
72
|
+
FreezerBurn::Settings.print
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def _meta_parser(cmd)
|
77
|
+
@parsers.each do |el|
|
78
|
+
el = el.to_s
|
79
|
+
klass = "FreezerBurn::" + el.capitalize
|
80
|
+
if @options[el]
|
81
|
+
Object.const_get19(klass).send(cmd)
|
82
|
+
break # jump out of each
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
end # class
|
89
|
+
end # module
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module FreezerBurn
|
2
|
+
class Cxtracker < Rotation
|
3
|
+
|
4
|
+
def self.update_settings!
|
5
|
+
FreezerBurn::Settings.prefix 'cxtracker'
|
6
|
+
FreezerBurn::Settings.fridge '/var/db/fridge/stats.*'
|
7
|
+
end
|
8
|
+
|
9
|
+
def _build_collection(dir)
|
10
|
+
@dirglob = Dir.glob(dir)
|
11
|
+
collection = []
|
12
|
+
|
13
|
+
@dirglob.each do |filename|
|
14
|
+
collection << { filename: filename, file_epoch: _get_file_epoch_cxtracker(filename) }
|
15
|
+
end
|
16
|
+
|
17
|
+
@dirglob = nil
|
18
|
+
|
19
|
+
# remove from collection elements with no file_epoch k/v
|
20
|
+
collection.collect { |e| e if e[:file_epoch] != '' }.compact
|
21
|
+
end
|
22
|
+
|
23
|
+
# ./test/data/stats.bge1.1429901797
|
24
|
+
# stats.bge1.1429901798
|
25
|
+
def _get_file_epoch_cxtracker(filename)
|
26
|
+
file_epoch = File.basename(filename).split('.')[2]
|
27
|
+
# should safely cast
|
28
|
+
file_epoch = Integer(file_epoch)
|
29
|
+
# ArgumentError: invalid value for Integer: "nights"
|
30
|
+
return file_epoch
|
31
|
+
rescue
|
32
|
+
return ''
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module FreezerBurn
|
2
|
+
class Passivedns < Rotation
|
3
|
+
|
4
|
+
def self.update_settings!
|
5
|
+
FreezerBurn::Settings.prefix 'passivedns'
|
6
|
+
FreezerBurn::Settings.fridge '/var/db/fridge/pdns.*'
|
7
|
+
end
|
8
|
+
|
9
|
+
def _build_collection(dir)
|
10
|
+
@dirglob = Dir.glob(dir)
|
11
|
+
collection = []
|
12
|
+
|
13
|
+
@dirglob.each do |filename|
|
14
|
+
collection << { filename: filename, file_epoch: _get_file_epoch(filename) }
|
15
|
+
end
|
16
|
+
|
17
|
+
@dirglob = nil
|
18
|
+
|
19
|
+
# remove from collection elements with no file_epoch k/v
|
20
|
+
collection.collect { |e| e if e[:file_epoch] != '' }.compact
|
21
|
+
end
|
22
|
+
|
23
|
+
# ./test/data/stats.bge1.1429901797
|
24
|
+
# stats.bge1.1429901798
|
25
|
+
def _get_file_epoch(filename)
|
26
|
+
file_epoch = File.basename(filename).split('.')[2]
|
27
|
+
# should safely cast
|
28
|
+
file_epoch = Integer(file_epoch)
|
29
|
+
# ArgumentError: invalid value for Integer: "nights"
|
30
|
+
return file_epoch
|
31
|
+
rescue
|
32
|
+
return ''
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
|
3
|
+
module FreezerBurn
|
4
|
+
class Rotation
|
5
|
+
|
6
|
+
attr_reader :collection
|
7
|
+
|
8
|
+
# Stub
|
9
|
+
def self.update_settings!
|
10
|
+
raise ClassError, "method stub called, child method missing"
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.rotate(fridge=FreezerBurn::Settings.fridge)
|
14
|
+
rotation = self.new(fridge)
|
15
|
+
rotation.rotate
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(fridge=FreezerBurn::Settings.fridge)
|
19
|
+
# Seconds since epoch
|
20
|
+
@unixtime = Time.now.utc.to_i
|
21
|
+
@interval = 86_400
|
22
|
+
|
23
|
+
# UT END of TODAY(uteot).
|
24
|
+
@uteot = (Time.now + @interval).change(hour: 0).to_i
|
25
|
+
|
26
|
+
# UT START of TODAY(utsot).
|
27
|
+
@utsot = @uteot - @interval
|
28
|
+
|
29
|
+
@collection = _build_collection(fridge)
|
30
|
+
|
31
|
+
self.class.update_settings!
|
32
|
+
return self
|
33
|
+
end
|
34
|
+
|
35
|
+
def rotate
|
36
|
+
begin
|
37
|
+
_rotate_interval
|
38
|
+
|
39
|
+
# Fall back interval.
|
40
|
+
@uteot -= @interval
|
41
|
+
@utsot -= @interval
|
42
|
+
|
43
|
+
# limit selecting to only one year
|
44
|
+
@collection = [] if @unixtime - Settings.max_scan_time_in_sec > @uteot
|
45
|
+
|
46
|
+
end while !@collection.empty?
|
47
|
+
end
|
48
|
+
|
49
|
+
#private
|
50
|
+
|
51
|
+
# Stub
|
52
|
+
def _build_collection(dir)
|
53
|
+
raise ClassError, "method stub called, child method missing"
|
54
|
+
end
|
55
|
+
|
56
|
+
# Stub
|
57
|
+
def _get_file_epoch_cxtracker(filename)
|
58
|
+
raise ClassError, "method stub called, child method missing"
|
59
|
+
end
|
60
|
+
|
61
|
+
def _rotate_interval
|
62
|
+
puts "Searching #{@utsot} -> #{@uteot}: #{@collection.size} files" if Settings.verbose
|
63
|
+
daylist = []
|
64
|
+
@collection.each do |file|
|
65
|
+
daylist.push(file) if (@utsot..@uteot) === file[:file_epoch]
|
66
|
+
end
|
67
|
+
unless daylist.empty?
|
68
|
+
puts "#{daylist.first[:filename]} .. #{daylist.last[:filename]}" if Settings.verbose
|
69
|
+
@collection -= daylist
|
70
|
+
|
71
|
+
# compress tarball daylist, write filename with earliest.lastest.gz.tar epoch time.
|
72
|
+
# best way to handle thousands of files is with gnu-tar (tar must support -T flag)
|
73
|
+
Tempfile.open('tar-ball-listing') do |f|
|
74
|
+
daylist.each { |fileref| f.puts(fileref[:filename]) }
|
75
|
+
f.close
|
76
|
+
# write filenames to a filelist.
|
77
|
+
cmd_string = "#{Settings.gnu_tar_command} -T #{f.path} --append -z #{Settings.remove_files}-f #{Settings.freezer}/#{Settings.prefix}.#{daylist.first[:file_epoch]}-#{daylist.last[:file_epoch]}.tar.gz > /dev/null 2>&1"
|
78
|
+
puts cmd_string if Settings.verbose
|
79
|
+
`#{cmd_string}` unless Settings.dryrun
|
80
|
+
end
|
81
|
+
|
82
|
+
end # unless
|
83
|
+
|
84
|
+
end # def
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module FreezerBurn
|
2
|
+
module Settings
|
3
|
+
extend self
|
4
|
+
|
5
|
+
@@registered_settings = []
|
6
|
+
|
7
|
+
# Appdata provides a basic single-method DSL with .parameter method
|
8
|
+
# being used to define a set of available settings.
|
9
|
+
# This method takes one or more symbols, with each one being
|
10
|
+
# a name of the configuration option.
|
11
|
+
def parameter(*names)
|
12
|
+
names.each do |name|
|
13
|
+
attr_accessor name
|
14
|
+
|
15
|
+
@@registered_settings.push(name)
|
16
|
+
|
17
|
+
# For each given symbol we generate accessor method that sets option's
|
18
|
+
# value being called with an argument, or returns option's current value
|
19
|
+
# when called without arguments
|
20
|
+
undef_method name if method_defined? name
|
21
|
+
|
22
|
+
define_method name do |*values|
|
23
|
+
value = values.first
|
24
|
+
#binding.pry
|
25
|
+
if value
|
26
|
+
send("#{name}=", value)
|
27
|
+
else
|
28
|
+
instance_variable_defined?("@#{name}") ? instance_variable_get("@#{name}") : nil
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# And we define a wrapper for the configuration block, that we'll use to set up
|
35
|
+
# our set of options
|
36
|
+
def config &block
|
37
|
+
instance_eval(&block)
|
38
|
+
end
|
39
|
+
|
40
|
+
# list available settings
|
41
|
+
def self.list
|
42
|
+
@@registered_settings
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.reset!
|
46
|
+
self.config do
|
47
|
+
verbose false
|
48
|
+
dryrun false
|
49
|
+
fridge '/var/db/fridge/*.log'
|
50
|
+
freezer '/var/log/freezer'
|
51
|
+
gnu_tar_command 'gtar'
|
52
|
+
remove_files '--remove-files '
|
53
|
+
prefix 'cxtracker'
|
54
|
+
max_scan_time_in_sec 31_536_000
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.to_h
|
59
|
+
c = {}
|
60
|
+
FreezerBurn::Settings.list.each do |toggle|
|
61
|
+
c[toggle.to_sym] = FreezerBurn::Settings.send(toggle)
|
62
|
+
end
|
63
|
+
return c
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.print
|
67
|
+
FreezerBurn::Settings.list.each do |toggle|
|
68
|
+
puts "#{toggle} => #{FreezerBurn::Settings.send(toggle)}"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
# [1] pry(#<FreezerBurn::CLI>)> Settings.list
|
75
|
+
# => [:verbose, :fridge, :freezer, :gnu_tar_command, :remove_files, :prefix, :max_scan_time_in_sec]
|
76
|
+
|
77
|
+
Settings.config do
|
78
|
+
parameter :verbose, :dryrun
|
79
|
+
parameter :fridge, :freezer
|
80
|
+
parameter :gnu_tar_command
|
81
|
+
parameter :remove_files
|
82
|
+
parameter :prefix
|
83
|
+
parameter :max_scan_time_in_sec
|
84
|
+
end
|
85
|
+
|
86
|
+
Settings.reset!
|
87
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# require 'pry'
|
2
|
+
# binding.pry
|
3
|
+
require 'test_helper'
|
4
|
+
require 'minitest/spec'
|
5
|
+
|
6
|
+
describe "rotation" do
|
7
|
+
|
8
|
+
before do
|
9
|
+
FreezerBurn::Settings.reset!
|
10
|
+
FreezerBurn::Settings.fridge = './test/data/stats.*'
|
11
|
+
FreezerBurn::Settings.freezer = './test/data/freezer'
|
12
|
+
end
|
13
|
+
|
14
|
+
describe 'when calling an rotation job' do
|
15
|
+
it 'should return a roation job object' do
|
16
|
+
job = FreezerBurn::Cxtracker.new
|
17
|
+
job.must_be_instance_of FreezerBurn::Cxtracker
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should respond with a collection of files in fridge' do
|
21
|
+
job = FreezerBurn::Cxtracker.new
|
22
|
+
job.collection.must_be_instance_of Array
|
23
|
+
job.collection.must_include({:filename => "./test/data/stats.bge1.1429901795", :file_epoch => 1429901795})
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
|
4
|
+
require 'simplecov'
|
5
|
+
SimpleCov.start do
|
6
|
+
add_filter '/test/'
|
7
|
+
add_group 'Bin', '/lib/cli'
|
8
|
+
add_group 'Lib', '/lib'
|
9
|
+
end
|
10
|
+
|
11
|
+
require "codeclimate-test-reporter"
|
12
|
+
CodeClimate::TestReporter.start
|
13
|
+
|
14
|
+
gem "minitest"
|
15
|
+
require 'minitest/autorun'
|
16
|
+
require 'minitest/pride'
|
17
|
+
require 'minitest/spec'
|
18
|
+
|
19
|
+
# :: Scaffold for CodeClimate
|
20
|
+
# require "codeclimate-test-reporter"
|
21
|
+
# CodeClimate::TestReporter.start
|
22
|
+
|
23
|
+
#require File.join(File.dirname(__FILE__), '..', 'freezer_burn')
|
24
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'freezer_burn')
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'minitest/spec'
|
3
|
+
|
4
|
+
describe "rotation" do
|
5
|
+
|
6
|
+
before do
|
7
|
+
FreezerBurn::Settings.reset!
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'when calling the stub' do
|
11
|
+
it 'should raise a ClassError' do
|
12
|
+
proc { FreezerBurn::Rotation.new }.must_raise FreezerBurn::ClassError
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'minitest/spec'
|
3
|
+
|
4
|
+
describe FreezerBurn::Settings do
|
5
|
+
|
6
|
+
before do
|
7
|
+
FreezerBurn::Settings.reset!
|
8
|
+
FreezerBurn::Settings.freezer = './test/data/freezer'
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'when calling an APP Setting' do
|
12
|
+
it 'should respond with defaults' do
|
13
|
+
FreezerBurn::Settings.fridge.must_equal '/var/db/fridge/*.log'
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should list its attributes' do
|
17
|
+
FreezerBurn::Settings.list.must_equal [:verbose, :dryrun, :fridge, :freezer, :gnu_tar_command, :remove_files, :prefix, :max_scan_time_in_sec]
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should convert to a hash with new test settings' do
|
21
|
+
target_hash = {:verbose=>nil, :dryrun=>nil, :fridge=>"/var/db/fridge/*.log", :freezer=>"./test/data/freezer", :gnu_tar_command=>"gtar", :remove_files=>"--remove-files ", :prefix=>"cxtracker", :max_scan_time_in_sec=>31536000}
|
22
|
+
FreezerBurn::Settings.to_h.must_equal target_hash
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: freezer_burn
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.6
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- shadowbq
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-08-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: docopt
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.5.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.5.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bump
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest-colorize
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: ansi
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
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: simplecov
|
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: travis
|
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: codeclimate-test-reporter
|
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
|
+
description: rough management of compressed gems
|
112
|
+
email:
|
113
|
+
- shadowbq@gmail.com
|
114
|
+
executables:
|
115
|
+
- freezer_burn
|
116
|
+
extensions: []
|
117
|
+
extra_rdoc_files: []
|
118
|
+
files:
|
119
|
+
- ".gitignore"
|
120
|
+
- ".ruby-gemset"
|
121
|
+
- ".travis.yml"
|
122
|
+
- Gemfile
|
123
|
+
- LICENSE
|
124
|
+
- README.md
|
125
|
+
- Rakefile
|
126
|
+
- bin/freezer_burn
|
127
|
+
- build-gem.sh
|
128
|
+
- freezer_burn.gemspec
|
129
|
+
- lib/ext/object.rb
|
130
|
+
- lib/ext/time.rb
|
131
|
+
- lib/freezer_burn.rb
|
132
|
+
- lib/freezer_burn/cli.rb
|
133
|
+
- lib/freezer_burn/parsers/cxtracker.rb
|
134
|
+
- lib/freezer_burn/parsers/passivedns.rb
|
135
|
+
- lib/freezer_burn/rotation.rb
|
136
|
+
- lib/freezer_burn/settings.rb
|
137
|
+
- lib/freezer_burn/version.rb
|
138
|
+
- test/data/stats.bge1.1429901795
|
139
|
+
- test/data/stats.bge1.1429901797
|
140
|
+
- test/data/stats.bge1.1429901799
|
141
|
+
- test/test_cxtracker.rb
|
142
|
+
- test/test_helper.rb
|
143
|
+
- test/test_rotation.rb
|
144
|
+
- test/test_settings.rb
|
145
|
+
homepage: https://github.com/shadowbq/freezer_burn
|
146
|
+
licenses:
|
147
|
+
- MIT
|
148
|
+
metadata: {}
|
149
|
+
post_install_message:
|
150
|
+
rdoc_options: []
|
151
|
+
require_paths:
|
152
|
+
- lib
|
153
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
154
|
+
requirements:
|
155
|
+
- - ">="
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
159
|
+
requirements:
|
160
|
+
- - ">="
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
version: '0'
|
163
|
+
requirements: []
|
164
|
+
rubyforge_project:
|
165
|
+
rubygems_version: 2.4.8
|
166
|
+
signing_key:
|
167
|
+
specification_version: 4
|
168
|
+
summary: rough management of compressed gems
|
169
|
+
test_files:
|
170
|
+
- test/data/stats.bge1.1429901795
|
171
|
+
- test/data/stats.bge1.1429901797
|
172
|
+
- test/data/stats.bge1.1429901799
|
173
|
+
- test/test_cxtracker.rb
|
174
|
+
- test/test_helper.rb
|
175
|
+
- test/test_rotation.rb
|
176
|
+
- test/test_settings.rb
|