Repository: priv-kweihmann/oelint-adv (language: python)

Issue:
Warn about vars from BB_RENAMED_VARIABLES
Those vars flagged are obsolete, we should inform the user about it

- listvars script should extract the needed information
Warn about vars from BB_RENAMED_VARIABLES
Those vars flagged are obsolete, we should inform the user about it

- listvars script should extract the needed information


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/knownvar_bump.yml b/.github/workflows/knownvar_bump.yml
index cb8f734..5b3b877 100644
--- a/.github/workflows/knownvar_bump.yml
+++ b/.github/workflows/knownvar_bump.yml
@@ -28,7 +28,7 @@ jobs:
                file locales libacl1
           sudo locale-gen en_US.UTF-8
       - name: Bump known vars for master
-        run: ${GITHUB_WORKSPACE}/scripts/generate-knownvars master ${GITHUB_WORKSPACE}/oelint_adv/data/master.json
+        run: ${GITHUB_WORKSPACE}/scripts/generate-variables master ${GITHUB_WORKSPACE}/oelint_adv/data/master.json
         shell: bash
       - name: Create Pull Request
         uses: peter-evans/create-pull-request@v7
diff --git a/README.md b/README.md
index 4062e21..2bac378 100644
--- a/README.md
+++ b/README.md
@@ -161,6 +161,7 @@ Rules marked with **[I]** need to be activated through [a rule file](#defining-a
 * [oelint.task.docstrings](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.task.docstrings.md) - Custom tasks should have docstrings
 * [oelint.task.heredocs](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.task.heredocs.md) - Usage of heredocs should be avoided. Use files instead
 * [oelint.task.multifragments](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.task.multifragments.md) - Multiple fragments of the same function in the same file should be merged
+* [oelint.task.network](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.task.network.md) - Warn about potential network access of tasks
 * [oelint.task.noanonpython](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.task.noanonpython.md) - Avoid anonymous python functions
 * [oelint.task.nocopy](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.task.nocopy.md) - No cp usage in do_install
 * [oelint.task.nomkdir](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.task.nomkdir.md) - No mkdir usage in do_install
@@ -168,6 +169,7 @@ Rules marked with **[I]** need to be activated through [a rule file](#defining-a
 * [oelint.task.order](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.task.order.md) - Order of tasks **[S]**
 * [oelint.task.pythonprefix](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.task.pythonprefix.md) - Tasks containing python code should be prefixed with 'python' in function header
 * [oelint.var.addpylib](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.var.addpylib.md) - addpylib is only valid in .conf files
+* [oelint.var.badimagefeature](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.var.badimagefeature.md) - Warn about "bad" IMAGE_FEATURES
 * [oelint.var.bbclassextend](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.var.bbclassextend.md) - Use BBCLASSEXTEND when possible
 * [oelint.var.filesoverride](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.var.filesoverride.md) - FILES:*(FILES_*) variables should not be overridden
 * [oelint.var.improperinherit](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.var.improperinherit.md) - Warn about improperly named inherits
@@ -223,6 +225,7 @@ Rules marked with **[I]** need to be activated through [a rule file](#defining-a
 * [oelint.vars.pnbpnusage](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.vars.pnbpnusage.md) - \$\{BPN\} should be used instead of \$\{PN\} **[F]**
 * [oelint.vars.pnusagediscouraged](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.vars.pnusagediscouraged.md) - Variable shouldn't contain \$\{PN\} or \$\{BPN\}
 * [oelint.vars.pythonpnusage](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.vars.pythonpnusage.md) - python3 should be used instead of \$\{PYTHON_PN\} **[F]** (scarthgap+)
+* [oelint.vars.renamed](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.vars.renamed.md) - Warn about renamed or deprecated variables **[F]**
 * [oelint.vars.sectionlowercase](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.vars.sectionlowercase.md) - SECTION should be lowercase only **[F]**
 * [oelint.vars.spacesassignment](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.vars.spacesassignment.md) - ' = ' should be correct variable assignment
 * [oelint.vars.specific](https://github.com/priv-kweihmann/oelint-adv/blob/master/docs/wiki/oelint.vars.specific.md) - Variable is specific to an unknown identifier
diff --git a/docs/wiki/oelint.task.network.md b/docs/wiki/oelint.task.network.md
new file mode 100644
index 0000000..52d127b
--- /dev/null
+++ b/docs/wiki/oelint.task.network.md
@@ -0,0 +1,20 @@
+# oelint.task.network
+
+severity: warning
+
+## Example
+
+```
+do_compile[network] = "1"
+```
+
+## Why is this bad?
+
+It means that during compilation code could be fetched from a network.
+That implies that the code cannot be reliably reproduced offline or even in the
+future as remote network resources could vanish over time
+
+## Ways to fix it
+
+Inspect why the code is needing network access and engage with upstream to
+discuss the options
diff --git a/docs/wiki/oelint.var.badimagefeature.md b/docs/wiki/oelint.var.badimagefeature.md
new file mode 100644
index 0000000..55f2632
--- /dev/null
+++ b/docs/wiki/oelint.var.badimagefeature.md
@@ -0,0 +1,37 @@
+# oelint.var.badimagefeature
+
+severity: warning
+
+## Example
+
+```
+EXTRA_IMAGE_FEATURES:append = " empty-root-password"
+```
+
+## Why is this bad?
+
+Various settings in ``EXTRA_IMAGE_FEATURES`` and ``IMAGE_FEATURES`` either
+bloat the image or are a security risk.
+
+The following items are considered bad
+
+- allow-empty-password
+- allow-root-login
+- dbg-pkgs
+- debug-tweaks
+- dev-pkgs
+- eclipse-debug
+- empty-root-password
+- post-install-logging
+- ptest-pkgs
+- serial-autologin-root
+- staticdev-pkgs
+- tools-debug
+
+None of them should be used in production.
+
+## Ways to fix it
+
+- Remove the setting from ``EXTRA_IMAGE_FEATURES`` and ``IMAGE_FEATURES``
+- use ``nooelint: oelint.var.badimagefeature.<id>`` when you are sure that
+  none of the image(s) resulting out of this setting can be used in production
diff --git a/docs/wiki/oelint.vars.renamed.md b/docs/wiki/oelint.vars.renamed.md
new file mode 100644
index 0000000..23e6a69
--- /dev/null
+++ b/docs/wiki/oelint.vars.renamed.md
@@ -0,0 +1,24 @@
+# oelint.vars.renamed
+
+severity: error
+
+## Example
+
+```
+PNBLACKLIST = "1"
+```
+
+## Why is this bad?
+
+Those variables were deprecated.
+Some of them will be automatically renamed.
+
+## Ways to fix it
+
+Use the correct variable
+
+```
+SKIP_RECIPE = "1"
+```
+
+or in case of a removal by upstream remove the variable from the recipe code
diff --git a/oelint_adv/data/kirkstone.json b/oelint_adv/data/kirkstone.json
index 00f1cb2..d922347 100644
--- a/oelint_adv/data/kirkstone.json
+++ b/oelint_adv/data/kirkstone.json
@@ -1867,6 +1867,30 @@
       "ZSTD_COMPRESSION_LEVEL",
       "ZSTD_LEGACY_SUPPORT",
       "ZSTD_THREADS"
-    ]
+    ],
+    "renamed": {
+      "PNBLACKLIST": "SKIP_RECIPE",
+      "CVE_CHECK_PN_WHITELIST": "CVE_CHECK_SKIP_RECIPE",
+      "CVE_CHECK_WHITELIST": "CVE_CHECK_IGNORE",
+      "MULTI_PROVIDER_WHITELIST": "BB_MULTI_PROVIDER_ALLOWED",
+      "SDK_LOCAL_CONF_BLACKLIST": "ESDK_LOCALCONF_REMOVE",
+      "SDK_LOCAL_CONF_WHITELIST": "ESDK_LOCALCONF_ALLOW",
+      "SDK_INHERIT_BLACKLIST": "ESDK_CLASS_INHERIT_DISABLE",
+      "SSTATE_DUPWHITELIST": "SSTATE_ALLOW_OVERLAP_FILES",
+      "SYSROOT_DIRS_BLACKLIST": "SYSROOT_DIRS_IGNORE",
+      "UNKNOWN_CONFIGURE_WHITELIST": "UNKNOWN_CONFIGURE_OPT_IGNORE",
+      "ICECC_USER_CLASS_BL": "ICECC_CLASS_DISABLE",
+      "ICECC_SYSTEM_CLASS_BL": "ICECC_CLASS_DISABLE",
+      "ICECC_USER_PACKAGE_WL": "ICECC_RECIPE_ENABLE",
+      "ICECC_USER_PACKAGE_BL": "ICECC_RECIPE_DISABLE",
+      "ICECC_SYSTEM_PACKAGE_BL": "ICECC_RECIPE_DISABLE",
+      "INHERIT_BLACKLIST": "is a deprecated variable and no longer needed",
+      "TUNEABI_WHITELIST": "is a deprecated variable and support has been removed",
+      "LICENSE_FLAGS_WHITELIST": "LICENSE_FLAGS_ACCEPTED",
+      "WHITELIST_GPL-3.0-only": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_GPL-3.0-or-later": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_LGPL-3.0-only": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_LGPL-3.0-or-later": "INCOMPATIBLE_LICENSE_EXCEPTIONS"
+    }
   }
 }
