Skip to content

Commit

Permalink
Refactor server installer prompts.
Browse files Browse the repository at this point in the history
  • Loading branch information
bitbound committed Apr 25, 2021
1 parent 20c45b8 commit d8e8664
Show file tree
Hide file tree
Showing 6 changed files with 249 additions and 42 deletions.
1 change: 0 additions & 1 deletion Desktop.Core/Services/WebRtcSession.cs
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@ public async Task Init(IceServerModel[] iceServers)
public Task SendDto<T>(T dto) where T : BaseDto
{
CaptureChannel.SendMessage(MessagePackSerializer.Serialize(dto));
TaskHelper.DelayUntil(() => CurrentBuffer < 64_000, TimeSpan.FromSeconds(5));
return Task.CompletedTask;
}

Expand Down
93 changes: 93 additions & 0 deletions Server.Installer/Models/GitHubReleasesResponse.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Remotely.Server.Installer.Models
{

public class GitHubReleasesResponsePayload
{
public string url { get; set; }
public string assets_url { get; set; }
public string upload_url { get; set; }
public string html_url { get; set; }
public int id { get; set; }
public Author author { get; set; }
public string node_id { get; set; }
public string tag_name { get; set; }
public string target_commitish { get; set; }
public string name { get; set; }
public bool draft { get; set; }
public bool prerelease { get; set; }
public DateTime created_at { get; set; }
public DateTime published_at { get; set; }
public Asset[] assets { get; set; }
public string tarball_url { get; set; }
public string zipball_url { get; set; }
public string body { get; set; }
}

public class Author
{
public string login { get; set; }
public int id { get; set; }
public string node_id { get; set; }
public string avatar_url { get; set; }
public string gravatar_id { get; set; }
public string url { get; set; }
public string html_url { get; set; }
public string followers_url { get; set; }
public string following_url { get; set; }
public string gists_url { get; set; }
public string starred_url { get; set; }
public string subscriptions_url { get; set; }
public string organizations_url { get; set; }
public string repos_url { get; set; }
public string events_url { get; set; }
public string received_events_url { get; set; }
public string type { get; set; }
public bool site_admin { get; set; }
}

public class Asset
{
public string url { get; set; }
public int id { get; set; }
public string node_id { get; set; }
public string name { get; set; }
public string label { get; set; }
public Uploader uploader { get; set; }
public string content_type { get; set; }
public string state { get; set; }
public int size { get; set; }
public int download_count { get; set; }
public DateTime created_at { get; set; }
public DateTime updated_at { get; set; }
public string browser_download_url { get; set; }
}

public class Uploader
{
public string login { get; set; }
public int id { get; set; }
public string node_id { get; set; }
public string avatar_url { get; set; }
public string gravatar_id { get; set; }
public string url { get; set; }
public string html_url { get; set; }
public string followers_url { get; set; }
public string following_url { get; set; }
public string gists_url { get; set; }
public string starred_url { get; set; }
public string subscriptions_url { get; set; }
public string organizations_url { get; set; }
public string repos_url { get; set; }
public string events_url { get; set; }
public string received_events_url { get; set; }
public string type { get; set; }
public bool site_admin { get; set; }
}

}
99 changes: 68 additions & 31 deletions Server.Installer/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public static async Task Main(string[] args)

var elevationDetector = Services.GetRequiredService<IElevationDetector>();
var serverInstaller = Services.GetRequiredService<IServerInstaller>();
var githubApi = Services.GetRequiredService<IGitHubApi>();

