Share Pastebin
Guest
Public paste!

rui

By: a guest | Oct 11th, 2007 | Syntax: Ruby | Size: 7.29 KB | Hits: 71 | Expires: Never
Copy text to clipboard
  1. =begin
  2. Coletor do Sisope.
  3. Organiza as threads e envia os dados.
  4. Feito por Ruivaldo Neto
  5. =end
  6. $: << "/home/sisope/"
  7. $DEBUG = true
  8.  
  9. ##
  10. # Aqui você pode ver que usamos poucas dependências :)
  11. require 'logger'
  12. require 'date'
  13. require 'time'
  14. require 'net/http'
  15. require 'infocentro.rb'
  16. require 'yaml'
  17.  
  18. ##
  19. # Configurando o logger
  20. $log = Logger.new(STDOUT)
  21. $log.level = Logger::DEBUG
  22. $log.datetime_format = "%H:%M:%S"
  23. $log.info("Iniciando coletor")
  24.  
  25. ##
  26. # Constantes
  27. $EnderecoServidor = ""
  28. $ArquivoReenvio = ""
  29.  
  30. ##
  31. # Método para esperar X minutos
  32. def sleep_minutos(minutos)
  33.   sleep minutos # * 60
  34. end
  35.  
  36. ##
  37. # Classe coletora
  38. class Coletor
  39.   def initialize
  40.     @infocentro = Infocentro.new
  41.     @coletas = []
  42.   end
  43.  
  44.   ##
  45.   # Verifica se o id do infocentro está configurado.
  46.   def verificar_id_configurado
  47.     if @infocentro.coletar_id.nil?
  48.       exit 1
  49.     end
  50.   end
  51.  
  52.   ##
  53.   # Verifica se os arquivos necessários as coletas existem, senão, cria.
  54.   def verificar_arquivos_necessarios
  55.     if not File.exists?('/var/log/lastlog')
  56.       system('cat /dev/null > /var/log/lastlog')
  57.     end
  58.  
  59.     if not File.exists?('/var/log/wtmp')
  60.       system('cat /dev/null > /var/log/wtmp')
  61.     end
  62.   end
  63.  
  64.  
  65.   ##
  66.   # Envia os dados através de uma requisição POST simulada.
  67.   def enviar_para(endereco, parametros, tentativa=0)
  68.     # Verifica se o numero de tentativas excedeu o limite de dez.
  69.     if tentativa == 10
  70.       #$log.warn("Salvando para reenvio: #{endereco} - #{parametros.inspect}")
  71.       salvar_para_reenvio(endereco, parametros)
  72.       return false
  73.     end
  74.  
  75.     #$log.info("Tentando enviar: #{endereco} - #{parametros.inspect}")
  76.     resposta = Net::HTTP.post_form(URI.parse(endereco), parametros)
  77.     if resposta.code.to_i == 200
  78.       #$log.info("Enviado: #{endereco} - #{parametros.inspect}")
  79.       return true
  80.     end
  81.    
  82.     rescue SocketError => e
  83.       #$log.warn("Falha na transmissão: #{endereco} - #{parametros.inspect}")
  84.       sleep 6 # Dorme 6 segundos para não sobrecarregar o servidor.
  85.       self.enviar_para(endereco, parametros, tentativa+1)
  86.  
  87.     rescue SystemStackError => e
  88.       #$log.debug("Muitas tentativas de envio feitas. Abortando.")
  89.   end
  90.  
  91.   ##
  92.   # Salva o endereco e os parametros numa lista para reenvio
  93.   def salvar_para_reenvio(endereco, parametros)  
  94.     grupo = endereco.split("/")[-1]
  95.     endereco = $EnderecoServidor + 'reenvio_' + grupo
  96.    
  97.     parametros["data"] = Date.today.strftime("%d/%m/%Y")
  98.     parametros["horario"] = Time.now.strftime("%H:%m:%S")
  99.    
  100.     lista_de_envio = carregar_lista_reenvio()
  101.     lista_de_envio << {:endereco => endereco, :parametros => parametros}
  102.     alterar_lista_reenvio(lista_de_envio)
  103.   end
  104.  
  105.  
  106.   ##
  107.   # Carregar lista reenvio
  108.   def carregar_lista_reenvio
  109.     lista_de_envio = YAML.load(File.open($ArquivoReenvio, "r+"))
  110.    
  111.     if lista_de_envio.nil?
  112.       lista_de_envio = []
  113.     end
  114.        
  115.     return lista_de_envio
  116.   end
  117.  
  118.  
  119.   ##
  120.   # Escreve na lista de reenvio uma nova lista
  121.   def alterar_lista_reenvio(nova_lista)
  122.     File.open($ArquivoReenvio, "w") { |fp| YAML.dump(nova_lista, fp) }
  123.   end
  124.  
  125.  
  126.   ##
  127.   # Pegar proximo elemento no reenvio
  128.   def proximo_reenvio()
  129.     lista_envio = carregar_lista_reenvio()    
  130.     item_reenvio = lista_envio[0]
  131.     return item_reenvio
  132.   end
  133.  
  134.  
  135.   ##
  136.   # Executar reenvio
  137.   # Pega o primeiro item da lista de reenvio a cada uma hora
  138.   # E tenta enviar. Se conseguir, remove-o da lista.
  139.   def executar_reenvio()
  140.     while true
  141.       item_reenvio = proximo_reenvio()
  142.      
  143.       #$log.debug(item_reenvio.inspect)
  144.       unless item_reenvio.nil? || item_reenvio.empty?
  145.         #$log.info("Reenviando: #{item_reenvio[:endereco]} #{item_reenvio[:parametros].inspect}")
  146.        
  147.         resposta = self.reenvio(item_reenvio[:endereco], item_reenvio[:parametros])
  148.         if resposta == 200
  149.           ## This line is bogus, look: item_reeEnvio
  150.           $log.info("Reenviado com exito: #{item_reeenvio[:endereco]} - #{item_reenvio[:parametros].inspect}")
  151.           ##
  152.           prosseguir_lista_reenvio()
  153.           $log.debug(carregar_lista_reenvio())
  154.         else
  155.           #$log.info("Falha ao reenviar: #{item_reenvio[:endereco]} - #{item_reenvio[:parametros].inspect.inspect}")
  156.         end
  157.        
  158.       else
  159.         #$log.info("Nao ha items setados para reenvio")
  160.       end
  161.      
  162.       sleep_minutos(10) # Dorme por uma hora
  163.     end
  164.   end
  165.  
  166.  
  167.   ##
  168.   # Prosseguir lista de reenvio
  169.   # Remove o primeiro e pula para o proximo
  170.   def prosseguir_lista_reenvio()
  171.     lista_envio = carregar_lista_reenvio()
  172.     lista_envio.shift unless lista_envio.nil? || lista_envio.empty?
  173.     alterar_lista_reenvio(lista_envio)
  174.   end
  175.  
  176.  
  177.   ##
  178.   # Método enviar_para_reenvio
  179.   # É um enviar para sem repetição
  180.   def reenvio(endereco, parametros)
  181.     begin
  182.       resposta = Net::HTTP.post_form(URI.parse(endereco), parametros)
  183.       return resposta.code.to_i
  184.     rescue SocketError => e
  185.       return 404
  186.     end
  187.   end
  188.  
  189.  
  190.   ##
  191.   # Envia o primeiro grupo de coleta.
  192.   def executar_coleta_grupo1
  193.     parametros = {}
  194.     while true
  195.       parametros['id'] = @infocentro.coletar_id
  196.       parametros['qad'] = @infocentro.coletar_qad
  197.       parametros['qul'] = @infocentro.coletar_qul
  198.       parametros['qtl'] = @infocentro.coletar_qtl
  199.       parametros['hd'] = @infocentro.coletar_hd
  200.  
  201.       self.enviar_para($EnderecoServidor + "grupo1.php", parametros)
  202.       sleep_minutos(10) # Aguarda por dez minutos.
  203.     end
  204.   end
  205.  
  206.  
  207.   ##
  208.   # Executar coleta grupo 2.
  209.   def executar_coleta_grupo2
  210.     parametros = {}
  211.     while true
  212.       parametros['id'] = @infocentro.coletar_id
  213.       parametros['ocupacao_home'] = @infocentro.coletar_ocupacao_home
  214.       parametros['ocupacao_raiz'] = @infocentro.coletar_ocupacao_raiz
  215.       parametros['quantidade_impressao'] = @infocentro.coletar_quantidade_impressao
  216.       parametros['quantidade_login_root'] = @infocentro.coletar_quantidade_login_root
  217.       parametros['versao_berimbau'] = @infocentro.coletar_versao_berimbau
  218.       parametros['quantidade_usuario_cadastrado'] = @infocentro.coletar_quantidade_usuario_cadastrado
  219.  
  220.       self.enviar_para($EnderecoServidor + "grupo2.php", parametros)
  221.       sleep_minutos(120) # Envia a cada duas horas
  222.     end
  223.   end
  224.  
  225.  
  226.   ###
  227.   # Coleta pld.
  228.   def coletar_pld()
  229.       sleep_minutos(60) # Espera uma hora até o primeiro login.
  230.       parametros = {}
  231.       parametros['id'] = @infocentro.coletar_id
  232.       parametros['pld'] = @infocentro.coletar_primeiro_login
  233.       self.enviar_para($EnderecoServidor + 'pld1.php', parametros)
  234.   end
  235.  
  236.  
  237.   ###
  238.   # Iniciar coletas.
  239.   def iniciar_coleta()
  240.     # Coleta do pld
  241.     @coletas << Thread.new { self.coletar_pld }
  242.  
  243.     # Adiciona coleta do grupo 1 ;)
  244.     @coletas << Thread.new { self.executar_coleta_grupo1 }
  245.  
  246.     # Adiciona a coleta do grupo 2
  247.     @coletas << Thread.new { self.executar_coleta_grupo2 }
  248.  
  249.     # Adiciona o reenvio
  250.     @coletas << Thread.new { self.executar_reenvio }
  251.    
  252.     # Inicia as threads. O método join faz o programa executar até elas terminarem.
  253.     @coletas.each {|c| c.abort_on_exception = true}
  254.     @coletas.each {|c| c.join}
  255.   end
  256. end
  257.  
  258.  
  259. ###
  260. # Inicia a execução do script.
  261. coletor = Coletor.new
  262. coletor.verificar_id_configurado
  263. coletor.verificar_arquivos_necessarios
  264. coletor.iniciar_coleta