`

ror项目里通过FTP定时获取文件存储到程序目录

    博客分类:
  • RUBY
FTP 
阅读更多
module Net
  class FTP
    def mput(pattern, &block)
      Dir[pattern].each{ |file| put(file, &block) }
    end

    def mget(pattern, remote_path = ".", local_path = ".", &block)
#      remote_path = is_cw ? remote_path + "/" + pattern : remote_path  
      files = remote_path.blank? ? list(pattern) : list(remote_path + "/" + pattern)
#      files = is_cw ? list(remote_path) : nlst(remote_path)  
      localfiles = []
      files.each{ |file|
        filename = filename(file)
        file_extname = filename.split(".").last
        localfile = local_path + "/" + File.basename(filename)
        ext_name = ["txt","xml", "dat"] # 标准的文本文件结尾
        ext_name << "end" 备份文件采集.end 结尾,实际上是TXT文件
        if(ext_name.include?(file_extname.downcase)||file_extname.downcase.match(/\d{4}-\d{1,2}-\d{1,2}$/))
          gettextfile(remote_path + "/" + filename, localfile, &block)
#          gettextfile( filename, localfile, &block)  
        else
          getbinaryfile(remote_path + filename, localfile, &block)
        end
        sleep(1)
        localfiles << localfile
      }
      return localfiles
    end

    def filename(o_filename)
      if(o_filename.start_with?("l"))
        s = o_filename.split(" ")
        s[s.length - 3]
      else
        o_filename.split(" ").last
      end
    end
  end
end




rake定时文件

desc 'Import Hubei radius CDR'
namespace :hb do
  task :import_radius  => :environment do
    date = ENV['date']
    date ||= (DateTime.now - 1.day).strftime("%Y-%m-%d")
    FileUtils.mkpath("#{RAILS_ROOT}/tmp/radius")
    FileUtils.mkpath("#{RAILS_ROOT}/tmp/sqlldr")
    radius_config = YAML.load_file("#{RAILS_ROOT}/config/value_analysis.yml").symbolize_keys!
    time_start = Time.now
    sqlldr_file = File.new("#{RAILS_ROOT}/tmp/sqlldr/#{date}-radius.ctl", "w")
    begin
      write_header(sqlldr_file)
      date_pattern = date.to_date.strftime("%Y%m%d")
      sqlldr_lines = []
      Net::FTP.open(radius_config[:radius_host], radius_config[:radius_username], radius_config[:radius_password]) { |ftp|
        ftp.passive = true
        ftp.debug_mode = true
        ftp.resume = true
        ftp.mget("*" + date_pattern + "*.txt", radius_config[:radius_path] + "/#{date_pattern}", "#{RAILS_ROOT}/tmp/radius") do |line|
          sqlldr_line = []
          unless line.nil?
            cell_def.each do |d|
              key = d.keys.first
              value = d.values.first
              fields_value = line.split("|")
              if fields_value.length > 5
                if ['net_type','auth_type'].include?(key.to_s)
                  sqlldr_line << value
                elsif value.is_a? Fixnum
                  sqlldr_line << fields_value[value]
                elsif value[:format].nil?
                  sqlldr_line << fields_value[value[:index]]
                else
                  sqlldr_line << value[:format].call(fields_value[value[:index]])
                end
              end              
            end
            sqlldr_lines << sqlldr_line.join(",")
          end
        end
      }
      sqlldr_file << sqlldr_lines.join("\n")
      puts "total_time for writing sqlldr_file:#{Time.now - time_start}"
      sleep 10
      time_start = Time.now
      sqlldr_com = "sqlldr userid=#{$CFG['username']}/#{$CFG['password']}@#{$CFG['service']},control=#{RAILS_ROOT}/tmp/sqlldr/#{date}-radius.ctl,log=#{RAILS_ROOT}/log/#{date}.log,direct=true"
      puts sqlldr_com
      system sqlldr_com
      puts "total_time for importing data:#{Time.now - time_start}"
      time_start = Time.now
      puts "calling deal wlan auth perf task procedure"
      sleep 0.02
      Report.deal_auth_deal_perf_task(date)
      puts "total_time for execute procedure:#{Time.now - time_start}"
    ensure
      sqlldr_file.close
    end
  end

  def cell_def
    [
      {:login => 2},
      {:start_time => {
          :index => 30,
          :head => "START_TIME Date 'yyyymmddHH24miss'"
        }},
      {:sta_mac => {
          :index => 20,
          :format => Proc.new {|mac| format_mac(mac) }
        }},
      {:end_time => {
          :index => 31,
          :head => "END_TIME Date 'yyyymmddHH24miss'"
        }},
      {:period_time => {
          :index => 32,
          :format => Proc.new {|time_len| time_len.to_i / 60 }
        }},
      {:bytes_in => {
          :index => 12,
          :format => Proc.new {|bytes| bytes.to_i * 1000 }
        }
      },
      {:bytes_out => {
          :index => 11,
          :format => Proc.new {|bytes| bytes.to_i * 1000 }
        }
      },
      {:svlan_id => 48},
      {:net_type => 1},
      {:auth_type => 1}
    ]
  end

  def format_mac(mac)
    "#{mac[0..1]}:#{mac[2..3]}:#{mac[4..5]}:#{mac[6..7]}:#{mac[8..9]}:#{mac[10..11]}".upcase
  end

  def write_header(sqlldr_file)
    sqlldr_file << "OPTIONS(ERRORS=100000)\nLoad DATA\nINFILE *\nTRUNCATE INTO TABLE WLAN_AUTH_IMPORT_TEMP\nFields terminated by \",\"\nTRAILING NULLCOLS\n"
    head = []
    cell_def.each do |d|
      key = d.keys.first
      value = d.values.first
      if value.is_a? Fixnum or value[:head].nil?
        head << key.to_s.upcase
      else
        head << value[:head]
      end
    end
    sqlldr_file << "(#{head.join(",")})\nBEGINDATA\n"
  end
end
分享到:
评论

相关推荐

    ROR 文件的上传与下载

    1. **文件上传**:`UploadController`中的`create`方法接收上传的文件,并调用`SaveFile`模型的`save`方法将文件数据存储到数据库中。`SaveFile`模型的`save`方法读取文件的二进制流,并将其连同文件名一起保存到...

    ror留言板程序

    通过这个"ror留言板程序",开发者可以学习到Ruby on Rails的基础知识,如路由设置、控制器操作、模型关联、视图渲染,以及如何利用数据库进行数据交互。此外,还可以了解到测试驱动开发(TDD)的概念,以及如何组织...

    RoR性能优化经验谈

    首先,RoR性能优化涉及到多个层面,包括应用程序的部署、服务器配置以及代码优化。在部署方面,操作系统的选择至关重要。RoR通常在Unix类操作系统上运行最佳,如RHEL、CentOS、Ubuntu和SuSE Linux。对于AMD Opteron ...

    ROR安装必备所有架包

    它还负责将URL映射到控制器方法,是构建Web应用程序的基石。 接着,`activerecord`是Rails中的ORM(对象关系映射)库,使得开发者可以使用Ruby语言操作数据库。`activerecord-1.15.5.gem`包含了与数据库交互所需的...

    ror实例

    "ror实例"可能指的是在学习或实践中,通过创建一个具体的Rails应用程序来理解和掌握RoR的工作原理和最佳实践。 在Ruby on Rails中,重要知识点包括: 1. **Gemfile与Gemfile.lock**:项目中的Gemfile用于指定项目...

    ROR环境配置

    在IT行业中,Ruby on Rails(简称ROR)是一款基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在简化Web应用开发过程,提高开发效率。本文将深入探讨如何配置ROR开发环境,以及...

    RoR选题方向—源代码

    1. **路由(Routing)**:RoR的路由系统将URL映射到控制器的行动上,通过`config/routes.rb`文件进行配置。理解路由规则有助于构建可扩展和灵活的Web应用。 2. **控制器(Controllers)**:控制器负责处理请求,...

    ror中文资料

    学习RoR中文资料,应首先从Ruby语言入手,掌握其基本语法和面向对象特性,然后深入理解Rails框架的核心概念和工作原理,通过实践项目来巩固知识。同时,不断关注社区动态,了解最新的Gem和最佳实践,以便不断提升...

    ror

    NULL 博文链接:https://xuxiangpan888.iteye.com/blog/266696

    初探ROR

    **初探ROR** Ruby on Rails(简称ROR)是一个基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在促进...通过学习和实践,你将能够利用ROR构建出功能强大、易于维护的Web应用程序。

    神经网络ror resenet模型

    **神经网络Ror ResNet模型详解** 在深度学习领域,ResNet(残差网络)模型是具有里程碑意义的创新,由He et al.在2015年提出。该模型解决了深度神经网络训练中的梯度消失问题,允许构建非常深的网络结构。而“Ror”...

    excel lib ror ruby

    标题 "excel lib ror ruby" 暗示我们要讨论的是在Ruby on Rails(简称RoR)框架中使用库来处理Excel文件的相关知识。RoR是一个流行的开源Web开发框架,而Ruby语言本身支持与Microsoft Excel文件交互,这在数据导入...

    基于sqlite的ror例子

    标签“源码”表明压缩包中包含有实际的代码文件,可能是Rails项目的目录结构,包括`Gemfile`(管理依赖)、`config`目录(配置文件)、`app`目录(包含模型、控制器和视图)、`db`目录(数据库相关,如迁移文件)等...

    计算机软件-编程源码-FOXPRO ROR WINDOWS 高级成程序设计技术.zip

    8. **文件操作和I/O流**:处理文件输入输出是任何程序的基础,源码可能会展示如何读写文件,如何进行文件流操作等。 9. **动态链接库(DLL)和API调用**:利用Windows API可以扩展FOXPRO的功能,源码可能涉及到如何...

    我的ror的第一天

    在Rails中,新项目可以通过运行 `rails new project_name` 命令来创建,这会生成一个完整的项目结构,包括默认的目录和文件。 总的来说,"我的ror的第一天" 主题涵盖的内容广泛,包括Rails的安装、源码管理、开发...

    RoR 培训课程PPT

    - **哲学思想与MVC模式**:阐述了RoR的设计哲学,强调代码简洁性与可读性,通过模型-视图-控制器(Model-View-Controller, MVC)模式实现应用程序结构的清晰划分。 - **创建第一个应用**:演示如何利用Rails提供的...

    RoR中文解决方案(很不错哦)

    用户可以使用这个文件来重建或填充一个RoR应用所依赖的数据库,特别是当应用涉及到中文数据时,这个文件可能已经包含了正确的编码设置,以确保中文字符能被正确处理。 “jascaffold”则可能是另一个RoR插件,它提供...

    ASP.NET项目移植ROR实践----DB转移(已完成)

    ASP.NET项目移植到Ruby on Rails (ROR)的实践中,DB转移是一个关键步骤。这个过程涉及到将现有的ASP.NET应用程序的数据模型、数据库结构以及业务逻辑迁移到ROR框架中。在这个过程中,我们需要理解两个不同框架之间的...

Global site tag (gtag.js) - Google Analytics