设为首页 收藏本站
查看: 898|回复: 0

[经验分享] ror项目里通过FTP定时获取文件存储到程序目录

[复制链接]

尚未签到

发表于 2016-6-10 13:16:15 | 显示全部楼层 |阅读模式
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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-228704-1-1.html 上篇帖子: 从远程ftp上按修改时间或文件名称更新相关文件(原创) 下篇帖子: FtpClient 类来操作FTP的上传和下载,带进度条
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表