Fix sync askpass and git availability
This commit is contained in:
parent
37523a874b
commit
4416a170b9
2 changed files with 27 additions and 5 deletions
|
|
@ -115,6 +115,10 @@
|
||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
after = [ "network-online.target" ];
|
after = [ "network-online.target" ];
|
||||||
wants = [ "network-online.target" ];
|
wants = [ "network-online.target" ];
|
||||||
|
path = [
|
||||||
|
pkgs.git
|
||||||
|
pkgs.openssh
|
||||||
|
];
|
||||||
preStart = lib.optionalString useRuntimeConfig ''
|
preStart = lib.optionalString useRuntimeConfig ''
|
||||||
umask 0077
|
umask 0077
|
||||||
{
|
{
|
||||||
|
|
|
||||||
28
src/main.rs
28
src/main.rs
|
|
@ -15,7 +15,7 @@ use serde::{Deserialize, Serialize};
|
||||||
use teloxide::prelude::*;
|
use teloxide::prelude::*;
|
||||||
use teloxide::types::{InlineKeyboardButton, InlineKeyboardMarkup, Message, MessageId};
|
use teloxide::types::{InlineKeyboardButton, InlineKeyboardMarkup, Message, MessageId};
|
||||||
use tokio::sync::Mutex;
|
use tokio::sync::Mutex;
|
||||||
use tempfile::NamedTempFile;
|
use tempfile::{NamedTempFile, TempPath};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
const ACK_TTL_SECS: u64 = 5;
|
const ACK_TTL_SECS: u64 = 5;
|
||||||
|
|
@ -1872,6 +1872,7 @@ async fn queue_op(state: &std::sync::Arc<AppState>, op: QueuedOp) -> Result<()>
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_sync(sync: &SyncConfig) -> Result<SyncOutcome> {
|
fn run_sync(sync: &SyncConfig) -> Result<SyncOutcome> {
|
||||||
|
ensure_git_available()?;
|
||||||
if !sync.repo_path.exists() {
|
if !sync.repo_path.exists() {
|
||||||
return Err(anyhow!(
|
return Err(anyhow!(
|
||||||
"Sync repo path not found: {}",
|
"Sync repo path not found: {}",
|
||||||
|
|
@ -1944,7 +1945,7 @@ fn run_sync(sync: &SyncConfig) -> Result<SyncOutcome> {
|
||||||
}
|
}
|
||||||
|
|
||||||
let askpass = create_askpass_script()?;
|
let askpass = create_askpass_script()?;
|
||||||
let askpass_path = askpass.path().to_string_lossy().to_string();
|
let askpass_path = askpass.to_string_lossy().to_string();
|
||||||
let push_env = vec![
|
let push_env = vec![
|
||||||
("GIT_TERMINAL_PROMPT", "0".to_string()),
|
("GIT_TERMINAL_PROMPT", "0".to_string()),
|
||||||
("GIT_ASKPASS", askpass_path),
|
("GIT_ASKPASS", askpass_path),
|
||||||
|
|
@ -1975,7 +1976,9 @@ fn run_git(repo_path: &Path, args: &[&str], envs: Vec<(&str, String)>) -> Result
|
||||||
for (key, value) in envs {
|
for (key, value) in envs {
|
||||||
cmd.env(key, value);
|
cmd.env(key, value);
|
||||||
}
|
}
|
||||||
let output = cmd.output().context("run git command")?;
|
let output = cmd
|
||||||
|
.output()
|
||||||
|
.with_context(|| format!("run git command: git {}", args.join(" ")))?;
|
||||||
Ok(GitOutput {
|
Ok(GitOutput {
|
||||||
status: output.status,
|
status: output.status,
|
||||||
stdout: String::from_utf8_lossy(&output.stdout).to_string(),
|
stdout: String::from_utf8_lossy(&output.stdout).to_string(),
|
||||||
|
|
@ -1983,6 +1986,21 @@ fn run_git(repo_path: &Path, args: &[&str], envs: Vec<(&str, String)>) -> Result
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn ensure_git_available() -> Result<()> {
|
||||||
|
match Command::new("git").arg("--version").output() {
|
||||||
|
Ok(output) => {
|
||||||
|
if output.status.success() {
|
||||||
|
Ok(())
|
||||||
|
} else {
|
||||||
|
Err(anyhow!("Git unavailable: git --version failed."))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(_) => Err(anyhow!(
|
||||||
|
"Git is not available in PATH. Add git to the service path."
|
||||||
|
)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn format_git_error(action: &str, output: &GitOutput) -> String {
|
fn format_git_error(action: &str, output: &GitOutput) -> String {
|
||||||
let mut message = format!("{} failed.", action);
|
let mut message = format!("{} failed.", action);
|
||||||
let stdout = output.stdout.trim();
|
let stdout = output.stdout.trim();
|
||||||
|
|
@ -2072,7 +2090,7 @@ fn sync_commit_message() -> String {
|
||||||
format!("Bot sync {}", Local::now().format("%Y-%m-%d %H:%M:%S"))
|
format!("Bot sync {}", Local::now().format("%Y-%m-%d %H:%M:%S"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_askpass_script() -> Result<NamedTempFile> {
|
fn create_askpass_script() -> Result<TempPath> {
|
||||||
let mut file = NamedTempFile::new().context("create askpass script")?;
|
let mut file = NamedTempFile::new().context("create askpass script")?;
|
||||||
file.write_all(
|
file.write_all(
|
||||||
b"#!/bin/sh\ncase \"$1\" in\n*Username*) echo \"$GIT_SYNC_USERNAME\" ;;\n*Password*) echo \"$GIT_SYNC_PAT\" ;;\n*) echo \"\" ;;\nesac\n",
|
b"#!/bin/sh\ncase \"$1\" in\n*Username*) echo \"$GIT_SYNC_USERNAME\" ;;\n*Password*) echo \"$GIT_SYNC_PAT\" ;;\n*) echo \"\" ;;\nesac\n",
|
||||||
|
|
@ -2081,7 +2099,7 @@ fn create_askpass_script() -> Result<NamedTempFile> {
|
||||||
let mut perms = file.as_file().metadata()?.permissions();
|
let mut perms = file.as_file().metadata()?.permissions();
|
||||||
perms.set_mode(0o700);
|
perms.set_mode(0o700);
|
||||||
fs::set_permissions(file.path(), perms).context("chmod askpass script")?;
|
fs::set_permissions(file.path(), perms).context("chmod askpass script")?;
|
||||||
Ok(file)
|
Ok(file.into_temp_path())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn split_items(text: &str) -> Vec<String> {
|
fn split_items(text: &str) -> Vec<String> {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue