public static SysLinuxConfigFile Create(string filename, SysLinuxAppearance sysLinuxAppearance)
        {
            var configFile = new SysLinuxConfigFile(filename, sysLinuxAppearance);

            configFile.CreateNew();
            return(configFile);
        }
        public static SysLinuxConfigFile OpenFile(string filename, SysLinuxAppearance sysLinuxAppearance)
        {
            var configFile = new SysLinuxConfigFile(filename, sysLinuxAppearance);

            configFile.Load(File.ReadAllText(filename));
            return(configFile);
        }
        public static bool TryParse(string filename, out SysLinuxConfigFile sysLinuxConfigFile)
        {
            var sysLinuxConfig = new SysLinuxConfigFile(filename, null);

            if (sysLinuxConfig.LoadConfig(File.ReadAllText(filename), filename))
            {
                sysLinuxConfigFile = sysLinuxConfig;
                return(true);
            }

            sysLinuxConfigFile = null;
            return(false);
        }
示例#4
0
        public void CreateBootStick(Logger logger)
        {
            var tempDirectory = FileSystemExtensions.MakeDirectoryUnique(Path.Combine(Path.GetTempPath(), "GodlikeStick"));

            logger.Status("Create temp directory");
            tempDirectory.Create();
            try
            {
                var targetDirectory = new DirectoryInfo(Path.Combine(_drive.RootDirectory.FullName, DriveDirectory));

                if (!targetDirectory.Exists)
                {
                    logger.Status($"Create /{DriveDirectory} directory on drive");
                    targetDirectory.Create();
                }

                if (!File.Exists(Path.Combine(targetDirectory.FullName, "libcom32.c32")))
                {
                    InstallSysLinux(_drive, tempDirectory, logger);
                }

                logger.Status("Write syslinux config");
                var sysLinuxFile = new FileInfo(Path.Combine(targetDirectory.FullName, "syslinux.cfg"));
                if (sysLinuxFile.Exists)
                {
                    SysLinuxConfigFile = SysLinuxConfigFile.OpenFile(sysLinuxFile.FullName, _sysLinuxAppearance);
                }
                else
                {
                    SysLinuxConfigFile = SysLinuxConfigFile.Create(sysLinuxFile.FullName, _sysLinuxAppearance);
                }

                logger.Status("Copy background.png");
                var backgroundFilePath = Path.Combine(targetDirectory.FullName, "background.png");
                if (!string.IsNullOrEmpty(_sysLinuxAppearance.ScreenBackground) &&
                    File.Exists(_sysLinuxAppearance.ScreenBackground))
                {
                    File.Copy(_sysLinuxAppearance.ScreenBackground, backgroundFilePath);
                }
                else if (!File.Exists(backgroundFilePath))
                {
                    //only copy if the file does not exist because the user could have already installed syslinux with a different background image
                    WpfUtilities.WriteResourceToFile(
                        new Uri("pack://application:,,,/Resources/SysLinuxFiles/background.png"), backgroundFilePath);
                }

                var randomFiles = new[]
                { "chain.c32", "libcom32.c32", "libutil.c32", "memdisk", "menu.c32", "vesamenu.c32", "grub.exe" };
                foreach (var randomFile in randomFiles)
                {
                    var resource =
                        Application.GetResourceStream(
                            new Uri($"pack://application:,,,/Resources/SysLinuxFiles/{randomFile}"));

                    if (resource == null)
                    {
                        throw new FileNotFoundException();
                    }

                    var targetFile = Path.Combine(targetDirectory.FullName, randomFile);
                    if (File.Exists(targetFile))
                    {
                        byte[] resourceHash;
                        byte[] fileHash;
                        using (var md5 = new MD5CryptoServiceProvider())
                        {
                            resourceHash = md5.ComputeHash(resource.Stream);
                            using (var fs = new FileStream(targetFile, FileMode.Open, FileAccess.Read))
                                fileHash = md5.ComputeHash(fs);
                        }

                        if (resourceHash.SequenceEqual(fileHash))
                        {
                            logger.Status($"{randomFile} already exists");
                            continue;
                        }
                    }

                    logger.Status($"Write \"{Path.Combine(targetDirectory.FullName, randomFile)}\"");
                    WpfUtilities.WriteResourceToFile(
                        new Uri($"pack://application:,,,/Resources/SysLinuxFiles/{randomFile}"),
                        Path.Combine(targetDirectory.FullName, randomFile));
                }
            }
            finally
            {
                logger.Status("Delete temp directory");
                tempDirectory.Delete(true);
            }
        }