\ No newline at end of file
diff --git a/oelint_adv/data/langdale.json b/oelint_adv/data/langdale.json
index 17327e5..b5f2832 100644
--- a/oelint_adv/data/langdale.json
+++ b/oelint_adv/data/langdale.json
@@ -1866,6 +1866,30 @@
       "ZSTD_COMPRESSION_LEVEL",
       "ZSTD_LEGACY_SUPPORT",
       "ZSTD_THREADS"
-    ]
+    ],
+    "renamed": {
+      "PNBLACKLIST": "SKIP_RECIPE",
+      "CVE_CHECK_PN_WHITELIST": "CVE_CHECK_SKIP_RECIPE",
+      "CVE_CHECK_WHITELIST": "CVE_CHECK_IGNORE",
+      "MULTI_PROVIDER_WHITELIST": "BB_MULTI_PROVIDER_ALLOWED",
+      "SDK_LOCAL_CONF_BLACKLIST": "ESDK_LOCALCONF_REMOVE",
+      "SDK_LOCAL_CONF_WHITELIST": "ESDK_LOCALCONF_ALLOW",
+      "SDK_INHERIT_BLACKLIST": "ESDK_CLASS_INHERIT_DISABLE",
+      "SSTATE_DUPWHITELIST": "SSTATE_ALLOW_OVERLAP_FILES",
+      "SYSROOT_DIRS_BLACKLIST": "SYSROOT_DIRS_IGNORE",
+      "UNKNOWN_CONFIGURE_WHITELIST": "UNKNOWN_CONFIGURE_OPT_IGNORE",
+      "ICECC_USER_CLASS_BL": "ICECC_CLASS_DISABLE",
+      "ICECC_SYSTEM_CLASS_BL": "ICECC_CLASS_DISABLE",
+      "ICECC_USER_PACKAGE_WL": "ICECC_RECIPE_ENABLE",
+      "ICECC_USER_PACKAGE_BL": "ICECC_RECIPE_DISABLE",
+      "ICECC_SYSTEM_PACKAGE_BL": "ICECC_RECIPE_DISABLE",
+      "INHERIT_BLACKLIST": "is a deprecated variable and no longer needed",
+      "TUNEABI_WHITELIST": "is a deprecated variable and support has been removed",
+      "LICENSE_FLAGS_WHITELIST": "LICENSE_FLAGS_ACCEPTED",
+      "WHITELIST_GPL-3.0-only": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_GPL-3.0-or-later": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_LGPL-3.0-only": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_LGPL-3.0-or-later": "INCOMPATIBLE_LICENSE_EXCEPTIONS"
+    }
   }
 }
\ No newline at end of file
diff --git a/oelint_adv/data/mickledore.json b/oelint_adv/data/mickledore.json
index 3318644..7ecba57 100644
--- a/oelint_adv/data/mickledore.json
+++ b/oelint_adv/data/mickledore.json
@@ -1879,6 +1879,30 @@
       "ZSTD_LEGACY_SUPPORT",
       "ZSTD_THREADS",
       ""
