How to Start WEBrick Server in Rubymine Console from Ruby Script - ruby

I have Ruby script that creates a proxy so that I can make HTTP request to a server from the command line using a session ID that the server expects.
First of all, the script works great when I run it from the command line
#web_server_thread = Thread.start do
puts "Starting local proxy on port #{#port}"
Rack::Handler::WEBrick.run WebServerProxy.new(#port, #host, #secure, #port2, #default_module_host, #cookie) , :Port => #port
end
Returns
Starting local proxy on port 9292
[2012-06-15 11:29:03] INFO WEBrick 1.3.1
[2012-06-15 11:29:03] INFO ruby 1.9.3 (2012-04-20) [i386-mingw32]
[2012-06-15 11:29:03] INFO WEBrick::HTTPServer#start: pid=6856 port=9292
I have been trying run this in RubyMine and the output in the console is always just:
Process finished with exit code 0
Question:
So my question is what can I do to configure RubyMine to run this script and if I cannot configure it to do so why not?
Other Information:
Windows 7
RubyMine v4.0.4
Ruby v1.9.3
As I noted above this is running as expected from the command line, so I am simply looking for an explanation of reasons why this is not working in RubyMine.

I figured out what I was doing wrong and if I posted all 700 lines of the script you would have to. Prior to creating the thread above there was an if statement checking to make sure the name of the script was equal to a particular string (why I have no idea, I did not write this). When using RubyMine the name of the script included the full path on the server so that the logic starting the server never was executed using RubyMine but worked fine when I was using the command line.
Edit
The reason it was checking to see if it was itself was so that other scripts could require it and reuse the class.

Related

Need config.ru to Start up a Sinatra App from within a Docker Container?

Why isn't the simple command ruby my app.rb working to boot up my Sinatra application from within a Docker container?
I have a very simple Sinatra app:
# myapp.rb
require 'sinatra'
get '/' do
'Hello world!'
end
I run this locally with ruby myapp.rb and I get the following output
== Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from Puma
Puma starting in single mode...
* Puma version: 5.1.1 (ruby 2.7.0-p0) ("At Your Service")
* Min threads: 0
* Max threads: 5
* Environment: development
* PID: 49242
* Listening on http://127.0.0.1:4567
* Listening on http://[::1]:4567
Use Ctrl-C to stop
Opens up on http://127.0.0.1:4567 with no issue. When moving to Dockerize the app, I create a Gemfile with Sinatra and the following Dockerfile.
FROM ruby:2.7.0
WORKDIR /code
COPY . /code
RUN bundle install
CMD ["ruby", "myapp.rb"]
Standing up the container, it seem successful (Docker Desktop is green, no terminal errors), but clicking on the suggested link http://localhost:4567/ doesn't load (sad Chrome face). Logs from within the container look like so
[2020-12-27 18:04:52] INFO WEBrick 1.6.0
[2020-12-27 18:04:52] INFO ruby 2.7.0 (2019-12-25) [x86_64-linux]
== Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from WEBrick
[2020-12-27 18:04:52] INFO WEBrick::HTTPServer#start: pid=1 port=4567
However, when I add the below config.ru file and change the last line of my Dockerfile to CMD ["bundle", "exec", "rackup", "--host", "0.0.0.0", "-p", "4567"], http://localhost:4567/ opens with no issue.
# config.ru
require './myapp'
run Sinatra::Application
Why are these tweaks necessary to make the app work? The logs from with the container look nearly the same.
[2020-12-27 18:01:49] INFO WEBrick 1.6.0
[2020-12-27 18:01:49] INFO ruby 2.7.0 (2019-12-25) [x86_64-linux]
[2020-12-27 18:01:49] INFO WEBrick::HTTPServer#start: pid=1 port=4567
172.17.0.1 - - [27/Dec/2020:18:02:44 +0000] "GET / HTTP/1.1" 200 12 0.0420
I'm not necessarily wondering about "best practices" here (this is a side project). I'm more just trying to understand what I might be missing about how Dockerizing apps works.
Docker commands for both cases (and I clear the images/containers between runs):
docker build --tag sinatra-img .
docker run --name sinatra-app -dp 4567:4567 sinatra-img
When you start your app with ruby myapp.rb in a Docker container, your app is listening on localhost because it is running in development mode. If your Docker server runs in a VM, you won't be able to access your app. To fix this, when you run your app in a Docker container, make sure that it is listening on 0.0.0.0: ruby myapp.rb -o 0.0.0.0
NOTE:
The following answer relates to a previous version of the question. The new question has a different answer (fixing the binding address using the -o 0.0.0.0 CLI argument).
The Sinatra framework is based on Rack and requires a Rack compatible server... either that, or it can also fallback on the WEBrick server that's included with the Ruby language bundle.
WEBrick is a decent server, but it wasn't designed for the heavier loads or the needs of an actual web application running in production.
For this reason, you SHOULD use a Rack compatible server.
However, this does not mean that you have to use the rackup CLI helper.
Some servers, like Puma, iodine and passenger include their own CLI, so you could run your application using:
CMD ["bundle", "exec", "puma", "-p", "4567"]
Type puma -h (or iodine -h) for more command line options. A server's specific CLI might offer some server specific features you don't get with backup. For example, Iodine exposes some security options through it's CLI (maximum file upload size, maximum total header length, web socket message limits, etc').
Using the server's CLI interface should be considered a better option.
In addition, although I wouldn't recommend it, some servers also provide a Ruby API that allows you start the server from a Ruby script (instead of a config.ru file). i.e., with iodine (I'm biased):
ENV['PORT'] ||= "4567"
require 'iodine' # will test the `ENV['PORT']` value
require 'sinatra'
get '/' do
'Hello world!'
end
Iodine.listen service: :http, public: './public', handler: Sinatra::Application
# Iodine.threads = 16 # or whatever.
# Iodine.workers = -2 # half the core count (negative value).
Iodine.start
I wouldn't use this approach. It tends to be more fragile and it also hardcodes both the environment and the server settings in the application.
I would just add the config.ru and use a decent server (I like iodine, but Puma is much more popular and unless you need real-time pub/sub, websockets or some specific security/performance features, popular is often safer).
EDIT (according to comment):
If what you're really looking for is to embed the command bundle exec into the Ruby script (for version control using a gemfile), you can start the script with the lines
#!/usr/bin/env ruby
require 'bundler'
Bundler.require
Or, if you don't want to use a gemfile at all (or don't require version control), you can jus start the first line with:
#!/usr/bin/env ruby
Then you can start your server directly:
CMD ["puma", "-p", "4567"]
Or, without using the server's CLI, using the example script above, run:
CMD ["my_script.rb"]

