commit
a3725d1110
10 changed files with 190 additions and 66 deletions
|
@ -3,7 +3,7 @@ echo "Creating output directory"
|
||||||
mkdir -p release/tmp
|
mkdir -p release/tmp
|
||||||
|
|
||||||
echo "Copying package files"
|
echo "Copying package files"
|
||||||
cp -r web src migrations Cargo.toml Cargo.lock res/unix/Makefile release/tmp
|
cp -r web docs/swagger src migrations Cargo.toml Cargo.lock res/unix/Makefile release/tmp
|
||||||
|
|
||||||
echo "Creating tarball"
|
echo "Creating tarball"
|
||||||
POLARIS_VERSION=$(grep -m 1 ^version Cargo.toml | awk '{print $3}' | tr -d '"\r\n')
|
POLARIS_VERSION=$(grep -m 1 ^version Cargo.toml | awk '{print $3}' | tr -d '"\r\n')
|
||||||
|
|
|
@ -29,13 +29,18 @@ Copy-Item .\web\style .\release\tmp\web\style -recurse
|
||||||
Copy-Item .\web\tags .\release\tmp\web\tags -recurse
|
Copy-Item .\web\tags .\release\tmp\web\tags -recurse
|
||||||
Copy-Item .\web\favicon.png .\release\tmp\web\
|
Copy-Item .\web\favicon.png .\release\tmp\web\
|
||||||
Copy-Item .\web\index.html .\release\tmp\web\
|
Copy-Item .\web\index.html .\release\tmp\web\
|
||||||
|
Copy-Item .\docs\swagger .\release\tmp\swagger -recurse
|
||||||
|
|
||||||
""
|
""
|
||||||
"Creating installer"
|
"Creating installer"
|
||||||
heat dir .\release\tmp\web\ -ag -g1 -dr AppDataPolaris -cg WebUI -sfrag -var wix.WebUIDir -out .\release\tmp\web_ui_fragment.wxs
|
heat dir .\release\tmp\web\ -ag -g1 -dr AppDataPolaris -cg WebUI -sfrag -var wix.WebUIDir -out .\release\tmp\web_ui_fragment.wxs
|
||||||
|
heat dir .\release\tmp\swagger\ -ag -g1 -dr AppDataPolaris -cg SwaggerUI -sfrag -var wix.SwaggerUIDir -out .\release\tmp\swagger_ui_fragment.wxs
|
||||||
|
|
||||||
candle -wx -ext WixUtilExtension -arch x64 -out .\release\tmp\web_ui_fragment.wixobj .\release\tmp\web_ui_fragment.wxs
|
candle -wx -ext WixUtilExtension -arch x64 -out .\release\tmp\web_ui_fragment.wixobj .\release\tmp\web_ui_fragment.wxs
|
||||||
|
candle -wx -ext WixUtilExtension -arch x64 -out .\release\tmp\swagger_ui_fragment.wixobj .\release\tmp\swagger_ui_fragment.wxs
|
||||||
candle -wx -ext WixUtilExtension -arch x64 -out .\release\tmp\installer.wixobj .\res\windows\installer\installer.wxs
|
candle -wx -ext WixUtilExtension -arch x64 -out .\release\tmp\installer.wixobj .\res\windows\installer\installer.wxs
|
||||||
light -dWebUIDir=".\release\tmp\web" -wx -ext WixUtilExtension -ext WixUIExtension -spdb -sw1076 -sice:ICE38 -sice:ICE64 -out .\release\Polaris_$POLARIS_VERSION.msi .\release\tmp\installer.wixobj .\release\tmp\web_ui_fragment.wixobj
|
|
||||||
|
light -dWebUIDir=".\release\tmp\web" -dSwaggerUIDir=".\release\tmp\swagger" -wx -ext WixUtilExtension -ext WixUIExtension -spdb -sw1076 -sice:ICE38 -sice:ICE64 -out .\release\Polaris_$POLARIS_VERSION.msi .\release\tmp\installer.wixobj .\release\tmp\web_ui_fragment.wixobj .\release\tmp\swagger_ui_fragment.wixobj
|
||||||
|
|
||||||
"Cleaning up"
|
"Cleaning up"
|
||||||
Remove-Item -Recurse .\release\tmp
|
Remove-Item -Recurse .\release\tmp
|
||||||
|
|
|
@ -11,6 +11,7 @@ install: build
|
||||||
install -d $(POLARIS_DATA_DIR)
|
install -d $(POLARIS_DATA_DIR)
|
||||||
install ./target/release/polaris $(POLARIS_BIN_DIR)
|
install ./target/release/polaris $(POLARIS_BIN_DIR)
|
||||||
cp -r ./web $(POLARIS_DATA_DIR)
|
cp -r ./web $(POLARIS_DATA_DIR)
|
||||||
|
cp -r ./swagger $(POLARIS_DATA_DIR)
|
||||||
@echo "Polaris installation complete!"
|
@echo "Polaris installation complete!"
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
<ComponentRef Id='ProgramMenuDir' />
|
<ComponentRef Id='ProgramMenuDir' />
|
||||||
<ComponentRef Id='CleanupExtraData' />
|
<ComponentRef Id='CleanupExtraData' />
|
||||||
<ComponentGroupRef Id="WebUI" />
|
<ComponentGroupRef Id="WebUI" />
|
||||||
|
<ComponentGroupRef Id="SwaggerUI" />
|
||||||
</Feature>
|
</Feature>
|
||||||
|
|
||||||
<Icon Id='polaris.exe' SourceFile='polaris.exe' />
|
<Icon Id='polaris.exe' SourceFile='polaris.exe' />
|
||||||
|
|
|
@ -2,73 +2,21 @@ use rocket::http::hyper::header::*;
|
||||||
use rocket::http::uri::Uri;
|
use rocket::http::uri::Uri;
|
||||||
use rocket::http::Status;
|
use rocket::http::Status;
|
||||||
use rocket::local::Client;
|
use rocket::local::Client;
|
||||||
use std::fs;
|
|
||||||
use std::ops::Deref;
|
|
||||||
use std::path::PathBuf;
|
|
||||||
use std::sync::Arc;
|
|
||||||
use std::{thread, time};
|
use std::{thread, time};
|
||||||
|
|
||||||
use crate::api;
|
use crate::api;
|
||||||
use crate::config;
|
use crate::config;
|
||||||
use crate::db;
|
|
||||||
use crate::ddns;
|
use crate::ddns;
|
||||||
use crate::index;
|
use crate::index;
|
||||||
use crate::server;
|
|
||||||
use crate::vfs;
|
use crate::vfs;
|
||||||
|
|
||||||
|
use crate::test::get_test_environment;
|
||||||
|
|
||||||
const TEST_USERNAME: &str = "test_user";
|
const TEST_USERNAME: &str = "test_user";
|
||||||
const TEST_PASSWORD: &str = "test_password";
|
const TEST_PASSWORD: &str = "test_password";
|
||||||
const TEST_MOUNT_NAME: &str = "collection";
|
const TEST_MOUNT_NAME: &str = "collection";
|
||||||
const TEST_MOUNT_SOURCE: &str = "test/collection";
|
const TEST_MOUNT_SOURCE: &str = "test/collection";
|
||||||
|
|
||||||
struct TestEnvironment {
|
|
||||||
pub client: Client,
|
|
||||||
command_sender: Arc<index::CommandSender>,
|
|
||||||
db: Arc<db::DB>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TestEnvironment {
|
|
||||||
pub fn update_index(&self) {
|
|
||||||
index::update(self.db.deref()).unwrap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Drop for TestEnvironment {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
self.command_sender.deref().exit().unwrap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_test_environment(db_name: &str) -> TestEnvironment {
|
|
||||||
let mut db_path = PathBuf::new();
|
|
||||||
db_path.push("test");
|
|
||||||
db_path.push(db_name);
|
|
||||||
if db_path.exists() {
|
|
||||||
fs::remove_file(&db_path).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
let db = Arc::new(db::DB::new(&db_path).unwrap());
|
|
||||||
|
|
||||||
let web_dir_path = PathBuf::from("web");
|
|
||||||
let command_sender = index::init(db.clone());
|
|
||||||
|
|
||||||
let server = server::get_server(
|
|
||||||
5050,
|
|
||||||
"/",
|
|
||||||
"/api",
|
|
||||||
&web_dir_path,
|
|
||||||
db.clone(),
|
|
||||||
command_sender.clone(),
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
let client = Client::new(server).unwrap();
|
|
||||||
TestEnvironment {
|
|
||||||
client,
|
|
||||||
command_sender,
|
|
||||||
db,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn complete_initial_setup(client: &Client) {
|
fn complete_initial_setup(client: &Client) {
|
||||||
let configuration = config::Config {
|
let configuration = config::Config {
|
||||||
album_art_pattern: None,
|
album_art_pattern: None,
|
||||||
|
|
28
src/main.rs
28
src/main.rs
|
@ -71,11 +71,15 @@ mod metadata;
|
||||||
mod playlist;
|
mod playlist;
|
||||||
mod serve;
|
mod serve;
|
||||||
mod server;
|
mod server;
|
||||||
|
mod swagger;
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test;
|
||||||
mod thumbnails;
|
mod thumbnails;
|
||||||
mod ui;
|
mod ui;
|
||||||
mod user;
|
mod user;
|
||||||
mod utils;
|
mod utils;
|
||||||
mod vfs;
|
mod vfs;
|
||||||
|
mod web;
|
||||||
|
|
||||||
static LOG_CONFIG: simplelog::Config = simplelog::Config {
|
static LOG_CONFIG: simplelog::Config = simplelog::Config {
|
||||||
time: Some(Level::Error),
|
time: Some(Level::Error),
|
||||||
|
@ -149,6 +153,7 @@ fn run() -> Result<()> {
|
||||||
options.optopt("p", "port", "set polaris to run on a custom port", "PORT");
|
options.optopt("p", "port", "set polaris to run on a custom port", "PORT");
|
||||||
options.optopt("d", "database", "set the path to index database", "FILE");
|
options.optopt("d", "database", "set the path to index database", "FILE");
|
||||||
options.optopt("w", "web", "set the path to web client files", "DIRECTORY");
|
options.optopt("w", "web", "set the path to web client files", "DIRECTORY");
|
||||||
|
options.optopt("s", "swagger", "set the path to swagger files", "DIRECTORY");
|
||||||
options.optopt(
|
options.optopt(
|
||||||
"l",
|
"l",
|
||||||
"log",
|
"log",
|
||||||
|
@ -220,10 +225,10 @@ fn run() -> Result<()> {
|
||||||
|
|
||||||
// API mount target
|
// API mount target
|
||||||
let prefix_url = config.prefix_url.unwrap_or_else(|| "".to_string());
|
let prefix_url = config.prefix_url.unwrap_or_else(|| "".to_string());
|
||||||
let api_url = format!("{}/api", &prefix_url);
|
let api_url = format!("/{}api", &prefix_url);
|
||||||
info!("Mounting API on {}", api_url);
|
info!("Mounting API on {}", api_url);
|
||||||
|
|
||||||
// Static files mount target
|
// Web client mount target
|
||||||
let web_dir_name = matches.opt_str("w");
|
let web_dir_name = matches.opt_str("w");
|
||||||
let mut default_web_dir = utils::get_data_root()?;
|
let mut default_web_dir = utils::get_data_root()?;
|
||||||
default_web_dir.push("web");
|
default_web_dir.push("web");
|
||||||
|
@ -231,8 +236,19 @@ fn run() -> Result<()> {
|
||||||
.map(|n| Path::new(n.as_str()).to_path_buf())
|
.map(|n| Path::new(n.as_str()).to_path_buf())
|
||||||
.unwrap_or(default_web_dir);
|
.unwrap_or(default_web_dir);
|
||||||
info!("Static files location is {}", web_dir_path.display());
|
info!("Static files location is {}", web_dir_path.display());
|
||||||
let static_url = format!("/{}", &prefix_url);
|
let web_url = format!("/{}", &prefix_url);
|
||||||
info!("Mounting static files on {}", static_url);
|
info!("Mounting web client files on {}", web_url);
|
||||||
|
|
||||||
|
// Swagger files mount target
|
||||||
|
let swagger_dir_name = matches.opt_str("s");
|
||||||
|
let mut default_swagger_dir = utils::get_data_root()?;
|
||||||
|
default_swagger_dir.push("swagger");
|
||||||
|
let swagger_dir_path = swagger_dir_name
|
||||||
|
.map(|n| Path::new(n.as_str()).to_path_buf())
|
||||||
|
.unwrap_or(default_swagger_dir);
|
||||||
|
info!("Swagger files location is {}", swagger_dir_path.display());
|
||||||
|
let swagger_url = format!("/{}swagger", &prefix_url);
|
||||||
|
info!("Mounting swagger files on {}", swagger_url);
|
||||||
|
|
||||||
// Start server
|
// Start server
|
||||||
info!("Starting up server");
|
info!("Starting up server");
|
||||||
|
@ -244,9 +260,11 @@ fn run() -> Result<()> {
|
||||||
|
|
||||||
let server = server::get_server(
|
let server = server::get_server(
|
||||||
port,
|
port,
|
||||||
&static_url,
|
|
||||||
&api_url,
|
&api_url,
|
||||||
|
&web_url,
|
||||||
&web_dir_path,
|
&web_dir_path,
|
||||||
|
&swagger_url,
|
||||||
|
&swagger_dir_path,
|
||||||
db.clone(),
|
db.clone(),
|
||||||
command_sender,
|
command_sender,
|
||||||
)?;
|
)?;
|
||||||
|
|
|
@ -1,28 +1,41 @@
|
||||||
use rocket;
|
use rocket;
|
||||||
use rocket_contrib::serve::StaticFiles;
|
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use crate::api;
|
|
||||||
use crate::db::DB;
|
use crate::db::DB;
|
||||||
use crate::errors;
|
use crate::errors;
|
||||||
use crate::index::CommandSender;
|
use crate::index::CommandSender;
|
||||||
|
|
||||||
|
pub struct StaticDirs {
|
||||||
|
pub web_dir_path: PathBuf,
|
||||||
|
pub swagger_dir_path: PathBuf,
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_server(
|
pub fn get_server(
|
||||||
port: u16,
|
port: u16,
|
||||||
static_url: &str,
|
|
||||||
api_url: &str,
|
api_url: &str,
|
||||||
|
web_url: &str,
|
||||||
web_dir_path: &PathBuf,
|
web_dir_path: &PathBuf,
|
||||||
|
swagger_url: &str,
|
||||||
|
swagger_dir_path: &PathBuf,
|
||||||
db: Arc<DB>,
|
db: Arc<DB>,
|
||||||
command_sender: Arc<CommandSender>,
|
command_sender: Arc<CommandSender>,
|
||||||
) -> Result<rocket::Rocket, errors::Error> {
|
) -> Result<rocket::Rocket, errors::Error> {
|
||||||
|
|
||||||
let config = rocket::Config::build(rocket::config::Environment::Production)
|
let config = rocket::Config::build(rocket::config::Environment::Production)
|
||||||
.port(port)
|
.port(port)
|
||||||
.finalize()?;
|
.finalize()?;
|
||||||
|
|
||||||
|
let static_dirs = Arc::new(StaticDirs {
|
||||||
|
web_dir_path: web_dir_path.to_path_buf(),
|
||||||
|
swagger_dir_path: swagger_dir_path.to_path_buf(),
|
||||||
|
});
|
||||||
|
|
||||||
Ok(rocket::custom(config)
|
Ok(rocket::custom(config)
|
||||||
.manage(db)
|
.manage(db)
|
||||||
.manage(command_sender)
|
.manage(command_sender)
|
||||||
.mount(&static_url, StaticFiles::from(web_dir_path))
|
.manage(static_dirs)
|
||||||
.mount(&api_url, api::get_routes()))
|
.mount(&swagger_url, crate::swagger::get_routes())
|
||||||
|
.mount(&web_url, crate::web::get_routes())
|
||||||
|
.mount(&api_url, crate::api::get_routes()))
|
||||||
}
|
}
|
||||||
|
|
38
src/swagger.rs
Normal file
38
src/swagger.rs
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
use rocket::response::NamedFile;
|
||||||
|
use rocket::State;
|
||||||
|
use std::io;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use crate::server::StaticDirs;
|
||||||
|
|
||||||
|
pub fn get_routes() -> Vec<rocket::Route> {
|
||||||
|
routes![
|
||||||
|
index,
|
||||||
|
files,
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
#[get("/", rank = 9)]
|
||||||
|
fn index(static_dirs: State<Arc<StaticDirs>>) -> io::Result<NamedFile> {
|
||||||
|
let mut path = static_dirs.swagger_dir_path.clone();
|
||||||
|
path.push("index.html");
|
||||||
|
NamedFile::open(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[get("/<file..>", rank = 9)]
|
||||||
|
fn files(static_dirs: State<Arc<StaticDirs>>, file: PathBuf) -> Option<NamedFile> {
|
||||||
|
let path = static_dirs.swagger_dir_path.clone().join(file.clone());
|
||||||
|
NamedFile::open(path).ok()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_index() {
|
||||||
|
use rocket::http::Status;
|
||||||
|
use crate::test::get_test_environment;
|
||||||
|
|
||||||
|
let env = get_test_environment("swagger_index.sqlite");
|
||||||
|
let client = &env.client;
|
||||||
|
let response = client.get("/swagger").dispatch();
|
||||||
|
assert_eq!(response.status(), Status::Ok);
|
||||||
|
}
|
62
src/test.rs
Normal file
62
src/test.rs
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
use rocket;
|
||||||
|
use rocket::local::Client;
|
||||||
|
use std::fs;
|
||||||
|
use std::ops::Deref;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use crate::db::DB;
|
||||||
|
use crate::index;
|
||||||
|
use crate::server;
|
||||||
|
|
||||||
|
pub struct TestEnvironment {
|
||||||
|
pub client: Client,
|
||||||
|
command_sender: Arc<index::CommandSender>,
|
||||||
|
db: Arc<DB>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TestEnvironment {
|
||||||
|
pub fn update_index(&self) {
|
||||||
|
index::update(self.db.deref()).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for TestEnvironment {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
self.command_sender.deref().exit().unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_test_environment(db_name: &str) -> TestEnvironment {
|
||||||
|
let mut db_path = PathBuf::new();
|
||||||
|
db_path.push("test");
|
||||||
|
db_path.push(db_name);
|
||||||
|
if db_path.exists() {
|
||||||
|
fs::remove_file(&db_path).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
let db = Arc::new(DB::new(&db_path).unwrap());
|
||||||
|
|
||||||
|
let web_dir_path = PathBuf::from("web");
|
||||||
|
let mut swagger_dir_path = PathBuf::from("docs");
|
||||||
|
swagger_dir_path.push("swagger");
|
||||||
|
let command_sender = index::init(db.clone());
|
||||||
|
|
||||||
|
let server = server::get_server(
|
||||||
|
5050,
|
||||||
|
"/api",
|
||||||
|
"/",
|
||||||
|
&web_dir_path,
|
||||||
|
"/swagger",
|
||||||
|
&swagger_dir_path,
|
||||||
|
db.clone(),
|
||||||
|
command_sender.clone(),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
let client = Client::new(server).unwrap();
|
||||||
|
TestEnvironment {
|
||||||
|
client,
|
||||||
|
command_sender,
|
||||||
|
db,
|
||||||
|
}
|
||||||
|
}
|
38
src/web.rs
Normal file
38
src/web.rs
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
use rocket::response::NamedFile;
|
||||||
|
use rocket::State;
|
||||||
|
use std::io;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use crate::server::StaticDirs;
|
||||||
|
|
||||||
|
pub fn get_routes() -> Vec<rocket::Route> {
|
||||||
|
routes![
|
||||||
|
index,
|
||||||
|
files,
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
#[get("/", rank = 10)]
|
||||||
|
fn index(static_dirs: State<Arc<StaticDirs>>) -> io::Result<NamedFile> {
|
||||||
|
let mut path = static_dirs.web_dir_path.clone();
|
||||||
|
path.push("index.html");
|
||||||
|
NamedFile::open(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[get("/<file..>", rank = 10)]
|
||||||
|
fn files(static_dirs: State<Arc<StaticDirs>>, file: PathBuf) -> Option<NamedFile> {
|
||||||
|
let path = static_dirs.web_dir_path.clone().join(file.clone());
|
||||||
|
NamedFile::open(path).ok()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_index() {
|
||||||
|
use rocket::http::Status;
|
||||||
|
use crate::test::get_test_environment;
|
||||||
|
|
||||||
|
let env = get_test_environment("web_index.sqlite");
|
||||||
|
let client = &env.client;
|
||||||
|
let response = client.get("/").dispatch();
|
||||||
|
assert_eq!(response.status(), Status::Ok);
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue