- better logging

This commit is contained in:
Alex Ling 2020-02-17 00:33:43 +00:00
parent e5e2540b7c
commit 8119f718db
4 changed files with 46 additions and 24 deletions

View File

@ -136,9 +136,9 @@ class TitleInfo
end end
class Library class Library
JSON.mapping dir: String, titles: Array(Title), scan_interval: Int32 JSON.mapping dir: String, titles: Array(Title), scan_interval: Int32, logger: MLogger
def initialize(@dir, @scan_interval, logger) def initialize(@dir, @scan_interval, @logger)
# explicitly initialize @titles to bypass the compiler check. it will # explicitly initialize @titles to bypass the compiler check. it will
# be filled with actual Titles in the `scan` call below # be filled with actual Titles in the `scan` call below
@titles = [] of Title @titles = [] of Title
@ -146,11 +146,11 @@ class Library
return scan if @scan_interval < 1 return scan if @scan_interval < 1
spawn do spawn do
loop do loop do
logger.info "Starting periodic scan" @logger.info "Starting periodic scan"
start = Time.local start = Time.local
scan scan
ms = (Time.local - start).total_milliseconds ms = (Time.local - start).total_milliseconds
logger.info "Scanned #{@titles.size} titles in #{ms}ms" @logger.info "Scanned #{@titles.size} titles in #{ms}ms"
sleep @scan_interval * 60 sleep @scan_interval * 60
end end
end end
@ -160,11 +160,15 @@ class Library
end end
def scan def scan
unless Dir.exists? @dir unless Dir.exists? @dir
@logger.info "The library directory #{@dir} does not exist. " \
"Attempting to create it"
Dir.mkdir_p @dir Dir.mkdir_p @dir
end end
@titles = (Dir.entries @dir) @titles = (Dir.entries @dir)
.select { |path| File.directory? File.join @dir, path } .select { |path| File.directory? File.join @dir, path }
.map { |path| Title.new File.join @dir, path } .map { |path| Title.new File.join @dir, path }
.select { |title| !title.entries.empty? } .select { |title| !title.entries.empty? }
@logger.debug "Scan completed"
@logger.debug "Scanned library: \n#{self.to_pretty_json}"
end end
end end

View File

@ -52,4 +52,8 @@ class MLogger
@logger.{{lvl.id}} msg @logger.{{lvl.id}} msg
end end
{% end %} {% end %}
def to_json(json : JSON::Builder)
json.string self
end
end end

View File

