This commit is contained in:
bparodi@lezzo.org 2024-11-16 13:18:01 +01:00
parent ba9a8eab88
commit 39b06ba0b4
3 changed files with 80 additions and 11 deletions

View file

@ -6,6 +6,7 @@ open System.Threading
open System.Threading.Tasks open System.Threading.Tasks
open Bidello.Datatypes open Bidello.Datatypes
open Bidello.Shell
type IShellGrain = type IShellGrain =
@ -18,14 +19,26 @@ type ShellGrain() =
interface IShellGrain with interface IShellGrain with
member _.schedule (ct) (jobs: ChainOfJobs) = task { member _.schedule (ct) (jobs: ChainOfJobs) = task {
// printfn "Grain view: --------"
// printfn "HEAD= %A" jobs.head
// jobs.rest |> List.iter (printfn "%A")
// printfn "--------"
let! rc = let! rc =
jobs.head jobs.head
|> Shell.run_job |> run_job
(*
let rec run = function
| [] -> ()
| x::xs ->
let! rc = run_job x
match rc with match rc with
| Ok rc -> printfn "rc = OK %A" rc | NoShell reason | Unknown reason ->
| Error rc -> printfn "rc = Error %A" rc printfn "Greve: %A" reason
| Success stdout -> printfn "rc = Ok %A" stdout
| NoPermissionOnFolder -> printfn "NO perms on folder"
| NoPrivilegeToUser -> printfn "NO privilege to user"
| Failure (_rc, stderr) -> printfn "rc ERror = = stderr %A" stderr
run xs
run (jobs.head::jobs.rest)
*)
failwith "todoo"
} }

View file

@ -29,6 +29,33 @@ let private shell_ () =
let shell = Lazy.Create shell_ let shell = Lazy.Create shell_
let private has_permission_on_folder (shell: string) (folder: string) (user: string) = task {
try
let! rc =
Builder
.UseShell(shell)
.UseExecutable("true")
.UseStartInfoTransform(fun si ->
si.WorkingDirectory <- folder
si.UserName <- user)
.ExecuteAsync ()
return true
with _ -> return false
}
let private can_switch_to_user (shell: string) (user: string) = task {
try
let! rc =
Builder
.UseShell(shell)
.UseExecutable("true")
.UseStartInfoTransform(fun si -> si.UserName <- user)
.ExecuteAsync ()
return true
with _ -> return false
}
let which (executable: string) = let which (executable: string) =
let run (shell: string) = let run (shell: string) =
let rc = let rc =
@ -56,6 +83,7 @@ let which (executable: string) =
type RunResult = type RunResult =
| Success of string | Failure of (int * string) | Success of string | Failure of (int * string)
| Unknown of string | NoShell of string | Unknown of string | NoShell of string
| NoPermissionOnFolder | NoPrivilegeToUser
let run_job (cj: CronJob) = task { let run_job (cj: CronJob) = task {
@ -92,6 +120,18 @@ let run_job (cj: CronJob) = task {
match shell.Value with match shell.Value with
| Error e -> return NoShell e | Error e -> return NoShell e
| Ok shell -> | Ok shell ->
printfn $"Running: {executable}|{shell}|{workdir}|{user}" let! rc = run shell
return! run shell
match rc with
| Unknown u ->
let! can_switch = can_switch_to_user shell user
if not can_switch then
return NoPrivilegeToUser
else
let! can_cwd = has_permission_on_folder shell workdir user
if not can_cwd then
return NoPermissionOnFolder
else
return Unknown u
| rc -> return rc
} }

View file

@ -98,3 +98,19 @@ let should_fail_no_host () =
Cron.sort_jobs now requirements Cron.sort_jobs now requirements
|> Result.isError |> Result.isError
|> Assert.is_true |> Assert.is_true
[<Test>]
let job_deps_chain () =
let requirements = [
{bj with job_name = "j1"}
{bj with job_name = "j2_after_j1"; ``when``="@after j2"}
{bj with job_name = "j3_after_j2"; ``when``="@after j2_after_j1"}
]
let cjs = run_function requirements
let expected = [[("h1", "j1"); ("h1", "j1_after")];
[("h1", "j2"); ("h1", "j2_after")];
[("h2", "j1")]]
Assert.are_seq_equal expected cjs