mirror of
https://github.com/hkalexling/Mango.git
synced 2025-08-02 19:05:32 -04:00
- better logging
This commit is contained in:
parent
e5e2540b7c
commit
8119f718db
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 %}
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user