Ruby, Webrick think every local port is already in use

I am developing a static site locally. To view it in a browser, I run this command
ruby -run -ehttpd . -p8000
to run a local webserver at localhost:8000.
Starting yesterday, when I run it, I get the error
INFO WEBrick 1.3.1
INFO ruby 2.0.0 (2015-12-16) [universal.x86_64-darwin16]
WARN TCPServer Error: Address already in use - bind(2)
INFO WEBrick::HTTPServer#start: pid=1158 port=8000
So I change the port number -p8000 to p8001 and I get the same error. I try 8002, 8003, 8888, 1313, 8004. I the same error on every single port number. Ruby, or Webrick, thinks that every port is already in use.
All the solutions to this problem I can find online suggest finding whatever process is hogging the port using commands like lsof | grep '8000' or lsof -wni tcp:8000 and then killing that process. But those commands don't return anything. There are no processes using those ports.
This happens on a fresh restart of my machine. Wifi turned off.

Simple Ruby "Hello, World" Program for Webrick Using Virtual Hosts

I searched the internet for a "Hello, World" type program for Webrick in Ruby, but could not find anything that worked. I found this guide on SO but for the life of me could not get it to work.
Consulting the Ruby Documentation for Webrick led me to some code snippets that got me going in the right direction. There were no easy-to-follow tutorials so I wanted to add my answer on SO.
I was using Ubuntu 14.04 without Apache or Nginx and wanted my server for a virtual host. Webrick by default does not respond to requests concurrently but for me this was a plus in addition to its small footprint. I was hoping to get it working without the Rails framework for an even lighter footprint.
To get started, I installed Ruby with the Ubuntu package manager. If you are using CentOS or another Linux distribution, you can adapt this step to your particular package manager. Also make sure port 80 is open on your web server. It's possible to get SSL with Webrick but I chose not to at this point.
sudo apt-get install ruby
Here is the script which I named myapp.rb that I am using. I placed it /var/www/myapp. Ideally, I think it should not be in document root. You should also create a special user and group just to run the script to improve security (I have not outlined those steps here)
require 'webrick'
server = WEBrick::HTTPServer.new(:Port => 80,
:SSLEnable => false,
:DocumentRoot => '/var/www/myapp',
:ServerAlias => 'myapp.example.com')
server.mount_proc '/' do |req, res|
res.body = 'Hello, world!'
end
trap 'INT' do server.shutdown end
server.start
The require statement above tells Ruby to include the Webrick classes when running the program. The second line of the script creates an instance of Webrick with the following options:
Use Port 80
Disable SSL
Set the document root to /var/www/myapp
Set the Server Alias to myapp.example.com
Of course, you'll have to configure your particular domains DNS'. The server.mount_proc is telling Ruby to serve the response, "Hello, world" at document root. I think you can specify a subdirectory there if you life. The Ruby Webrick documentation above has information on that.
The line that begins with trap means that the web server can be stopped with Ctrl-C. To start the script I typed the following at the SSH command line:
ruby myapp.rb

