Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

display the upgrade progress. #4574

Merged
merged 1 commit into from
Aug 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 16 additions & 10 deletions Oqtane.Server/wwwroot/app_offline.bak
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,30 @@
<meta name="viewport" content="width=device-width">
<title>Upgrade Framework</title>
<base href="/" />
<link rel="stylesheet" href="https://www.oqtane.net/css/app.css">
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="https://www.oqtane.net/css/app.css">
</head>
<body onload="forceWait()">
<body onload="refresh()">
<div>
<br /><br />
<h1 align="center">Please Wait... Upgrade In Progress...</h1>
<p align="center">(this process can take a few minutes... please be patient)</p>
</div>

<div class="app-progress-indicator"></div>
<div class="w-50 mx-auto mt-5">
<div class="progress" role="progressbar" aria-label="Basic example" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar progress-bar-striped progress-bar-animated [PROGRESSCLASS]" style="width: [PROGRESS]%"></div>
</div>
<div class="fs-6 fst-italic mt-1">
[STATUS]
</div>
</div>

<script>
function forceWait() {
setInterval(function () {
window.location.href = "/";
}, 120 * 1000);
function refresh() {
setTimeout(function () {
window.location.href = "/?reload";
}, 1000);
}
</script>
</body>
</html>

</html>
98 changes: 66 additions & 32 deletions Oqtane.Updater/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,26 +31,34 @@ static void Main(string[] args)

if (Directory.Exists(deployfolder))
{
string log = "Upgrade Process Started: " + DateTime.UtcNow.ToString() + Environment.NewLine;
log += "ContentRootPath: " + contentrootfolder + Environment.NewLine;
log += "WebRootPath: " + webrootfolder + Environment.NewLine;

string packagename = "";
string[] packages = Directory.GetFiles(deployfolder, "Oqtane.Framework.*.Upgrade.zip");
if (packages.Length > 0)
{
packagename = packages[packages.Length - 1]; // use highest version
}

// create upgrade log file
var logFilePath = Path.Combine(deployfolder, $"{Path.GetFileNameWithoutExtension(packagename)}.log");
if (File.Exists(logFilePath))
{
File.Delete(logFilePath);
}

WriteLog(logFilePath, "Upgrade Process Started: " + DateTime.UtcNow.ToString() + Environment.NewLine);
WriteLog(logFilePath, "ContentRootPath: " + contentrootfolder + Environment.NewLine);
WriteLog(logFilePath, "WebRootPath: " + webrootfolder + Environment.NewLine);
if (packagename != "" && File.Exists(Path.Combine(webrootfolder, "app_offline.bak")))
{
log += "Located Upgrade Package: " + packagename + Environment.NewLine;
WriteLog(logFilePath, "Located Upgrade Package: " + packagename + Environment.NewLine);

log += "Stopping Application Using: " + Path.Combine(contentrootfolder, "app_offline.htm") + Environment.NewLine;
File.Copy(Path.Combine(webrootfolder, "app_offline.bak"), Path.Combine(contentrootfolder, "app_offline.htm"), true);
WriteLog(logFilePath, "Stopping Application Using: " + Path.Combine(contentrootfolder, "app_offline.htm") + Environment.NewLine);
var offlineTemplate = File.ReadAllText(Path.Combine(webrootfolder, "app_offline.bak"));
var offlineFilePath = Path.Combine(contentrootfolder, "app_offline.htm");

// get list of files in package with local paths
log += "Retrieving List Of Files From Upgrade Package..." + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 5, "Retrieving List Of Files From Upgrade Package");
WriteLog(logFilePath, "Retrieving List Of Files From Upgrade Package..." + Environment.NewLine);
List<string> files = new List<string>();
using (ZipArchive archive = ZipFile.OpenRead(packagename))
{
Expand All @@ -59,15 +67,18 @@ static void Main(string[] args)
if (!string.IsNullOrEmpty(entry.Name))
{
files.Add(Path.Combine(contentrootfolder, entry.FullName));
WriteLog(logFilePath, "Check File: " + entry.FullName + Environment.NewLine);
}
}
}

bool success = true;
// ensure files are not locked
if (CanAccessFiles(files))
{
log += "Preparing Backup Folder: " + backupfolder + Environment.NewLine;
bool success = true;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 10, "Preparing Backup Folder");
WriteLog(logFilePath, "Preparing Backup Folder: " + backupfolder + Environment.NewLine);

try
{
// clear out backup folder
Expand All @@ -79,14 +90,16 @@ static void Main(string[] args)
}
catch (Exception ex)
{
log += "Error Creating Backup Folder: " + ex.Message + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 95, "Error Creating Backup Folder", "bg-danger");
WriteLog(logFilePath, "Error Creating Backup Folder: " + ex.Message + Environment.NewLine);
success = false;
}

// backup files
if (success)
{
log += "Backing Up Files..." + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 15, "Backing Up Files");
WriteLog(logFilePath, "Backing Up Files..." + Environment.NewLine);
foreach (string file in files)
{
string filename = Path.Combine(backupfolder, file.Replace(contentrootfolder + Path.DirectorySeparatorChar, ""));
Expand All @@ -99,20 +112,24 @@ static void Main(string[] args)
Directory.CreateDirectory(Path.GetDirectoryName(filename));
}
File.Copy(file, filename);
WriteLog(logFilePath, "Copy File: " + filename + Environment.NewLine);
}
}
catch (Exception ex)
{
log += "Error Backing Up Files: " + ex.Message + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 95, "Error Backing Up Files", "bg-danger");
WriteLog(logFilePath, "Error Backing Up Files: " + ex.Message + Environment.NewLine);
success = false;
break;
}
}
}