@ -14,14 +14,10 @@ class Server
end end
get "/" do |env| get "/" do |env|
begin
titles = @context.library.titles titles = @context.library.titles
username = get_username env username = get_username env
percentage = titles.map &.load_percetage username percentage = titles.map &.load_percetage username
layout "index" layout "index"
rescue
env.response.status_code = 500
end
end end
get "/book/:title" do |env| get "/book/:title" do |env|
@ -32,7 +28,8 @@ class Server
percentage = title.entries.map { |e| percentage = title.entries.map { |e|
title.load_percetage username, e.title } title.load_percetage username, e.title }
layout "title" layout "title"
rescue rescue e
@context.error e
env.response.status_code = 404 env.response.status_code = 404
end end
end end
@ -86,7 +83,7 @@ class Server
env.redirect "/admin/user" env.redirect "/admin/user"
rescue e rescue e
@context.error e.message @context.error e
redirect_url = URI.new \ redirect_url = URI.new \
path: "/admin/user/edit",\ path: "/admin/user/edit",\
query: hash_to_query({"error" => e.message}) query: hash_to_query({"error" => e.message})
@ -126,7 +123,7 @@ class Server
env.redirect "/admin/user" env.redirect "/admin/user"
rescue e rescue e
@context.error e.message @context.error e
redirect_url = URI.new \ redirect_url = URI.new \
path: "/admin/user/edit",\ path: "/admin/user/edit",\
query: hash_to_query({"username" => original_username, \ query: hash_to_query({"username" => original_username, \
@ -151,7 +148,8 @@ class Server
page = [page - 2 * IMGS_PER_PAGE, 1].max page = [page - 2 * IMGS_PER_PAGE, 1].max
env.redirect "/reader/#{title.title}/#{entry.title}/#{page}" env.redirect "/reader/#{title.title}/#{entry.title}/#{page}"
rescue rescue e
@context.error e
env.response.status_code = 404 env.response.status_code = 404
end end
end end
@ -182,7 +180,8 @@ class Server
"/reader/#{title.title}/#{next_entry.title}" "/reader/#{title.title}/#{next_entry.title}"
render "src/views/reader.ecr" render "src/views/reader.ecr"
rescue rescue e
@context.error e
env.response.status_code = 404 env.response.status_code = 404
end end
end end
@ -196,7 +195,8 @@ class Server
cookie = env.request.cookies cookie = env.request.cookies
.find { |c| c.name == "token" }.not_nil! .find { |c| c.name == "token" }.not_nil!
@context.storage.logout cookie.value @context.storage.logout cookie.value
rescue rescue e
@context.error "Error when attempting to log out: #{e}"
ensure ensure
env.redirect "/login" env.redirect "/login"
end end
@ -233,7 +233,7 @@ class Server
send_img env, img send_img env, img
rescue e rescue e
@context.error e.message @context.error e
env.response.status_code = 500 env.response.status_code = 500
e.message e.message
end end
@ -248,7 +248,7 @@ class Server
send_json env, t.to_json send_json env, t.to_json
rescue e rescue e
@context.error e.message @context.error e
env.response.status_code = 500 env.response.status_code = 500
e.message e.message
end end
@ -273,6 +273,7 @@ class Server
username = env.params.url["username"] username = env.params.url["username"]
@context.storage.delete_user username @context.storage.delete_user username
rescue e rescue e
@context.error e
send_json env, { send_json env, {
"success" => false, "success" => false,
"error" => e.message "error" => e.message
@ -293,6 +294,7 @@ class Server
raise "incorrect page value" if page < 0 || page > entry.pages raise "incorrect page value" if page < 0 || page > entry.pages
title.save_progress username, entry.title, page title.save_progress username, entry.title, page
rescue e rescue e
@context.error e
send_json env, { send_json env, {
"success" => false, "success" => false,
"error" => e.message "error" => e.message
@ -307,12 +309,14 @@ class Server
add_handler AuthHandler.new @context.storage add_handler AuthHandler.new @context.storage
{% if flag?(:release) %} {% if flag?(:release) %}
# when building for relase, embed the static files in binary # when building for relase, embed the static files in binary
@context.debug "We are in release mode. Using embeded static files."
serve_static false serve_static false
add_handler StaticHandler.new add_handler StaticHandler.new
{% end %} {% end %}
end end
def start def start
@context.debug "Starting Kemal server"
{% if flag?(:release) %} {% if flag?(:release) %}
Kemal.config.env = "production" Kemal.config.env = "production"
{% end %} {% end %}

View File

@ -19,17 +19,21 @@ class Storage
def initialize(@path : String, @logger : MLogger) def initialize(@path : String, @logger : MLogger)
dir = File.dirname path dir = File.dirname path
unless Dir.exists? dir unless Dir.exists? dir
@logger.info "The DB directory #{dir} does not exist. " \
"Attepmting to create it"
Dir.mkdir_p dir Dir.mkdir_p dir
end end
DB.open "sqlite3://#{path}" do |db| DB.open "sqlite3://#{path}" do |db|
begin begin
db.exec "create table users" \ db.exec "create table users" \
"(username text, password text, token text, admin integer)" "(username text, password text, token text, admin integer)"
rescue e : SQLite3::Exception | DB::Error rescue e
unless e.message == "table users already exists" unless e.message == "table users already exists"
@logger.fatal "Error when checking tables in DB: #{e}"
raise e raise e
end end
else else
@logger.debug "Creating DB file at #{@path}"
db.exec "create unique index username_idx on users (username)" db.exec "create unique index username_idx on users (username)"
db.exec "create unique index token_idx on users (token)" db.exec "create unique index token_idx on users (token)"
random_pw = random_str random_pw = random_str
@ -49,14 +53,18 @@ class Storage
"users where username = (?)", \ "users where username = (?)", \
username, as: {String, String?} username, as: {String, String?}
unless verify_password hash, password unless verify_password hash, password
@logger.debug "Password does not match the hash"
return nil return nil
end end
@logger.debug "Useer #{username} verified"
return token if token return token if token
token = random_str token = random_str
@logger.debug "Updating token for #{username}"
db.exec "update users set token = (?) where username = (?)", db.exec "update users set token = (?) where username = (?)",
token, username token, username
return token return token
rescue e : SQLite3::Exception | DB::Error rescue e
@logger.error "Error when verifying user #{username}: #{e}"
return nil return nil
end end
end end
@ -68,7 +76,8 @@ class Storage
username = db.query_one "select username from users where " \ username = db.query_one "select username from users where " \
"token = (?)", token, as: String "token = (?)", token, as: String
return username return username
rescue e : SQLite3::Exception | DB::Error rescue e
@logger.debug "Unable to verify token"
return nil return nil
end end
end end
@ -79,7 +88,8 @@ class Storage
begin begin
return db.query_one "select admin from users where " \ return db.query_one "select admin from users where " \
"token = (?)", token, as: Bool "token = (?)", token, as: Bool
rescue e : SQLite3::Exception | DB::Error rescue e
@logger.debug "Unable to verify user as admin"
return false return false
end end
end end