diff --git a/data/locale/deutsch.locale b/data/locale/deutsch.locale index 9084627c8..f620f4e35 100644 --- a/data/locale/deutsch.locale +++ b/data/locale/deutsch.locale @@ -486,6 +486,7 @@ flashupdate.settings Update-Einstellungen flashupdate.squashfs.noversion Bei Updates werden Versionsüberprüfungen derzeit nur über Web-Updates unterstützt.\nWollen Sie das ausgewählte Image wirklich installieren? flashupdate.titlereadflash Flash auslesen flashupdate.titlewriteflash Flash schreiben +flashupdate.update_with_settings_del_skipped Ordner [%s] kann nicht gelöscht werden. Eintrag wird übersprungen. flashupdate.update_with_settings_processed Image wird bearbeitet... flashupdate.update_with_settings_skipped Ordner [%s] kann nicht gesichert werden. Eintrag wird übersprungen. flashupdate.update_with_settings_successfully Settingsübernahme erfolgreich.\nDas Image kann jetzt geflasht werden. diff --git a/data/locale/english.locale b/data/locale/english.locale index 23118da8d..163dc7cdf 100644 --- a/data/locale/english.locale +++ b/data/locale/english.locale @@ -486,6 +486,7 @@ flashupdate.settings Update settings flashupdate.squashfs.noversion SquashFS version checks are currently only supported when updating over the web.\nAre you sure that you wish to install this image? flashupdate.titlereadflash Reading Flash flashupdate.titlewriteflash Writing Flash +flashupdate.update_with_settings_del_skipped Folder [%s] can not be deleted. Entry is skipped. flashupdate.update_with_settings_processed Image is being processed... flashupdate.update_with_settings_skipped Folder [%s] can not be saved. Entry is skipped. flashupdate.update_with_settings_successfully Setting takeover successfully.\nThe image can now be flashed. diff --git a/data/settingsupdate.conf b/data/settingsupdate.conf index 1d2ed7a13..9515124bc 100644 --- a/data/settingsupdate.conf +++ b/data/settingsupdate.conf @@ -37,3 +37,10 @@ -/var/tuxbox/config/satellites.xml -/var/tuxbox/config/settingsupdate.conf -/var/tuxbox/config/tobackup.conf + +#---------------------------------------------------------------------------- +## nach der Sicherung aus dem neuen Image zu löschende Dateien/Verzeichnisse, +## gekennzeichnet durch ein vorangestelltes ~ +# z.B. +# ~/share/tuxbox/neutrino/themes/Classic.theme +#---------------------------------------------------------------------------- diff --git a/src/gui/ext_update.cpp b/src/gui/ext_update.cpp index b5b70998c..2e0215c82 100644 --- a/src/gui/ext_update.cpp +++ b/src/gui/ext_update.cpp @@ -73,7 +73,9 @@ CExtUpdate::CExtUpdate() fLogfile = "/tmp/update.log"; mountPkt = "/tmp/image_mount"; FileHelpers = NULL; - BlackList.clear(); + copyList.clear(); + blackList.clear(); + deleteList.clear(); } CExtUpdate::~CExtUpdate() @@ -82,7 +84,9 @@ CExtUpdate::~CExtUpdate() delete[] MTDBuf; if(FileHelpers) delete[] FileHelpers; - BlackList.clear(); + copyList.clear(); + blackList.clear(); + deleteList.clear(); } CExtUpdate* CExtUpdate::getInstance() @@ -120,6 +124,7 @@ bool CExtUpdate::ErrorReset(bool modus, const std::string & msg1, const std::str } if(hintBox) hintBox->hide(); + sync(); return false; } @@ -339,6 +344,7 @@ bool CExtUpdate::applySettings() if(hintBox) hintBox->hide(); + sync(); return true; } @@ -399,6 +405,40 @@ bool CExtUpdate::copyFileList(const std::string & fileList, const std::string & return true; } +bool CExtUpdate::deleteFileList(const std::string & fileList) +{ + Wildcard = ""; + struct dirent **namelist; + std::string fList = fileList; + static struct stat FileInfo; + + size_t pos = fileList.find_last_of("/"); + fList = fileList.substr(0, pos); + Wildcard = fileList.substr(pos+1); + + int n = scandir(fList.c_str(), &namelist, fileSelect, 0); + if (n > 0) { + while (n--) { + std::string dName = namelist[n]->d_name; + if (lstat((fList+"/"+dName).c_str(), &FileInfo) != -1) { + if (S_ISDIR(FileInfo.st_mode)) { + // Directory + WRITE_UPDATE_LOG("delete directory: %s\n", (fList+"/"+dName).c_str()); + FileHelpers->removeDir((fList+"/"+dName).c_str()); + } + else if (S_ISREG(FileInfo.st_mode)) { + // File + WRITE_UPDATE_LOG("delete file: %s\n", (fList+"/"+dName).c_str()); + unlink((fList+"/"+dName).c_str()); + } + } + free(namelist[n]); + } + free(namelist); + } + return true; +} + bool CExtUpdate::findConfigEntry(std::string & line, std::string find) { if (line.find("#:" + find + "=") == 0) { @@ -430,7 +470,7 @@ bool CExtUpdate::readConfig(const std::string & line) bool CExtUpdate::isBlacklistEntry(const std::string & file) { - for(vector::iterator it = BlackList.begin(); it != BlackList.end(); ++it) { + for(vector::iterator it = blackList.begin(); it != blackList.end(); ++it) { if (*it == file) { DBG_MSG("BlacklistEntry %s\n", (*it).c_str()); WRITE_UPDATE_LOG("BlacklistEntry: %s\n", (*it).c_str()); @@ -440,6 +480,20 @@ bool CExtUpdate::isBlacklistEntry(const std::string & file) return false; } +bool CExtUpdate::checkSpecialFolders(std::string line, bool copy) +{ + if ((line == "/") || (line == "/*") || (line == "/*.*") || (line.find("/dev") == 0) || (line.find("/proc") == 0) || + (line.find("/sys") == 0) || (line.find("/mnt") == 0) || (line.find("/tmp") == 0)) { + char buf[PATH_MAX]; + neutrino_locale_t msg = (copy) ? LOCALE_FLASHUPDATE_UPDATE_WITH_SETTINGS_SKIPPED : LOCALE_FLASHUPDATE_UPDATE_WITH_SETTINGS_DEL_SKIPPED; + snprintf(buf, sizeof(buf), g_Locale->getText(msg), line.c_str()); + WRITE_UPDATE_LOG("%s%s", buf, "\n"); + ShowMsgUTF(LOCALE_MESSAGEBOX_INFO, buf, CMessageBox::mbrOk, CMessageBox::mbOk, NEUTRINO_ICON_INFO); + return true; + } + return false; +} + bool CExtUpdate::readBackupList(const std::string & dstPath) { char buf[PATH_MAX]; @@ -470,37 +524,18 @@ bool CExtUpdate::readBackupList(const std::string & dstPath) size_t pos; std::string line; - // read blacklist - BlackList.clear(); - while(fgets(buf, sizeof(buf), f1) != NULL) { - line = buf; - line = trim(line); - // ignore comments - if (line.find_first_of("#") == 0) - continue; - pos = line.find_first_of("#"); - if (pos != std::string::npos) { - line = line.substr(0, pos); - line = trim(line); - } - // find blacklist entry - if (line.find_first_of("-") == 0) { - line = line.substr(1); - if ((line.length() > 1) && (lstat(line.c_str(), &FileInfo) != -1)) { - if (S_ISREG(FileInfo.st_mode)) - BlackList.push_back(line); - } - } - } - - // read backuplist - fseek(f1, 0, SEEK_SET); + // read blacklist and config vars + copyList.clear(); + blackList.clear(); + deleteList.clear(); while(fgets(buf, sizeof(buf), f1) != NULL) { + std::string tmpLine; line = buf; line = trim(line); // ignore comments if (line.find_first_of("#") == 0) { - if (line.find_first_of(":") == 1) { // config vars + // config vars + if (line.find_first_of(":") == 1) { if (line.length() > 1) readConfig(line); } @@ -511,27 +546,39 @@ bool CExtUpdate::readBackupList(const std::string & dstPath) line = line.substr(0, pos); line = trim(line); } - - // '+' add entry = default - if (line.find_first_of("+") == 0) - line = line.substr(1); - - // '-' blacklist entry - if (line.find_first_of("-") == 0) - continue; - - // Entry '~' (delete) ignore currently still - if (line.find_first_of("~") == 0) - continue; - - // special folders - else if ((line == "/") || (line == "/*") || (line == "/*.*") || (line.find("/dev") == 0) || (line.find("/proc") == 0) || - (line.find("/sys") == 0) || (line.find("/mnt") == 0) || (line.find("/tmp") == 0)) { - snprintf(buf, sizeof(buf), g_Locale->getText(LOCALE_FLASHUPDATE_UPDATE_WITH_SETTINGS_SKIPPED), line.c_str()); - WRITE_UPDATE_LOG("%s%s", buf, "\n"); - ShowMsgUTF(LOCALE_MESSAGEBOX_INFO, buf, CMessageBox::mbrOk, CMessageBox::mbOk, NEUTRINO_ICON_INFO); - continue; + // find blackList entry + if (line.find_first_of("-") == 0) { + tmpLine = line.substr(1); + if ((tmpLine.length() > 1) && (lstat(tmpLine.c_str(), &FileInfo) != -1)) { + if (S_ISREG(FileInfo.st_mode)) + blackList.push_back(tmpLine); + } } + // find deleteList entry + else if (line.find_first_of("~") == 0) { + tmpLine = line.substr(1); + if (checkSpecialFolders(tmpLine, false)) + continue; + tmpLine = dstPath + tmpLine; + if (line.length() > 2) + deleteList.push_back(tmpLine); + } + // find copyList entry + else { + tmpLine = (line.find_first_of("+") == 0) ? line.substr(1) : line; // '+' add entry = default + if (checkSpecialFolders(tmpLine, true)) + continue; + if (tmpLine.length() > 1) + copyList.push_back(tmpLine); + } + } + fclose(f1); + + // read copyList + vector::iterator it; + for(it = copyList.begin(); it != copyList.end(); ++it) { + line = *it; + line = trim(line); // remove '/' from line end size_t len = line.length(); pos = line.find_last_of("/"); @@ -573,8 +620,29 @@ bool CExtUpdate::readBackupList(const std::string & dstPath) } } - fclose(f1); + // read DeleteList + for(it = deleteList.begin(); it != deleteList.end(); ++it) { + line = *it; + if (lstat(line.c_str(), &FileInfo) != -1) { + if ((line.find("*") != std::string::npos) || (line.find("?") != std::string::npos)) { + // Wildcards + WRITE_UPDATE_LOG("delete file list: %s\n", line.c_str()); + deleteFileList(line.c_str()); + } + else if (S_ISREG(FileInfo.st_mode)) { + // File + WRITE_UPDATE_LOG("delete file: %s\n", line.c_str()); + unlink(line.c_str()); + } + else if (S_ISDIR(FileInfo.st_mode)){ + // Directory + WRITE_UPDATE_LOG("delete directory: %s\n", line.c_str()); + FileHelpers->removeDir(line.c_str()); + } + } + } + sync(); return true; } diff --git a/src/gui/ext_update.h b/src/gui/ext_update.h index 57e1b921a..e0291641b 100644 --- a/src/gui/ext_update.h +++ b/src/gui/ext_update.h @@ -54,14 +54,16 @@ class CExtUpdate std::string backupList, defaultBackup; std::string mountPkt; CFileHelpers* FileHelpers; - std::vector BlackList; + std::vector copyList, blackList, deleteList; bool applySettings(void); bool readBackupList(const std::string & dstPath); bool copyFileList(const std::string & fileList, const std::string & dstPath); + bool deleteFileList(const std::string & fileList); bool readConfig(const std::string & Config); bool findConfigEntry(std::string & line, std::string find); bool isMtdramLoad(); + bool checkSpecialFolders(std::string line, bool copy); FILE * fUpdate; char updateLogBuf[1024]; diff --git a/src/system/locals.h b/src/system/locals.h index 2a35ef6b2..792767143 100644 --- a/src/system/locals.h +++ b/src/system/locals.h @@ -513,6 +513,7 @@ typedef enum LOCALE_FLASHUPDATE_SQUASHFS_NOVERSION, LOCALE_FLASHUPDATE_TITLEREADFLASH, LOCALE_FLASHUPDATE_TITLEWRITEFLASH, + LOCALE_FLASHUPDATE_UPDATE_WITH_SETTINGS_DEL_SKIPPED, LOCALE_FLASHUPDATE_UPDATE_WITH_SETTINGS_PROCESSED, LOCALE_FLASHUPDATE_UPDATE_WITH_SETTINGS_SKIPPED, LOCALE_FLASHUPDATE_UPDATE_WITH_SETTINGS_SUCCESSFULLY, diff --git a/src/system/locals_intern.h b/src/system/locals_intern.h index 905652f7f..243d504ad 100644 --- a/src/system/locals_intern.h +++ b/src/system/locals_intern.h @@ -513,6 +513,7 @@ const char * locale_real_names[] = "flashupdate.squashfs.noversion", "flashupdate.titlereadflash", "flashupdate.titlewriteflash", + "flashupdate.update_with_settings_del_skipped", "flashupdate.update_with_settings_processed", "flashupdate.update_with_settings_skipped", "flashupdate.update_with_settings_successfully",