-    ]
+    ],
+    "renamed": {
+      "PNBLACKLIST": "SKIP_RECIPE",
+      "CVE_CHECK_PN_WHITELIST": "CVE_CHECK_SKIP_RECIPE",
+      "CVE_CHECK_WHITELIST": "CVE_CHECK_IGNORE",
+      "MULTI_PROVIDER_WHITELIST": "BB_MULTI_PROVIDER_ALLOWED",
+      "SDK_LOCAL_CONF_BLACKLIST": "ESDK_LOCALCONF_REMOVE",
+      "SDK_LOCAL_CONF_WHITELIST": "ESDK_LOCALCONF_ALLOW",
+      "SDK_INHERIT_BLACKLIST": "ESDK_CLASS_INHERIT_DISABLE",
+      "SSTATE_DUPWHITELIST": "SSTATE_ALLOW_OVERLAP_FILES",
+      "SYSROOT_DIRS_BLACKLIST": "SYSROOT_DIRS_IGNORE",
+      "UNKNOWN_CONFIGURE_WHITELIST": "UNKNOWN_CONFIGURE_OPT_IGNORE",
+      "ICECC_USER_CLASS_BL": "ICECC_CLASS_DISABLE",
+      "ICECC_SYSTEM_CLASS_BL": "ICECC_CLASS_DISABLE",
+      "ICECC_USER_PACKAGE_WL": "ICECC_RECIPE_ENABLE",
+      "ICECC_USER_PACKAGE_BL": "ICECC_RECIPE_DISABLE",
+      "ICECC_SYSTEM_PACKAGE_BL": "ICECC_RECIPE_DISABLE",
+      "INHERIT_BLACKLIST": "is a deprecated variable and no longer needed",
+      "TUNEABI_WHITELIST": "is a deprecated variable and support has been removed",
+      "LICENSE_FLAGS_WHITELIST": "LICENSE_FLAGS_ACCEPTED",
+      "WHITELIST_GPL-3.0-only": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_GPL-3.0-or-later": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_LGPL-3.0-only": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_LGPL-3.0-or-later": "INCOMPATIBLE_LICENSE_EXCEPTIONS"
+    }
   }
 }
\ No newline at end of file
diff --git a/oelint_adv/data/nanbield.json b/oelint_adv/data/nanbield.json
index 6748aeb..613fec1 100644
--- a/oelint_adv/data/nanbield.json
+++ b/oelint_adv/data/nanbield.json
@@ -1924,6 +1924,30 @@
       "ZSTD_COMPRESSION_LEVEL",
       "ZSTD_LEGACY_SUPPORT",
       "ZSTD_THREADS"
-    ]
+    ],
+    "renamed": {
+      "PNBLACKLIST": "SKIP_RECIPE",
+      "CVE_CHECK_PN_WHITELIST": "CVE_CHECK_SKIP_RECIPE",
+      "CVE_CHECK_WHITELIST": "CVE_CHECK_IGNORE",
+      "MULTI_PROVIDER_WHITELIST": "BB_MULTI_PROVIDER_ALLOWED",
+      "SDK_LOCAL_CONF_BLACKLIST": "ESDK_LOCALCONF_REMOVE",
+      "SDK_LOCAL_CONF_WHITELIST": "ESDK_LOCALCONF_ALLOW",
+      "SDK_INHERIT_BLACKLIST": "ESDK_CLASS_INHERIT_DISABLE",
+      "SSTATE_DUPWHITELIST": "SSTATE_ALLOW_OVERLAP_FILES",
+      "SYSROOT_DIRS_BLACKLIST": "SYSROOT_DIRS_IGNORE",
+      "UNKNOWN_CONFIGURE_WHITELIST": "UNKNOWN_CONFIGURE_OPT_IGNORE",
+      "ICECC_USER_CLASS_BL": "ICECC_CLASS_DISABLE",
+      "ICECC_SYSTEM_CLASS_BL": "ICECC_CLASS_DISABLE",
+      "ICECC_USER_PACKAGE_WL": "ICECC_RECIPE_ENABLE",
+      "ICECC_USER_PACKAGE_BL": "ICECC_RECIPE_DISABLE",
+      "ICECC_SYSTEM_PACKAGE_BL": "ICECC_RECIPE_DISABLE",
+      "INHERIT_BLACKLIST": "is a deprecated variable and no longer needed",
+      "TUNEABI_WHITELIST": "is a deprecated variable and support has been removed",
+      "LICENSE_FLAGS_WHITELIST": "LICENSE_FLAGS_ACCEPTED",
+      "WHITELIST_GPL-3.0-only": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_GPL-3.0-or-later": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_LGPL-3.0-only": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_LGPL-3.0-or-later": "INCOMPATIBLE_LICENSE_EXCEPTIONS"
+    }
   }
 }
\ No newline at end of file
diff --git a/oelint_adv/data/scarthgap.json b/oelint_adv/data/scarthgap.json
index 440c3f0..7f30f56 100644
--- a/oelint_adv/data/scarthgap.json
+++ b/oelint_adv/data/scarthgap.json
@@ -1940,6 +1940,30 @@
       "ZSTD_DEFAULTS",
       "ZSTD_LEGACY_SUPPORT",
       "ZSTD_THREADS"
-    ]
+    ],
+    "renamed": {
+      "PNBLACKLIST": "SKIP_RECIPE",
+      "CVE_CHECK_PN_WHITELIST": "CVE_CHECK_SKIP_RECIPE",
+      "CVE_CHECK_WHITELIST": "CVE_CHECK_IGNORE",
+      "MULTI_PROVIDER_WHITELIST": "BB_MULTI_PROVIDER_ALLOWED",
+      "SDK_LOCAL_CONF_BLACKLIST": "ESDK_LOCALCONF_REMOVE",
+      "SDK_LOCAL_CONF_WHITELIST": "ESDK_LOCALCONF_ALLOW",
+      "SDK_INHERIT_BLACKLIST": "ESDK_CLASS_INHERIT_DISABLE",
+      "SSTATE_DUPWHITELIST": "SSTATE_ALLOW_OVERLAP_FILES",
+      "SYSROOT_DIRS_BLACKLIST": "SYSROOT_DIRS_IGNORE",
+      "UNKNOWN_CONFIGURE_WHITELIST": "UNKNOWN_CONFIGURE_OPT_IGNORE",
+      "ICECC_USER_CLASS_BL": "ICECC_CLASS_DISABLE",
+      "ICECC_SYSTEM_CLASS_BL": "ICECC_CLASS_DISABLE",
+      "ICECC_USER_PACKAGE_WL": "ICECC_RECIPE_ENABLE",
+      "ICECC_USER_PACKAGE_BL": "ICECC_RECIPE_DISABLE",
+      "ICECC_SYSTEM_PACKAGE_BL": "ICECC_RECIPE_DISABLE",
+      "INHERIT_BLACKLIST": "is a deprecated variable and no longer needed",
+      "TUNEABI_WHITELIST": "is a deprecated variable and support has been removed",
+      "LICENSE_FLAGS_WHITELIST": "LICENSE_FLAGS_ACCEPTED",
+      "WHITELIST_GPL-3.0-only": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_GPL-3.0-or-later": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_LGPL-3.0-only": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_LGPL-3.0-or-later": "INCOMPATIBLE_LICENSE_EXCEPTIONS"
+    }
   }
 }
