Example #1
0
        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);
                }
            }
        }
Example #2
0
        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);
                }
            }
        }
Example #3
0
        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();
            }
        }
Example #4
0
        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());
                }
            }
        }
Example #5
0
        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());
                }
            }
        }
Example #6
0
        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);
                }
            }
        }
Example #7
0
        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);
            }
        }