X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=na-get-lib%2FNaGet.SubCommands%2FNaGetInstall.cs;h=05f0db1d5260e9e10cff386cd33e3c4f143ffd36;hb=9a97ef5e1b4ce5dde8f5457986820624d4a063b7;hp=e000ff78ccba9294d72b799c1dc46c5063e6d852;hpb=28244d25caea176161ae04c320f561938de9835d;p=applistation%2FAppliStation.git diff --git a/na-get-lib/NaGet.SubCommands/NaGetInstall.cs b/na-get-lib/NaGet.SubCommands/NaGetInstall.cs index e000ff7..05f0db1 100644 --- a/na-get-lib/NaGet.SubCommands/NaGetInstall.cs +++ b/na-get-lib/NaGet.SubCommands/NaGetInstall.cs @@ -1,4 +1,5 @@ -using System; +using System; +using System.Collections.Generic; using NaGet.Packages.Install; using NaGet.Packages; using NaGet.Net; @@ -13,7 +14,19 @@ namespace NaGet.SubCommands private PackageListsManager pkgListMan; - public Downloader Downloader; // TODO ŽQÆ‚ð‚µ‚ÄƒZƒbƒg‚·‚é‚悤‚É + /// + /// ダウンロードに使うダウンローダオブジェクト + /// + public Downloader Downloader { + get { + if (downloader == null) { + downloader = new Downloader(); + } + return downloader; + } + } + + private Downloader downloader; private bool packageInstallerDownloaded = false; @@ -22,23 +35,23 @@ namespace NaGet.SubCommands } /// - /// ƒCƒ“ƒXƒg[ƒ‹‚·‚éƒpƒbƒP[ƒW + /// インストールするパッケージ /// public Installation[] Installations; /// - /// ƒRƒ“ƒXƒgƒ‰ƒNƒ^ + /// コンストラクタ /// - /// ƒCƒ“ƒXƒg[ƒ‹‚·‚éƒpƒbƒP[ƒW + /// インストールするパッケージ public NaGetInstall(PackageListsManager pkgListMan, Package[] pkgs) : this(pkgListMan, Installation.ConvertInstallations(pkgs)) { } /// - /// ƒRƒ“ƒXƒgƒ‰ƒNƒ^ + /// コンストラクタ /// - /// ƒCƒ“ƒXƒg[ƒ‹ˆ—‚Ì”z—ñ + /// インストール処理の配列 public NaGetInstall(PackageListsManager pkgMan, Installation[] installations) { pkgListMan = pkgMan; @@ -49,17 +62,18 @@ namespace NaGet.SubCommands private void initializeMainTaskSetNames() { - System.Collections.Generic.List taskSetNames = new System.Collections.Generic.List(); + List taskSetNames = new List(); for (int i =0; i < Installations.Length; i++) { - taskSetNames.Add(string.Format("Žæ“¾: {0}", Installations[i].ToString())); + taskSetNames.Add(string.Format("取得: {0}", Installations[i].ToString())); + taskSetNames.Add(string.Format("ウイルススキャン: {0}", Installations[i].ToString())); } - taskSetNames.Add("ƒCƒ“ƒXƒg[ƒ‰‚ÌŒŸØ"); + taskSetNames.Add("インストーラーの検証"); for (int i =0; i < Installations.Length; i++) { - taskSetNames.Add(string.Format("ƒCƒ“ƒXƒg[ƒ‹: {0}", Installations[i].ToString())); + taskSetNames.Add(string.Format("インストール: {0}", Installations[i].ToString())); } - taskSetNames.Add(string.Format("ƒŠƒXƒgXV: {0}", NaGet.Env.ArchiveInstalledPackageListFile)); - taskSetNames.Add(string.Format("ƒŠƒXƒgXV: {0}", NaGet.Env.SystemInstalledPackageListFile)); + taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.ArchiveInstalledPackageListFile)); + taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.SystemInstalledPackageListFile)); TaskSetNames = taskSetNames.ToArray(); } @@ -67,39 +81,51 @@ namespace NaGet.SubCommands public override void Run() { currentTaskSetIndex = 0; - RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED, "ƒCƒ“ƒXƒg[ƒ‹ˆ—ŠJŽn"); + RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED, "インストール処理開始"); { - // ƒnƒbƒVƒ…”ñ“K‡‚ȃCƒ“ƒXƒg[ƒ‰‚Ì•\ - System.Collections.Generic.List invalidInstallers = null; + // ハッシュ非適合なインストーラの表 + List invalidInstallers = null; while (invalidInstallers == null || invalidInstallers.Count > 0) { currentTaskSetIndex = 0; packageInstallerDownloaded = false; - runDownloadInstallers(); - if (done) return; // ‚à‚µrunDownloadInstallers()“à‚ŃGƒ‰[I—¹‚µ‚Ä‚¢‚½‚È‚çI—¹ + runDownloadAndVirusCheckInstallers(); + if (done) return; // もしrunDownloadInstallers()内でエラー終了していたなら終了 packageInstallerDownloaded = true; - // ƒnƒbƒVƒ…‚̉ó‚ê‚Ä‚¢‚éƒCƒ“ƒXƒg[ƒ‰‚ðŽæ“¾ + + RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]); + + // ハッシュの壊れているインストーラーを取得 invalidInstallers = runCheckHashForInstaller(); - // ƒnƒbƒVƒ…‚ª‰ó‚ê‚Ä‚¢‚é‚Æ‚«‚̑΍ô + // ハッシュが壊れているときの対策 if (invalidInstallers.Count > 0) { - string msg = string.Format("{0}ŒÂ‚̃pƒbƒP[ƒW‚Ńtƒ@ƒCƒ‹‚ª‰ó‚ê‚Ä‚¢‚é‰Â”\«‚ª‚ ‚è‚Ü‚·\n‹­§“I‚ɃCƒ“ƒXƒg[ƒ‹‚𑱍s‚µ‚Ü‚·‚©?", - invalidInstallers.Count); - NaGetTaskQueryResult result = RaiseTaskSetQueryEvent(msg, NaGetTaskQueryResult.CONTINUE - | NaGetTaskQueryResult.RETRY - | NaGetTaskQueryResult.CANCEL); + System.Text.StringBuilder invalidInstallerNames = new System.Text.StringBuilder(); + foreach (Installation invalidInst in invalidInstallers) { + invalidInstallerNames.AppendFormat(" - {0}\n", invalidInst.ToString()); + } + + string msg = string.Format("以下の{0}個のパッケージでファイルが壊れている可能性があります。\n{1}\n強制的にインストールを続行しますか?", + invalidInstallers.Count, invalidInstallerNames.ToString()); + NaGetTaskQueryResult result = NaGetTaskQueryResult.CANCEL; + + if (!cancelCalled) { + result = RaiseTaskSetQueryEvent(msg, NaGetTaskQueryResult.CONTINUE + | NaGetTaskQueryResult.RETRY + | NaGetTaskQueryResult.CANCEL); + } switch (result) { case NaGetTaskQueryResult.CONTINUE: - RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "ƒnƒbƒVƒ…‚Ì”ñ®‡‚𖳎‹‚µ‚ăCƒ“ƒXƒg[ƒ‹‚ðŒp‘±"); - invalidInstallers.Clear(); // ƒnƒbƒVƒ…”ñ“K‡ƒpƒbƒP[ƒW‚ð‹­§“I‚É–•Á + RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "ハッシュの非整合を無視してインストールを継続"); + invalidInstallers.Clear(); // ハッシュ非適合パッケージを強制的に抹消 break; case NaGetTaskQueryResult.RETRY: - RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ƒ_ƒEƒ“ƒ[ƒhˆ—‚ðÄŽŽs"); + RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ダウンロード処理を再試行"); foreach (Installation invalidInst in invalidInstallers) { invalidInst.RemoveDownloadedFile(); @@ -108,19 +134,20 @@ namespace NaGet.SubCommands break; //case NaGetTaskQueryResult.CANCEL: default: - RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "ƒpƒbƒP[ƒW‚̃Cƒ“ƒXƒg[ƒ‹ˆ—‚ªƒLƒƒƒ“ƒZƒ‹‚³‚ê‚Ü‚µ‚½"); + RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "パッケージのインストール処理がキャンセルされました"); done = true; return; } } currentTaskSetIndex ++; + RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]); } } foreach (Installation inst in Installations) { - string installTaskMsg = inst.ToString(); + string installTaskMsg = TaskSetNames[currentTaskSetIndex]; if (inst.Silent && (!inst.SupportsSilentOnly)) { - installTaskMsg += " (ƒTƒCƒŒƒ“ƒgƒCƒ“ƒXƒg[ƒ‹)"; + installTaskMsg += " (サイレントインストール)"; } RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, installTaskMsg); @@ -131,7 +158,7 @@ namespace NaGet.SubCommands inst.OutputDataReceived += this.ReceivedOutputData; int exitCode = inst.Install(); if (exitCode != 0) { - RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "ƒCƒ“ƒXƒg[ƒ‹‚ª³í‚ɏI‚¦‚Ä‚¢‚È‚¢‰Â”\«‚ª‚ ‚è‚Ü‚·BƒCƒ“ƒXƒg[ƒ‰‚̏I—¹ƒR[ƒh:"+exitCode); + RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "インストールが正常に終えていない可能性があります。プロセスの終了コード:"+exitCode); } pkgListMan.WriteInstallationLog(inst); @@ -145,89 +172,144 @@ namespace NaGet.SubCommands RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, installTaskMsg); if (cancelCalled) { - RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "ƒpƒbƒP[ƒW‚̃Cƒ“ƒXƒg[ƒ‹ˆ—‚ªƒLƒƒƒ“ƒZƒ‹‚³‚ê‚Ü‚µ‚½"); + RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "パッケージのインストール処理がキャンセルされました"); done = true; return; } } - pkgListMan.SaveSystemInstalledLogList(); // ƒƒO‚̃Rƒ~ƒbƒg + pkgListMan.SaveSystemInstalledLogList(); // ログのコミット runLocalUpdate(); done = true; - RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED, "I—¹", 100); + RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED, "終了", 100); } /// - /// ˆ—“à—e‚̃_ƒEƒ“ƒ[ƒh•”•ª‚̃Tƒuƒ‹[ƒ`ƒ“ + /// 処理内容のダウンロード・ウイルススキャン部分のサブルーチン /// - private void runDownloadInstallers() + private void runDownloadAndVirusCheckInstallers() { - foreach (Installation inst in Installations) { - if (! inst.IsInstallablePackage()) { - string msg = string.Format("{0}‚̓Cƒ“ƒXƒg[ƒ‹‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚¹‚ñ", inst.ToString()); - - RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, msg); - done = true; - return; - } - - RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, inst.ToString()); - - if (! inst.Downloaded) { - try { - inst.Download(Downloader); - } catch (NaGetTaskCanceledException) { - RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "ƒCƒ“ƒXƒg[ƒ‰‚̃_ƒEƒ“ƒ[ƒhˆ—‚ªƒLƒƒƒ“ƒZƒ‹‚³‚ê‚Ü‚µ‚½"); + using (DownloadScanner scanner = new DownloadScanner()) { + scanner.Init(); + foreach (Installation inst in Installations) { + if (! inst.IsInstallablePackage()) { + string msg = string.Format("{0}はインストールすることができません", inst.ToString()); + + RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, msg); done = true; return; - } catch (System.Net.WebException e) { - RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, e.Message); - if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) { - RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "ƒlƒbƒgƒ[ƒN‚ɐڑ±‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB"); - } else { - RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "ƒlƒbƒgƒ[ƒN‚ɐڑ±‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½Bƒlƒbƒgƒ[ƒN‚ªØ’f‚³‚ê‚Ä‚¢‚é‚©Aƒtƒ@ƒCƒAƒEƒH[ƒ‹‚É‚æ‚Á‚ÄŽÕ’f‚³‚ꂽ‰Â”\«‚ª‚ ‚è‚Ü‚·B"); + } + + RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]); + + if (! inst.Downloaded) { + try { + inst.Download(Downloader); + } catch (NaGetTaskCanceledException) { + RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "インストーラーのダウンロード処理がキャンセルされました"); + done = true; + return; + } catch (System.Net.WebException e) { + RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, e.Message); + if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) { + RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "ネットワークに接続されていません。"); + } else { + RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "ネットワークに接続できませんでした。ネットワークが切断されているか、ファイアウォールによって遮断された可能性があります。"); + } + done = true; + return; + } catch (Exception e) { + RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, e.Message); + done = true; + return; } + } + currentTaskSetIndex ++; + + if (inst.Downloaded) { // 正常終了 + RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]); + } else { // インストールが完了せずに終わった=失敗=エラー + RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, string.Format("{0}のインストーラーファイルを正常にダウンロードできませんでした", inst.ToString())); done = true; return; - } catch (Exception e) { - RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, e.Message); + } + + RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]); + if (! NaGet.Env.EnableScanInstallerFile) { + RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ウイルススキャンを行わない設定のため、ダウンロードしたファイルはウイルススキャンされませんでした"); + } else if (!scanner.HasScanner) { + RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)"); + } else { + try { + DownloadScannerResult result = inst.ScanInstallerFile(scanner); + + switch (result) { + case DownloadScannerResult.ScannerNotFound: + RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)"); + break; + case DownloadScannerResult.InfectedAndCleaned: + RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, + "インストーラーファイルからウイルス感染が検出されたため、削除されました。"); + done = true; + return; + case DownloadScannerResult.InfectedButNotCleaned: + RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, + "インストーラーファイルからウイルス感染が検出されました。"); + done = true; + break; + case DownloadScannerResult.ErrorNotFound: + throw new System.IO.FileNotFoundException(string.Empty); + //break; + } + + } catch (System.Runtime.InteropServices.COMException ex) { + RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, + string.Format("{0} (E{1})", ex.Message, ex.ErrorCode)); + } catch (System.IO.FileNotFoundException ex) { + if (ex.InnerException is System.Runtime.InteropServices.COMException) { + RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, + string.Format("{0} (E{1})", ex.InnerException.Message, ((System.Runtime.InteropServices.COMException) ex.InnerException).ErrorCode)); + } + RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "インストーラーファイルがウイルススキャナーによって削除されました。"); + done = true; + return; + } + } + currentTaskSetIndex ++; + RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]); + + if (cancelCalled) { + RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "パッケージのインストール処理がキャンセルされました"); done = true; return; } } - currentTaskSetIndex ++; - - if (inst.Downloaded) { // ³íI—¹ - RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, inst.ToString()); - } else { // ƒCƒ“ƒXƒg[ƒ‹‚ªŠ®—¹‚¹‚¸‚ɏI‚í‚Á‚½=Ž¸”s=ƒGƒ‰[ - RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, string.Format("{0}‚̃Cƒ“ƒXƒg[ƒ‰‚𐳏í‚Ƀ_ƒEƒ“ƒ[ƒh‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½", inst.ToString())); - } } } /// - /// ƒ_ƒEƒ“ƒ[ƒh‚µ‚½ƒpƒbƒP[ƒW‚ª®‡‚µ‚½‚©”Û‚©ƒnƒbƒVƒ…‚Ń`ƒFƒbƒN + /// ダウンロードしたパッケージが整合したか否かハッシュでチェック /// - /// ®‡‚µ‚È‚©‚Á‚½ƒCƒ“ƒXƒg[ƒ‰‚̃ŠƒXƒg - private System.Collections.Generic.List runCheckHashForInstaller() + /// 整合しなかったインストーラーのリスト + private List runCheckHashForInstaller() { - System.Collections.Generic.List invalidInstallers = new System.Collections.Generic.List(); + List invalidInstallers = new List(); int i = 0; foreach (Installation inst in Installations) { float percent = (CurrentTaskSetIndex+((float)i / Installations.Length))*100f/TaskSetNames.Length; if (inst.GetRegisteredHashCount() > 0) { - RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ŒŸØ: "+inst.ToString(), percent); + RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "検証: "+inst.ToString(), percent); if (inst.IsInstallablePackage() && inst.VerifyHashValues() == false) { invalidInstallers.Add(inst); - RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "ŒŸØ: "+inst.ToString() + " ”ñ®‡", percent); + RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "検証: "+inst.ToString() + " 非整合", percent); } else { - RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ŒŸØ: "+inst.ToString() + " OK", percent); + RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "検証: "+inst.ToString() + " OK", percent); } } i++; @@ -238,14 +320,14 @@ namespace NaGet.SubCommands private void runLocalUpdate() { - // ƒCƒ“ƒXƒg[ƒ‹ƒgƒŠƒXƒg‚̍XV + // インストールトリストの更新 RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]); pkgListMan.DetectInstalledPkgs(); pkgListMan.SaveInstalledPackageList(); currentTaskSetIndex++; RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]); - // ƒVƒXƒeƒ€‚ɃCƒ“ƒXƒg[ƒ‹‚³‚ê‚Ä‚¢‚郊ƒXƒg‚̍XV + // システムにインストールされているリストの更新 RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]); pkgListMan.DetectSystemInstalledPkgs(); pkgListMan.SaveSystemInstalledPackageList();