\ No newline at end of file
diff --git a/oelint_adv/data/styhead.json b/oelint_adv/data/styhead.json
index 7b4cf61..bfa4ecd 100644
--- a/oelint_adv/data/styhead.json
+++ b/oelint_adv/data/styhead.json
@@ -1950,6 +1950,33 @@
       "ZSTD_DEFAULTS",
       "ZSTD_LEGACY_SUPPORT",
       "ZSTD_THREADS"
-    ]
+    ],
+    "renamed": {
+      "PNBLACKLIST": "SKIP_RECIPE",
+      "CVE_CHECK_PN_WHITELIST": "CVE_CHECK_SKIP_RECIPE",
+      "CVE_CHECK_WHITELIST": "CVE_CHECK_IGNORE",
+      "MULTI_PROVIDER_WHITELIST": "BB_MULTI_PROVIDER_ALLOWED",
+      "SDK_LOCAL_CONF_BLACKLIST": "ESDK_LOCALCONF_REMOVE",
+      "SDK_LOCAL_CONF_WHITELIST": "ESDK_LOCALCONF_ALLOW",
+      "SDK_INHERIT_BLACKLIST": "ESDK_CLASS_INHERIT_DISABLE",
+      "SSTATE_DUPWHITELIST": "SSTATE_ALLOW_OVERLAP_FILES",
+      "SYSROOT_DIRS_BLACKLIST": "SYSROOT_DIRS_IGNORE",
+      "UNKNOWN_CONFIGURE_WHITELIST": "UNKNOWN_CONFIGURE_OPT_IGNORE",
+      "ICECC_USER_CLASS_BL": "ICECC_CLASS_DISABLE",
+      "ICECC_SYSTEM_CLASS_BL": "ICECC_CLASS_DISABLE",
+      "ICECC_USER_PACKAGE_WL": "ICECC_RECIPE_ENABLE",
+      "ICECC_USER_PACKAGE_BL": "ICECC_RECIPE_DISABLE",
+      "ICECC_SYSTEM_PACKAGE_BL": "ICECC_RECIPE_DISABLE",
+      "INHERIT_BLACKLIST": "is a deprecated variable and no longer needed",
+      "TUNEABI_WHITELIST": "is a deprecated variable and support has been removed",
+      "LICENSE_FLAGS_WHITELIST": "LICENSE_FLAGS_ACCEPTED",
+      "TCLIBCAPPEND": "is no longer used, modify TMPDIR directly if required",
+      "VOLATILE_LOG_DIR": "is obsolete and no longer supported",
+      "VOLATILE_TMP_DIR": "is obsolete and no longer supported",
+      "WHITELIST_GPL-3.0-only": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_GPL-3.0-or-later": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_LGPL-3.0-only": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_LGPL-3.0-or-later": "INCOMPATIBLE_LICENSE_EXCEPTIONS"
+    }
   }
 }
\ No newline at end of file
diff --git a/oelint_adv/data/walnascar.json b/oelint_adv/data/walnascar.json
index ba7adba..03dd378 100644
--- a/oelint_adv/data/walnascar.json
+++ b/oelint_adv/data/walnascar.json
@@ -1953,6 +1953,34 @@
       "ZSTD_DEFAULTS",
       "ZSTD_LEGACY_SUPPORT",
       "ZSTD_THREADS"
-    ]
+    ],
+    "renamed": {
+      "BB_DANGLINGAPPENDS_WARNONLY": "support for the variable was removed as it unconditionally affects all layers",
+      "PNBLACKLIST": "SKIP_RECIPE",
+      "CVE_CHECK_PN_WHITELIST": "CVE_CHECK_SKIP_RECIPE",
+      "CVE_CHECK_WHITELIST": "CVE_CHECK_IGNORE",
+      "MULTI_PROVIDER_WHITELIST": "BB_MULTI_PROVIDER_ALLOWED",
+      "SDK_LOCAL_CONF_BLACKLIST": "ESDK_LOCALCONF_REMOVE",
+      "SDK_LOCAL_CONF_WHITELIST": "ESDK_LOCALCONF_ALLOW",
+      "SDK_INHERIT_BLACKLIST": "ESDK_CLASS_INHERIT_DISABLE",
+      "SSTATE_DUPWHITELIST": "SSTATE_ALLOW_OVERLAP_FILES",
+      "SYSROOT_DIRS_BLACKLIST": "SYSROOT_DIRS_IGNORE",
+      "UNKNOWN_CONFIGURE_WHITELIST": "UNKNOWN_CONFIGURE_OPT_IGNORE",
+      "ICECC_USER_CLASS_BL": "ICECC_CLASS_DISABLE",
+      "ICECC_SYSTEM_CLASS_BL": "ICECC_CLASS_DISABLE",
+      "ICECC_USER_PACKAGE_WL": "ICECC_RECIPE_ENABLE",
+      "ICECC_USER_PACKAGE_BL": "ICECC_RECIPE_DISABLE",
+      "ICECC_SYSTEM_PACKAGE_BL": "ICECC_RECIPE_DISABLE",
+      "INHERIT_BLACKLIST": "is a deprecated variable and no longer needed",
+      "TUNEABI_WHITELIST": "is a deprecated variable and support has been removed",
+      "LICENSE_FLAGS_WHITELIST": "LICENSE_FLAGS_ACCEPTED",
+      "TCLIBCAPPEND": "is no longer used, modify TMPDIR directly if required",
+      "VOLATILE_LOG_DIR": "is obsolete and no longer supported",
+      "VOLATILE_TMP_DIR": "is obsolete and no longer supported",
+      "WHITELIST_GPL-3.0-only": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_GPL-3.0-or-later": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_LGPL-3.0-only": "INCOMPATIBLE_LICENSE_EXCEPTIONS",
+      "WHITELIST_LGPL-3.0-or-later": "INCOMPATIBLE_LICENSE_EXCEPTIONS"
+    }
   }
 }
