-
Notifications
You must be signed in to change notification settings - Fork 0
/
shell.fsx
87 lines (71 loc) · 2.79 KB
/
shell.fsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
module Shell
open System
let logfn format =
Printf.kprintf (printfn "%A: %s" DateTime.Now) format
let exec procName args =
logfn "Shell: %s %s" procName args
let proc = new Diagnostics.Process()
proc.StartInfo <- Diagnostics.ProcessStartInfo()
proc.StartInfo.FileName <- procName
proc.StartInfo.Arguments <- args
proc.StartInfo.UseShellExecute <- false
proc.StartInfo.RedirectStandardOutput <- true
let mutable lastOutput = DateTime.Now
proc.OutputDataReceived.Add(fun e ->
if e.Data <> null then
logfn "%s" e.Data
lastOutput <- DateTime.Now
)
proc.Start() |> ignore
proc.BeginOutputReadLine()
let timeBetweenChecks = TimeSpan.FromMinutes(10.0)
let maxTimeBetweenOutput = TimeSpan.FromHours(4.0)
while not(proc.WaitForExit(timeBetweenChecks.TotalMilliseconds |> int)) do
let timeAfterLastOutput = DateTime.Now - lastOutput
if timeAfterLastOutput > maxTimeBetweenOutput then
logfn "Timeouted after: %A" timeAfterLastOutput
proc.Kill()
raise (TimeoutException())
else
logfn "Waiting for next output for: %A" timeAfterLastOutput
if proc.ExitCode <> 0 then
let error = sprintf "Error code: %d" proc.ExitCode
logfn "%s" error
raise (Exception(error))
else
logfn "OK"
let execToGetOutput procName args =
logfn "Shell: %s %s" procName args
let proc = new Diagnostics.Process()
proc.StartInfo <- Diagnostics.ProcessStartInfo()
proc.StartInfo.FileName <- procName
proc.StartInfo.Arguments <- args
proc.StartInfo.UseShellExecute <- false
proc.StartInfo.RedirectStandardOutput <- true
proc.Start() |> ignore
let timeout = TimeSpan.FromHours(6.0)
if proc.WaitForExit(timeout.TotalMilliseconds |> int) then
if proc.ExitCode <> 0 then
let error = sprintf "Error code: %d" proc.ExitCode
logfn "%s" error
proc.StandardOutput.ReadToEnd ()
else
logfn "OK"
proc.StandardOutput.ReadToEnd ()
else
logfn "Timeouted"
proc.Kill()
raise (TimeoutException())
let datasetDir = System.IO.Path.Combine(__SOURCE_DIRECTORY__, "dataset")
let mySqlDatasetDir = System.IO.Path.Combine(datasetDir, "mysql")
let msSqlDatasetDir = System.IO.Path.Combine(datasetDir, "mssql")
let ttlDatasetDir = System.IO.Path.Combine(datasetDir, "ttl")
let tdDir = System.IO.Path.Combine(__SOURCE_DIRECTORY__, "td_data")
let mappingDir = System.IO.Path.Combine(__SOURCE_DIRECTORY__, "mapping")
let outputDir = System.IO.Path.Combine(__SOURCE_DIRECTORY__, "output")
let staticDir = System.IO.Path.Combine(__SOURCE_DIRECTORY__, "static")
let jdbcDir = System.IO.Path.Combine(staticDir, "jdbc")
let createAndEmptyDirectory path =
let directory = IO.Directory.CreateDirectory(path)
directory.GetFiles() |> Seq.iter (fun x -> x.Delete())
directory.GetDirectories() |> Seq.iter (fun x -> x.Delete(true))