fcl_rails_daemon 1.0.1
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 +12 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/README.md +64 -0
- data/Rakefile +1 -0
- data/bin/console +14 -0
- data/bin/fcld +91 -0
- data/bin/setup +7 -0
- data/fcl_rails_daemon-1.0.0.gem +0 -0
- data/fcl_rails_daemon.gemspec +29 -0
- data/lib/core/comando_exemplo.rb +46 -0
- data/lib/core/daemon.rb +124 -0
- data/lib/core/gerenciador.rb +185 -0
- data/lib/core/registrador.rb +16 -0
- data/lib/fcl_rails_daemon.rb +19 -0
- data/lib/fcl_rails_daemon/config.rb +9 -0
- data/lib/fcl_rails_daemon/version.rb +3 -0
- data/spec/fcl_rails_daemon_spec.rb +11 -0
- data/spec/spec_helper.rb +2 -0
- metadata +139 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 998be626e5fb47732b6b04730e443d413c71cf04
|
4
|
+
data.tar.gz: 94bdd36d38f2d01e9f823eb4b1dabb24ad304b63
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1c97416f21d3266e0780871bf60864c74862e9d3a48c9b35043f83a53a6b306add86495e81a5b61151e5640ed1d80bdad6aa9077d7a4af7692073096f2040b29
|
7
|
+
data.tar.gz: 0d71952e33958860d328068a662b0aee15653fed92a0d9f12e038348c1561bff13382fa5c38c0b67b88d2f011753e1a01d24bab5661c4f6bc7a24a40441e4839
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# FclRailsDaemon
|
2
|
+
|
3
|
+
Esta gem foi desenvolvida com a partir da necessidade de gerenciamento através do terminal em processos que por sua vez
|
4
|
+
executam determinados programas escritos em ruby.
|
5
|
+
|
6
|
+
## Instalação
|
7
|
+
|
8
|
+
A partir do Gemfile
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem 'fcl_rails_daemon'
|
12
|
+
```
|
13
|
+
|
14
|
+
Então execute:
|
15
|
+
|
16
|
+
$ bundle
|
17
|
+
|
18
|
+
Ou somente instale:
|
19
|
+
|
20
|
+
$ gem install fcl_rails_daemon
|
21
|
+
|
22
|
+
|
23
|
+
## Configuração
|
24
|
+
|
25
|
+
Após a instalação é necessário criar os diretórios e arquivos de configuração, para isso execute
|
26
|
+
|
27
|
+
$ fcld --configure
|
28
|
+
|
29
|
+
Serão criados:
|
30
|
+
|
31
|
+
* _config/fcld_rails_daemon.rb_ (Arquivo onde são registrados os comandos)
|
32
|
+
* _tmp/pids/fcld.yml (Arquivo onde_ são registrados os pids dos comandos)
|
33
|
+
* _lib/fcld_comandos/comando_exemplo.rb_ (Um modelo para criação de comandos)
|
34
|
+
|
35
|
+
|
36
|
+
## Como Usar?
|
37
|
+
|
38
|
+
#### Podemos adicionar comandos através do parametro --create
|
39
|
+
|
40
|
+
$ fcld --create meu_primeiro_comando
|
41
|
+
|
42
|
+
* Cria um comando em lib/fcld_comandos
|
43
|
+
* Efetua o registro em config/fcl_rails_daemon.rb
|
44
|
+
|
45
|
+
|
46
|
+
#### Podemos consultar o manual para descobrir quais os comandos disponíveis através do parametro --help
|
47
|
+
|
48
|
+
$ fcld --help
|
49
|
+
|
50
|
+
|
51
|
+
#### Podemos consultar os pids de processos gerenciados pelo daemon através do parametro --pids
|
52
|
+
|
53
|
+
$ fcld --pids
|
54
|
+
|
55
|
+
|
56
|
+
#### Podemos executar as ações básicas de um daemon (parametros start | stop | restart | status)
|
57
|
+
|
58
|
+
$ fcld start
|
59
|
+
|
60
|
+
|
61
|
+
#### Podemos controlar processos individualnmente através do parametro --task
|
62
|
+
|
63
|
+
$ fcld --task meu_primeiro_comando start
|
64
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "fcl_rails_daemon"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/fcld
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'fileutils'
|
3
|
+
require 'fcl_rails_daemon/config'
|
4
|
+
|
5
|
+
base = DAEMON_ROOT
|
6
|
+
config_dir = "config"
|
7
|
+
config_dir = File.join(base, config_dir)
|
8
|
+
FileUtils.mkdir_p(config_dir) unless File.directory?(config_dir)
|
9
|
+
config_file = File.join(config_dir, 'fcld_rails_daemon.rb')
|
10
|
+
|
11
|
+
if ARGV.include? "--configure"
|
12
|
+
config_file_content = <<-FILE
|
13
|
+
# Para registrar seus comandos é necessário adicioná-los conforme o exemplo abaixo
|
14
|
+
# É necessário que seja informado o nome do comando e qual a classe ao qual ele representa
|
15
|
+
# Ex:
|
16
|
+
# FclRailsDaemon::Registrador.add(comando: 'comando_exemplo', classe: ComandoExemplo)
|
17
|
+
FILE
|
18
|
+
|
19
|
+
File.open(config_file, 'wb') {|f| f.write(config_file_content) } unless File.exist?(config_file)
|
20
|
+
|
21
|
+
command_sample_content = <<-FILE
|
22
|
+
class ComandoExemplo < FclRailsDaemon::Daemon
|
23
|
+
|
24
|
+
# Obrigatóriamente é necessário implementar o método "initialize"
|
25
|
+
def initialize
|
26
|
+
# Definir o parametro "task" (nome que será referenciado no comando digitado no terminal).
|
27
|
+
#
|
28
|
+
# O parametro "log" é opcional mas sugiro que seja definido um log para cada comando para evitar que muitos comandos
|
29
|
+
# escrevam no log deafult (caso tenha# muitos comandos)
|
30
|
+
super(task: "comando_exemplo", log: "log/comando_exemplo.log")
|
31
|
+
end
|
32
|
+
|
33
|
+
# Obrigatóriamente é necessário implementar o método self.help
|
34
|
+
def self.help
|
35
|
+
# Retornar Hash com "descricao" e "exemplo"
|
36
|
+
{
|
37
|
+
descricao: "Descrição do comando comando_exemplo :) - Executado a cada 1 min",
|
38
|
+
exemplo: ["--task comando_exemplo start | stop | restart | status"]
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
# Obrigatóriamente é necessário implementar o método run
|
43
|
+
def run
|
44
|
+
# Chamar o método run da classe pai (super) passando um bloco que vai conter seu código
|
45
|
+
super do
|
46
|
+
# Caso deseje que o seu comando fique executando repetidamente coloque dentro de um loop
|
47
|
+
loop do
|
48
|
+
# Escreva seu código aqui!!
|
49
|
+
# Não use Process.exit(true), exit(), abort() em seu codigo pois infere na morte do processo do Daemon
|
50
|
+
puts "Está executando comando_exemplo! :)"
|
51
|
+
|
52
|
+
# Espera em segundos antes de executar seu comando outra vez
|
53
|
+
# Util no caso de simular um processo cronológico (esse exemplo vai executar o comando a cada 10 segundos)
|
54
|
+
sleep(10)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
FILE
|
62
|
+
|
63
|
+
commands_dir = DAEMON_CONFIG['command_path']
|
64
|
+
commands_dir = File.join(base, commands_dir)
|
65
|
+
FileUtils.mkdir_p(commands_dir) unless File.directory?(commands_dir)
|
66
|
+
|
67
|
+
command_file = File.join(commands_dir, 'comando_exemplo.rb')
|
68
|
+
File.open(command_file, 'wb') {|f| f.write(command_sample_content) } unless File.exists?(command_file)
|
69
|
+
|
70
|
+
log_dir = "log"
|
71
|
+
log_dir = File.join(base, log_dir)
|
72
|
+
FileUtils.mkdir_p(log_dir) unless File.directory?(log_dir)
|
73
|
+
|
74
|
+
pids_dir = File.join(base, "tmp/pids")
|
75
|
+
pids_file = File.join(base, DAEMON_CONFIG['pids_file'])
|
76
|
+
FileUtils.mkdir_p(pids_dir) unless File.directory?(pids_dir)
|
77
|
+
File.open(pids_file, 'wb') {|f| f << "default:" } unless File.exist?(pids_file)
|
78
|
+
|
79
|
+
puts "[Ok] Gem foi configurada!"
|
80
|
+
exit
|
81
|
+
end
|
82
|
+
|
83
|
+
unless File.exist?(config_file)
|
84
|
+
puts "[Ooops] Gem ainda não foi configurada... Para configurar execute o comando fcld --configure "
|
85
|
+
exit
|
86
|
+
end
|
87
|
+
|
88
|
+
require 'fcl_rails_daemon'
|
89
|
+
require 'fcl_rails_daemon/version'
|
90
|
+
|
91
|
+
FclRailsDaemon::Gerenciador.run(ARGV)
|
data/bin/setup
ADDED
Binary file
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'fcl_rails_daemon/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "fcl_rails_daemon"
|
8
|
+
spec.version = FclRailsDaemon::VERSION
|
9
|
+
spec.licenses = ['MIT']
|
10
|
+
spec.platform = Gem::Platform::RUBY
|
11
|
+
spec.authors = ["Washington Silva"]
|
12
|
+
spec.email = ["w-osilva@hotmail.com"]
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.rubyforge_project = "fcl_rails_daemon"
|
15
|
+
spec.files = `git ls-files -z`.split("\x0")
|
16
|
+
spec.test_files = `git ls-files -- {test,spec}/*`.split("\n")
|
17
|
+
spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.summary = %q{Projeto utilizado para gerar comandos que podem ser executados em background (daemons).}
|
21
|
+
spec.description = %q{Este tem como maior caracteristica a facilidade de gerar comandos e gerenciá-los de forma independente.}
|
22
|
+
|
23
|
+
spec.add_dependency "bundler"
|
24
|
+
spec.add_dependency "activesupport"
|
25
|
+
spec.add_dependency "rake"
|
26
|
+
spec.add_dependency "daemons", "~> 1.2"
|
27
|
+
|
28
|
+
spec.add_development_dependency "rspec"
|
29
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module FclRailsDaemon
|
2
|
+
class ComandoExemplo < FclRailsDaemon::Daemon
|
3
|
+
|
4
|
+
# Obrigatóriamente é necessário implementar o método "initialize" e definir o parametro "task" (nome que será
|
5
|
+
# referenciado no comando digitado no terminal).
|
6
|
+
#
|
7
|
+
# O parametro "log" é opcional mas sugiro que seja definido um log para cada comando para evitar que muitos comandos
|
8
|
+
# escrevam no mesmo arquivo ocasionando dificuldade em compreender qual saída pertence a qual comando (caso tenha
|
9
|
+
# muitos comandos)
|
10
|
+
def initialize
|
11
|
+
super(task: 'meu_comando', log: 'log/meu_comando.log')
|
12
|
+
end
|
13
|
+
|
14
|
+
# Obrigatóriamente é necessário implementar o método self.help e retornar um Hash com "descricao" e "exemplo"
|
15
|
+
def self.help
|
16
|
+
{
|
17
|
+
descricao: 'Executa meu comando :) - Executado a cada 1 min',
|
18
|
+
exemplo: ['--task meu_comando start | stop | restart | status']
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
# Obrigatóriamente é necessário implementar o método run e chamar o mesmo método run da classe pai (super) passando
|
23
|
+
# um bloco que vai conter seu código
|
24
|
+
def run
|
25
|
+
super do
|
26
|
+
|
27
|
+
# Caso deseje que o seu comando fique executando repetidamente coloque dentro de um loop
|
28
|
+
loop do
|
29
|
+
|
30
|
+
# Escreva seu código aqui!!
|
31
|
+
# É importante que não exista nenhuma chamada para Process.exit(true), exit(), abort() pois infere na morte do
|
32
|
+
# processo do Daemon
|
33
|
+
puts "#{Time.now.to_s} - Está executando meu comando! :)"
|
34
|
+
|
35
|
+
# Espera em segundos antes de iniciar novamente
|
36
|
+
# Util para que possa simular um processo cronológico (neste exemplo o comando será executado repetidamente
|
37
|
+
# a cada 60 segundos)
|
38
|
+
sleep(60)
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
data/lib/core/daemon.rb
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
module FclRailsDaemon
|
2
|
+
class Daemon
|
3
|
+
|
4
|
+
cattr_reader :comandos_validos
|
5
|
+
@@pids_file = File.join(DAEMON_ROOT, DAEMON_CONFIG['pids_file'])
|
6
|
+
@@comandos_validos = ['start', 'stop', 'restart', 'status']
|
7
|
+
|
8
|
+
|
9
|
+
def initialize(task: nil, log: nil)
|
10
|
+
raise "Não foi definida o nome da task no construtor do comando" unless task
|
11
|
+
@daemon ||= nil
|
12
|
+
@task = task
|
13
|
+
@log = (log) ? File.join(DAEMON_ROOT, log) : File.join(DAEMON_ROOT, DAEMON_CONFIG['default_log'])
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.pids
|
17
|
+
f = File.open(@@pids_file, 'rb')
|
18
|
+
f.read
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.help
|
22
|
+
raise "Não foi implementado o método self.help no comando"
|
23
|
+
end
|
24
|
+
|
25
|
+
def log
|
26
|
+
puts "#{@log} (#{@task})"
|
27
|
+
end
|
28
|
+
|
29
|
+
def run(&block)
|
30
|
+
@daemon = Daemons.call(multiple: true) do
|
31
|
+
# força a saída para o output definido
|
32
|
+
$stdout.reopen(@log, 'a')
|
33
|
+
$stderr.reopen(@log, 'a')
|
34
|
+
$stdout.sync = true
|
35
|
+
|
36
|
+
block.call
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def start
|
41
|
+
pid = get_pid @task
|
42
|
+
if running?(pid)
|
43
|
+
puts "proc: processo com pid #{pid} está rodando. (#{@task})"
|
44
|
+
return
|
45
|
+
end
|
46
|
+
run
|
47
|
+
set_pid(@task, @daemon.pid.pid) if @daemon
|
48
|
+
end
|
49
|
+
|
50
|
+
def stop
|
51
|
+
pid = get_pid @task
|
52
|
+
|
53
|
+
unless running? pid
|
54
|
+
puts "proc: processo não está rodando. (#{@task})"
|
55
|
+
return
|
56
|
+
end
|
57
|
+
kill pid
|
58
|
+
end
|
59
|
+
|
60
|
+
def restart
|
61
|
+
stop
|
62
|
+
start
|
63
|
+
end
|
64
|
+
|
65
|
+
def status
|
66
|
+
pid = get_pid @task
|
67
|
+
if running? pid
|
68
|
+
puts "proc: processo com pid #{pid} está rodando. (#{@task}) "
|
69
|
+
else
|
70
|
+
puts "proc: processo não está rodando. (#{@task}) "
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
def get_pid(task)
|
76
|
+
pids = YAML.load_file(@@pids_file)
|
77
|
+
(pids.has_key?(task)) ? pids[task] : nil
|
78
|
+
end
|
79
|
+
|
80
|
+
def set_pid(task, pid)
|
81
|
+
pids = YAML.load_file(@@pids_file)
|
82
|
+
pids[task] = pid
|
83
|
+
File.open(@@pids_file, 'wb') do |f|
|
84
|
+
f << pids.to_yaml
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def running?(pid)
|
89
|
+
status = false
|
90
|
+
if pid
|
91
|
+
begin
|
92
|
+
Process.getpgid(pid)
|
93
|
+
status = true
|
94
|
+
rescue Errno::ESRCH
|
95
|
+
status = false
|
96
|
+
end
|
97
|
+
end
|
98
|
+
status
|
99
|
+
end
|
100
|
+
|
101
|
+
def kill(pid)
|
102
|
+
status = false
|
103
|
+
if pid
|
104
|
+
begin
|
105
|
+
Process.kill("KILL", pid)
|
106
|
+
set_pid(@task, nil)
|
107
|
+
status = true
|
108
|
+
rescue Errno::ESRCH
|
109
|
+
puts "proc: não existe processo com pid #{pid}. (#{@task})"
|
110
|
+
status = false
|
111
|
+
ensure
|
112
|
+
if status == false
|
113
|
+
puts "proc: processo com pid #{pid} está parado. (#{@task})"
|
114
|
+
else
|
115
|
+
puts "proc: processo com pid #{pid} foi parado. (#{@task})"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
else
|
119
|
+
puts "proc: não existe processo com pid #{pid}. (#{@task})"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,185 @@
|
|
1
|
+
module FclRailsDaemon
|
2
|
+
class Gerenciador
|
3
|
+
@@comandos = Registrador.load
|
4
|
+
|
5
|
+
def self.run(argv)
|
6
|
+
|
7
|
+
if argv.include?('--pids')
|
8
|
+
puts Daemon.pids
|
9
|
+
exit
|
10
|
+
end
|
11
|
+
|
12
|
+
if argv.include?('--logs')
|
13
|
+
registrados = self.get_registrados nil
|
14
|
+
registrados.each { |comando| comando.send('log') }
|
15
|
+
exit
|
16
|
+
end
|
17
|
+
|
18
|
+
self.criar_comando(argv) if argv.include?('--create')
|
19
|
+
|
20
|
+
self.help(ARGV) unless self.valid?(argv)
|
21
|
+
|
22
|
+
task ||= nil
|
23
|
+
acao = argv.last
|
24
|
+
if argv.include?('--task')
|
25
|
+
i = argv.index('--task') + 1
|
26
|
+
task = argv[i]
|
27
|
+
end
|
28
|
+
registrados = self.get_registrados task
|
29
|
+
registrados.each { |comando| comando.send(acao) }
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def self.help(argv)
|
34
|
+
acao = argv.last
|
35
|
+
task ||= nil
|
36
|
+
if (argv.include?('--task') && argv.include?('--help'))
|
37
|
+
i = argv.index('--task') + 1
|
38
|
+
task = argv[i]
|
39
|
+
end
|
40
|
+
helpers = self.get_helpers(task)
|
41
|
+
self.show helpers
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.valid?(argv)
|
45
|
+
Daemon.comandos_validos.include?(argv.last) && !(argv.include?('--help'))
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
def self.show(helpers)
|
50
|
+
prefixo = DAEMON_CONFIG['command_prefix']
|
51
|
+
|
52
|
+
puts "\n------------------------------------------------------------------------------------------------------------\n"
|
53
|
+
puts " FOOTSTATSD\n"
|
54
|
+
puts "------------------------------------------------------------------------------------------------------------\n"
|
55
|
+
puts " * Use a opção --help para ver os manual para os comandos\n"
|
56
|
+
puts " #{prefixo} --help\n\n"
|
57
|
+
puts " * Use a opção start| stop | restart | status para controlar todos processos de uma vez\n"
|
58
|
+
puts " #{prefixo} start\n\n"
|
59
|
+
puts " * Use a opção --pids para ver os pids de processos\n"
|
60
|
+
puts " #{prefixo} --pids\n\n"
|
61
|
+
puts " * Use a opção --logs para ver os arquivos de log configurados para os comandos\n"
|
62
|
+
puts " #{prefixo} --logs\n\n"
|
63
|
+
puts " * Use a opção --task nome_comando start | stop | restart | status para controlar processos individualmente\n"
|
64
|
+
puts " #{prefixo} --task comando start\n\n"
|
65
|
+
puts "------------------------------------------------------------------------------------------------------------\n"
|
66
|
+
puts " LISTA DE TASKS\n"
|
67
|
+
puts "------------------------------------------------------------------------------------------------------------\n"
|
68
|
+
|
69
|
+
helpers.each do |h|
|
70
|
+
puts " * #{h[:descricao]}"
|
71
|
+
h[:exemplo].each do |e|
|
72
|
+
puts " #{e}"
|
73
|
+
end
|
74
|
+
puts ""
|
75
|
+
end
|
76
|
+
exit
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.get_registrados(task = nil)
|
80
|
+
lista = []
|
81
|
+
@@registrados ||= {}
|
82
|
+
if task
|
83
|
+
raise "Comando não registrado # #{task} #" unless @@comandos.has_key? task
|
84
|
+
@@registrados[task] = (@@registrados.has_key? task) ? @@registrados[task] : @@comandos[task].new
|
85
|
+
lista << @@registrados[task]
|
86
|
+
return lista
|
87
|
+
end
|
88
|
+
@@comandos.each do |k, c|
|
89
|
+
lista << @@registrados[k] = (@@registrados.has_key? k) ? @@registrados[k] : c.new
|
90
|
+
end
|
91
|
+
lista
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.get_helpers(task = nil)
|
95
|
+
lista = []
|
96
|
+
@@helpers ||= {}
|
97
|
+
if task
|
98
|
+
raise "Comando não registrado # #{task} #" unless @@comandos.has_key? task
|
99
|
+
@@helpers[task] = (@@helpers.has_key? task) ? @@helpers[task] : @@comandos[task].help
|
100
|
+
lista << @@helpers[task]
|
101
|
+
return lista
|
102
|
+
end
|
103
|
+
@@comandos.each do |k, c|
|
104
|
+
lista << @@helpers[k] = c.help unless @@helpers.has_key?(k)
|
105
|
+
end
|
106
|
+
lista
|
107
|
+
end
|
108
|
+
|
109
|
+
def self.criar_comando(argv)
|
110
|
+
|
111
|
+
i = argv.index('--create') + 1
|
112
|
+
comando = argv[i]
|
113
|
+
unless comando
|
114
|
+
puts "O nome do comando não foi definido"
|
115
|
+
exit
|
116
|
+
end
|
117
|
+
if Daemon.comandos_validos.include? comando
|
118
|
+
puts "O comando não pode ter o nome #{comando}"
|
119
|
+
exit
|
120
|
+
end
|
121
|
+
|
122
|
+
comando_camel = ActiveSupport::Inflector.camelize(comando)
|
123
|
+
comando_undescore = ActiveSupport::Inflector.underscore(comando)
|
124
|
+
|
125
|
+
conteudo = <<-FILE
|
126
|
+
class #{comando_camel} < FclRailsDaemon::Daemon
|
127
|
+
|
128
|
+
# Obrigatóriamente é necessário implementar o método "initialize"
|
129
|
+
def initialize
|
130
|
+
# Definir o parametro "task" (nome que será referenciado no comando digitado no terminal).
|
131
|
+
#
|
132
|
+
# O parametro "log" é opcional mas sugiro que seja definido um log para cada comando para evitar que muitos comandos
|
133
|
+
# escrevam no log deafult (caso tenha# muitos comandos)
|
134
|
+
super(task: "#{comando_undescore}", log: "log/#{comando_undescore}.log")
|
135
|
+
end
|
136
|
+
|
137
|
+
# Obrigatóriamente é necessário implementar o método self.help
|
138
|
+
def self.help
|
139
|
+
# Retornar Hash com "descricao" e "exemplo"
|
140
|
+
{
|
141
|
+
descricao: "Descrição do comando #{comando_undescore} :) - Executado a cada 1 min",
|
142
|
+
exemplo: ["--task #{comando_undescore} start | stop | restart | status"]
|
143
|
+
}
|
144
|
+
end
|
145
|
+
|
146
|
+
# Obrigatóriamente é necessário implementar o método run
|
147
|
+
def run
|
148
|
+
# Chamar o método run da classe pai (super) passando um bloco que vai conter seu código
|
149
|
+
super do
|
150
|
+
# Caso deseje que o seu comando fique executando repetidamente coloque dentro de um loop
|
151
|
+
loop do
|
152
|
+
# Escreva seu código aqui!!
|
153
|
+
# Não use Process.exit(true), exit(), abort() em seu codigo pois infere na morte do processo do Daemon
|
154
|
+
puts "Está executando #{comando_undescore}! :)"
|
155
|
+
|
156
|
+
# Espera em segundos antes de executar seu comando outra vez
|
157
|
+
# Util no caso de simular um processo cronológico (esse exemplo vai executar o comando a cada 10 segundos)
|
158
|
+
sleep(10)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|
164
|
+
FILE
|
165
|
+
|
166
|
+
arquivo = File.join(DAEMON_ROOT, DAEMON_CONFIG['command_path'], comando_undescore + '.rb' )
|
167
|
+
|
168
|
+
if File.exist?(arquivo)
|
169
|
+
puts "Comando já existe..."
|
170
|
+
else
|
171
|
+
File.open(arquivo, 'wb') {|f| f.write(conteudo) }
|
172
|
+
|
173
|
+
arquivo_registro = File.join(DAEMON_ROOT, DAEMON_CONFIG['register_file'] )
|
174
|
+
conteudo_registrar = "\nFclRailsDaemon::Registrador.add(comando: '#{comando_undescore}', classe: #{comando_camel})"
|
175
|
+
File.open(arquivo_registro, 'a+') {|f| f << conteudo_registrar }
|
176
|
+
|
177
|
+
puts "Comando criado e registrado... "
|
178
|
+
puts "Arquivo: #{arquivo} "
|
179
|
+
puts "Registro: #{arquivo_registro} "
|
180
|
+
end
|
181
|
+
exit
|
182
|
+
end
|
183
|
+
|
184
|
+
end
|
185
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module FclRailsDaemon
|
2
|
+
class Registrador
|
3
|
+
@@comandos ||= {}
|
4
|
+
|
5
|
+
def self.add(comando: nil, classe: nil)
|
6
|
+
raise "Comando não definido" unless comando
|
7
|
+
raise "Classe não definida" unless classe
|
8
|
+
@@comandos[comando] = classe
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.load
|
12
|
+
@@comandos
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "fcl_rails_daemon/version"
|
2
|
+
require "fcl_rails_daemon/config"
|
3
|
+
require 'fileutils'
|
4
|
+
require 'yaml'
|
5
|
+
require 'daemons'
|
6
|
+
require 'active_support'
|
7
|
+
|
8
|
+
|
9
|
+
module FclRailsDaemon end
|
10
|
+
|
11
|
+
require_relative "core/daemon"
|
12
|
+
comandos_dir = File.join(DAEMON_ROOT, "lib", "comandos")
|
13
|
+
if File.directory?(comandos_dir)
|
14
|
+
Dir["#{comandos_dir}/*.rb"].each {|file| require file }
|
15
|
+
end
|
16
|
+
require_relative "core/registrador.rb"
|
17
|
+
require_relative "core/gerenciador.rb"
|
18
|
+
|
19
|
+
require File.join(DAEMON_ROOT, "config", "fcld_rails_daemon.rb")
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fcl_rails_daemon
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Washington Silva
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-12-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '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'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
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: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
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: daemons
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.2'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.2'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
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
|
+
description: Este tem como maior caracteristica a facilidade de gerar comandos e gerenciá-los
|
84
|
+
de forma independente.
|
85
|
+
email:
|
86
|
+
- w-osilva@hotmail.com
|
87
|
+
executables:
|
88
|
+
- console
|
89
|
+
- fcld
|
90
|
+
- setup
|
91
|
+
extensions: []
|
92
|
+
extra_rdoc_files: []
|
93
|
+
files:
|
94
|
+
- ".gitignore"
|
95
|
+
- ".rspec"
|
96
|
+
- ".travis.yml"
|
97
|
+
- Gemfile
|
98
|
+
- README.md
|
99
|
+
- Rakefile
|
100
|
+
- bin/console
|
101
|
+
- bin/fcld
|
102
|
+
- bin/setup
|
103
|
+
- fcl_rails_daemon-1.0.0.gem
|
104
|
+
- fcl_rails_daemon.gemspec
|
105
|
+
- lib/core/comando_exemplo.rb
|
106
|
+
- lib/core/daemon.rb
|
107
|
+
- lib/core/gerenciador.rb
|
108
|
+
- lib/core/registrador.rb
|
109
|
+
- lib/fcl_rails_daemon.rb
|
110
|
+
- lib/fcl_rails_daemon/config.rb
|
111
|
+
- lib/fcl_rails_daemon/version.rb
|
112
|
+
- spec/fcl_rails_daemon_spec.rb
|
113
|
+
- spec/spec_helper.rb
|
114
|
+
homepage: ''
|
115
|
+
licenses:
|
116
|
+
- MIT
|
117
|
+
metadata: {}
|
118
|
+
post_install_message:
|
119
|
+
rdoc_options: []
|
120
|
+
require_paths:
|
121
|
+
- lib
|
122
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
requirements: []
|
133
|
+
rubyforge_project: fcl_rails_daemon
|
134
|
+
rubygems_version: 2.4.8
|
135
|
+
signing_key:
|
136
|
+
specification_version: 4
|
137
|
+
summary: Projeto utilizado para gerar comandos que podem ser executados em background
|
138
|
+
(daemons).
|
139
|
+
test_files: []
|