focus.rb 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/focus +47 -0
- data/lib/focus/config.rb +58 -0
- data/lib/focus/host.rb +63 -0
- metadata +62 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: be3ca51dc59f5a69a6b15b2381b7596776c7a85b656f2402db409ef11a095e0a
|
4
|
+
data.tar.gz: dfed043bd5a771f9ecc8ad7e22eb898349bbece9cb5c9520da50cf37256e7390
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a551d74afb999598545732fe17a94f0e96581b44a6b06e3ea6cce87fab20f66ed51cda65715238abc8c1612fb468b2f72f4774e4ad81ed96310bd35c2c897311
|
7
|
+
data.tar.gz: 3230ffd2acd77850eaf32bd2eb01b3bf150bd531beaa291c3d3cee11cf5f2821ab1307cef3f0e16dc78f56cb0ce32bf29c70b1769835868afa85faa3e2a9f612
|
data/bin/focus
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "colorize"
|
4
|
+
require "optparse"
|
5
|
+
require "focus/config"
|
6
|
+
require "focus/host"
|
7
|
+
|
8
|
+
script_name = File.basename($0)
|
9
|
+
config_path = ".config/focus.rb/config.yaml"
|
10
|
+
action = :list_block_hosts
|
11
|
+
args = []
|
12
|
+
options_parser = nil
|
13
|
+
|
14
|
+
ARGV.options do |opts|
|
15
|
+
options_parser = opts
|
16
|
+
|
17
|
+
opts.banner = "Usage: ruby #{script_name} [--start | --restore]
|
18
|
+
Help to focus on your work, block leasure website while you need working, unblock for week-ends !
|
19
|
+
"
|
20
|
+
|
21
|
+
opts.on("-c=PATH", "--config=PATH", "Change the default config path") { |path| config_path = path }
|
22
|
+
|
23
|
+
opts.on("-a=BLOCK", "--add-block-host=BLOCK", "Add a new host to block") { |block| action = :add_block_host; args = [block] }
|
24
|
+
opts.on("-d=BLOCK", "--delete-block-host=BLOCK", "Delete a host to block") { |block| action = :delete_block_host; args = [block] }
|
25
|
+
|
26
|
+
opts.on("-b", "--block", "Block non-work website") { action = :block }
|
27
|
+
opts.on("-r", "--restore", "Restore non-work website") { action = :restore }
|
28
|
+
|
29
|
+
opts.separator ""
|
30
|
+
|
31
|
+
opts.on("-h", "--help", "Show this help message.") { action = :help }
|
32
|
+
|
33
|
+
opts.parse!
|
34
|
+
end
|
35
|
+
|
36
|
+
config = Focus::Config.new(filepath: config_path)
|
37
|
+
|
38
|
+
ACTIONS = {
|
39
|
+
list_block_hosts: lambda { puts config.block_hosts },
|
40
|
+
add_block_host: lambda { config.add_block_host(*args) },
|
41
|
+
delete_block_host: lambda { config.add_block_host(*args) },
|
42
|
+
block: lambda { Focus::Host.new.block!(config) },
|
43
|
+
restore: lambda { Focus::Host.new.restore!(config) },
|
44
|
+
help: lambda { puts options_parser }
|
45
|
+
}
|
46
|
+
|
47
|
+
ACTIONS.fetch(action, ACTIONS[:help]).call()
|
data/lib/focus/config.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require "yaml"
|
2
|
+
|
3
|
+
module Focus
|
4
|
+
class Config
|
5
|
+
BASE_PATH = ENV["HOME"]
|
6
|
+
DEFAULT_BLOCK_HOSTS = %w(reddit.com youtube.com okcupid.com)
|
7
|
+
|
8
|
+
def initialize(filepath:)
|
9
|
+
@filepath = File.join(BASE_PATH, filepath)
|
10
|
+
dir = File.dirname(@filepath)
|
11
|
+
if !File.exist?(dir)
|
12
|
+
Dir.mkdir(dir)
|
13
|
+
end
|
14
|
+
if !File.exist?(@filepath)
|
15
|
+
write(
|
16
|
+
{
|
17
|
+
block_hosts: DEFAULT_BLOCK_HOSTS,
|
18
|
+
},
|
19
|
+
)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def read
|
24
|
+
YAML.load_file(@filepath)
|
25
|
+
end
|
26
|
+
|
27
|
+
def write(data)
|
28
|
+
data[:block_hosts].uniq!
|
29
|
+
File.write(@filepath, data.to_yaml)
|
30
|
+
end
|
31
|
+
|
32
|
+
def block_hosts
|
33
|
+
read[:block_hosts]
|
34
|
+
end
|
35
|
+
|
36
|
+
def add_block_host(blocks)
|
37
|
+
puts "This operation adds \"#{blocks}\" to the list of blocked hosts.".yellow
|
38
|
+
puts "This operation does not block the hosts. Execute -b to execute the blocking.".yellow
|
39
|
+
blocks.split(",").each do |block|
|
40
|
+
data = read
|
41
|
+
data[:block_hosts] << block
|
42
|
+
write(data)
|
43
|
+
puts "Added host \"#{block}\"!".green
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def delete_block_host(blocks)
|
48
|
+
puts "This operation removes \"#{blocks}\" to the list of blocked hosts.".yellow
|
49
|
+
puts "This operation does not unblock the hosts. Execute -b to refresh the blocking or -r to reset it.".yellow
|
50
|
+
blocks.split(",").each do |block|
|
51
|
+
data = read
|
52
|
+
data[:block_hosts].delete_if { |host| host == block }
|
53
|
+
write(data)
|
54
|
+
puts "Removed host \"#{block}\"!".green
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/focus/host.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
module Focus
|
2
|
+
class Host
|
3
|
+
def initialize(file = "/etc/hosts")
|
4
|
+
@file = file
|
5
|
+
read!
|
6
|
+
end
|
7
|
+
|
8
|
+
def get_index
|
9
|
+
start_index = @all_lines.find_index { |line| /### FOCUS:start \(automaticaly generated\) ###/i === line }
|
10
|
+
stop_index = @all_lines.find_index { |line| /### FOCUS:stop \(automaticaly generated\) ###/i === line }
|
11
|
+
{ start: start_index + 1, stop: stop_index - 1 } if start_index && stop_index
|
12
|
+
end
|
13
|
+
|
14
|
+
def read!
|
15
|
+
@all_lines = File.read(@file).split("\n")
|
16
|
+
index = get_index
|
17
|
+
@data = []
|
18
|
+
if index
|
19
|
+
selected_lines = @all_lines[index[:start]..index[:stop]]
|
20
|
+
@data = selected_lines.map { |line| line.split(/\s+/) }.map { |ip, host| { ip: ip, host: host } }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def overwrite!
|
25
|
+
index = get_index
|
26
|
+
if index
|
27
|
+
count = index[:stop] - index[:start]
|
28
|
+
@all_lines << "" if @all_lines[index[:start] - 2] != ""
|
29
|
+
@all_lines.slice!(index[:start] - 1, count + 3)
|
30
|
+
else
|
31
|
+
@all_lines << "" if @all_lines.last != ""
|
32
|
+
end
|
33
|
+
|
34
|
+
@all_lines << "### FOCUS:start (automaticaly generated) ###"
|
35
|
+
@data.each do |managed|
|
36
|
+
@all_lines << "#{managed[:ip]} #{managed[:host]}"
|
37
|
+
end
|
38
|
+
@all_lines << "### FOCUS:stop (automaticaly generated) ###"
|
39
|
+
@all_lines << ""
|
40
|
+
File.write(@file, @all_lines.join("\n"))
|
41
|
+
end
|
42
|
+
|
43
|
+
def block!(config)
|
44
|
+
puts "Blocking the hosts".green
|
45
|
+
read!
|
46
|
+
config.block_hosts.each do |block_host|
|
47
|
+
puts block_host.red
|
48
|
+
@data << { host: block_host, ip: "127.0.0.1" }
|
49
|
+
@data << { host: "www.#{block_host}", ip: "127.0.0.1" }
|
50
|
+
end
|
51
|
+
@data.uniq!
|
52
|
+
overwrite!
|
53
|
+
puts "Done!".green
|
54
|
+
end
|
55
|
+
|
56
|
+
def restore!(config)
|
57
|
+
puts "Restoring blocked hosts".green
|
58
|
+
@data = []
|
59
|
+
overwrite!
|
60
|
+
puts "Done!".green
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
metadata
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: focus.rb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Arthur Poulet
|
8
|
+
autorequire:
|
9
|
+
bindir:
|
10
|
+
- bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2021-09-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: colorize
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 0.8.1
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 0.8.1
|
28
|
+
description: A tool to help you focus on work* Block hosts names localy
|
29
|
+
email:
|
30
|
+
- arthur.focus@sceptique.eu
|
31
|
+
executables:
|
32
|
+
- focus
|
33
|
+
extensions: []
|
34
|
+
extra_rdoc_files: []
|
35
|
+
files:
|
36
|
+
- bin/focus
|
37
|
+
- lib/focus/config.rb
|
38
|
+
- lib/focus/host.rb
|
39
|
+
homepage: https://git.sceptique.eu/Sceptique/focus.rb
|
40
|
+
licenses:
|
41
|
+
- GPL-3.0
|
42
|
+
metadata: {}
|
43
|
+
post_install_message:
|
44
|
+
rdoc_options: []
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
requirements: []
|
58
|
+
rubygems_version: 3.2.27
|
59
|
+
signing_key:
|
60
|
+
specification_version: 4
|
61
|
+
summary: A tool to help you focus on work
|
62
|
+
test_files: []
|