// extract files
if (success)
{
log += "Extracting Files From Upgrade Package..." + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 50, "Extracting Files From Upgrade Package");
WriteLog(logFilePath, "Extracting Files From Upgrade Package..." + Environment.NewLine);
try
{
using (ZipArchive archive = ZipFile.OpenRead(packagename))
Expand All @@ -127,19 +144,22 @@ static void Main(string[] args)
Directory.CreateDirectory(Path.GetDirectoryName(filename));
}
entry.ExtractToFile(filename, true);
WriteLog(logFilePath, "Exact File: " + filename + Environment.NewLine);
}
}
}
}
catch (Exception ex)
{
success = false;
log += "Error Extracting Files From Upgrade Package: " + ex.Message + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 95, "Error Extracting Files From Upgrade Package", "bg-danger");
WriteLog(logFilePath, "Error Extracting Files From Upgrade Package: " + ex.Message + Environment.NewLine);
}

if (success)
{
log += "Removing Backup Folder..." + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 90, "Removing Backup Folder");
WriteLog(logFilePath, "Removing Backup Folder..." + Environment.NewLine);
try
{
// clean up backup
Expand All @@ -149,12 +169,14 @@ static void Main(string[] args)
}
catch (Exception ex)
{
log += "Error Removing Backup Folder: " + ex.Message + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 95, "Error Extracting Files From Upgrade Package", "bg-warning");
WriteLog(logFilePath, "Error Removing Backup Folder: " + ex.Message + Environment.NewLine);
}
}
else
{
log += "Restoring Files From Backup Folder..." + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 50, "Upgrade Failed, Restoring Files From Backup Folder", "bg-warning");
WriteLog(logFilePath, "Restoring Files From Backup Folder..." + Environment.NewLine);
try
{
// restore on failure
Expand All @@ -165,48 +187,46 @@ static void Main(string[] args)
if (File.Exists(filename))
{
File.Copy(filename, file);
WriteLog(logFilePath, "Restore File: " + filename + Environment.NewLine);
}
}
// clean up backup
Directory.Delete(backupfolder, true);
}
catch (Exception ex)
{
log += "Error Restoring Files From Backup Folder: " + ex.Message + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 95, "Error Restoring Files From Backup Folder", "bg-danger");
WriteLog(logFilePath, "Error Restoring Files From Backup Folder: " + ex.Message + Environment.NewLine);
}
}
}
else
{
log += "Upgrade Failed: Could Not Backup Files" + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 95, "Upgrade Failed: Could Not Backup Files", "bg-danger");
WriteLog(logFilePath, "Upgrade Failed: Could Not Backup Files" + Environment.NewLine);
}
}
else
{
log += "Upgrade Failed: Some Files Are Locked By The Hosting Environment" + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 95, "Upgrade Failed: Some Files Are Locked By The Hosting Environment", "bg-danger");
WriteLog(logFilePath, "Upgrade Failed: Some Files Are Locked By The Hosting Environment" + Environment.NewLine);
}

UpdateOfflineContent(offlineFilePath, offlineTemplate, 100, "Upgrade Process Finished, Reloading", success ? "" : "bg-danger");
Thread.Sleep(3000); //wait for 3 seconds to complete the upgrade process.
// bring the app back online
if (File.Exists(Path.Combine(contentrootfolder, "app_offline.htm")))
{
log += "Restarting Application By Removing: " + Path.Combine(contentrootfolder, "app_offline.htm") + Environment.NewLine;
WriteLog(logFilePath, "Restarting Application By Removing: " + Path.Combine(contentrootfolder, "app_offline.htm") + Environment.NewLine);
File.Delete(Path.Combine(contentrootfolder, "app_offline.htm"));
}
}
else
{
log += "Framework Upgrade Package Not Found Or " + Path.Combine(webrootfolder, "app_offline.bak") + " Does Not Exist" + Environment.NewLine;
WriteLog(logFilePath, "Framework Upgrade Package Not Found Or " + Path.Combine(webrootfolder, "app_offline.bak") + " Does Not Exist" + Environment.NewLine);
}

log += "Upgrade Process Ended: " + DateTime.UtcNow.ToString() + Environment.NewLine;

// create upgrade log file
string logfile = Path.Combine(deployfolder, Path.GetFileNameWithoutExtension(packagename) + ".log");
if (File.Exists(logfile))
{
File.Delete(logfile);
}
File.WriteAllText(logfile, log);
WriteLog(logFilePath, "Upgrade Process Ended: " + DateTime.UtcNow.ToString() + Environment.NewLine);
}
else
{
Expand Down Expand Up @@ -269,5 +289,19 @@ private static bool CanAccessFiles(List<string> files)
}
return canAccess;
}

private static void UpdateOfflineContent(string filePath, string contentTemplate, int progress, string status, string progressClass = "")
{
var content = contentTemplate
.Replace("[PROGRESS]", progress.ToString())
.Replace("[PROGRESSCLASS]", progressClass)
.Replace("[STATUS]", status);
File.WriteAllText(filePath, content);
}

private static void WriteLog(string logFilePath, string logContent)
{
File.AppendAllText(logFilePath, $"[{DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff")}] {logContent}");
}
}
}