\ No newline at end of file
diff --git a/oelint_adv/rule_base/rule_tasks_network.py b/oelint_adv/rule_base/rule_tasks_network.py
new file mode 100644
index 0000000..a420576
--- /dev/null
+++ b/oelint_adv/rule_base/rule_tasks_network.py
@@ -0,0 +1,30 @@
+from typing import List, Tuple
+
+from oelint_parser.cls_item import FlagAssignment, Function
+from oelint_parser.cls_stash import Stash
+from oelint_parser.constants import CONSTANTS
+
+from oelint_adv.cls_rule import Rule
+
+
+class TaskNetwork(Rule):
+    def __init__(self) -> None:
+        super().__init__(id='oelint.task.network',
+                         severity='warning',
+                         message='Task \'{FUNC}\' uses the network flag, that can lead to unpredictable results',
+                         valid_from_release='kirkstone')
+
+    def check(self, _file: str, stash: Stash) -> List[Tuple[str, int, str]]:
+        res = []
+        task_names = {x.FuncName for x in stash.GetItemsFor(filename=_file, classifier=Function.CLASSIFIER)}
+        task_names.update(CONSTANTS.FunctionsKnown)
+        for item in stash.GetItemsFor(filename=_file,
+                                      classifier=FlagAssignment.CLASSIFIER,
+                                      attribute=FlagAssignment.ATTR_NAME,
+                                      attributeValue=task_names):
+            if item.VarName in ['do_fetch']:
+                continue
+            if item.Flag in ['network'] and item.ValueStripped not in ['0']:
+                res += self.finding(item.Origin, item.InFileLine,
+                                    self.Msg.replace('{FUNC}', item.VarName))
+        return res
diff --git a/oelint_adv/rule_base/rule_var_imagefeatures_bad.py b/oelint_adv/rule_base/rule_var_imagefeatures_bad.py
new file mode 100644
index 0000000..c01213a
--- /dev/null
+++ b/oelint_adv/rule_base/rule_var_imagefeatures_bad.py
@@ -0,0 +1,46 @@
+from typing import List, Tuple
+
+from oelint_parser.cls_item import Variable
+from oelint_parser.cls_stash import Stash
+
+from oelint_adv.cls_rule import Rule
+
+
+class ImageFeaturesBad(Rule):
+    def __init__(self) -> None:
+        self._map = {
+            'allow-empty-password': ('warning', 'that is a security risk. Users can have accounts without password protection'),
+            'allow-root-login': ('info', 'that is a security risk. Root can login into the system'),
+            'dbg-pkgs': ('info', 'that exposes sensitive information. Use debuginfod instead'),
+            'debug-tweaks': ('warning', 'that is a security risk. Allows limitless access without authentication'),
+            'dev-pkgs': ('info', 'that is not recommended, as it bloats the image. Do not use in production'),
+            'eclipse-debug': ('info', 'installs debugging tools that could expose sensitive information. Do not use in production'),
+            'empty-root-password': ('warning', 'that is a security risk. Anyone can authenticate as root over serial without a password'),
+            'post-install-logging': ('info', 'that could expose sensitive information. Not recommended for production'),
+            'ptest-pkgs': ('info', 'that bloats the image. Never use in production'),
+            'serial-autologin-root': ('warning', 'that is a security risk. Automatically logs in a root'),
+            'staticdev-pkgs': ('info', 'that is not recommended, as it bloats the image. Do not use in production'),
+            'tools-debug': ('info', 'installs debugging tools that could expose sensitive information. Do not use in production'),
+        }
+        super().__init__(id='oelint.var.badimagefeature',
+                         severity='warning',
+                         message='{var} contains \'{feature}\', {reason}',
+                         appendix=list(self._map.keys()))
+
+    def check(self, _file: str, stash: Stash) -> List[Tuple[str, int, str]]:
+        res = []
+        for item in stash.GetItemsFor(filename=_file,
+                                      classifier=Variable.CLASSIFIER,
+                                      attribute=Variable.ATTR_VAR,
+                                      attributeValue=("IMAGE_FEATURES", "EXTRA_IMAGE_FEATURES")):
+            if 'remove' in item.SubItems:
+                continue
+            items = item.get_items()
+            for k, v in self._map.items():
+                if k in items:
+                    severity, reason = v
+                    res += self.finding(item.Origin, item.InFileLine,
+                                        self.Msg.format(var=item.VarName, feature=k, reason=reason),
+                                        appendix=k,
+                                        severity_override=severity)
+        return res
diff --git a/oelint_adv/rule_base/rule_var_renamed.py b/oelint_adv/rule_base/rule_var_renamed.py
new file mode 100644
index 0000000..a690856
--- /dev/null
+++ b/oelint_adv/rule_base/rule_var_renamed.py
@@ -0,0 +1,52 @@
+from typing import List, Tuple
+
+from oelint_parser.cls_item import Variable
+from oelint_parser.cls_stash import Stash
+from oelint_parser.constants import CONSTANTS
+
+from oelint_adv.cls_rule import Rule
+
+
+class VarsRenamed(Rule):
+    def __init__(self) -> None:
+        self._map = CONSTANTS.GetByPath('variables/renamed')
+        super().__init__(id='oelint.vars.renamed',
+                         severity='error',
+                         message='{var} {reason}',
+                         valid_from_release='kirkstone')
+
+    def __getMatches(self, _file: str, stash: Stash) -> List[Variable]:
+        items: List[Variable] = stash.GetItemsFor(filename=_file,
+                                                  classifier=Variable.CLASSIFIER,
+                                                  attribute=Variable.ATTR_VAR,
+                                                  attributeValue=list(self._map.keys()))
+        return items
+
+    def check(self, _file: str, stash: Stash) -> List[Tuple[str, int, str]]:
+        res = []
+        for i in self.__getMatches(_file, stash):
+            message = self._map[i.VarName]
+            if ' ' not in message:
+                message = f'got renamed to {message}'
+            res += self.finding(i.Origin, i.InFileLine,
+                                self.Msg.format(var=i.VarName, reason=message))
+        return res
+
+    def fix(self, _file: str, stash: Stash) -> List[str]:
+        res = []
+        for i in self.__getMatches(_file, stash):
+            rename = self._map[i.VarName]
+            if ' ' not in rename:
+                stash.Remove(i)
+                i.RealRaw = i.RealRaw.replace(i.VarName, rename)
+                i.Raw = i.Raw.replace(i.VarName, rename)
+                i = Variable(i.Origin,
+                             i.Line,
+                             i.InFileLine,
+                             i.Raw, rename,
+                             i.VarValue,
+                             i.VarOp,
+                             i.RealRaw, i.IsNewStyleOverrideSyntax)
+                stash.Append(i)
+                res.append(_file)
+        return res
diff --git a/requirements.txt b/requirements.txt
index 1f0d5d0..5dc50f5 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,5 +1,5 @@
 anytree ~= 2.12
 argcomplete ~= 3.5
 colorama ~= 0.4
-oelint-parser ~= 6.3
+oelint-parser ~= 6.4
 urllib3 ~= 2.2
