305 lines
12 KiB
C#
305 lines
12 KiB
C#
|
using System;
|
|||
|
using System.Diagnostics;
|
|||
|
using System.IO;
|
|||
|
using System.Net.Security;
|
|||
|
using System.Security.Cryptography.X509Certificates;
|
|||
|
using ICSharpCode.SharpZipLib.Core;
|
|||
|
using ICSharpCode.SharpZipLib.Zip;
|
|||
|
|
|||
|
namespace tytdsetup
|
|||
|
{
|
|||
|
class MainClass
|
|||
|
{
|
|||
|
public static void Main(string[] args)
|
|||
|
{
|
|||
|
bool isLinux
|
|||
|
|
|||
|
= Environment.OSVersion.Platform == PlatformID.Unix;
|
|||
|
|
|||
|
begin:
|
|||
|
Console.Clear();
|
|||
|
Console.WriteLine("TYTD Setup");
|
|||
|
Console.WriteLine();
|
|||
|
string locationToStoreItIn = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),"TYTDServer");
|
|||
|
if (isLinux)
|
|||
|
{
|
|||
|
Console.WriteLine("Pick a path without spaces");
|
|||
|
}
|
|||
|
Console.WriteLine("If you leave it empty it will be stored in \"" + locationToStoreItIn + "\"");
|
|||
|
Console.Write("Location: ");
|
|||
|
{
|
|||
|
string location = Console.ReadLine();
|
|||
|
if (!string.IsNullOrWhiteSpace(location))
|
|||
|
{
|
|||
|
locationToStoreItIn = location;
|
|||
|
}
|
|||
|
}
|
|||
|
Console.WriteLine();
|
|||
|
string workingDirForApp = "working";
|
|||
|
Console.WriteLine("This directory is for downloading into: ");
|
|||
|
Console.WriteLine("If you leave it empty the name will be \"" + workingDirForApp + "\"");
|
|||
|
Console.Write("Working Directory Name: ");
|
|||
|
{
|
|||
|
string location = Console.ReadLine();
|
|||
|
if (!string.IsNullOrWhiteSpace(location) && location != "tytd-web-master")
|
|||
|
{
|
|||
|
workingDirForApp = location;
|
|||
|
}
|
|||
|
}
|
|||
|
Console.WriteLine();
|
|||
|
string binaryName= "server";
|
|||
|
Console.WriteLine("If you leave it empty the name will be \"" + binaryName + "\"");
|
|||
|
Console.Write("Server Binaries Directory Name: ");
|
|||
|
{
|
|||
|
string location = Console.ReadLine();
|
|||
|
if (!string.IsNullOrWhiteSpace(location) && location != "tytd-server-master")
|
|||
|
{
|
|||
|
binaryName= location;
|
|||
|
}
|
|||
|
}
|
|||
|
Console.WriteLine();
|
|||
|
|
|||
|
Console.WriteLine("If you leave it empty the port number will be 3250");
|
|||
|
Console.Write("Port Number: ");
|
|||
|
|
|||
|
string portStr= Console.ReadLine();
|
|||
|
System.Net.ServicePointManager.ServerCertificateValidationCallback += certificateValidationCallback;
|
|||
|
int portNumber;
|
|||
|
|
|||
|
if(!int.TryParse(portStr,out portNumber))
|
|||
|
{
|
|||
|
portNumber = 3250;
|
|||
|
}
|
|||
|
Console.WriteLine();
|
|||
|
|
|||
|
Console.Write("Do you want to keep zip files (Y/n)> ");
|
|||
|
|
|||
|
string read = Console.ReadLine();
|
|||
|
|
|||
|
bool keepZipFiles = read != "N" && read != "n" && read != "No" && read != "no" && read != "nO" && read != "NO";
|
|||
|
|
|||
|
Console.WriteLine();
|
|||
|
Console.WriteLine("Your configuration is: ");
|
|||
|
Console.WriteLine("Directory For Everything: " + locationToStoreItIn);
|
|||
|
Console.WriteLine("Server Binaries Directory Name: " + binaryName);
|
|||
|
Console.WriteLine("Working Directory Name: " + workingDirForApp);
|
|||
|
|
|||
|
Console.WriteLine("Port Number: " + portNumber.ToString());
|
|||
|
Console.WriteLine("Keep Zip Files: " + (keepZipFiles ? "Yes" : "No"));
|
|||
|
Console.WriteLine("Is This configuration what you want:");
|
|||
|
Console.WriteLine("(y)es");
|
|||
|
Console.WriteLine("(n)o");
|
|||
|
Console.WriteLine("(c)ancel install");
|
|||
|
retype: Console.Write("> ");
|
|||
|
|
|||
|
string resp = Console.ReadLine();
|
|||
|
if (string.IsNullOrWhiteSpace(resp))
|
|||
|
{
|
|||
|
goto retype;
|
|||
|
}
|
|||
|
resp = resp.ToLower().Replace(" ", "");
|
|||
|
switch (resp)
|
|||
|
{
|
|||
|
case "y":
|
|||
|
case "yes":
|
|||
|
break;
|
|||
|
case "n":
|
|||
|
case "no":
|
|||
|
goto begin;
|
|||
|
case "c":
|
|||
|
case "cancelinstall":
|
|||
|
return;
|
|||
|
default:
|
|||
|
Console.WriteLine("You must select one");
|
|||
|
|
|||
|
goto retype;
|
|||
|
}
|
|||
|
|
|||
|
using (var wc = new System.Net.WebClient())
|
|||
|
{
|
|||
|
string name = "tytd-server-master.zip";
|
|||
|
wc.DownloadProgressChanged += (sender, e) =>
|
|||
|
{
|
|||
|
string progressStr = "\r"+(name + " " + e.ProgressPercentage + "% ").PadRight(27);
|
|||
|
Console.Write(progressStr);
|
|||
|
};
|
|||
|
if (!File.Exists("tytd-server-master.zip"))
|
|||
|
{
|
|||
|
wc.DownloadFile("https://gitlab.tesses.cf/tesses50/tytd-server/-/archive/master/tytd-server-master.zip", "tytd-server-master.zip");
|
|||
|
}
|
|||
|
name = "tytd-web-master.zip";
|
|||
|
if (!File.Exists("tytd-web-master.zip")) {
|
|||
|
wc.DownloadFile("https://gitlab.tesses.cf/tesses50/tytd-web/-/archive/master/tytd-web-master.zip", "tytd-web-master.zip");
|
|||
|
}
|
|||
|
name = "tytd-config.zip";
|
|||
|
if (!File.Exists("tytd-config.zip")) {
|
|||
|
wc.DownloadFile("https://downloads.tesses.cf/apps/tytd/tytd-config.zip", "tytd-config.zip");
|
|||
|
}
|
|||
|
Console.WriteLine();
|
|||
|
}
|
|||
|
Directory.CreateDirectory(Path.Combine(locationToStoreItIn, workingDirForApp));
|
|||
|
|
|||
|
ExtractTo("tytd-web-master.zip", locationToStoreItIn);
|
|||
|
ExtractTo("tytd-server-master.zip", locationToStoreItIn);
|
|||
|
|
|||
|
ExtractTo("tytd-config.zip", Path.Combine(locationToStoreItIn, workingDirForApp));
|
|||
|
/*
|
|||
|
ls TYTDServer/
|
|||
|
working
|
|||
|
server
|
|||
|
*/
|
|||
|
|
|||
|
Directory.Move(Path.Combine(locationToStoreItIn,"tytd-server-master", "bin", "Release"),Path.Combine(locationToStoreItIn,binaryName));
|
|||
|
Directory.Move(Path.Combine(locationToStoreItIn,"tytd-web-master"), Path.Combine(locationToStoreItIn,workingDirForApp,"WebSite"));
|
|||
|
Directory.Delete(Path.Combine(locationToStoreItIn,"tytd-server-master"),true);
|
|||
|
if(!keepZipFiles)
|
|||
|
{
|
|||
|
File.Delete( "tytd-server-master.zip");
|
|||
|
File.Delete("tytd-server-master.zip");
|
|||
|
}
|
|||
|
|
|||
|
if (isLinux)
|
|||
|
{
|
|||
|
string runPath = Path.Combine(locationToStoreItIn, ".run");
|
|||
|
Directory.CreateDirectory(runPath);
|
|||
|
Console.WriteLine("if you want this permanently in PATH put this in your ~/.bashrc");
|
|||
|
Console.WriteLine("export PATH=\""+runPath+":$PATH\"");
|
|||
|
|
|||
|
string tytd_server = Path.Combine(runPath, "tytd-server");
|
|||
|
File.WriteAllText(tytd_server, "cd \"" + Path.Combine(locationToStoreItIn,workingDirForApp) + "\"\nmono \"" + Path.Combine(locationToStoreItIn,binaryName,"youtube-downloader.exe") + "\" http://+:" + portNumber.ToString() + "/\n",System.Text.Encoding.UTF8);
|
|||
|
Process.Start("chmod","755 \"" + tytd_server +"\"");
|
|||
|
|
|||
|
} else
|
|||
|
{
|
|||
|
string tytd_batch_desktop = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory),"TYTD Server.bat");
|
|||
|
string tytd_batch_start = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu), "TYTD Server", "TYTD Server.bat");
|
|||
|
|
|||
|
string cmd = "@echo off\r\ncd \"" + Path.Combine(locationToStoreItIn, workingDirForApp) + "\"" + Path.Combine(locationToStoreItIn, binaryName, "youtube-downloader.exe") + "\" http://+:" + portNumber.ToString() + "/\r\n";
|
|||
|
|
|||
|
Directory.CreateDirectory(Path.GetDirectoryName(tytd_batch_start));
|
|||
|
File.WriteAllText(tytd_batch_desktop, cmd, System.Text.Encoding.ASCII);
|
|||
|
File.WriteAllText(tytd_batch_start, cmd, System.Text.Encoding.ASCII);
|
|||
|
}
|
|||
|
|
|||
|
Console.WriteLine("Done");
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// Extracts the content from a .zip file inside an specific folder.
|
|||
|
/// </summary>
|
|||
|
/// <param name="FileZipPath"></param>
|
|||
|
/// <param name="password"></param>
|
|||
|
/// <param name="OutputFolder"></param>
|
|||
|
public static void ExtractZipContent(string FileZipPath, string password, string OutputFolder)
|
|||
|
{
|
|||
|
ZipFile file = null;
|
|||
|
try
|
|||
|
{
|
|||
|
FileStream fs = File.OpenRead(FileZipPath);
|
|||
|
file = new ZipFile(fs);
|
|||
|
|
|||
|
if (!String.IsNullOrEmpty(password))
|
|||
|
{
|
|||
|
// AES encrypted entries are handled automatically
|
|||
|
file.Password = password;
|
|||
|
}
|
|||
|
|
|||
|
foreach (ZipEntry zipEntry in file)
|
|||
|
{
|
|||
|
if (!zipEntry.IsFile)
|
|||
|
{
|
|||
|
// Ignore directories
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
String entryFileName = zipEntry.Name;
|
|||
|
// to remove the folder from the entry:- entryFileName = Path.GetFileName(entryFileName);
|
|||
|
// Optionally match entrynames against a selection list here to skip as desired.
|
|||
|
// The unpacked length is available in the zipEntry.Size property.
|
|||
|
|
|||
|
// 4K is optimum
|
|||
|
byte[] buffer = new byte[4096];
|
|||
|
Stream zipStream = file.GetInputStream(zipEntry);
|
|||
|
|
|||
|
// Manipulate the output filename here as desired.
|
|||
|
String fullZipToPath = Path.Combine(OutputFolder, entryFileName);
|
|||
|
string directoryName = Path.GetDirectoryName(fullZipToPath);
|
|||
|
|
|||
|
if (directoryName.Length > 0)
|
|||
|
{
|
|||
|
Directory.CreateDirectory(directoryName);
|
|||
|
}
|
|||
|
|
|||
|
// Unzip file in buffered chunks. This is just as fast as unpacking to a buffer the full size
|
|||
|
// of the file, but does not waste memory.
|
|||
|
// The "using" will close the stream even if an exception occurs.
|
|||
|
using (FileStream streamWriter = File.Create(fullZipToPath))
|
|||
|
{
|
|||
|
StreamUtils.Copy(zipStream, streamWriter, buffer);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
if (file != null)
|
|||
|
{
|
|||
|
file.IsStreamOwner = true; // Makes close also shut the underlying stream
|
|||
|
file.Close(); // Ensure we release resources
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
static void ExtractTo(string src,string rootDir)
|
|||
|
{
|
|||
|
ExtractZipContent(src, null, rootDir);
|
|||
|
|
|||
|
}
|
|||
|
static bool accept_cert=false;
|
|||
|
private static bool certificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
|
|||
|
{
|
|||
|
if(sslPolicyErrors == SslPolicyErrors.None)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
if (accept_cert)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
Console.WriteLine("Certificate failure for gitlab.tesses.cf");
|
|||
|
Console.WriteLine("Cert Hash: " + certificate.GetCertHashString());
|
|||
|
|
|||
|
Console.WriteLine("Type any of the following to dismiss:");
|
|||
|
Console.WriteLine("Trust: (y)es");
|
|||
|
Console.WriteLine("Trust every request: (a)lways");
|
|||
|
Console.WriteLine("Dont Trust (will cause Exception aka program will crash): (n)o");
|
|||
|
retype: Console.Write("> ");
|
|||
|
|
|||
|
string resp = Console.ReadLine();
|
|||
|
if(string.IsNullOrWhiteSpace(resp))
|
|||
|
{
|
|||
|
goto retype;
|
|||
|
}
|
|||
|
resp = resp.ToLower().Replace(" ", "");
|
|||
|
if (resp == "y" || resp == "yes")
|
|||
|
{
|
|||
|
return true;
|
|||
|
}else if(resp == "n" || resp == "no" )
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
else if(resp == "a" || resp == "always")
|
|||
|
{
|
|||
|
accept_cert = true;
|
|||
|
return true;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Console.WriteLine("You must select one");
|
|||
|
|
|||
|
goto retype;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|