:(
This commit is contained in:
parent
ba9a8eab88
commit
39b06ba0b4
3 changed files with 80 additions and 11 deletions
|
@ -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"
|
||||||
|
}
|
||||||
|
|
44
src/Shell.fs
44
src/Shell.fs
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue