Actually run build commands (only cargo rn though)
parent
f3dda40180
commit
826ef3b100
14
README.md
14
README.md
|
@ -6,10 +6,18 @@ On first run, `forge-server` will create a configuration file for you in the def
|
||||||
Use this to configure options, such as the IP & port to bind on, and whether to use authentication (along with a password).
|
Use this to configure options, such as the IP & port to bind on, and whether to use authentication (along with a password).
|
||||||
|
|
||||||
Authentication will use *Argon2id* to hash and verify passwords.
|
Authentication will use *Argon2id* to hash and verify passwords.
|
||||||
|
Right now it only supports building `cargo` projects.
|
||||||
|
|
||||||
Actually building stuff is a **WIP**.
|
### Build
|
||||||
|
```bash
|
||||||
|
cargo run -p forge-server
|
||||||
|
$EDITOR ~/.config/forge/config.toml
|
||||||
|
cargo run -p forge-server
|
||||||
|
```
|
||||||
|
|
||||||
## Client
|
## Client
|
||||||
Fully **WIP**.
|
|
||||||
|
|
||||||
Sends data to the server specified via commandline options.
|
Sends data to the server specified via commandline options.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cargo run -p forge
|
||||||
|
```
|
||||||
|
|
|
@ -5,6 +5,7 @@ use argon2::{
|
||||||
use paris::{error, info, success, warn};
|
use paris::{error, info, success, warn};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use serde_json::Result;
|
use serde_json::Result;
|
||||||
|
use std::process::Command as pCommand;
|
||||||
use std::{fmt, fs, io, net::SocketAddr, path::PathBuf, process::exit};
|
use std::{fmt, fs, io, net::SocketAddr, path::PathBuf, process::exit};
|
||||||
use tokio::io::{AsyncBufReadExt, AsyncReadExt, AsyncWriteExt, BufReader};
|
use tokio::io::{AsyncBufReadExt, AsyncReadExt, AsyncWriteExt, BufReader};
|
||||||
use tokio::net::{TcpListener, TcpStream};
|
use tokio::net::{TcpListener, TcpStream};
|
||||||
|
@ -101,7 +102,7 @@ struct Message {
|
||||||
basename: String,
|
basename: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn build(msg: Message, address: SocketAddr, dir: String) {
|
async fn build(msg: Message, address: SocketAddr, dir: PathBuf) {
|
||||||
let mut features = String::new();
|
let mut features = String::new();
|
||||||
match msg.command.features {
|
match msg.command.features {
|
||||||
Some(f) => {
|
Some(f) => {
|
||||||
|
@ -115,19 +116,53 @@ async fn build(msg: Message, address: SocketAddr, dir: String) {
|
||||||
None => features = "".to_string(),
|
None => features = "".to_string(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut build_dir = dir;
|
||||||
|
build_dir.push(&msg.basename);
|
||||||
|
|
||||||
|
let mut manifest = build_dir.clone();
|
||||||
|
manifest.push("Cargo.toml");
|
||||||
|
|
||||||
success!(
|
success!(
|
||||||
"Received message from <green>{:?}<//>: <magenta>{}<//>\n<bright-white>cd {}\ngit clone {}\ncd {}\n{} {} {} {}\n<//>",
|
"Received message from <green>{:?}<//>: <magenta>{}<//>",
|
||||||
address,
|
address,
|
||||||
msg.uuid.format_hyphenated(),
|
msg.uuid,
|
||||||
dir,
|
|
||||||
msg.repository,
|
|
||||||
msg.basename,
|
|
||||||
msg.command.build_system,
|
|
||||||
msg.command.subcommand,
|
|
||||||
msg.command.tag,
|
|
||||||
features,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let git_output = pCommand::new("git")
|
||||||
|
.arg("clone")
|
||||||
|
.arg(msg.repository.to_string())
|
||||||
|
.arg(&build_dir)
|
||||||
|
.output()
|
||||||
|
.unwrap();
|
||||||
|
if !git_output.status.success() {
|
||||||
|
error!("{:?}", git_output);
|
||||||
|
} else {
|
||||||
|
info!("{:?}", git_output);
|
||||||
|
}
|
||||||
|
|
||||||
|
let build_output = match msg.command.tag {
|
||||||
|
Tag::Release => {
|
||||||
|
pCommand::new(msg.command.build_system.to_string())
|
||||||
|
.arg(msg.command.subcommand.to_string())
|
||||||
|
.arg(msg.command.tag.to_string())
|
||||||
|
.arg(format!("--manifest-path={}", &manifest.display()))
|
||||||
|
// .arg(features.to_string())
|
||||||
|
.output()
|
||||||
|
.unwrap()
|
||||||
|
}
|
||||||
|
Tag::Debug => pCommand::new(msg.command.build_system.to_string())
|
||||||
|
.arg(msg.command.subcommand.to_string())
|
||||||
|
.arg(format!("--manifest-path={}", &manifest.display()))
|
||||||
|
.output()
|
||||||
|
.unwrap(),
|
||||||
|
};
|
||||||
|
|
||||||
|
if !build_output.status.success() {
|
||||||
|
error!("{:?}", build_output);
|
||||||
|
} else {
|
||||||
|
info!("{:?}", build_output);
|
||||||
|
}
|
||||||
|
|
||||||
match msg.pre_exec {
|
match msg.pre_exec {
|
||||||
Some(e) => info!("Running pre-exec: {}", e),
|
Some(e) => info!("Running pre-exec: {}", e),
|
||||||
None => {}
|
None => {}
|
||||||
|
@ -165,7 +200,7 @@ async fn process_socket(
|
||||||
mut socket: TcpStream,
|
mut socket: TcpStream,
|
||||||
address: SocketAddr,
|
address: SocketAddr,
|
||||||
auth: AuthConfig,
|
auth: AuthConfig,
|
||||||
dir: String,
|
dir: PathBuf,
|
||||||
salt: SaltString,
|
salt: SaltString,
|
||||||
argon2: Argon2<'_>,
|
argon2: Argon2<'_>,
|
||||||
) {
|
) {
|
||||||
|
@ -228,7 +263,7 @@ async fn main() -> io::Result<()> {
|
||||||
match listener.accept().await {
|
match listener.accept().await {
|
||||||
Ok((socket, addr)) => {
|
Ok((socket, addr)) => {
|
||||||
let auth = config.auth.clone();
|
let auth = config.auth.clone();
|
||||||
let dir = config.host.build_directory.clone().unwrap();
|
let dir = PathBuf::from(config.host.build_directory.clone().unwrap());
|
||||||
let m_salt = salt.clone();
|
let m_salt = salt.clone();
|
||||||
let m_argon2 = argon2.clone();
|
let m_argon2 = argon2.clone();
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
|
|
Loading…
Reference in New Issue