\ No newline at end of file
diff --git a/scripts/bitbake-listflags b/scripts/bitbake-listflags
new file mode 100755
index 0000000..f524b18
--- /dev/null
+++ b/scripts/bitbake-listflags
@@ -0,0 +1,54 @@
+#! /usr/bin/env python3
+# Copyright (C) 2021 Richard Purdie
+# Copyright (c) 2024, Konrad Weihmann
+# SPDX-License-Identifier: GPL-2.0-only
+
+# Based on bitbake-getvar
+# Lists all defined flags of a variable
+
+import argparse
+import os
+import sys
+import warnings
+
+
+def main(args=None):
+    parser = argparse.ArgumentParser(description="Bitbake List Flags")
+    parser.add_argument(
+        '-q', '--quiet', help='Silence bitbake server logging', action="store_true")
+    parser.add_argument('-v', '--value', action='store_true',
+                        help='Print with value')
+    parser.add_argument('bitbake', help='Path to bitbake binary')
+    parser.add_argument('var', help='Variable to poll for')
+    args = parser.parse_args()
+
+    bindir = os.path.dirname(args.bitbake)
+    topdir = os.path.dirname(bindir)
+    sys.path[0:0] = [os.path.join(topdir, 'lib')]
+
+    import bb.tinfoil
+
+    quiet = args.quiet
+    with bb.tinfoil.Tinfoil(tracking=True, setup_logging=not quiet) as tinfoil:
+        tinfoil.prepare(quiet=2, config_only=True)
+        d = tinfoil.config_data
+
+        for k, v in d.getVarFlags(args.var).items():
+            if ':' in k:
+                continue
+            if k.startswith('_'):
+                continue
+            if args.value:
+                yield (k, v)
+            else:
+                yield k
+
+
+if __name__ == "__main__":
+    warnings.simplefilter("default")
+    result = main()
+    for item in result:
+        if isinstance(item, tuple):
+            print(f'{item[0]}@{item[1]}')
+        else:
+            print(item)
diff --git a/scripts/generate-knownvars b/scripts/generate-variables
similarity index 60%
rename from scripts/generate-knownvars
rename to scripts/generate-variables
index f73b0ff..a29eeff 100755
--- a/scripts/generate-knownvars
+++ b/scripts/generate-variables
@@ -24,7 +24,7 @@ args = create_argparser()
 
 with tempfile.TemporaryDirectory() as t:
     subprocess.run(['git', 'clone', 'https://git.yoctoproject.org/poky', '--single-branch', '-b', args.branch], cwd=t)