Perl + Apache + CGI

How do I run perl script from local host?
I have installed Apache 2.2 and Active Perl 5.16.3.
I am able to run the perl scrip from command prompt.
But since i am dealing with web application, i want it to be run from localhost.
However, I am getting the following error in the browser
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please help me out!
Your problem is probably related to the configuration of Apache. (It may be Apache that needs configuring for .cgi scripts) - If this is the case then you can find good info on this here:
http://www.perlmonks.org/?node_id=44536
http://www.cgi101.com/book/connect/winxp.html
http://www.editrocket.com/articles/perl_apache_windows.html
There is usually a host of things that you need to do to get it working. Following a good HOWTO to make sure that everything is installed and configured correctly will usually get you going to execute scripts on your local Windows machine.
You could run cgi script from web browser. CGI means that it should send a HTML header before sending any output to the server (which is going to send it back to the browser).
http://perldoc.perl.org/CGI.html#NAME
http://www.cs.tut.fi/~jkorpela/perl/cgi.html
Like this:
use CGI; # load CGI routines
$q = CGI->new;
print $q->header; # create the HTTP header
print $q->start_html('hello world'); # start the HTML
### your script logic goes here
print $q->end_html; # end the HTML
Of course, CGI is outdated, for new development you should use some mmore recent framwork like: Dancer, Mojolicious, ...
if someone is looking for an answer in year 2017 then follow this on windows 2010 machine.
Download Strawberry perl from perl site
Install in default directory.C:\Strawberry
Download Apache from https://httpd.apache.org/download.cgi#apache24
Once you successfully get apache server running then
Place your perl scripts in your Apache24/cgi-bin/ folder.
firstline of your perl script should point to path where perl is installed for my case it is #!C:/Strawberry/perl/bin/perl.exe
you should change your path according your installation folder
Filename - first.pl
#!C:/Strawberry/perl/bin/perl.exe
print "Content-type: text/html\n\n";
print "Hello, World.";
Now you can run your script from browser http://localhost/cgi-bin/first.pl

port in use when not using a port

