88 lines
2.4 KiB
Ruby
88 lines
2.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "optparse"
|
|
require_relative "version"
|
|
require_relative "config"
|
|
require_relative "store"
|
|
require_relative "password"
|
|
|
|
module Volumen
|
|
# Command-line interface: serve, hash-password, version, help.
|
|
class CLI
|
|
USAGE = <<~TEXT.freeze
|
|
volumen #{Volumen::VERSION} — a small, file-based Markdown blog engine.
|
|
|
|
Usage:
|
|
volumen serve [--config PATH] [--content DIR] [--host HOST] [--port PORT]
|
|
volumen hash-password
|
|
volumen version
|
|
volumen help
|
|
TEXT
|
|
|
|
def self.run(argv)
|
|
new(argv).run
|
|
end
|
|
|
|
def initialize(argv)
|
|
@argv = argv.dup
|
|
end
|
|
|
|
def run
|
|
command = @argv.shift
|
|
case command
|
|
when "version", "--version", "-v" then puts Volumen::VERSION
|
|
when "help", "--help", "-h", nil then puts USAGE
|
|
when "serve" then serve
|
|
when "hash-password" then hash_password
|
|
else
|
|
warn "volumen: unknown command #{command.inspect}\n\n#{USAGE}"
|
|
exit 1
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def serve
|
|
options = parse_serve_options
|
|
prepare_config(options[:config])
|
|
config = Config.load(path: options[:config], overrides: options)
|
|
|
|
require_relative "server"
|
|
store = Store.new(config.content_dir, default_lang: config.language)
|
|
app = Server.configured(config: config, store: store)
|
|
app.run!(bind: config.host, port: config.port)
|
|
end
|
|
|
|
def parse_serve_options
|
|
options = { config: Config::DEFAULT_PATH }
|
|
OptionParser.new do |parser|
|
|
parser.on("--config PATH") { |value| options[:config] = value }
|
|
parser.on("--content DIR") { |value| options[:content] = value }
|
|
parser.on("--host HOST") { |value| options[:host] = value }
|
|
parser.on("--port PORT", Integer) { |value| options[:port] = value }
|
|
end.parse!(@argv)
|
|
options
|
|
end
|
|
|
|
def prepare_config(path)
|
|
if Config.generate_default(path)
|
|
warn "volumen: wrote a default config to #{path}; review it and restart."
|
|
elsif !File.exist?(path)
|
|
warn "volumen: config #{path} not found; using built-in defaults."
|
|
end
|
|
end
|
|
|
|
def hash_password
|
|
require "io/console"
|
|
print "Password: "
|
|
password = ($stdin.noecho(&:gets) || "").chomp
|
|
puts
|
|
if password.empty?
|
|
warn "volumen: empty password"
|
|
exit 1
|
|
end
|
|
puts Password.hash(password)
|
|
end
|
|
end
|
|
end
|