public override void Update(HostConfig HC, IPAddress ipAddress) { if (HC == null) { throw new ArgumentNullException("HC"); } if (ipAddress == null) { throw new ArgumentNullException("ipAddress"); } using (RMWebClient WC = new RMWebClient()) { try { NameValueCollection Params = new NameValueCollection(); Params.Add("a", "rec_edit"); Params.Add("content", ipAddress.ToString()); Params.Add("email", HC.Username); Params.Add("id", HC.ProviderSpecificSettings[HostConfig.CLOUDFLARE_REC_ID]); int HostnamePeriodCount = HC.Hostname.Count(x => x == '.'); // TODO Do this for other providers too switch (HostnamePeriodCount) { case 0: throw new Exception("Hostname has 0 periods?"); case 1: Params.Add("name", HC.Hostname); break; // One period == full domain name (ie github.com) default: Params.Add("name", string.Join(".", HC.Hostname.Split('.'), 0, HostnamePeriodCount - 1)); break; // More than one period == all but last element (ie www.github.com or a.b.c.d.github.com) } Params.Add("tkn", HC.Password.GetPlainText()); Params.Add("ttl", "1"); Params.Add("type", "A"); Params.Add("z", HC.ProviderSpecificSettings[HostConfig.CLOUDFLARE_ZONE_NAME]); Hashtable rec_edit_response = (Hashtable)JSON.JsonDecode(Encoding.UTF8.GetString(WC.UploadValues("https://www.cloudflare.com/api_json.html", "POST", Params))); if (rec_edit_response["result"].ToString() == "success") { Hashtable Response = (Hashtable)rec_edit_response["response"]; Hashtable Rec = (Hashtable)Response["rec"]; Hashtable Obj = (Hashtable)Rec["obj"]; if (!Obj["content"].ToString().Contains(ipAddress.ToString())) { HC.Disabled = true; HC.DisabledReason = rec_edit_response["msg"].ToString(); HC.Save(); Logging.instance.LogError("Unable to update host \"" + HC.Hostname + "\" (" + HC.Provider.ToString() + "): " + HC.DisabledReason); } } else { HC.Disabled = true; HC.DisabledReason = (rec_edit_response["msg"] == null) ? "Unknown reason" : rec_edit_response["msg"].ToString(); HC.Save(); Logging.instance.LogError("Unable to update host \"" + HC.Hostname + "\" (" + HC.Provider.ToString() + "): " + HC.DisabledReason); } } catch (Exception ex) { HC.Disabled = true; HC.DisabledReason = "Unhandled exception (" + ex.Message + ")"; HC.Save(); Logging.instance.LogException("Unable to update host \"" + HC.Hostname + "\"", ex); } } }
void cmdRetrieve_Click(object sender, EventArgs e) { if (!Dialog.ValidateIsEmailAddress(txtEmailAddress)) { return; } if (!Dialog.ValidateIsNotEmpty(txtAPIKey)) { return; } lvZoneRecords.Items.Clear(); using (RMWebClient WC = new RMWebClient()) { // Get all zones try { NameValueCollection Params = new NameValueCollection(); Params.Add("a", "zone_load_multi"); Params.Add("email", txtEmailAddress.Text.Trim()); Params.Add("tkn", txtAPIKey.Text.Trim()); Hashtable zone_load_multi_response = (Hashtable)JSON.JsonDecode(Encoding.UTF8.GetString(WC.UploadValues("https://www.cloudflare.com/api_json.html", "POST", Params))); if ((zone_load_multi_response["result"] != null) && (zone_load_multi_response["result"].ToString() == "success")) { Hashtable Response = (Hashtable)zone_load_multi_response["response"]; Hashtable Zones = (Hashtable)Response["zones"]; ArrayList Objs = (ArrayList)Zones["objs"]; // Now get all records for each zone foreach (Hashtable Zone in Objs) { Params = new NameValueCollection(); Params.Add("a", "rec_load_all"); Params.Add("email", txtEmailAddress.Text.Trim()); Params.Add("tkn", txtAPIKey.Text.Trim()); Params.Add("z", Zone["zone_name"].ToString()); Hashtable rec_load_all_response = (Hashtable)JSON.JsonDecode(Encoding.UTF8.GetString(WC.UploadValues("https://www.cloudflare.com/api_json.html", "POST", Params))); Response = (Hashtable)rec_load_all_response["response"]; Hashtable Recs = (Hashtable)Response["recs"]; Objs = (ArrayList)Recs["objs"]; foreach (Hashtable ZoneRecord in Objs) { if (ZoneRecord["type"].ToString() == "A") { ListViewItem LVI = new ListViewItem(ZoneRecord["name"].ToString()); LVI.SubItems.Add(ZoneRecord["zone_name"].ToString()); LVI.SubItems.Add(ZoneRecord["rec_id"].ToString()); lvZoneRecords.Items.Add(LVI); } } } } else { if (zone_load_multi_response["msg"] == null) { throw new Exception("Unknown error"); } else { throw new Exception(zone_load_multi_response["msg"].ToString()); } } } catch (Exception ex) { Logging.instance.LogException("Error retrieving CloudFlare zone records", ex); Dialog.Error("Error retrieving hostnames:\r\n\r\n" + ex.Message, "Error"); } } }
public override IPAddress[] GetRemoteIPs(HostConfig HC) { if (HC == null) { throw new ArgumentNullException("HC"); } using (RMWebClient WC = new RMWebClient()) { try { NameValueCollection Params = new NameValueCollection(); Params.Add("a", "rec_load_all"); Params.Add("email", HC.Username); Params.Add("tkn", HC.Password.GetPlainText()); Params.Add("z", HC.ProviderSpecificSettings[HostConfig.CLOUDFLARE_ZONE_NAME]); Hashtable rec_load_all_response = (Hashtable)JSON.JsonDecode(Encoding.UTF8.GetString(WC.UploadValues("https://www.cloudflare.com/api_json.html", "POST", Params))); if (rec_load_all_response["result"].ToString() == "success") { Hashtable Response = (Hashtable)rec_load_all_response["response"]; Hashtable Recs = (Hashtable)Response["recs"]; ArrayList Objs = (ArrayList)Recs["objs"]; foreach (Hashtable Obj in Objs) { if (Obj["name"].ToString().ToLower() == HC.Hostname.ToLower()) { return(new IPAddress[] { IPAddress.Parse(Obj["content"].ToString()) }); } } } else { Logging.instance.LogError("Unable to get remote IPs \"" + HC.Hostname + "\" (" + HC.Provider.ToString() + "): " + (rec_load_all_response["msg"] == null ? "Unknown reason" : rec_load_all_response["msg"].ToString())); } } catch (Exception ex) { Logging.instance.LogException("Unable to get remote IPs \"" + HC.Hostname + "\" (" + HC.Provider.ToString() + ")", ex); } } return(null); }