Просмотр исходного кода

Merge pull request #76 from torarnv/filter-improvements

Add ability to pass multiple filters, and to filter by regular expressions
Rich Infante 4 лет назад
Родитель
Сommit
b018e20f09
5 измененных файлов с 50 добавлено и 14 удалено
  1. 8 3
      Readme.md
  2. 10 3
      package-lock.json
  3. 1 1
      package.json
  4. 7 2
      tools/cli.js
  5. 24 5
      tools/reports/backup/files.js

+ 8 - 3
Readme.md

@@ -113,11 +113,16 @@ ibackuptool -b $UDID --report system.wifi,phone.calls,phone.voicemail -f csv -o
 ```
 
 ## Extracting files
-the `--extract <path>` parameter paired with the backup.files report will extract all files in a backup, with filenames matching an optional filter (specified by `--filter <filter>`).
+the `--extract <path>` parameter paired with the backup.files report will extract all files in a backup.
+
+To limit which files are extracted, pass one or more filters via `--filter <filter>`.
+Each filter must match for the file to be included.
+
+Regular expression filters can be passed by `--regex-filter <filter>`.
 
 ```bash
-# Export all photos onto "~/Desktop/Photos"
-ibackuptool -b $UDID -r backup.files --extract ~/Desktop/Photos --filter DCIM
+# Export all JPEG photos onto "~/Desktop/Photos"
+ibackuptool -b $UDID -r backup.files --extract ~/Desktop/Photos --filter DCIM --regex-filter '\.(jpg|JPG|jpeg|JPEG)$'
 ```
 
 ## Running Tests

+ 10 - 3
package-lock.json

@@ -661,9 +661,9 @@
       }
     },
     "commander": {
-      "version": "2.20.3",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-6.1.0.tgz",
+      "integrity": "sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA=="
     },
     "commondir": {
       "version": "1.0.1",
@@ -2227,6 +2227,13 @@
         "lodash.set": "^4.3.0",
         "lodash.uniq": "^4.5.0",
         "path-is-absolute": "^1.0.0"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.20.3",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+        }
       }
     },
     "json5": {

+ 1 - 1
package.json

@@ -18,7 +18,7 @@
     "bplist-parser": "^0.1.1",
     "buffer-reader": "^0.1.0",
     "chalk": "^1.1.3",
-    "commander": "^2.15.1",
+    "commander": "^6.1.0",
     "fs-extra": "^4.0.3",
     "json2csv": "^3.11.5",
     "plist": "^2.1.0",

+ 7 - 2
tools/cli.js

@@ -37,7 +37,8 @@ program
   .option('-o, --output <path>', 'Specify an output directory for files to be written to.')
   .option(`-v, --verbose`, 'Verbose debugging output')
   .option(`    --plugins <plugins>`, 'List of pluging modules to use')
-  .option(`    --filter <filter>`, 'Filter output fo r individual reports. See the README for usage.')
+  .option(`    --filter <filter...>`, 'Filters output for individual reports.')
+  .option(`    --regex-filter <filter...>`, 'Filters output for individual reports using a regular expression.')
   .option('    --join-reports', 'Join JSON reports together. (available for -f json or -f raw only!)')
   .option(`    --no-color`, 'Disable colorized output')
   .option(`    --dump`, 'alias for "--formatter raw"')
@@ -183,11 +184,15 @@ async function main () {
         try {
           log.begin('run', report.name)
 
+          var filters = program.filter || [];
+          for (var filter of program.regexFilter || [])
+            filters.push(new RegExp(filter));
+
           // Create some parameters to send by default.
           let params = {
             backup: program.backup,
             extract: program.extract,
-            filter: program.filter,
+            filter: filters,
             id: program.id,
             raw: !!program.formatter.isRaw
           }

+ 24 - 5
tools/reports/backup/files.js

@@ -97,11 +97,30 @@ function getManifest (backup) {
 
 /// Filter exclusion check
 function isIncludedByFilter (filter, item, filePath) {
-  return filter === 'all' ||
-    filter === undefined ||
-    (filter && item.domain.indexOf(filter) > -1) ||
-    (filter && item.filename.indexOf(filter) > -1) ||
-    (filePath.indexOf(filter) > -1)
+  if (filter === 'all' || filter === undefined)
+    return true;
+
+  for (var f of Array.isArray(filter) ? filter : [filter]) {
+    if (!isIncludedBySingleFilter(f, item, filePath))
+      return false;
+  }
+  return true;
+}
+
+function isIncludedBySingleFilter (filter, item, filePath) {
+  for (var x of [item.domain, item.filename, filePath]) {
+    if (isIncludedBySingleFilterCheck(filter, x))
+      return true;
+  }
+}
+
+function isIncludedBySingleFilterCheck (filter, x) {
+  if (filter instanceof RegExp)
+    return x.search(filter) > -1
+  else if (filter instanceof Function)
+    return filter(x)
+  else
+    return x.indexOf(filter) > -1;
 }
 
 /// Extract files