public ProgramBlock ProgramImport(int newPid, string archiveName, string groupName) { ProgramBlock newProgram; char[] signature = new char[2]; using (var reader = new StreamReader(archiveName)) { reader.Read(signature, 0, 2); } if (signature[0] == 'P' && signature[1] == 'K') { // Read and uncompress zip file content (arduino program bundle) string zipFileName = archiveName.Replace(".hgx", ".zip"); if (File.Exists(zipFileName)) { File.Delete(zipFileName); } File.Move(archiveName, zipFileName); string destFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Utility.GetTmpFolder(), "import"); if (Directory.Exists(destFolder)) { Directory.Delete(destFolder, true); } Utility.UncompressZip(zipFileName, destFolder); string bundleFolder = Path.Combine("programs", "arduino", newPid.ToString()); if (Directory.Exists(bundleFolder)) { Directory.Delete(bundleFolder, true); } if (!Directory.Exists(Path.Combine("programs", "arduino"))) { Directory.CreateDirectory(Path.Combine("programs", "arduino")); } Directory.Move(Path.Combine(destFolder, "src"), bundleFolder); archiveName = Path.Combine(destFolder, "program.hgx"); } // TODO: Deprecate Compat Compat_526.FixProgramsDatabase(archiveName); using (var reader = new StreamReader(archiveName)) { var serializer = new XmlSerializer(typeof(ProgramBlock)); newProgram = (ProgramBlock)serializer.Deserialize(reader); } newProgram.Address = newPid; newProgram.Group = groupName; homegenie.ProgramManager.ProgramAdd(newProgram); newProgram.IsEnabled = false; newProgram.ScriptErrors = ""; newProgram.Engine.SetHost(homegenie); if (newProgram.Type.ToLower() != "arduino") { homegenie.ProgramManager.CompileScript(newProgram); } return(newProgram); }
public bool RestoreConfiguration(string archiveFolder, string selectedPrograms) { bool success = true; // Import automation groups List <Group> automationGroups; var serializer = new XmlSerializer(typeof(List <Group>)); using (var reader = new StreamReader(Path.Combine(archiveFolder, "automationgroups.xml"))) { automationGroups = (List <Group>)serializer.Deserialize(reader); } foreach (var automationGroup in automationGroups) { if (homegenie.AutomationGroups.Find(g => g.Name == automationGroup.Name) == null) { homegenie.AutomationGroups.Add(automationGroup); homegenie.RaiseEvent( Domains.HomeGenie_System, Domains.HomeGenie_BackupRestore, SourceModule.Master, "HomeGenie Backup Restore", Properties.InstallProgressMessage, "= Added: Automation Group '" + automationGroup.Name + "'" ); } } homegenie.UpdateGroupsDatabase("Automation"); // Copy system configuration files File.Copy(Path.Combine(archiveFolder, "groups.xml"), Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "groups.xml"), true); homegenie.RaiseEvent( Domains.HomeGenie_System, Domains.HomeGenie_BackupRestore, SourceModule.Master, "HomeGenie Backup Restore", Properties.InstallProgressMessage, "= Restored: Control Groups" ); File.Copy(Path.Combine(archiveFolder, "modules.xml"), Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "modules.xml"), true); homegenie.RaiseEvent( Domains.HomeGenie_System, Domains.HomeGenie_BackupRestore, SourceModule.Master, "HomeGenie Backup Restore", Properties.InstallProgressMessage, "= Restored: Modules" ); File.Copy(Path.Combine(archiveFolder, "scheduler.xml"), Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "scheduler.xml"), true); homegenie.RaiseEvent( Domains.HomeGenie_System, Domains.HomeGenie_BackupRestore, SourceModule.Master, "HomeGenie Backup Restore", Properties.InstallProgressMessage, "= Restored: Scheduler Events" ); #if !NETCOREAPP // Statistics db if (File.Exists(Path.Combine(archiveFolder, StatisticsLogger.STATISTICS_DB_FILE))) { File.Copy(Path.Combine(archiveFolder, StatisticsLogger.STATISTICS_DB_FILE), Path.Combine(AppDomain.CurrentDomain.BaseDirectory, StatisticsLogger.STATISTICS_DB_FILE), true); homegenie.RaiseEvent( Domains.HomeGenie_System, Domains.HomeGenie_BackupRestore, SourceModule.Master, "HomeGenie Backup Restore", Properties.InstallProgressMessage, "= Restored: Statistics Database" ); } #endif // Remove all old non-system programs var rp = new List <ProgramBlock>(); foreach (var program in homegenie.ProgramManager.Programs) { if (program.Address >= ProgramManager.USERSPACE_PROGRAMS_START) { rp.Add(program); } } foreach (var program in rp) { homegenie.ProgramManager.ProgramRemove(program); homegenie.RaiseEvent( Domains.HomeGenie_System, Domains.HomeGenie_BackupRestore, SourceModule.Master, "HomeGenie Backup Restore", Properties.InstallProgressMessage, "= Removed: Program '" + program.Name + "' (" + program.Address + ")" ); } // Restore installed packages if (File.Exists(Path.Combine(archiveFolder, PackageManager.PACKAGE_LIST_FILE))) { File.Copy(Path.Combine(archiveFolder, PackageManager.PACKAGE_LIST_FILE), Path.Combine(AppDomain.CurrentDomain.BaseDirectory, PackageManager.PACKAGE_LIST_FILE), true); // Restore packages from "installed_packages.json" string installFolder = Path.Combine(archiveFolder, "pkg"); List <dynamic> pkgList = homegenie.PackageManager.LoadInstalledPackages(); foreach (var pkg in pkgList) { success = success && homegenie.PackageManager.InstallPackage(pkg.folder_url.ToString(), installFolder); } } // Update program database after package restore homegenie.UpdateProgramsDatabase(); // Update system config UpdateSystemConfig(archiveFolder); // Remove old MIG Interfaces config/data files (lib/mig/*.xml) string migLibFolder = Path.Combine("lib", "mig"); if (Directory.Exists(migLibFolder)) { foreach (string f in Directory.GetFiles(migLibFolder, "*.xml")) { File.Delete(f); homegenie.RaiseEvent( Domains.HomeGenie_System, Domains.HomeGenie_BackupRestore, SourceModule.Master, "HomeGenie Backup Restore", Properties.InstallProgressMessage, "= Removed: MIG Data File '" + f + "'" ); } } // Restore MIG configuration/data files if present (from backup folder lib/mig/*.xml) migLibFolder = Path.Combine(archiveFolder, "lib", "mig"); if (Directory.Exists(migLibFolder)) { foreach (string f in Directory.GetFiles(migLibFolder, "*.xml")) { File.Copy(f, Path.Combine("lib", "mig", Path.GetFileName(f)), true); homegenie.RaiseEvent( Domains.HomeGenie_System, Domains.HomeGenie_BackupRestore, SourceModule.Master, "HomeGenie Backup Restore", Properties.InstallProgressMessage, "= Restored: '" + Path.Combine("lib", "mig", Path.GetFileName(f)) + "'" ); } } // Soft-reload system configuration from newly restored files and save config homegenie.SoftReload(); // Restore user-space automation programs serializer = new XmlSerializer(typeof(List <ProgramBlock>)); string programsDatabase = Path.Combine(archiveFolder, "programs.xml"); #if !NETCOREAPP // TODO: Deprecate Compat Compat_526.FixProgramsDatabase(programsDatabase); #endif List <ProgramBlock> newProgramsData; using (var reader = new StreamReader(programsDatabase)) { newProgramsData = (List <ProgramBlock>)serializer.Deserialize(reader); } foreach (var program in newProgramsData) { var currentProgram = homegenie.ProgramManager.Programs.Find(p => p.Address == program.Address); program.IsRunning = false; // Only restore USER-SPACE PROGRAMS if (selectedPrograms.Contains("," + program.Address + ",") && (program.Address >= ProgramManager.USERSPACE_PROGRAMS_START && program.Address < ProgramManager.PACKAGE_PROGRAMS_START)) { if (currentProgram == null) { homegenie.ProgramManager.ProgramAdd(program); homegenie.RaiseEvent( Domains.HomeGenie_System, Domains.HomeGenie_BackupRestore, SourceModule.Master, "HomeGenie Backup Restore", Properties.InstallProgressMessage, "= Added: Program '" + program.Name + "' (" + program.Address + ")" ); } else { homegenie.ProgramManager.ProgramRemove(currentProgram); homegenie.ProgramManager.ProgramAdd(program); homegenie.RaiseEvent( Domains.HomeGenie_System, Domains.HomeGenie_BackupRestore, SourceModule.Master, "HomeGenie Backup Restore", Properties.InstallProgressMessage, "= Replaced: Program '" + program.Name + "' (" + program.Address + ")" ); } // Restore Arduino program folder ... // TODO: this is untested yet... if (program.Type.ToLower() == "arduino") { string sourceFolder = Path.Combine(archiveFolder, "programs", "arduino", program.Address.ToString()); string arduinoFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "programs", "arduino", program.Address.ToString()); if (Directory.Exists(arduinoFolder)) { Directory.Delete(arduinoFolder, true); } Directory.CreateDirectory(arduinoFolder); foreach (string newPath in Directory.GetFiles(sourceFolder)) { File.Copy(newPath, newPath.Replace(sourceFolder, arduinoFolder), true); } } else { homegenie.ProgramManager.ProgramCompile(program); } } else if (currentProgram != null && (program.Address < ProgramManager.USERSPACE_PROGRAMS_START || program.Address >= ProgramManager.PACKAGE_PROGRAMS_START)) { // Only restore Enabled/Disabled status for SYSTEM PROGRAMS and packages currentProgram.IsEnabled = program.IsEnabled; } } homegenie.UpdateProgramsDatabase(); homegenie.RaiseEvent( Domains.HomeGenie_System, Domains.HomeGenie_BackupRestore, SourceModule.Master, "HomeGenie Backup Restore", Properties.InstallProgressMessage, "= Status: Backup Restore " + (success ? "Successful" : "Errors") ); homegenie.SaveData(); return(success); }