Class: Machinery::Html
Overview
Copyright © 2013-2016 SUSE LLC
This program is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, contact SUSE LLC.
To contact SUSE about this file by physical or electronic mail, you may find current contact information at www.suse.com
Class Method Summary collapse
- .remove_output_redirection ⇒ Object
-
.run_server(system_description_store, opts, &block) ⇒ Object
Creates a new thread running a sinatra webserver which serves the local system descriptions The Thread object is returned so that the caller can ‘.join` it until it’s finished.
- .setup_output_redirection ⇒ Object
Class Method Details
.remove_output_redirection ⇒ Object
106 107 108 109 |
# File 'lib/html.rb', line 106 def self.remove_output_redirection STDOUT.reopen @orig_stdout STDERR.reopen @orig_stderr end |
.run_server(system_description_store, opts, &block) ⇒ Object
Creates a new thread running a sinatra webserver which serves the local system descriptions The Thread object is returned so that the caller can ‘.join` it until it’s finished.
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/html.rb', line 21 def self.run_server(system_description_store, opts, &block) if opts[:public] && opts[:ip] raise RuntimeError.new("It's only possible to use either an IP address or the 'public' " \ "flag bot not both.") end Thread.new do if opts[:public] opts[:ip] = "0.0.0.0" Machinery::Ui.warn "Warning:\nThe --public option makes the HTTP server listen on all configured IP addresses. Everyone who has access to one of those IP addresses can access all of your system descriptions stored in '~/.machinery'. Be careful if there is sensitive information (such as private keys) stored in one of your descriptions.\n".chomp elsif opts[:ip] == "0.0.0.0" Machinery::Ui.warn "Warning:\nThe server is listening on all configured IP addresses. Everyone who has access to one of those IP addresses can access all of your system descriptions stored in '~/.machinery'. Be careful if there is sensitive information (such as private keys) stored in one of your descriptions.\n".chomp elsif opts[:ip] && opts[:ip] != "localhost" && opts[:ip] != "127.0.0.1" Machinery::Ui.warn "Warning:\nYou specified an IP address other than '127.0.0.1', your server may be reachable from the network. Everyone who can access that network can access your system descriptions stored in '~/.machinery'. Be careful if there is sensitive information (such as private keys) stored in one of your descriptions.\n".chomp elsif !opts[:ip] opts[:ip] = "127.0.0.1" end Server.set :system_description_store, system_description_store Server.set :port, opts[:port] || Machinery::Config.new.http_server_port Server.set :bind, opts[:ip] Server.set :public_folder, File.join(Machinery::ROOT, "html") Server.set :static_cache_control, "no-cache" begin setup_output_redirection begin Server.run! do Thread.new { block.call } end rescue SocketError => e servefailed_error = "Cannot start server on \#{opts[:ip]}:\#{Server.settings.port}.\nERROR: \#{e.message}\n".chomp raise Machinery::Errors::ServeFailed, servefailed_error rescue Errno::EADDRNOTAVAIL servefailed_error = "The IP-Address \#{opts[:ip]} is not available. Please choose a different IP-Address.\n".chomp raise Machinery::Errors::ServeFailed, servefailed_error rescue Errno::EACCES => e servefailed_error = "You are not allowed to start the server on port \#{Server.settings.port}. You need root privileges for ports between 2 and 1023!\nERROR: \#{e.message}\n".chomp raise Machinery::Errors::ServeFailed, servefailed_error rescue Errno::EADDRINUSE, RuntimeError => e # If eventmachine is installed it will be used for handling the server. And eventmachine # raises RuntimeError instead of Errno::EADDRINUSE, so we have to handle these as well raise(e) if e.is_a?(RuntimeError) && !(e.to_s.index("port is in use")) servefailed_error = "Port \#{Server.settings.port} is already in use.\nYou have to stop the already running server on port \#{Server.settings.port} first or if you're serving a description with the `serve` command, you can also use the `--port` option.\n EOF\n raise Machinery::Errors::ServeFailed, servefailed_error\n end\n remove_output_redirection\n rescue => e\n remove_output_redirection\n # Re-raise exception in main thread\n Thread.main.raise e\n end\n end\nend\n".chomp |
.setup_output_redirection ⇒ Object
98 99 100 101 102 103 104 |
# File 'lib/html.rb', line 98 def self.setup_output_redirection @orig_stdout = STDOUT.clone @orig_stderr = STDERR.clone server_log = File.join(Machinery::DEFAULT_CONFIG_DIR, "webserver.log") STDOUT.reopen server_log, "w" STDERR.reopen server_log, "w" end |