pastebin - collaborative debugging

pastebin is a collaborative debugging tool allowing you to share and modify code snippets while chatting on IRC, IM or a message board.

This site is developed to XHTML and CSS2 W3C standards. If you see this paragraph, your browser does not support those standards and you need to upgrade. Visit WaSP for a variety of options.

Ruby pastebin - collaborative debugging tool View Help


Posted by rui on Thu 11 Oct 14:36
report abuse | download | new post

  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

Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.

Syntax highlighting:

To highlight particular lines, prefix each line with @@


Remember me