Qiniu Directory Upload
open System.Diagnostics open System open System.IO open Microsoft.WindowsAPICodePack.Dialogs let AppPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase let DataPath = AppPath + "Data\\" let BatPath = DataPath + "QiniuDirectoryUpload.bat" let LogPath = (DataPath + "Log" |> Directory.CreateDirectory).FullName + "\\" let QshellFilename = "qshell-windows-x64.exe" let UploadConfigPath = DataPath + "upload.json" let GetTime _ = DateTime.Now.ToLocalTime().ToString("u").Replace(" ", "").Replace("-", "").Replace(":", "").Replace("Z", "") let SystemRaw (command : string) visible = let mutable Output = String.Empty let sw = new StreamWriter(BatPath) sw.Write command sw.Close() let mutable StartInfo = new ProcessStartInfo() StartInfo.FileName <- BatPath StartInfo.Arguments <- "2>&1" StartInfo.RedirectStandardError <- true StartInfo.RedirectStandardOutput <- true StartInfo.UseShellExecute <- false StartInfo.WorkingDirectory <- DataPath StartInfo.CreateNoWindow <- true let cmd = new Process() cmd.StartInfo <- StartInfo cmd.OutputDataReceived.Add (fun e -> if String.IsNullOrEmpty e.Data <> true then if visible then if AppPath |> e.Data.Contains = false then "[*] " + e.Data |> Console.WriteLine Output <- Output + "\n" + e.Data) cmd.EnableRaisingEvents <- true cmd.Start() |> ignore cmd.BeginOutputReadLine() cmd.WaitForExit() Output let System command = SystemRaw command true let SystemInvisible command = SystemRaw command false let Qshell command = QshellFilename + " " + command |> System let QshellInvisible command = QshellFilename + " " + command |> SystemInvisible let GetBuckets _ = let raw = "buckets" |> QshellInvisible (('\n' |> raw.Trim().Split) |> List.ofArray).Tail let SelectBucket _ = "[-] Buckets" |> Console.WriteLine let buckets = GetBuckets() for i in List.zip ([1 .. GetBuckets() |> List.length] |> List.map (fun x -> x |> Convert.ToString)) (GetBuckets()) do "[*] " + (i |> fst) + " | " + (i |> snd) |> Console.WriteLine "bucket : " |> Console.Write buckets.[(Console.ReadLine() |> Convert.ToInt32) - 1] let Logic accessKey secretKey = if accessKey <> "" && secretKey <> "" then ("account " + accessKey + " " + secretKey) |> Qshell |> ignore let CheckLogic _ = let res = "buckets" |> QshellInvisible match "error" |> res.Contains with | true -> false | _ -> true let DirectoryPick _ = let dialog = new CommonOpenFileDialog() dialog.IsFolderPicker <- true match dialog.ShowDialog() with | CommonFileDialogResult.Ok -> dialog.FileName | _ -> String.Empty let Doublize (input : string) = String.Join("\\\\", '\\' |> input.Split) let Qupload configPath = "qupload " + configPath |> Qshell let Build bucket path = let uploadConfig = new StreamWriter(UploadConfigPath) uploadConfig.WriteLine("{") uploadConfig.WriteLine(" \"src_dir\":\"" + (path |> Doublize) + "\",") uploadConfig.WriteLine(" \"bucket\":\"" + bucket + "\",") uploadConfig.WriteLine(" \"ignore_dir\":false,") uploadConfig.WriteLine(" \"overwrite\":true,") uploadConfig.WriteLine(" \"check_exists\":true,") uploadConfig.WriteLine(" \"check_hash\":true,") uploadConfig.WriteLine(" \"check_size\":false,") uploadConfig.WriteLine(" \"rescan_local\":true,") uploadConfig.WriteLine(" \"log_file\":\"" + (LogPath |> Doublize) + GetTime()+ ".log\",") uploadConfig.WriteLine(" \"log_level\":\"debug\",") uploadConfig.WriteLine(" \"log_rotate\":1,") uploadConfig.WriteLine(" \"log_stdout\":true,") uploadConfig.WriteLine(" \"file_type\":0") uploadConfig.WriteLine("}") uploadConfig.Close() let QiniuDirectoryUpload (bucket : string) (path : string) = if CheckLogic() = true then "是否以上次登录的账号继续?(y/n)" |> Console.Write if Console.ReadLine() = "n" then Logic "1" "1" while CheckLogic() = false do "[!] Logic Fail" |> Console.WriteLine "AccessKey : " |> Console.Write let ak = Console.ReadLine() "SecretKey : " |> Console.Write let sk = Console.ReadLine() Logic ak sk "[*] Logic Successed" |> Console.WriteLine let bucket = SelectBucket() let path = DirectoryPick() Build bucket path "\"" + UploadConfigPath + "\"" |> Qupload [<STAThread>] [<EntryPoint>] let main argv = match argv.Length with | 0 -> QiniuDirectoryUpload "" "" | _ -> QiniuDirectoryUpload argv.[0] argv.[1] |> ignore Console.ReadLine() |> ignore 0