【发布时间】:2021-01-14 14:20:17
【问题描述】:
我有一个 Puma 应用程序,当您输入 IP 地址并通过单击复选框选择对其进行跟踪路由时,它将执行跟踪路由:
下面的代码(实际上应用程序做得更多,但为了这个问题,我已经简化了它):
网站.erb:
class Pumatra < Sinatra::Base
get '/' do
erb :index
end
post '/run' do
params.to_s
end
get'/traceroute_results' do
@ipaddress = params[:ipaddress]
@traceroute = params[:traceroute]
if @traceroute == "on"
stdout, status = Open3.capture2("traceroute -4 -w3 #{@ipaddress}")
@traceroute_result ="<pre><code>" + stdout + "</code></pre>"
end
@traceroute_header
@traceroute_result
end
@traceroute_thread = Thread.new{traceroute()}
@traceroute_thread.join
erb :traceroute_results
end
end
我的 views/index.erb 文件包含这个(只向你们展示相关的部分):
....
<div class="checkbox">
<label><input type="checkbox" id="traceroute"
name="traceroute">Traceroute</label>
</div>
....
<!-- Start Results block -->
<section id="results_block" style="display:none;" class="l_panel bg_color_white l_relative">
<div id="traceroute_results" style="display:none;" class="l_grid"></div>
</section>
<!-- End Results block -->
这一切都很好。 Traceroute 运行并在完成后显示结果。 但是,有时由于啤酒花没有响应,这需要很长时间才能完成,尽管这是正常的,并且最终会返回结果。 我的问题是:仅出于美观的原因,我想在运行时显示输出跟踪路由。所以,更多的是一种渐进的观点,而不是最终的完整输出。 这可能吗?我该如何做?
欣赏提示, J
编辑:
我在 site.erb 中试过这个
get'/traceroute_results' do
@traceroute_header = "<br>TCP Traceroute results:"
IO.popen("traceroute -4 -w3 #{@ipaddress}") do |io|
io.each do |line|
@traceroute_result = line
erb :traceroute_results
end
end
end
但现在我的应用程序没有显示任何 traceroute 输出:(
我的traceroute_results.erb 文件:
<%= @traceroute_header %>
<%= @traceroute_result %>
编辑: Amadan 的有用帖子让我在我的 site.erb 中找到了这段代码:
get'/traceroute_results' do
@ipaddress = params[:ipaddress]
@traceroute = params[:traceroute]
if @traceroute == "on"
ipaddress = params[:ipaddress]
stream do |res|
res << erb(:traceroute_header)
Open3.popen3("traceroute -T -4 #{@ipaddress}") do |stdin, stdout,
stderr, wait_thr|
while line = stderr.gets
res << erb(:traceroute_results, {}, { out: line })
end
end
end
end
end
并将我的traceroute_results 文件更改为:
<%= out %>
不幸的是,当 url 加载时,我仍然没有收到任何信息。我可以告诉它正在执行跟踪路由,因为它需要一段时间才能返回结果,但它返回的是空的。
真的非常感谢任何人在这方面的帮助和耐心。 我正在与 Sinatra 一起运行 Ruby Puma。任何人都可以在这样的设置中成功运行它吗?我还没有找到在 puma 上下文中实际工作的 Sinatra 示例...... :(
谢谢, J
【问题讨论】: