private void delete_region_instance() { using ( AWSEC2Utils awsUtils = new AWSEC2Utils(setting_, write_log)) { using (FileStream fs = new FileStream(resouce_dir_ + "region.txt", FileMode.Open, FileAccess.Read)) { awsUtils.region = Helper.get_region(fs, region_combo_box.Text); } set_enable(false); try { awsUtils.delete_region_instance(); write_log(awsUtils.region + " のインスタンスを削除しました。"); } catch (Exception ex) { write_log("ERROR:\n" + ex.ToString()); } finally { set_enable(true); } } }
private void delete_instance() { using (AWSEC2Utils awsUtils = new AWSEC2Utils(setting_, write_log)) { bool has_err = false; using (FileStream fs = new FileStream(resouce_dir_ + "region.txt", FileMode.Open, FileAccess.Read)) { awsUtils.region = Helper.get_region(fs, region_combo_box.Text); } string instance_name = instance_text_box.Text; if (instance_name == "" || instance_name.ToLower().Equals("resource")) { write_log("ERROR: インスタンスネームが入力されていません。"); has_err = true; } char[] invalidChars = System.IO.Path.GetInvalidFileNameChars(); if (instance_name.IndexOfAny(invalidChars) >= 0) { write_log("ERROR: インスタンス名に使用できない文字が使用されています。(フォルダ名として不適切です)"); has_err = true; } if (instance_name.Length != Encoding.GetEncoding("shift_jis").GetByteCount(instance_name)) { write_log("ERROR: インスタンス名に使用できない文字が使用されています。(全角文字が含まれています)"); has_err = true; } if (has_err) { MessageBox.Show("削除に失敗しました。", "エラー"); return; } set_enable(false); try { awsUtils.delete_instance(instance_name); write_log(instance_name + " を削除しました。"); } catch (Exception ex) { write_log("ERROR:\n" + ex.ToString()); } finally { set_enable(true); } } }
private void region_combo_box_SelectedIndexChanged(object sender, EventArgs e) { using (AWSEC2Utils awsUtils = new AWSEC2Utils(setting_, write_log)) { string availability_zone = availability_zone_combo_box.Text.ToLower(); using (FileStream fs = new FileStream(resouce_dir_ + "region.txt", FileMode.Open, FileAccess.Read)) { string region = Helper.get_region(fs, region_combo_box.Text); if (region == "") { return; } List <string> arr = new List <string>(); IList <string> list = new List <string>(awsUtils.subnet_ids.Keys); foreach (string tag in list) { if (Helper.check_az(fs, region_combo_box.Text, tag)) { arr.Add(tag.ToUpper()); } } availability_zone_combo_box.Items.Clear(); availability_zone_combo_box.Items.AddRange((object[])arr.ToArray()); bool hit = false; for (int ii = 0; ii < arr.ToArray().Length; ii++) { if (availability_zone.Equals(arr[ii].ToLower())) { availability_zone_combo_box.SelectedIndex = ii; hit = true; break; } } if (!hit) { availability_zone_combo_box.SelectedIndex = 0; } } set_instance_name(); } }
private void delete_vpc() { using (AWSEC2Utils awsUtils = new AWSEC2Utils(setting_, write_log)) { using (FileStream fs = new FileStream(resouce_dir_ + "region.txt", FileMode.Open, FileAccess.Read)) { awsUtils.region = Helper.get_region(fs, region_combo_box.Text); } Helper.set_default_str(setting_, "region", awsUtils.region); try { if (awsUtils.delete_vpc_all(resouce_dir_ + "region.txt") == false) { MessageBox.Show("削除に失敗しました。", "エラー"); } } catch (Exception ex) { write_log("ERROR:\n" + ex.ToString()); } } }
private void create_vpc() { using (AWSEC2Utils awsUtils = new AWSEC2Utils(setting_, write_log)) { using (FileStream fs = new FileStream(resouce_dir_ + "region.txt", FileMode.Open, FileAccess.Read)) { awsUtils.region = Helper.get_region(fs, region_combo_box.Text); } Helper.set_default_str(setting_, "region", awsUtils.region); try { if (!awsUtils.load_vpc_id()) { error("VPC の読み込みに失敗しました。"); return; } if (!awsUtils.load_internet_gateway_id()) { error("インターネットゲートウェイの読み込みに失敗しました。"); return; } if (!awsUtils.load_routetable_id()) { error("ルートテーブルの読み込みに失敗しました。"); return; } using (FileStream fs = new FileStream(resouce_dir_ + "region.txt", FileMode.Open, FileAccess.Read)) { IList <string> list = new List <string>(awsUtils.subnet_ids.Keys); foreach (string tag in list) { if (Helper.check_az(fs, region_combo_box.Text, tag) == false) { continue; } if (!awsUtils.load_subnet_id(tag)) { error(awsUtils.region + tag + " の読み込みに失敗しました。"); return; } } } if (!awsUtils.load_security_group_id()) { error("セキュリティグループの読み込みに失敗しました。"); return; } write_log(awsUtils.region + " の VPC を作成しました。"); } catch (Exception ex) { write_log("ERROR:\n" + ex.ToString()); } } }
private void create_instance_button_Click(object sender, EventArgs e) { menu_close(); using (AWSEC2Utils awsUtils = new AWSEC2Utils(setting_, write_log)) { bool has_err = false; using (FileStream fs = new FileStream(resouce_dir_ + "region.txt", FileMode.Open, FileAccess.Read)) { awsUtils.region = Helper.get_region(fs, region_combo_box.Text); } string availability_zone = availability_zone_combo_box.Text.ToLower(); string instance_name = instance_text_box.Text; if (instance_name == "" || instance_name.ToLower().Equals("resource")) { write_log("ERROR: インスタンス名が入力されていません。"); has_err = true; } char[] invalidChars = System.IO.Path.GetInvalidFileNameChars(); if (instance_name.IndexOfAny(invalidChars) >= 0) { write_log("ERROR: インスタンス名に使用できない文字が使用されています。(フォルダ名として不適切です)"); has_err = true; } if (instance_name.Length != Encoding.GetEncoding("shift_jis").GetByteCount(instance_name)) { write_log("ERROR: インスタンス名に使用できない文字が使用されています。(全角文字が含まれています)"); has_err = true; } string instance_type = instance_combo_box.Text; if (instance_type == "") { write_log("ERROR: インスタンスタイプが選ばれていません。"); has_err = true; } string vm_type_ = "hvm"; if (AWSEC2Utils.paravirtual_instance_types.Contains(instance_type)) { vm_type_ = "paravirtual"; } string spot_price = price_numeric_up_down.Text; if (spot_price == "") { write_log("ERROR: 値段が入力されていません。"); has_err = true; } if (Convert.ToDouble(spot_price) < 0.001) { MessageBox.Show("金額は $0.001 以上の値を入力してください。", "エラー"); return; } string engine = "", eval = ""; using (FileStream fs = new FileStream(resouce_dir_ + "install_script.txt", FileMode.Open, FileAccess.Read)) { engine = Helper.get_install_script(fs, install_script_combo_box.Text, 1); eval = Helper.get_install_script(fs, install_script_combo_box.Text, 2); } if (engine == "" || eval == "") { write_log("ERROR: エンジンが入力されていません。"); has_err = true; } string save_folder = folder_browser_dialog.SelectedPath + "\\" + instance_text_box.Text; if (Directory.Exists(save_folder) || File.Exists(save_folder)) { DialogResult rtn = MessageBox.Show( this, "既にフォルダが存在します。上書きしますか?", "上書き確認", MessageBoxButtons.OKCancel); if (rtn == DialogResult.Cancel) { return; } Directory.Delete(save_folder + "\\", true); } save_folder = save_folder + "\\"; try { Directory.CreateDirectory(save_folder); } catch { write_log("ERROR: 保存フォルダ(" + save_folder + ")の作成に失敗しました。"); has_err = true; } if (has_err) { MessageBox.Show("失敗しました。", "エラー"); return; } Helper.set_default_str(setting_, "region", awsUtils.region); Helper.set_default_str(setting_, "availability_zone", availability_zone); set_enable(false); string private_key_tmp = null; FileInfo fi_tmp = null; try { private_key_tmp = Path.GetTempFileName(); fi_tmp = new FileInfo(private_key_tmp); Mutex mutex = new Mutex(false, Application.ProductName + awsUtils.region); try { if (mutex.WaitOne(30 * 1000) == false) { MessageBox.Show("処理の開始に失敗しました", "エラー"); return; } if (!awsUtils.check_vpc_id()) { write_log("VPC が存在しないので作成します。"); create_vpc(); awsUtils.check_vpc_id(); } awsUtils.reload_key_pair(private_key_tmp, fi_tmp.Name); if (!awsUtils.check_subnet_id(availability_zone)) { return; } if (!awsUtils.check_security_group_id()) { error("セキュリティグループでエラーが発生しました。"); return; } if (!awsUtils.load_image_id(vm_type_)) { error("マシンイメージでエラーが発生しました。"); return; } if (!awsUtils.request_spot(instance_type, availability_zone, spot_price, fi_tmp.Name)) { error("スポットリクエストでエラーが発生しました。"); return; } } finally { mutex.ReleaseMutex(); } int spot_request_timeout_seconds = setting_.getValueInt("common", "spot_request_timeout_seconds"); string instance_id = ""; long timeout = DateTime.Now.Ticks / TimeSpan.TicksPerSecond + spot_request_timeout_seconds; for (int ii = 0; ii < 1024; ii++) { if (timeout < (DateTime.Now.Ticks / TimeSpan.TicksPerSecond)) { break; } Helper.sleep(100); if ((ii % 30) != 1) { continue; } string request_spot_status = awsUtils.query_request_spot(); if (request_spot_status.IndexOf(",") >= 0) { instance_id = request_spot_status.Substring(request_spot_status.IndexOf(',') + 1); break; } if (request_spot_status.IndexOf("pending-evaluation") < 0 && request_spot_status.IndexOf("pending-fulfillment") < 0) { write_log("スポットリクエストが落札できませんでした。"); instance_id = ""; awsUtils.cancel_spot(); break; } } if (instance_id == "") { awsUtils.cancel_spot(); error("スポットインスタンスが落札できませんでした。"); return; } awsUtils.set_name_tag(instance_id, instance_name); File.WriteAllText(save_folder + "instance_status-" + instance_id + ".url", String.Format("[InternetShortcut]\r\nURL=https://{0}.console.aws.amazon.com/ec2/v2/home?region={0}#Instances:search={1};sort=instanceId", awsUtils.region, instance_id)); bool rollback = true; try { string ipaddress = awsUtils.get_instance_public_ipaddress(instance_id); if (ipaddress == null || ipaddress == "") { error("インスタンスの ipaddress の取得に失敗しました。"); return; } bool flg = false; for (int ii = 0; ii < 3; ii++) { try { if (!execute_script(ipaddress, private_key_tmp, instance_type, engine, eval)) { write_log("ERROR: セットアップスクリプトの実行でエラーが発生しました。(retry)"); continue; } } catch (Exception ex) { write_log("ERROR: " + ex.ToString()); write_log("ERROR: セットアップスクリプトの実行でエラーが発生しました。(retry)"); continue; } flg = true; break; } if (flg == false) { error("セットアップスクリプトの実行に失敗しました。"); return; } File.Copy(resouce_dir_ + "USIEngineViaSSH.ex_", save_folder + "USIEngineViaSSH.exe", true); File.Copy(private_key_tmp, save_folder + "private.pem", true); File.Copy("Renci.SshNet.dll", save_folder + "Renci.SshNet.dll", true); try { File.Copy("Renci.SshNet.LICENSE", save_folder + "Renci.SshNet.LICENSE", true); } catch { // none. } File.WriteAllText(save_folder + "info.txt", ipaddress + ",private.pem\r\n" + "# " + spot_price + "," + instance_type + "," + awsUtils.region + availability_zone + "," + end_time_str_ + "\r\n" + "# ssh -o StrictHostKeyChecking=no -i private.pem ubuntu@" + ipaddress + "\r\n\r\n" + "# UsiClient.exe.config patch (https://sites.google.com/site/shogixyz/home/shogiutil)... \r\n" + "<appSettings>\r\n" + " <add key=\"HostName\" value=\"" + ipaddress + "\"/>\r\n" + " <add key=\"Port\" value=\"53556\"/>\r\n" + " <add key=\"ExePath\" value=\"" + engine + "\"/>\r\n" + "</appSettings>\r\n"); write_log(" " + save_folder + " にエンジンを作成しました"); Process.Start(save_folder); rollback = false; } finally { if (rollback) { write_log("*** 失敗を検知しました、インスタンスを削除を試行します。"); delete_instance(); } } } catch (Exception ex) { write_log("ERROR:\n" + ex.ToString()); } finally { if (private_key_tmp != null) { awsUtils.delete_key_pair(fi_tmp.Name); File.Delete(private_key_tmp); } set_enable(true); } } }
private void price_of_instance_button_Click(object sender, EventArgs e) { menu_close(); string instance_type = instance_combo_box.Text; if (instance_type == "") { error("インスタンスタイプが選ばれていません。"); return; } set_enable(false); try { decimal min = 10000; int min_pos = 0; string min_az = ""; string min_region = ""; write_log(instance_type + " の最安値を調べています。"); using (FileStream fs = new FileStream(resouce_dir_ + "region.txt", FileMode.Open, FileAccess.Read)) { int pos = 0; foreach (string str in region_combo_box.Items) { if (!Helper.get_region_search_flag(fs, str)) { pos++; continue; } using (AWSEC2Utils awsUtils = new AWSEC2Utils(setting_, write_log)) { awsUtils.region = Helper.get_region(fs, str); region_combo_box.SelectedIndex = pos; int a_pos = 0; foreach (object obj in availability_zone_combo_box.Items) { availability_zone_combo_box.SelectedIndex = a_pos; a_pos++; decimal dd = awsUtils.load_spot_price(instance_type, ((string)obj).ToLower()); if (dd >= 10000) { break; } price_numeric_up_down.Value = dd; if (dd < min) { min_az = ((string)obj).ToUpper(); min = dd; min_pos = pos; min_region = awsUtils.region; } } } pos++; } } region_combo_box.SelectedIndex = min_pos; availability_zone_combo_box.Text = min_az; price_numeric_up_down.Value = min; write_log("最安値は " + min_region + min_az.ToLower() + " の " + min + " です。"); set_instance_name(); } catch (Exception ex) { write_log("ERROR:\n" + ex.ToString()); } finally { set_enable(true); } }