private void RunSetup() { #region Variables DateTime timestamp = DateTime.Now; Settings settings = new Settings(); #endregion #region Welcome Console.WriteLine(""); Console.ForegroundColor = ConsoleColor.DarkGray; Console.WriteLine(@" _ _ "); Console.WriteLine(@" | |____ ___ __| |__ __ _ ___ ___ "); Console.WriteLine(@" | / /\ V / '_ \ '_ \/ _` (_-</ -_) "); Console.WriteLine(@" |_\_\ \_/| .__/_.__/\__,_/__/\___| "); Console.WriteLine(@" |_| "); Console.WriteLine(@" "); Console.ResetColor(); Console.WriteLine(""); Console.WriteLine("Kvpbase Storage Server"); Console.WriteLine(""); // 1 2 3 4 5 6 7 // 12345678901234567890123456789012345678901234567890123456789012345678901234567890 Console.WriteLine("Thank you for using Kvpbase! We'll put together a basic system configuration"); Console.WriteLine("so you can be up and running quickly. You'll want to modify the System.json"); Console.WriteLine("file after to ensure a more secure operating environment."); #endregion #region Initial-Settings settings.EnableConsole = true; settings.Server = new Settings.SettingsServer(); settings.Server.Port = 8000; settings.Server.DnsHostname = "localhost"; settings.Server.Ssl = false; settings.Server.HeaderApiKey = "x-api-key"; settings.Server.HeaderEmail = "x-email"; settings.Server.HeaderPassword = "******"; settings.Server.MaxObjectSize = 2199023255552; // 2TB object size settings.Server.MaxTransferSize = 536870912; // 512MB transfer size settings.Storage = new Settings.SettingsStorage(); settings.Storage.Directory = "./Storage/"; Directory.CreateDirectory(settings.Storage.Directory); settings.Syslog = new Settings.SettingsSyslog(); settings.Syslog.ConsoleLogging = true; settings.Syslog.Header = "kvpbase"; settings.Syslog.ServerIp = "127.0.0.1"; settings.Syslog.ServerPort = 514; settings.Syslog.LogHttpRequests = false; settings.Syslog.LogHttpResponses = false; settings.Syslog.MinimumLevel = 1; #endregion #region Databases // 1 2 3 4 5 6 7 // 12345678901234567890123456789012345678901234567890123456789012345678901234567890 Console.WriteLine(""); Console.WriteLine("Kvpbase requires access to an external database, either Microsoft SQL Server,"); Console.WriteLine("MySQL, or PostgreSQL, for holding configuration-related information. Please"); Console.WriteLine("provide access details for your database. The user account supplied must have"); Console.WriteLine("the ability to CREATE and DROP tables along with issue queries containing"); Console.WriteLine("SELECT, INSERT, UPDATE, and DELETE."); Console.WriteLine(""); Console.WriteLine("IMPORTANT: The database must be created before continuing. Kvpbase will"); Console.WriteLine("automatically create the tables for you."); Console.WriteLine(""); settings.ConfigDatabase = new Settings.SettingsDatabase(); bool dbSet = false; while (!dbSet) { string userInput = Common.InputString("Database type [mssql|mysql|pgsql]:", "mssql", false); switch (userInput) { case "mssql": settings.ConfigDatabase.Type = DatabaseWrapper.DbTypes.MsSql; settings.ConfigDatabase.Hostname = Common.InputString("Hostname:", "localhost", false); settings.ConfigDatabase.Port = Common.InputInteger("Port:", 1433, true, false); settings.ConfigDatabase.Username = Common.InputString("Username:"******"sa", false); settings.ConfigDatabase.Password = Common.InputString("Password:"******"Instance (for SQLEXPRESS):", null, true); settings.ConfigDatabase.DatabaseName = Common.InputString("Database name:", "kvpbaseconfig", false); dbSet = true; break; case "mysql": settings.ConfigDatabase.Type = DatabaseWrapper.DbTypes.MySql; settings.ConfigDatabase.Hostname = Common.InputString("Hostname:", "localhost", false); settings.ConfigDatabase.Port = Common.InputInteger("Port:", 3306, true, false); settings.ConfigDatabase.Username = Common.InputString("Username:"******"root", false); settings.ConfigDatabase.Password = Common.InputString("Password:"******"Schema name:", "kvpbaseconfig", false); dbSet = true; break; case "pgsql": settings.ConfigDatabase.Type = DatabaseWrapper.DbTypes.PgSql; settings.ConfigDatabase.Hostname = Common.InputString("Hostname:", "localhost", false); settings.ConfigDatabase.Port = Common.InputInteger("Port:", 5432, true, false); settings.ConfigDatabase.Username = Common.InputString("Username:"******"postgres", false); settings.ConfigDatabase.Password = Common.InputString("Password:"******"Schema name:", "kvpbaseconfig", false); dbSet = true; break; } } // 1 2 3 4 5 6 7 // 12345678901234567890123456789012345678901234567890123456789012345678901234567890 Console.WriteLine(""); Console.WriteLine("Kvpbase also requires database access for storage metadata. This database can"); Console.WriteLine("be the same as your configuration database or different."); Console.WriteLine(""); bool useConfigDatabase = Common.InputBoolean("Use configuration database settings for storage database?", true); if (useConfigDatabase) { settings.StorageDatabase = new Settings.SettingsDatabase(); settings.StorageDatabase.Type = settings.ConfigDatabase.Type; settings.StorageDatabase.Hostname = settings.ConfigDatabase.Hostname; settings.StorageDatabase.Port = settings.ConfigDatabase.Port; settings.StorageDatabase.Username = settings.ConfigDatabase.Username; settings.StorageDatabase.Password = settings.ConfigDatabase.Password; settings.StorageDatabase.InstanceName = settings.ConfigDatabase.InstanceName; settings.StorageDatabase.DatabaseName = Common.InputString("Database name: ", "kvpbasedata", false); } else { dbSet = false; while (!dbSet) { string userInput = Common.InputString("Database type [mssql|mysql|pgsql]:", "mssql", false); switch (userInput) { case "mssql": settings.StorageDatabase.Type = DatabaseWrapper.DbTypes.MsSql; settings.StorageDatabase.Hostname = Common.InputString("Hostname:", "localhost", false); settings.StorageDatabase.Port = Common.InputInteger("Port:", 1433, true, false); settings.StorageDatabase.Username = Common.InputString("Username:"******"sa", false); settings.StorageDatabase.Password = Common.InputString("Password:"******"Instance (for SQLEXPRESS):", null, true); settings.StorageDatabase.DatabaseName = Common.InputString("Database name:", "kvpbaseconfig", false); dbSet = true; break; case "mysql": settings.StorageDatabase.Type = DatabaseWrapper.DbTypes.MySql; settings.StorageDatabase.Hostname = Common.InputString("Hostname:", "localhost", false); settings.StorageDatabase.Port = Common.InputInteger("Port:", 3306, true, false); settings.StorageDatabase.Username = Common.InputString("Username:"******"root", false); settings.StorageDatabase.Password = Common.InputString("Password:"******"Schema name:", "kvpbaseconfig", false); dbSet = true; break; case "pgsql": settings.StorageDatabase.Type = DatabaseWrapper.DbTypes.PgSql; settings.StorageDatabase.Hostname = Common.InputString("Hostname:", "localhost", false); settings.StorageDatabase.Port = Common.InputInteger("Port:", 5432, true, false); settings.StorageDatabase.Username = Common.InputString("Username:"******"postgres", false); settings.StorageDatabase.Password = Common.InputString("Password:"******"Schema name:", "kvpbaseconfig", false); dbSet = true; break; } } } #endregion #region Write-Files-and-Records Console.WriteLine(""); Console.WriteLine("| Writing system.json"); Common.WriteFile("System.json", Encoding.UTF8.GetBytes(Common.SerializeJson(settings, true))); Console.WriteLine("| Initializing logging"); LoggingModule logging = new LoggingModule("127.0.0.1", 514); Console.WriteLine( "| Initializing config DB: " + settings.ConfigDatabase.Hostname + "/" + settings.ConfigDatabase.DatabaseName + " [" + settings.ConfigDatabase.Type.ToString() + "]"); DatabaseClient configDb = new DatabaseClient( settings.ConfigDatabase.Type, settings.ConfigDatabase.Hostname, settings.ConfigDatabase.Port, settings.ConfigDatabase.Username, settings.ConfigDatabase.Password, settings.ConfigDatabase.InstanceName, settings.ConfigDatabase.DatabaseName); Console.WriteLine( "| Initializing storage DB: " + settings.StorageDatabase.Hostname + "/" + settings.StorageDatabase.DatabaseName + " [" + settings.StorageDatabase.Type.ToString() + "]"); DatabaseClient storageDb = new DatabaseClient( settings.StorageDatabase.Type, settings.StorageDatabase.Hostname, settings.StorageDatabase.Port, settings.StorageDatabase.Username, settings.StorageDatabase.Password, settings.StorageDatabase.InstanceName, settings.StorageDatabase.DatabaseName); Console.WriteLine("| Initializing configuration manager"); ConfigManager configMgr = new ConfigManager(settings, logging, configDb); Console.WriteLine("| Adding user [default]"); UserMaster currUser = new UserMaster(); currUser.GUID = "default"; currUser.Email = "*****@*****.**"; currUser.Password = "******"; currUser.Address1 = "123 Some Street"; currUser.Cellphone = "408-555-1212"; currUser.City = "San Jose"; currUser.CompanyName = "Default Company"; currUser.Country = "USA"; currUser.FirstName = "First"; currUser.LastName = "Last"; currUser.PostalCode = "95128"; currUser.State = "CA"; currUser.CreatedUtc = timestamp; currUser.Active = true; configMgr.AddUser(currUser); currUser = configMgr.GetUserByGuid("default"); Console.WriteLine("| Adding API key [default]"); ApiKey currApiKey = new ApiKey(); currApiKey = new ApiKey(); currApiKey.GUID = "default"; currApiKey.Notes = "Created by setup script"; currApiKey.UserMasterId = currUser.Id; currApiKey.Active = true; currApiKey.CreatedUtc = timestamp; configMgr.AddApiKey(currApiKey); currApiKey = configMgr.GetApiKeyByGuid("default"); Console.WriteLine("| Adding permission [default]"); Permission currPerm = new Permission(); currPerm.GUID = "default"; currPerm.DeleteContainer = true; currPerm.DeleteObject = true; currPerm.ReadContainer = true; currPerm.ReadObject = true; currPerm.WriteContainer = true; currPerm.WriteObject = true; currPerm.ApiKeyId = currApiKey.Id; currPerm.Notes = "Created by setup script"; currPerm.UserMasterId = currUser.Id; currPerm.Active = true; currPerm.CreatedUtc = timestamp; configMgr.AddPermission(currPerm); currPerm = configMgr.GetPermissionByGuid("default"); Console.WriteLine("| Creating container [default]"); string htmlFile = SampleHtmlFile("http://github.com/kvpbase"); string textFile = SampleTextFile("http://github.com/kvpbase"); string jsonFile = SampleJsonFile("http://github.com/kvpbase"); ContainerManager containerMgr = new ContainerManager(settings, logging, configMgr, storageDb); Container container = new Container(); container.UserGuid = "default"; container.Name = "default"; container.GUID = "default"; container.ObjectsDirectory = settings.Storage.Directory + container.UserGuid + "/" + container.Name + "/"; container.EnableAuditLogging = true; container.IsPublicRead = true; container.IsPublicWrite = false; containerMgr.Add(container); ContainerClient client = null; containerMgr.GetContainerClient("default", "default", out client); Console.WriteLine("| Writing sample files to container [default]"); ErrorCode error; client.WriteObject("hello.html", "text/html", Encoding.UTF8.GetBytes(htmlFile), null, out error); client.WriteObject("hello.txt", "text/plain", Encoding.UTF8.GetBytes(textFile), null, out error); client.WriteObject("hello.json", "application/json", Encoding.UTF8.GetBytes(jsonFile), null, out error); #endregion #region Wrap-Up // 1 2 3 4 5 6 7 // 12345678901234567890123456789012345678901234567890123456789012345678901234567890 Console.WriteLine(""); Console.WriteLine(Common.Line(79, "-")); Console.WriteLine(""); Console.WriteLine("We have created your first user account and permissions."); Console.WriteLine(" Email : " + currUser.Email); Console.WriteLine(" Password : "******" GUID : " + currUser.GUID); Console.WriteLine(" API Key : " + currApiKey.GUID); Console.WriteLine(""); Console.WriteLine("We've also created sample files for you so that you can see your node in"); Console.WriteLine("action. Go to the following URLs in your browser and see what happens!"); Console.WriteLine(""); Console.WriteLine(" http://localhost:8000/"); Console.WriteLine(" http://localhost:8000/default/default?_container&_html"); Console.WriteLine(" http://localhost:8000/default/default/hello.html"); Console.WriteLine(" http://localhost:8000/default/default/hello.html?_metadata=true"); Console.WriteLine(" http://localhost:8000/default/default/hello.txt"); Console.WriteLine(" http://localhost:8000/default/default/hello.json"); Console.WriteLine(""); Console.WriteLine("Kvpbase is set to listen on 'localhost' and will only respond to requests"); Console.WriteLine("from the local machine. SSL is disabled. Modify the System.json file to"); Console.WriteLine("change these settings."); Console.WriteLine(""); #endregion }