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

b2uploader - backup to server

Program.cs 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Net;
  7. using System.Security.Cryptography;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace B2Uploader
  11. {
  12. class Program
  13. {
  14. static void Main(string[] args)
  15. {
  16. if(args.Count() != 3)
  17. {
  18. Console.WriteLine("Need accountID, AppKey and Folder to upload");
  19. return;
  20. }
  21. if (!Directory.Exists(args[2]))
  22. {
  23. Console.WriteLine("Directory to upload MUST EXIST!");
  24. return;
  25. }
  26. var auth = AuthorizeUser(args[0], args[1]);
  27. var buckets = ListBuckets(new ListBucketsRequest() { accountId = auth.accountId }, auth.authorizationToken, auth.apiUrl);
  28. var bucket = buckets.buckets.First();
  29. foreach(string s in Directory.GetFiles(args[2]))
  30. {
  31. var uploadURL = GetUploadURL(new GetUploadURLRequest { bucketId = bucket.bucketId }, auth.authorizationToken, auth.apiUrl);
  32. var response = UploadFile(uploadURL.authorizationToken, "b2/x-auto", s, uploadURL.uploadUrl);
  33. }
  34. }
  35. static AuthorizeResponse AuthorizeUser(string accountId, string applicationKey)
  36. {
  37. HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://api.backblaze.com/b2api/v1/b2_authorize_account");
  38. string credentials = Convert.ToBase64String(Encoding.UTF8.GetBytes(accountId + ":" + applicationKey));
  39. webRequest.Headers.Add("Authorization", "Basic " + credentials);
  40. webRequest.ContentType = "application/json; charset=utf-8";
  41. WebResponse response = (HttpWebResponse)webRequest.GetResponse();
  42. var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
  43. response.Close();
  44. return JsonConvert.DeserializeObject<AuthorizeResponse>(responseString);
  45. }
  46. static ListBucketsResponse ListBuckets(ListBucketsRequest request, string authToken, string apiURL)
  47. {
  48. HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(apiURL + "/b2api/v1/b2_list_buckets");
  49. string body = JsonConvert.SerializeObject(request);
  50. var data = Encoding.UTF8.GetBytes(body);
  51. webRequest.Method = "POST";
  52. webRequest.Headers.Add("Authorization", authToken);
  53. webRequest.ContentType = "application/json; charset=utf-8";
  54. webRequest.ContentLength = data.Length;
  55. using (var stream = webRequest.GetRequestStream())
  56. {
  57. stream.Write(data, 0, data.Length);
  58. stream.Close();
  59. }
  60. WebResponse response = (HttpWebResponse)webRequest.GetResponse();
  61. var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
  62. response.Close();
  63. return JsonConvert.DeserializeObject<ListBucketsResponse>(responseString);
  64. }
  65. static GetUploadURLResponse GetUploadURL(GetUploadURLRequest request, string apiUrl, string authToken)
  66. {
  67. HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(apiUrl + "/b2api/v1/b2_get_upload_url");
  68. string body = JsonConvert.SerializeObject(request);
  69. var data = Encoding.UTF8.GetBytes(body);
  70. webRequest.Method = "POST";
  71. webRequest.Headers.Add("Authorization", authToken);
  72. webRequest.ContentType = "application/json; charset=utf-8";
  73. webRequest.ContentLength = data.Length;
  74. using (var stream = webRequest.GetRequestStream())
  75. {
  76. stream.Write(data, 0, data.Length);
  77. stream.Close();
  78. }
  79. WebResponse response = (HttpWebResponse)webRequest.GetResponse();
  80. var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
  81. response.Close();
  82. return JsonConvert.DeserializeObject<GetUploadURLResponse>(responseString);
  83. }
  84. static UploadFileResponse UploadFile(string authToken, string contentType, string filePath, string uploadUrl)
  85. {
  86. SHA1 sha = SHA1.Create();
  87. byte[] bytes = File.ReadAllBytes(filePath);
  88. String sha1 = ASCIIEncoding.ASCII.GetString(sha.ComputeHash(bytes));
  89. HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uploadUrl);
  90. webRequest.Method = "POST";
  91. webRequest.Headers.Add("Authorization", authToken);
  92. webRequest.Headers.Add("X-Bz-File-Name", filePath.Replace('\\','_'));
  93. webRequest.Headers.Add("X-Bz-Content-Sha1", sha1);
  94. webRequest.ContentType = contentType;
  95. using (var stream = webRequest.GetRequestStream())
  96. {
  97. stream.Write(bytes, 0, bytes.Length);
  98. stream.Close();
  99. }
  100. WebResponse response = (HttpWebResponse)webRequest.GetResponse();
  101. var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
  102. response.Close();
  103. var resp = JsonConvert.DeserializeObject<UploadFileResponse>(responseString);
  104. if(resp.contentSha1 == sha1)
  105. {
  106. Console.WriteLine(responseString);
  107. return resp;
  108. }
  109. else
  110. {
  111. //something went wrong!
  112. return null;
  113. }
  114. }
  115. }
  116. public class AuthorizeResponse
  117. {
  118. public string accountId { get; set; }
  119. public string apiUrl { get; set; }
  120. public string authorizationToken { get; set; }
  121. public string downloadUrl { get; set; }
  122. }
  123. public class CreateBucketResponse
  124. {
  125. public string bucketId { get; set; }
  126. public string accountId { get; set; }
  127. public string bucketName { get; set; }
  128. public string bucketType { get; set; }
  129. }
  130. public class CreateBucketRequest
  131. {
  132. public string accountId { get; set; }
  133. public string bucketName { get; set; }
  134. public string bucketType { get; set; }
  135. }
  136. public class GetUploadURLRequest
  137. {
  138. public string bucketId { get; set; }
  139. }
  140. public class GetUploadURLResponse
  141. {
  142. public string bucketId { get; set; }
  143. public string uploadUrl { get; set; }
  144. public string authorizationToken { get; set; }
  145. }
  146. public class ListBucketsRequest
  147. {
  148. public string accountId { get; set; }
  149. }
  150. public class ListBucketsResponse
  151. {
  152. public List<Bucket> buckets { get; set; }
  153. }
  154. public class Bucket
  155. {
  156. public string bucketId { get; set; }
  157. public string accountId { get; set; }
  158. public string bucketName { get; set; }
  159. public string bucketType { get; set; }
  160. }
  161. public class FileInfo
  162. {
  163. public string author { get; set; }
  164. }
  165. public class UploadFileResponse
  166. {
  167. public string fileId { get; set; }
  168. public string fileName { get; set; }
  169. public string accountId { get; set; }
  170. public string bucketId { get; set; }
  171. public int contentLength { get; set; }
  172. public string contentSha1 { get; set; }
  173. public string contentType { get; set; }
  174. public FileInfo fileInfo { get; set; }
  175. }
  176. }