I'm trying to run the following Sinatra application and am getting an error message telling me that I can't start a server, either because port's already in use or because I don't have root privileges. I have never had this problem before starting a Sinatra application. I updated to Mountain Lion for my mac a few days ago and wonder if this might be the cause of the problem. I also use RVM. Can anyone provide a suggestion...
require "sinatra"
class MyApp < Sinatra::Base
get '/' do
"Hello from MyApp"
end
end
== Sinatra/1.3.3 has taken the stage on 4567 for development with backup from Thin
>> Thin web server (v1.5.0 codename Knife)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:4567, CTRL+C to stop
/Users/me/.rvm/gems/ruby-1.9.2-p290#global/gems/eventmachine-1.0.0/lib/eventmachine.rb:526:in `start_tcp_server': no acceptor (port is in use or requires root privileges) (RuntimeError)
Update:
I can still run a rails server on my machine so I think the problem is specific to Sinatra. Furthermore, I was able to run Sinatra applications fine up til a few days ago, when I started playing around with this Rack Tutorialwhich instructed me to explicitly to set a port. I'm wondering if that made a permanent change.
>> Rack::Handler::WEBrick.run my_rack_proc, :Port => 9876
[2011-10-24 11:32:21] INFO WEBrick 1.3.1
[2011-10-24 11:32:21] INFO ruby 1.9.2 (2011-07-09) [i386-mingw32]
[2011-10-24 11:32:21] INFO WEBrick::HTTPServer#start: pid=480 port=9876
Note: I had a different answer before. I've replaced it with a new, more focused answer, but I left the old answer at the bottom for anyone still looking for it.
New answer:
This error is caused by the fact that the last time you had a server running, you closed the terminal without killing the server. I believe this is called 'running headless', like a chicken with its head cut off. So even though nobody is around watching, the server is still running and taking up the 'space' called port 9393. When you try to start a new server, there is already one running. It's kind of like a parking spot: since there is already a car there, you can't part a new one in the same spot.
Here's how I reproduced the error. I booted up a sinatra server, closed down the terminal without killing the server first, opened up a new terminal, and tried to boot up another server.
Taras-MacBook-Air:SurveyDBCGroupProject tlroys$ shotgun
== Shotgun/Thin on http://127.0.0.1:9393/
Thin web server (v1.6.1 codename Death Proof)
Maximum connections set to 1024
Listening on 127.0.0.1:9393, CTRL+C to stop
/Users/tlroys/.rvm/gems/ruby-1.9.3-p484/gems/eventmachine-1.0.3/lib/eventmachine.rb:526:in `start_tcp_server': no acceptor (port is in use or requires root privileges) (RuntimeError)
#deleted stack trace
What do you do if a car is parked in your spot? You can call the tow truck and tell the driver the license plate number of the car, and tell them to tow it away.
To find out the license plate number of the car, run the following set of commands I found on Stack Overflow
ps aux | grep ruby
This finds the process id, aka the license plate number of the 'car' occupying the 'parking spot.' Note: the server occupying my 'spot' is in fact a server written using the programming language ruby: sort of like some cars are Chevorlets. I can tell the person finding out the license plate number to look for the chevrolet, and he will find the right car as long as there are no other cars around. Since this 'zombie server' is the only ruby process running on my computer, telling the grep command to look for ruby will give the right process id/ license plate numbers. If I wanted to be more specific, I could probably say
ps aux | grep shotgun
and get the same result.
-The output should look like this: there should be two things in the list
27235 ?? S 0:00.72 /Users/tlroys/.rvm/gems/ruby-1.9.3-p484/bin/shotgun
27393 s000 S+ 0:00.00 grep ruby
The first one is the actual 'zombie server' you are looking for. The second thing is funny, because you are looking for all processes that contains the word ruby, and so it find the process that is looking for all processes that contain the word ruby. Haha.
Kill the first process. with the following command. Make sure to change the numbers to the actual process id:
kill -9 27235
You'll have to change the 27235 to the actual process id that you see, but you get the idea. The tow truck has come, dragged the car away to the junkyard, and left the spot free for me to use.
Old answer:
I had exactly the same issue, and as far as I can tell it was because there was a ruby process running on the port that I run my sinatra apps on. Below is the error (With the stack trace remove for brevity's sake) and the commands I ran to figure out what was going wrong and fix it.
In short, I tried to start my sinatra app, and it said port is in use or required root privileges. I then used the Tin Man's lsof command (seen above) to find out what ports were in use.
It showed that ruby was running on port 9393. I killed it with killall. I tried starting my sinatra app again. It worked.
Taras-MacBook-Air:sinatra_sandbox tlroys$ bundle exec shotgun config.ru
The source :rubygems is deprecated because HTTP requests are insecure.
Please change your source to 'https://rubygems.org' if possible, or 'http://rubygems.org' if not.
== Shotgun/Thin on http://127.0.0.1:9393/
>> Thin web server (v1.5.0 codename Knife)
>> Maximum connections set to 1024
>> Listening on 127.0.0.1:9393, CTRL+C to stop
/Users/tlroys/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/eventmachine-1.0.0/lib/eventmachine.rb:526:in `start_tcp_server': no acceptor (port is in use or requires root privileges) (RuntimeError)
Taras-MacBook-Air:sinatra_sandbox tlroys$ lsof -i TCP | grep LISTEN
ruby 59176 tlroys 9u IPv4 0xffffff8012fbdc00 0t0 TCP localhost:9393 (LISTEN)
Taras-MacBook-Air:sinatra_sandbox tlroys$ killall ruby
Taras-MacBook-Air:sinatra_sandbox tlroys$ bundle exec shotgun config.ru
The source :rubygems is deprecated because HTTP requests are insecure.
Please change your source to 'https://rubygems.org' if possible, or 'http://rubygems.org' if not.
Shotgun/Thin on http://127.0.0.1:9393/
Thin web server (v1.5.0 codename Knife)
Maximum connections set to 1024
Listening on 127.0.0.1:9393, CTRL+C to stop
The restriction about only root being able to open "well known port#s" has nothing to do with Ruby - it's an OS thing. It's also, in general, a Good Thing.
Look at "cannot start sinatra process - eventmachine 'no acceptor'".
There are two suggestions in the link:
The configuration issue he encountered might well fix your problem
If nothing else, the link also shows you how to change the port# (to some different - and perhaps higher) number.

Resources