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

b2uploader - backup to server

Program.cs 8.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. //check if file already exists
  42. string fileName = s.Replace('\\', '_');
  43. var existingFiles = ListFileNames(new ListFileNamesRequest() { bucketId = bucket.bucketId, startFileName = fileName }, auth.apiUrl, auth.authorizationToken);
  44. bool found = false;
  45. foreach (var x in existingFiles.files)
  46. {
  47. if (x.fileName == fileName)
  48. {
  49. found = true;
  50. break;
  51. }
  52. }
  53. if (found)
  54. {
  55. Console.WriteLine("File exists already, skipping");
  56. continue;
  57. }
  58. var uploadURL = GetUploadURL(new GetUploadURLRequest { bucketId = bucket.bucketId }, auth.apiUrl, auth.authorizationToken);
  59. var response = UploadFile(uploadURL.authorizationToken, "b2/x-auto", s, uploadURL.uploadUrl);
  60. }
  61. return 1;
  62. },
  63. errors =>{
  64. Console.WriteLine(errors);
  65. return 1;
  66. });
  67. }
  68. static AuthorizeResponse AuthorizeUser(string accountId, string applicationKey)
  69. {
  70. HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://api.backblaze.com/b2api/v1/b2_authorize_account");
  71. string credentials = Convert.ToBase64String(Encoding.UTF8.GetBytes(accountId + ":" + applicationKey));
  72. webRequest.Headers.Add("Authorization", "Basic " + credentials);
  73. webRequest.ContentType = "application/json; charset=utf-8";
  74. WebResponse response = (HttpWebResponse)webRequest.GetResponse();
  75. var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
  76. response.Close();
  77. return JsonConvert.DeserializeObject<AuthorizeResponse>(responseString);
  78. }
  79. static ListBucketsResponse ListBuckets(ListBucketsRequest request, string authToken, string apiURL)
  80. {
  81. HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(apiURL + "/b2api/v1/b2_list_buckets");
  82. string body = JsonConvert.SerializeObject(request);
  83. var data = Encoding.UTF8.GetBytes(body);
  84. webRequest.Method = "POST";
  85. webRequest.Headers.Add("Authorization", authToken);
  86. webRequest.ContentType = "application/json; charset=utf-8";
  87. webRequest.ContentLength = data.Length;
  88. using (var stream = webRequest.GetRequestStream())
  89. {
  90. stream.Write(data, 0, data.Length);
  91. stream.Close();
  92. }
  93. WebResponse response = (HttpWebResponse)webRequest.GetResponse();
  94. var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
  95. response.Close();
  96. return JsonConvert.DeserializeObject<ListBucketsResponse>(responseString);
  97. }
  98. static GetUploadURLResponse GetUploadURL(GetUploadURLRequest request, string apiUrl, string authToken)
  99. {
  100. HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(apiUrl + "/b2api/v1/b2_get_upload_url");
  101. string body = JsonConvert.SerializeObject(request);
  102. var data = Encoding.UTF8.GetBytes(body);
  103. webRequest.Method = "POST";
  104. webRequest.Headers.Add("Authorization", authToken);
  105. webRequest.ContentType = "application/json; charset=utf-8";
  106. webRequest.ContentLength = data.Length;
  107. using (var stream = webRequest.GetRequestStream())
  108. {
  109. stream.Write(data, 0, data.Length);
  110. stream.Close();
  111. }
  112. WebResponse response = (HttpWebResponse)webRequest.GetResponse();
  113. var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
  114. response.Close();
  115. return JsonConvert.DeserializeObject<GetUploadURLResponse>(responseString);
  116. }
  117. static UploadFileResponse UploadFile(string authToken, string contentType, string filePath, string uploadUrl)
  118. {
  119. byte[] bytes = System.IO.File.ReadAllBytes(filePath);
  120. String sha1 = GetSha1(bytes);
  121. HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uploadUrl);
  122. webRequest.Method = "POST";
  123. webRequest.Headers.Add("Authorization", authToken);
  124. webRequest.Headers.Add("X-Bz-File-Name", filePath.Replace('\\','_'));
  125. webRequest.Headers.Add("X-Bz-Content-Sha1", sha1);
  126. webRequest.ContentType = contentType;
  127. using (var stream = webRequest.GetRequestStream())
  128. {
  129. stream.Write(bytes, 0, bytes.Length);
  130. stream.Close();
  131. }
  132. WebResponse response = (HttpWebResponse)webRequest.GetResponse();
  133. var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
  134. response.Close();
  135. var resp = JsonConvert.DeserializeObject<UploadFileResponse>(responseString);
  136. if(resp.contentSha1 == sha1)
  137. {
  138. Console.WriteLine(responseString);
  139. return resp;
  140. }
  141. else
  142. {
  143. //something went wrong!
  144. return null;
  145. }
  146. }
  147. static ListFileNamesResponse ListFileNames(ListFileNamesRequest request, string apiUrl, string authToken)
  148. {
  149. HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(apiUrl + "/b2api/v1/b2_list_file_names");
  150. string body = JsonConvert.SerializeObject(request);
  151. var data = Encoding.UTF8.GetBytes(body);
  152. webRequest.Method = "POST";
  153. webRequest.Headers.Add("Authorization", authToken);
  154. webRequest.ContentType = "application/json; charset=utf-8";
  155. webRequest.ContentLength = data.Length;
  156. using (var stream = webRequest.GetRequestStream())
  157. {
  158. stream.Write(data, 0, data.Length);
  159. stream.Close();
  160. }
  161. WebResponse response = (HttpWebResponse)webRequest.GetResponse();
  162. var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
  163. response.Close();
  164. return JsonConvert.DeserializeObject<ListFileNamesResponse>(responseString);
  165. }
  166. private static string GetSha1(byte[] bytes)
  167. {
  168. using (SHA1Managed sha1 = new SHA1Managed())
  169. {
  170. var hash = sha1.ComputeHash(bytes);
  171. var sb = new StringBuilder(hash.Length * 2);
  172. foreach (byte b in hash)
  173. {
  174. // can be "x2" if you want lowercase
  175. sb.Append(b.ToString("X2"));
  176. }
  177. return sb.ToString();
  178. }
  179. }
  180. }
  181. }