failed attempt at making a single binary for CLI and GUI on Windows
This commit is contained in:
parent
5b9c711008
commit
4ee1d543f7
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "creddy",
|
||||
"version": "0.2.1",
|
||||
"version": "0.2.2",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
|
95
src-tauri/Cargo.lock
generated
95
src-tauri/Cargo.lock
generated
@ -68,36 +68,6 @@ version = "1.0.71"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8"
|
||||
|
||||
[[package]]
|
||||
name = "app"
|
||||
version = "0.2.1"
|
||||
dependencies = [
|
||||
"argon2",
|
||||
"auto-launch",
|
||||
"aws-config",
|
||||
"aws-sdk-sts",
|
||||
"aws-smithy-types",
|
||||
"aws-types",
|
||||
"chacha20poly1305",
|
||||
"clap",
|
||||
"dirs 5.0.1",
|
||||
"is-terminal",
|
||||
"netstat2",
|
||||
"once_cell",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"sodiumoxide",
|
||||
"sqlx",
|
||||
"strum",
|
||||
"strum_macros",
|
||||
"sysinfo",
|
||||
"tauri",
|
||||
"tauri-build",
|
||||
"tauri-plugin-single-instance",
|
||||
"thiserror",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "argon2"
|
||||
version = "0.5.0"
|
||||
@ -975,6 +945,37 @@ dependencies = [
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "creddy"
|
||||
version = "0.2.2"
|
||||
dependencies = [
|
||||
"argon2",
|
||||
"auto-launch",
|
||||
"aws-config",
|
||||
"aws-sdk-sts",
|
||||
"aws-smithy-types",
|
||||
"aws-types",
|
||||
"chacha20poly1305",
|
||||
"clap",
|
||||
"dirs 5.0.1",
|
||||
"gag",
|
||||
"netstat2",
|
||||
"once_cell",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"sodiumoxide",
|
||||
"sqlx",
|
||||
"strum",
|
||||
"strum_macros",
|
||||
"sysinfo",
|
||||
"tauri",
|
||||
"tauri-build",
|
||||
"tauri-plugin-single-instance",
|
||||
"thiserror",
|
||||
"tokio",
|
||||
"windows 0.48.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-channel"
|
||||
version = "0.5.8"
|
||||
@ -1347,6 +1348,17 @@ dependencies = [
|
||||
"rustc_version",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "filedescriptor"
|
||||
version = "0.8.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7199d965852c3bac31f779ef99cbb4537f80e952e2d6aa0ffeb30cce00f4f46e"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"thiserror",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "filetime"
|
||||
version = "0.2.21"
|
||||
@ -1529,6 +1541,16 @@ dependencies = [
|
||||
"byteorder",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gag"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a713bee13966e9fbffdf7193af71d54a6b35a0bb34997cd6c9519ebeb5005972"
|
||||
dependencies = [
|
||||
"filedescriptor",
|
||||
"tempfile",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gdk"
|
||||
version = "0.15.4"
|
||||
@ -2099,18 +2121,6 @@ dependencies = [
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "is-terminal"
|
||||
version = "0.4.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f"
|
||||
dependencies = [
|
||||
"hermit-abi 0.3.1",
|
||||
"io-lifetimes",
|
||||
"rustix",
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.10.5"
|
||||
@ -4009,6 +4019,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fe7e0f1d535e7cbbbab43c82be4fc992b84f9156c16c160955617e0260ebc449"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"clap",
|
||||
"cocoa",
|
||||
"dirs-next",
|
||||
"embed_plist",
|
||||
|
@ -1,11 +1,11 @@
|
||||
[package]
|
||||
name = "app"
|
||||
version = "0.2.1"
|
||||
description = "A Tauri App"
|
||||
authors = ["you"]
|
||||
name = "creddy"
|
||||
version = "0.2.2"
|
||||
description = "A friendly AWS credentials manager"
|
||||
authors = ["Joseph Montanaro"]
|
||||
license = ""
|
||||
repository = ""
|
||||
default-run = "app"
|
||||
default-run = "creddy"
|
||||
edition = "2021"
|
||||
rust-version = "1.57"
|
||||
|
||||
@ -17,7 +17,7 @@ tauri-build = { version = "1.0.4", features = [] }
|
||||
[dependencies]
|
||||
serde_json = "1.0"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
tauri = { version = "1.2", features = ["dialog", "os-all", "system-tray"] }
|
||||
tauri = { version = "1.2", features = ["cli", "dialog", "os-all", "system-tray"] }
|
||||
tauri-plugin-single-instance = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "dev" }
|
||||
sodiumoxide = "0.2.7"
|
||||
tokio = { version = ">=1.19", features = ["full"] }
|
||||
@ -35,9 +35,11 @@ strum_macros = "0.24"
|
||||
auto-launch = "0.4.0"
|
||||
dirs = "5.0"
|
||||
clap = { version = "3.2.23", features = ["derive"] }
|
||||
is-terminal = "0.4.7"
|
||||
# is-terminal = "0.4.7"
|
||||
argon2 = { version = "0.5.0", features = ["std"] }
|
||||
chacha20poly1305 = { version = "0.10.1", features = ["std"] }
|
||||
windows = { version = "0.48", features = ["Win32_Foundation", "Win32_System_Console"] }
|
||||
gag = "1.0"
|
||||
|
||||
[features]
|
||||
# by default Tauri runs in production mode
|
||||
|
@ -13,7 +13,6 @@ use tokio::{
|
||||
io::{AsyncReadExt, AsyncWriteExt},
|
||||
};
|
||||
|
||||
|
||||
use crate::app;
|
||||
use crate::config::AppConfig;
|
||||
use crate::credentials::{BaseCredentials, SessionCredentials};
|
||||
@ -23,6 +22,16 @@ use crate::errors::*;
|
||||
pub fn parser() -> Command<'static> {
|
||||
Command::new("creddy")
|
||||
.about("A friendly AWS credentials manager")
|
||||
// we don't want the default help handling because it early-exits,
|
||||
// and on Windows we need to setup the console before we can output
|
||||
.disable_help_flag(true)
|
||||
.arg(
|
||||
Arg::new("help")
|
||||
.short('h')
|
||||
.long("help")
|
||||
.action(ArgAction::SetTrue)
|
||||
.help("Print this message or the help of the given subcommand(s)")
|
||||
)
|
||||
.subcommand(
|
||||
Command::new("run")
|
||||
.about("Launch Creddy")
|
||||
|
@ -2,7 +2,6 @@ use std::net::Ipv4Addr;
|
||||
use std::path::PathBuf;
|
||||
|
||||
use auto_launch::AutoLaunchBuilder;
|
||||
use is_terminal::IsTerminal;
|
||||
use serde::{Serialize, Deserialize};
|
||||
use sqlx::SqlitePool;
|
||||
|
||||
@ -96,7 +95,7 @@ pub fn get_or_create_db_path() -> Result<PathBuf, DataDirError> {
|
||||
path.push("Creddy");
|
||||
|
||||
std::fs::create_dir_all(&path)?;
|
||||
if cfg!(debug_assertions) && std::io::stdout().is_terminal() {
|
||||
if cfg!(debug_assertions) {
|
||||
path.push("creddy.dev.db");
|
||||
}
|
||||
else {
|
||||
|
@ -3,6 +3,20 @@
|
||||
windows_subsystem = "windows"
|
||||
)]
|
||||
|
||||
#[cfg(windows)]
|
||||
use {
|
||||
std::fs::File,
|
||||
std::os::windows::io::FromRawHandle,
|
||||
std::os::raw::c_void,
|
||||
gag::Redirect,
|
||||
windows::Win32::System::Console::{
|
||||
AllocConsole,
|
||||
AttachConsole,
|
||||
GetStdHandle,
|
||||
STD_OUTPUT_HANDLE,
|
||||
STD_ERROR_HANDLE,
|
||||
}
|
||||
};
|
||||
|
||||
mod app;
|
||||
mod cli;
|
||||
@ -15,18 +29,40 @@ mod state;
|
||||
mod server;
|
||||
mod tray;
|
||||
|
||||
|
||||
use crate::errors::ErrorPopup;
|
||||
|
||||
|
||||
use std::io::Write;
|
||||
fn main() {
|
||||
let res = match cli::parser().get_matches().subcommand() {
|
||||
None | Some(("run", _)) => {
|
||||
let args = cli::parser().get_matches();
|
||||
let help = matches!(args.get_one::<bool>("help"), Some(true));
|
||||
|
||||
// This is the only case that doesn't need a console
|
||||
if let None | Some(("run", _)) = args.subcommand() {
|
||||
if !help {
|
||||
app::run().error_popup("Creddy failed to start");
|
||||
Ok(())
|
||||
},
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// on Windows, need to do the whole allocate-a-console thing
|
||||
#[cfg(windows)]
|
||||
attach_console();
|
||||
// let (out, err) = setup_console();
|
||||
println!("Testing stdout");
|
||||
// writeln!(&mut out, "Testing allocated file");
|
||||
|
||||
if help {
|
||||
// if we can't print help, we can't print an error, so just panic
|
||||
dbg!(args.get_one::<bool>("help"));
|
||||
cli::parser().print_help().unwrap();
|
||||
std::thread::sleep(std::time::Duration::from_secs(3));
|
||||
return;
|
||||
}
|
||||
|
||||
let res = match args.subcommand() {
|
||||
Some(("show", m)) => cli::show(m),
|
||||
Some(("exec", m)) => cli::exec(m),
|
||||
// clap ensures that subcommand is either None or run/show/exec
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
@ -34,3 +70,43 @@ fn main() {
|
||||
eprintln!("Error: {e}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fn attach_console() {
|
||||
unsafe { AttachConsole(u32::MAX); }
|
||||
}
|
||||
|
||||
|
||||
|
||||
fn setup_console() -> (Redirect<File>, Redirect<File>) {
|
||||
let (mut stdout, stderr) = unsafe {
|
||||
AllocConsole();
|
||||
// if we can't get handles to stdout/err, we can't display these errors,
|
||||
// so there's no point in doing anything other than panicking
|
||||
let stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE).unwrap();
|
||||
let stderr_handle = GetStdHandle(STD_ERROR_HANDLE).unwrap();
|
||||
|
||||
let mut f = File::create("C:\\Users\\Joe\\Downloads\\debug.txt").unwrap();
|
||||
writeln!(&mut f, "{stdout_handle:?}\n{:?}", stdout_handle.0 as *mut c_void).unwrap();
|
||||
|
||||
(
|
||||
File::from_raw_handle(stdout_handle.0 as *mut c_void),
|
||||
File::from_raw_handle(stderr_handle.0 as *mut c_void),
|
||||
)
|
||||
};
|
||||
|
||||
writeln!(&mut stdout, "Testing stdout before redirect")
|
||||
.map_err(|e| log_err(e))
|
||||
.unwrap();
|
||||
|
||||
(
|
||||
Redirect::stdout(stdout).unwrap(),
|
||||
Redirect::stderr(stderr).unwrap()
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
fn log_err(e: impl std::error::Error) {
|
||||
let mut f = File::create("C:\\Users\\Joe\\Downloads\\log.txt").unwrap();
|
||||
writeln!(&mut f, "{e}").unwrap();
|
||||
}
|
||||
|
@ -7,8 +7,8 @@
|
||||
"distDir": "../dist"
|
||||
},
|
||||
"package": {
|
||||
"productName": "creddy",
|
||||
"version": "0.2.1"
|
||||
"productName": "Creddy",
|
||||
"version": "0.2.2"
|
||||
},
|
||||
"tauri": {
|
||||
"allowlist": {
|
||||
@ -47,6 +47,14 @@
|
||||
"timestampUrl": ""
|
||||
}
|
||||
},
|
||||
"cli": {
|
||||
"description": "A friendly AWS credentials manager",
|
||||
"subcommands": {
|
||||
"run": {
|
||||
"description": "Launch Creddy"
|
||||
}
|
||||
}
|
||||
},
|
||||
"security": {
|
||||
"csp": {
|
||||
"default-src": ["'self'"],
|
||||
|
Loading…
x
Reference in New Issue
Block a user