if (!elevationDetector.IsElevated())
{
Expand Down Expand Up @@ -72,24 +73,23 @@ public static async Task Main(string[] args)

while (cliParams.UsePrebuiltPackage is null)
{
ConsoleHelper.WriteLine("Download pre-built package? If false, a customized server package will be created " +
"through GitHub Actions.");
var usePrebuiltPackage = ConsoleHelper.ReadLine("Download pre-built package (yes/no)?",
subprompt: "If no, a customized server package will be created through GitHub Actions.");

var usePrebuiltPackage = ConsoleHelper.ReadLine("Selection (true/false)").Trim();
if (bool.TryParse(usePrebuiltPackage, out var result))
if (ConsoleHelper.TryParseBoolLike(usePrebuiltPackage, out var result))
{
cliParams.UsePrebuiltPackage = result;
}
}

while (string.IsNullOrWhiteSpace(cliParams.InstallDirectory))
{
cliParams.InstallDirectory = ConsoleHelper.ReadLine("Enter the directory path where the server files should be extracted to (e.g. /var/www/remotely/)").Trim();
cliParams.InstallDirectory = ConsoleHelper.ReadLine("Which directory should the server files be extracted to (e.g. /var/www/remotely/)?").Trim();
}

while (cliParams.ServerUrl is null)
{
var url = ConsoleHelper.ReadLine("Enter your server's public URL (e.g. https://app.remotely.one)").Trim();
var url = ConsoleHelper.ReadLine("What is your server's public URL (e.g. https://app.remotely.one)?").Trim();
if (Uri.TryCreate(url, UriKind.Absolute, out var serverUrl))
{
cliParams.ServerUrl = serverUrl;
Expand All @@ -98,14 +98,13 @@ public static async Task Main(string[] args)

while (cliParams.WebServer is null)
{
ConsoleHelper.WriteLine("Which web server will be used?");
ConsoleHelper.WriteLine(" [0] - Caddy on Ubuntu");
ConsoleHelper.WriteLine(" [1] - Nginx on Ubuntu");
ConsoleHelper.WriteLine(" [2] - Caddy on CentOS");
ConsoleHelper.WriteLine(" [3] - Nginx on CentOS");
ConsoleHelper.WriteLine(" [4] - IIS on Windows Server 2016+");

var webServerType = ConsoleHelper.ReadLine("Selection").Trim();
var webServerType = ConsoleHelper.GetSelection("Which web server will be used?",
"Caddy on Ubuntu",
"Nginx on Ubuntu",
"Caddy on CentOS",
"Nginx on CentOS",
"IIS on Windows Server 2016+");

if (Enum.TryParse<WebServerType>(webServerType, out var result))
{
cliParams.WebServer = result;
Expand All @@ -117,32 +116,60 @@ public static async Task Main(string[] args)
{
while (string.IsNullOrWhiteSpace(cliParams.GitHubUsername))
{
cliParams.GitHubUsername = ConsoleHelper.ReadLine("Enter your GitHub username").Trim();
cliParams.GitHubUsername = ConsoleHelper.ReadLine("What is your GitHub username?").Trim();
}

while (string.IsNullOrWhiteSpace(cliParams.GitHubPat))
{
cliParams.GitHubPat = ConsoleHelper.ReadLine("Enter your GitHub Personal Access Token").Trim();
cliParams.GitHubPat = ConsoleHelper.ReadLine("What GitHub Personal Access Token should be used?").Trim();
}

while (cliParams.CreateNew is null)
{
ConsoleHelper.WriteLine("Create new build? True/false. If false, the latest existing build artifact on GitHub will be used.");
var createNew = ConsoleHelper.ReadLine("Create new build (yes/no)?",
subprompt: "If no, the latest existing build artifact on GitHub will be used.");

var createNew = ConsoleHelper.ReadLine("Selection").Trim();
if (bool.TryParse(createNew, out var result))
if (ConsoleHelper.TryParseBoolLike(createNew, out var result))
{
cliParams.CreateNew = result;
}
}

if (cliParams.CreateNew == true)
{
if (cliParams.Reference?.Contains("latest", StringComparison.OrdinalIgnoreCase) == true)
{
cliParams.Reference = await githubApi.GetLatestReleaseTag();
}

while (string.IsNullOrWhiteSpace(cliParams.Reference))
{
ConsoleHelper.WriteLine("Enter the GitHub branch or tag name from which to build. For example, you can enter " +
" \"master\" to build the latest changes from the default branch. Or you can enter a release tag like \"v2021.04.13.1604\".");
cliParams.Reference = ConsoleHelper.ReadLine("Input Reference").Trim();
var selection = ConsoleHelper.GetSelection("Which version would you like to build?",
"Latest official release",
"Preview changes (i.e. master branch)",
"Specific release");

if (int.TryParse(selection, out var result))
{
switch (result)
{
case 0:
cliParams.Reference = await githubApi.GetLatestReleaseTag();
break;
case 1:
cliParams.Reference = "master";
break;
case 2:
ConsoleHelper.WriteLine("Enter the GitHub branch or tag name from which to build " +
"(e.g. \"master\" or \"v2021.04.25.0953\").");
cliParams.Reference = ConsoleHelper.ReadLine("Input Reference").Trim();
break;
default:
break;
}
}


}

}
Expand Down Expand Up @@ -206,6 +233,12 @@ private static bool ParseCliParams(string[] args, out CliParams cliParams)

switch (key)
{
case "--help":
case "-h":
case "/h":
ShowHelpText();
Environment.Exit(0);
break;
case "--use-prebuilt":
case "-b":
{
Expand All @@ -214,7 +247,7 @@ private static bool ParseCliParams(string[] args, out CliParams cliParams)
cliParams.UsePrebuiltPackage = result;
continue;
}
ConsoleHelper.WriteError("--use-prebuilt parameter is invalid. Must be true or false.");
ConsoleHelper.WriteError("--use-prebuilt parameter is invalid. Must be true/yes or false/no.");
return false;
}
case "--web-server":
Expand Down Expand Up @@ -264,7 +297,7 @@ private static bool ParseCliParams(string[] args, out CliParams cliParams)
cliParams.CreateNew = result;
continue;
}
ConsoleHelper.WriteError("--create-new parameter is invalid. Must be true or false.");
ConsoleHelper.WriteError("--create-new parameter is invalid. Must be true/yes or false/no.");
return false;
}
default:
Expand All @@ -291,7 +324,7 @@ private static void ShowHelpText()

ConsoleHelper.WriteLine("\tNo Parameters - Run the installer interactively.", 2);

ConsoleHelper.WriteLine("\t--use-prebuilt, -b True/false. Whether to use the pre-built server package from the " +
ConsoleHelper.WriteLine("\t--use-prebuilt, -b (true/false or yes/no) Whether to use the pre-built server package from the " +
"latest public release, or to create a customized package through GitHub Actions. The pre-built package " +
"will not contain your server's URL in the desktop clients, and end users will need to type it in manually.", 1);

Expand All @@ -307,17 +340,21 @@ private static void ShowHelpText()
ConsoleHelper.WriteLine("Enter the GitHub branch or tag name from which to build. For example, you can enter " +
" \"master\" to build the latest changes from the default branch. Or you can enter a release tag like \"v2021.04.13.1604\".", 1);

ConsoleHelper.WriteLine("\t--reference, -r The name of the branch or tag from which to build. For example, you can enter " +
" \"master\" to build the latest changes from the default branch. Or you can enter a release tag like \"v2021.04.13.1604\".", 1);
ConsoleHelper.WriteLine("\t--reference, -r Use \"latest\" to build from the latest full release. Otherwise, you can enter the " +
"name of a branch or tag from which to build. For example, you can enter \"master\" to build the most recent preview changes " +
"from the default branch. Or you can enter a specific release tag like \"v2021.04.13.1604\".", 1);

ConsoleHelper.WriteLine("\t--create-new, -c True/false. Whether to run a new build. If false, the latest existing build artifact will be used.", 1);
ConsoleHelper.WriteLine("\t--create-new, -c (true/false or yes/no) Whether to run a new build. If false, the latest existing build artifact will be used.", 1);

ConsoleHelper.WriteLine("\t--web-server, -w Number. The web server that will be used as a reverse proxy to forward " +
"requests to the Remotely server. Select the appropriate option for your operating system and web server. " +
"0 = Caddy on Ubuntu. 1 = Nginx on Ubuntu. 2 = Caddy on CentOS. 3 = Nginx on CentOS. 4 = IIS on Windows Server 2016+.", 1);

ConsoleHelper.WriteLine("Example: sudo ./Remotely_Server_Installer -b false -u lucent-sea -p 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 -s https://app.remotely.one -i /var/www/remotely/ -r master -c true -w 0");
ConsoleHelper.WriteLine("Example: sudo ./Remotely_Server_Installer -b true -s https://app.remotely.one -i /var/www/remotely/ -w 0");

ConsoleHelper.WriteLine("Example (build latest release):");
ConsoleHelper.WriteLine("sudo ./Remotely_Server_Installer -b false -u lucent-sea -p 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 -s https://app.remotely.one -i /var/www/remotely/ -r latest -c true -w 0", 1);

ConsoleHelper.WriteLine("Example (use pre-built package):");
ConsoleHelper.WriteLine("sudo ./Remotely_Server_Installer -b true -s https://app.remotely.one -i /var/www/remotely/ -w 0");
}
}
}
20 changes: 19 additions & 1 deletion Server.Installer/Services/GitHubApi.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Remotely.Shared.Utilities;
using Remotely.Server.Installer.Models;
using Remotely.Shared.Utilities;
using Server.Installer.Models;
using System;
using System.Collections.Generic;
Expand All @@ -20,6 +21,7 @@ public interface IGitHubApi : IDisposable
Task<Artifact> GetLatestBuildArtifact(CliParams cliParams);

Task<bool> TriggerDispatch(CliParams cliParams);
Task<string> GetLatestReleaseTag();
}
public class GitHubApi : IGitHubApi
{
Expand Down Expand Up @@ -104,6 +106,22 @@ public async Task<Artifact> GetLatestBuildArtifact(CliParams cliParams)
return null;
}

public async Task<string> GetLatestReleaseTag()
{
try
{
var response = await _httpClient.GetFromJsonAsync<GitHubReleasesResponsePayload>("https://api.github.com/repos/lucent-sea/Remotely/releases/latest");
return response.tag_name;
}
catch (Exception ex)
{
ConsoleHelper.WriteError("Error while trying to retrieve release info." +
$"Error: {ex.Message}");
Environment.Exit(1);
}
return string.Empty;
}

public async Task<bool> TriggerDispatch(CliParams cliParams)
{
try
Expand Down
4 changes: 2 additions & 2 deletions Server/API/ScriptResultsController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,8 @@ public async Task<ScriptResult> Post([FromBody] ScriptResult result)
await _emailSender.SendEmailAsync(savedScript.SendErrorEmailTo,
"Script Run Alert",
$"An alert was triggered while running script {savedScript.Name} on device {device.DeviceName}. <br /><br />" +
$"Error Output: <br /><br /> " +
$"{string.Join("<br /><br />", result.ErrorOutput)}");
$"Error Output: <br /> <br /> " +
$"{string.Join("<br /> <br />", result.ErrorOutput)}");
}
}

Expand Down

0 comments on commit d8e8664

Please sign in to comment.