MCC/b2uploader: b2uploader - backup to server - SVN.BY: Go Git Service

b2uploader - backup to server

Program.cs 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. using B2Classes;
  2. using CommandLine;
  3. using Newtonsoft.Json;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Net;
  9. using System.Security.Cryptography;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. namespace B2Uploader
  13. {
  14. class CmdLineOptions
  15. {
  16. [Option('i', "accountid", HelpText = "Account ID", Required=true)]
  17. public string AccountId { get; set; }
  18. [Option('a', "appkey", HelpText = "Application Key", Required=true)]
  19. public string ApplicationKey { get; set; }
  20. [Option('d', "directory", HelpText="Directory you want to upload", Required=true)]
  21. public string Directory {get;set;}
  22. [Option('v', "verbose", HelpText="Verbose Output")]
  23. public bool Verbose{get;set;}
  24. }
  25. class Program
  26. {
  27. static void Main(string[] args)
  28. {
  29. var result = CommandLine.Parser.Default.ParseArguments<CmdLineOptions>(args);
  30. var existCode = result.MapResult(options => {
  31. if (!Directory.Exists(options.Directory))
  32. {
  33. Console.WriteLine("Directory to upload MUST EXIST!");
  34. return 0;
  35. }
  36. var auth = AuthorizeUser(options.AccountId, options.ApplicationKey);
  37. var buckets = ListBuckets(new ListBucketsRequest() { accountId = auth.accountId }, auth.authorizationToken, auth.apiUrl);
  38. var bucket = buckets.buckets.First();
  39. foreach(string s in Directory.GetFiles(options.Directory))
  40. {
  41. var uploadURL = GetUploadURL(new GetUploadURLRequest { bucketId = bucket.bucketId }, auth.apiUrl, auth.authorizationToken);
  42. var response = UploadFile(uploadURL.authorizationToken, "b2/x-auto", s, uploadURL.uploadUrl);
  43. }
  44. return 1;
  45. },
  46. errors =>{
  47. Console.WriteLine(errors);
  48. return 1;
  49. });
  50. }
  51. static AuthorizeResponse AuthorizeUser(string accountId, string applicationKey)
  52. {
  53. HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://api.backblaze.com/b2api/v1/b2_authorize_account");
  54. string credentials = Convert.ToBase64String(Encoding.UTF8.GetBytes(accountId + ":" + applicationKey));
  55. webRequest.Headers.Add("Authorization", "Basic " + credentials);
  56. webRequest.ContentType = "application/json; charset=utf-8";
  57. WebResponse response = (HttpWebResponse)webRequest.GetResponse();
  58. var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
  59. response.Close();
  60. return JsonConvert.DeserializeObject<AuthorizeResponse>(responseString);
  61. }
  62. static ListBucketsResponse ListBuckets(ListBucketsRequest request, string authToken, string apiURL)
  63. {
  64. HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(apiURL + "/b2api/v1/b2_list_buckets");
  65. string body = JsonConvert.SerializeObject(request);
  66. var data = Encoding.UTF8.GetBytes(body);
  67. webRequest.Method = "POST";
  68. webRequest.Headers.Add("Authorization", authToken);
  69. webRequest.ContentType = "application/json; charset=utf-8";
  70. webRequest.ContentLength = data.Length;
  71. using (var stream = webRequest.GetRequestStream())
  72. {
  73. stream.Write(data, 0, data.Length);
  74. stream.Close();
  75. }
  76. WebResponse response = (HttpWebResponse)webRequest.GetResponse();
  77. var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
  78. response.Close();
  79. return JsonConvert.DeserializeObject<ListBucketsResponse>(responseString);
  80. }
  81. static GetUploadURLResponse GetUploadURL(GetUploadURLRequest request, string apiUrl, string authToken)
  82. {
  83. HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(apiUrl + "/b2api/v1/b2_get_upload_url");
  84. string body = JsonConvert.SerializeObject(request);
  85. var data = Encoding.UTF8.GetBytes(body);
  86. webRequest.Method = "POST";
  87. webRequest.Headers.Add("Authorization", authToken);
  88. webRequest.ContentType = "application/json; charset=utf-8";
  89. webRequest.ContentLength = data.Length;
  90. using (var stream = webRequest.GetRequestStream())
  91. {
  92. stream.Write(data, 0, data.Length);
  93. stream.Close();
  94. }
  95. WebResponse response = (HttpWebResponse)webRequest.GetResponse();
  96. var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
  97. response.Close();
  98. return JsonConvert.DeserializeObject<GetUploadURLResponse>(responseString);
  99. }
  100. static UploadFileResponse UploadFile(string authToken, string contentType, string filePath, string uploadUrl)
  101. {
  102. byte[] bytes = File.ReadAllBytes(filePath);
  103. String sha1 = GetSha1(bytes);
  104. HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uploadUrl);
  105. webRequest.Method = "POST";
  106. webRequest.Headers.Add("Authorization", authToken);
  107. webRequest.Headers.Add("X-Bz-File-Name", filePath.Replace('\\','_'));
  108. webRequest.Headers.Add("X-Bz-Content-Sha1", sha1);
  109. webRequest.ContentType = contentType;
  110. using (var stream = webRequest.GetRequestStream())
  111. {
  112. stream.Write(bytes, 0, bytes.Length);
  113. stream.Close();
  114. }
  115. WebResponse response = (HttpWebResponse)webRequest.GetResponse();
  116. var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
  117. response.Close();
  118. var resp = JsonConvert.DeserializeObject<UploadFileResponse>(responseString);
  119. if(resp.contentSha1 == sha1)
  120. {
  121. Console.WriteLine(responseString);
  122. return resp;
  123. }
  124. else
  125. {
  126. //something went wrong!
  127. return null;
  128. }
  129. }
  130. private static string GetSha1(byte[] bytes)
  131. {
  132. using (SHA1Managed sha1 = new SHA1Managed())
  133. {
  134. var hash = sha1.ComputeHash(bytes);
  135. var sb = new StringBuilder(hash.Length * 2);
  136. foreach (byte b in hash)
  137. {
  138. // can be "x2" if you want lowercase
  139. sb.Append(b.ToString("X2"));
  140. }
  141. return sb.ToString();
  142. }
  143. }
  144. }
  145. }