-    output = subprocess.check_output(
+    output_known = subprocess.check_output(
         f'source poky/oe-init-build-env > /dev/null 2>&1 && {basepath}/bitbake-listvars -q -a $(which bitbake)',
         shell=True,
         universal_newlines=True,
@@ -32,16 +32,38 @@ with tempfile.TemporaryDirectory() as t:
         cwd=t
     )
 
+    output_renamed = subprocess.check_output(
+        f'source poky/oe-init-build-env > /dev/null 2>&1 && {basepath}/bitbake-listflags -v $(which bitbake) BB_RENAMED_VARIABLES',
+        shell=True,
+        universal_newlines=True,
+        executable='/bin/bash',
+        cwd=t
+    )
+
     if args.branch == 'master':
         # for master override the name
         from oelint_adv.tweaks import Tweaks
         args.destination = os.path.join(os.path.dirname(args.destination), Tweaks.DEVELOPMENT_RELEASE + '.json')
 
-    output = output.split('\n')
+    output_known = output_known.split('\n')
     # filter out those pesky server reconnect message
     # and other warnings
-    output = [x for x in output if ':' not in x and x]
+    output_known = [x for x in output_known if ':' not in x and x]
+
+    output_renamed = output_renamed.split('\n')
+    # filter out those pesky server reconnect message
+    # and other warnings
+    output_renamed = [x for x in output_renamed if ':' not in x and x]
+
+    obj = {
+        'variables': {
+            'known': output_known,
+            'renamed': {}}
+    }
+
+    for line in output_renamed:
+        k, v = line.split('@', 1)
+        obj['variables']['renamed'][k] = v
 
     with open(args.destination, 'w') as o:
-        obj = {'variables': {'known': output}}
         json.dump(obj, o, indent=2)


Test patch:
diff --git a/tests/README.md b/tests/README.md
index 63058c5..8f3e367 100644
--- a/tests/README.md
+++ b/tests/README.md
@@ -8,3 +8,104 @@ pip3 install -r requirements-dev.txt
 
 `oelint-adv` tests are built around `pytest`. Running `pytest` will execute all available tests.
 Note, that test fail when coverage drops below 100 %.
+
+## Adding a new test
+
+Every test is organized in test classes derived from ``TestBaseClass``
+
+```python
+
+from .base import TestBaseClass
+
+class TestClassMyNewTests(TestBaseClass):
+    ...
+```
+
+now functions prefixed with ``test_`` can be added to this class
+
+```python
+
+from .base import TestBaseClass
+
+class TestClassMyNewTests(TestBaseClass):
+    
+    def test_mynewtest(self):
+        ...
+```
+
+### TestBaseClass
+
+#### Creating CLI arguments
+
+to create the CLI arguments for ``oelint-adv`` use
+
+```python
+self._create_args(input_)
+```
+
+``_input`` is a dictionary of filenames and content.
+
+The ``_create_args`` function will then create temporary files with said content.
+
+Optional arguments can be passed as a list of strings using
+
+```python
+self._create_args(input_, ['my', 'extra', 'arguments'])
+```
+
+#### Checking for a finding
+
+To check if a finding was found ``check_for_id`` can be used
+
+```python
+self.check_for_id(arguments, id_to_check_for, number_of_occurrences)
+```
+
+e.g.
+
+```python
+self.check_for_id(self._create_args(input_), 'oelint.exportfunction.dash', 1)
+```
+
+checks the input an tests if the provided input file(s) produce exactly one report of
+``oelint.exportfunction.dash``
+
+#### Test automatic fixing
+
+To test if automated fixing is working ``fix_and_check`` can be used
+
+e.g.
+
+```python
+self.fix_and_check(self._create_args(input_), 'oelint.exportfunction.dash')
+```
+
+test if after automatic fixing exactly no reports of ``oelint.exportfunction.dash`` are found
+
+### Using pytest.parametrize
+
+to test different variation of inputs, ``pytest.parametrize`` is used widely
+
+e.g.
+
+```python
+@pytest.mark.parametrize('id_', ['oelint.file.includenotfound'])
+@pytest.mark.parametrize('occurrence', [1])
+@pytest.mark.parametrize('input_',
+                            [
+                                {
+                                    'oelint_adv_test.bb': 'include oelint_adv_test.inc',
+                                },
+                                {
+                                    'oelint_adv_test.bb': 'include oelint_adv_test2.inc',
+                                },
+                            ],
+                            )
+def test_bad(self, input_, id_, occurrence):
+    self.check_for_id(self._create_args(input_), id_, occurrence)
+```
+
+would run the check for all instances of inputs found in ``@pytest.mark.parametrize('input_'``.
+
+This can be used to reduce the amount of test functions written.
+Pytest will automatically generate instance for all permutations of configured inputs.
diff --git a/tests/test_class_oelint_task_network.py b/tests/test_class_oelint_task_network.py
new file mode 100644
index 0000000..229a9fc
--- /dev/null
+++ b/tests/test_class_oelint_task_network.py
@@ -0,0 +1,97 @@
+import pytest  # noqa: I900
+
+from .base import TestBaseClass
+
+
+class TestClassOelintNetwork(TestBaseClass):
+
+    @pytest.mark.parametrize('id_', ['oelint.task.network'])
+    @pytest.mark.parametrize('occurrence', [1])
+    @pytest.mark.parametrize('input_',
+                             [
+                                 {
+                                     'oelint_adv_test.bb':
+                                     '''
+                                     do_install[network] = "1"
+                                     ''',
+                                 },
+                                 {
+                                     'oelint_adv_test.bb':
+                                     '''
+                                     do_something() {
+                                        :
+                                     }
+
+                                     do_something[network] = "1"
+                                     ''',
+                                 },
+                                 {
+                                     'oelint_adv_test.bb':
+                                     '''
+                                     do_compile[network] = "1"
+                                     ''',
+                                 },
+                             ],
+                             )
+    def test_bad(self, input_, id_, occurrence):
+        self.check_for_id(self._create_args(input_), id_, occurrence)
+
+    @pytest.mark.parametrize('id_', ['oelint.task.network'])
+    @pytest.mark.parametrize('occurrence', [0])
+    @pytest.mark.parametrize('input_',
+                             [
+                                 {
+                                     'oelint_adv_test.bb':
+                                     '''
+                                     do_install[network] = "1"
+                                     ''',
+                                 },
+                                 {
+                                     'oelint_adv_test.bb':
+                                     '''
+                                     do_something() {
+                                        :
+                                     }
+
+                                     do_something[network] = "1"
+                                     ''',
+                                 },
+                                 {
+                                     'oelint_adv_test.bb':
+                                     '''
+                                     do_compile[network] = "1"
+                                     ''',
+                                 },
+                             ],
+                             )
+    def test_older_releases(self, input_, id_, occurrence):
+        self.check_for_id(self._create_args(input_, ['--release=dunfell']), id_, occurrence)
+
+    @pytest.mark.parametrize('id_', ['oelint.task.network'])
+    @pytest.mark.parametrize('occurrence', [0])
+    @pytest.mark.parametrize('input_',
+                             [
+                                 {
+                                     'oelint_adv_test.bb':
+                                     '''
+                                     do_install[network] = "0"
+                                     ''',
+                                 },
+                                 {
+                                     'oelint_adv_test.bb':
+                                     '''
+                                     do_fetch[network] = "1"
+                                     ''',
+                                 },
+                                 {
+                                     'oelint_adv_test.bb':
+                                     '''
+                                     do_something() {
+                                        :
+                                     }
+                                     ''',
+                                 },
+                             ],
+                             )
+    def test_good(self, input_, id_, occurrence):
+        self.check_for_id(self._create_args(input_), id_, occurrence)
diff --git a/tests/test_class_oelint_var_badimagefeatures.py b/tests/test_class_oelint_var_badimagefeatures.py
new file mode 100644
index 0000000..0d2251e
--- /dev/null
+++ b/tests/test_class_oelint_var_badimagefeatures.py
@@ -0,0 +1,71 @@
+import pytest  # noqa: I900
+
+from .base import TestBaseClass
+
+
+class TestClassOelintVarLicenseRemoteFile(TestBaseClass):
+
+    def _generate_code(self, var, feature, suffix=''):
+        return {'oelint_test.bb': f'{var}{suffix} = "{feature}"'}
+
+    @pytest.mark.parametrize('id_', ['oelint.var.badimagefeature'])
+    @pytest.mark.parametrize('occurrence', [1])
+    @pytest.mark.parametrize('var', ["IMAGE_FEATURES", "EXTRA_IMAGE_FEATURES"])
+    @pytest.mark.parametrize('feature', ['allow-empty-password',
+                                         'allow-root-login',
+                                         'dbg-pkgs',
+                                         'debug-tweaks',
+                                         'dev-pkgs',
+                                         'eclipse-debug',
+                                         'empty-root-password',
+                                         'post-install-logging',
+                                         'ptest-pkgs',
+                                         'serial-autologin-root',
+                                         'staticdev-pkgs',
+                                         'tools-debug'])
+    def test_bad(self, var, feature, id_, occurrence):
+        self.check_for_id(self._create_args(self._generate_code(var, feature)), f'{id_}.{feature}', occurrence)
+
+    @pytest.mark.parametrize('id_', ['oelint.var.badimagefeature'])
+    @pytest.mark.parametrize('occurrence', [0])
+    @pytest.mark.parametrize('var', ["IMAGE_FEATURES", "EXTRA_IMAGE_FEATURES"])
+    @pytest.mark.parametrize('feature', ['weston',
+                                         'x11',
+                                         'x11-base',
+                                         'x11-sato',
+                                         'tools-profile',
+                                         'tools-testapps',
+                                         'tools-sdk',
+                                         'nfs-server',
+                                         'nfs-client',
+                                         'ssh-server-dropbear',
+                                         'ssh-server-openssh',
+                                         'hwcodecs',
+                                         'package-management',
+                                         'lic-pkgs',
+                                         'doc-pkgs',
+                                         'bash-completion-pkgs',
+                                         'read-only-rootfs',
+                                         'stateless-rootfs',
+                                         'splash'])
+    def test_good(self, var, feature, id_, occurrence):
+        self.check_for_id(self._create_args(self._generate_code(var, feature)), f'{id_}.{feature}', occurrence)
+
+    @pytest.mark.parametrize('id_', ['oelint.var.badimagefeature'])
+    @pytest.mark.parametrize('occurrence', [0])
+    @pytest.mark.parametrize('var', ["IMAGE_FEATURES", "EXTRA_IMAGE_FEATURES"])
+    @pytest.mark.parametrize('feature', ['allow-empty-password',
+                                         'allow-root-login',
+                                         'dbg-pkgs',
+                                         'debug-tweaks',
+                                         'dev-pkgs',
+                                         'eclipse-debug',
+                                         'empty-root-password',
+                                         'post-install-logging',
+                                         'ptest-pkgs',
+                                         'serial-autologin-root',
+                                         'staticdev-pkgs',
+                                         'tools-debug'])
+    def test_good_remove(self, var, feature, id_, occurrence):
+        self.check_for_id(self._create_args(self._generate_code(
+            var, feature, suffix=':remove')), f'{id_}.{feature}', occurrence)
diff --git a/tests/test_class_oelint_var_renamed.py b/tests/test_class_oelint_var_renamed.py
new file mode 100644
index 0000000..18fde9f
--- /dev/null
+++ b/tests/test_class_oelint_var_renamed.py
@@ -0,0 +1,103 @@
+import pytest  # noqa: I900
+
+from .base import TestBaseClass
+
+
+class TestClassOelintVarsRenamed(TestBaseClass):
+
+    def _generate_code(self, var):
+        return {'oelint_test.bb': f'{var} = "1"'}
+
+    @pytest.mark.parametrize('id_', ['oelint.vars.renamed'])
+    @pytest.mark.parametrize('occurrence', [1])
+    @pytest.mark.parametrize('var', ['PNBLACKLIST',
+                                     'CVE_CHECK_PN_WHITELIST',
+                                     'CVE_CHECK_WHITELIST',
+                                     'MULTI_PROVIDER_WHITELIST',
+                                     'SDK_LOCAL_CONF_BLACKLIST',
+                                     'SDK_LOCAL_CONF_WHITELIST',
+                                     'SDK_INHERIT_BLACKLIST',
+                                     'SSTATE_DUPWHITELIST',
+                                     'SYSROOT_DIRS_BLACKLIST',
+                                     'UNKNOWN_CONFIGURE_WHITELIST',
+                                     'ICECC_USER_CLASS_BL',
+                                     'ICECC_SYSTEM_CLASS_BL',
+                                     'ICECC_USER_PACKAGE_WL',
+                                     'ICECC_USER_PACKAGE_BL',
+                                     'ICECC_SYSTEM_PACKAGE_BL',
+                                     'INHERIT_BLACKLIST',
+                                     'TUNEABI_WHITELIST',
+                                     'LICENSE_FLAGS_WHITELIST',
+                                     'TCLIBCAPPEND',
+                                     'VOLATILE_LOG_DIR',
+                                     'VOLATILE_TMP_DIR',
+                                     'WHITELIST_GPL-3.0-only',
+                                     'WHITELIST_GPL-3.0-or-later',
+                                     'WHITELIST_LGPL-3.0-only',
+                                     'WHITELIST_LGPL-3.0-or-later'])
+    def test_bad(self, var, id_, occurrence):
+        self.check_for_id(self._create_args(self._generate_code(var)), id_, occurrence)
+
+    @pytest.mark.parametrize('id_', ['oelint.vars.renamed'])
+    @pytest.mark.parametrize('occurrence', [0])
+    @pytest.mark.parametrize('var', ['PNBLACKLIST',
+                                     'CVE_CHECK_PN_WHITELIST',
+                                     'CVE_CHECK_WHITELIST',
+                                     'MULTI_PROVIDER_WHITELIST',
+                                     'SDK_LOCAL_CONF_BLACKLIST',
+                                     'SDK_LOCAL_CONF_WHITELIST',
+                                     'SDK_INHERIT_BLACKLIST',
+                                     'SSTATE_DUPWHITELIST',
+                                     'SYSROOT_DIRS_BLACKLIST',
+                                     'UNKNOWN_CONFIGURE_WHITELIST',
+                                     'ICECC_USER_CLASS_BL',
+                                     'ICECC_SYSTEM_CLASS_BL',
+                                     'ICECC_USER_PACKAGE_WL',
+                                     'ICECC_USER_PACKAGE_BL',
+                                     'ICECC_SYSTEM_PACKAGE_BL',
+                                     'INHERIT_BLACKLIST',
+                                     'TUNEABI_WHITELIST',
+                                     'LICENSE_FLAGS_WHITELIST',
+                                     'TCLIBCAPPEND',
+                                     'VOLATILE_LOG_DIR',
+                                     'VOLATILE_TMP_DIR',
+                                     'WHITELIST_GPL-3.0-only',
+                                     'WHITELIST_GPL-3.0-or-later',
+                                     'WHITELIST_LGPL-3.0-only',
+                                     'WHITELIST_LGPL-3.0-or-later'])
+    def test_bad_older_release(self, var, id_, occurrence):
+        self.check_for_id(self._create_args(self._generate_code(var), ['--release=dunfell']), id_, occurrence)
+
+    @pytest.mark.parametrize('id_', ['oelint.vars.renamed'])
+    @pytest.mark.parametrize('var', ['PNBLACKLIST',
+                                     'CVE_CHECK_PN_WHITELIST',
+                                     'CVE_CHECK_WHITELIST',
+                                     'MULTI_PROVIDER_WHITELIST',
+                                     'SDK_LOCAL_CONF_BLACKLIST',
+                                     'SDK_LOCAL_CONF_WHITELIST',
+                                     'SDK_INHERIT_BLACKLIST',
+                                     'SSTATE_DUPWHITELIST',
+                                     'SYSROOT_DIRS_BLACKLIST',
+                                     'UNKNOWN_CONFIGURE_WHITELIST',
+                                     'ICECC_USER_CLASS_BL',
+                                     'ICECC_SYSTEM_CLASS_BL',
+                                     'ICECC_USER_PACKAGE_WL',
+                                     'ICECC_USER_PACKAGE_BL',
+                                     'ICECC_SYSTEM_PACKAGE_BL',
+                                     'LICENSE_FLAGS_WHITELIST',
+                                     'WHITELIST_GPL-3.0-only',
+                                     'WHITELIST_GPL-3.0-or-later',
+                                     'WHITELIST_LGPL-3.0-only',
+                                     'WHITELIST_LGPL-3.0-or-later'])
+    def test_fix(self, var, id_):
+        self.fix_and_check(self._create_args_fix(self._generate_code(var)), id_)
+
+    @pytest.mark.parametrize('id_', ['oelint.vars.renamed'])
+    @pytest.mark.parametrize('occurrence', [1])
+    @pytest.mark.parametrize('var', ['INHERIT_BLACKLIST',
+                                     'TUNEABI_WHITELIST',
+                                     'TCLIBCAPPEND',
+                                     'VOLATILE_LOG_DIR',
+                                     'VOLATILE_TMP_DIR'])
+    def test_bad_unfixable(self, var, id_, occurrence):
+        self.check_for_id(self._create_args_fix(self._generate_code(var)), id_, occurrence)