diff --git a/RECOVERY.md b/RECOVERY.md
index cb63be4..51fe304 100644
--- a/RECOVERY.md
+++ b/RECOVERY.md
@@ -16,7 +16,7 @@ The repository is the source of truth for the project.
Read files in this order:
-```text
+```
1. README.md
2. RECOVERY.md
3. dotemacs
@@ -35,13 +35,13 @@ The user’s `.emacs` setup already loads the Linux+ system.
The repository may contain a copy of that file named:
-```text
+```
dotemacs
```
The relevant startup code is:
-```elisp
+```
;; Load custom Elisp
(let ((dir "~/.emacs.d/lisp/linuxplus/"))
(add-to-list 'load-path dir)
@@ -51,13 +51,13 @@ The relevant startup code is:
Therefore, after saving new lesson or quiz files into:
-```text
+```
~/.emacs.d/lisp/linuxplus/
```
the correct refresh step is:
-```text
+```
M-x linuxplus-load-all
```
@@ -67,13 +67,13 @@ Do not tell the user to manually add the directory to `load-path`, manually load
The loader file is:
-```text
+```
linuxplus-load-all.el
```
The function:
-```text
+```
linuxplus-load-all
```
@@ -89,7 +89,7 @@ The current convention uses consecutive numbers for each lesson/quiz pair.
Example:
-```text
+```
102-user-management-lesson.el
103-user-management-quiz.el
```
@@ -98,7 +98,7 @@ The next topic should use the next unused lesson number and the next unused quiz
Example:
-```text
+```
104-storage-lvm-quotas-lesson.el
105-storage-lvm-quotas-quiz.el
```
@@ -120,13 +120,13 @@ A lesson file should:
Avoid this problem:
-```elisp
+```
explicit-shell-file-name
```
Use a safer shell fallback pattern based on current repository style, such as:
-```elisp
+```
(or shell-file-name (getenv "SHELL") "/bin/sh")
```
@@ -137,8 +137,11 @@ The exact buffer names and formatting should follow the highest-numbered current
A quiz file should:
* use the established numbered filename format
+
* define one interactive quiz function
+
* call `linuxplus-start-quiz`
+
* pass exactly three arguments:
1. the lesson function symbol
@@ -147,7 +150,7 @@ A quiz file should:
The expected call shape is:
-```elisp
+```
(linuxplus-start-quiz
'linuxplus-NNN-topic-name-lesson
'((:type true-false
@@ -158,7 +161,7 @@ The expected call shape is:
Supported question types include:
-```text
+```
true-false
yes-no
multiple
@@ -170,7 +173,7 @@ For multiple-choice questions, inspect `06-linuxplus-quiz-mode.el` and the highe
The user will maintain:
-```text
+```
STUDY.md
```
@@ -182,7 +185,7 @@ Prefer paraphrased concepts over exact copyrighted question text.
Good format:
-```text
+```
Missed area: LVM volume groups
Correct concept: vgcreate creates a volume group.
Exam trap: lvcreate creates a logical volume, not a volume group.
@@ -194,7 +197,7 @@ Future lessons should prioritize weak areas listed in `STUDY.md`.
Previously discussed weak areas included topics such as:
-```text
+```
systemd and PID 1
GRUB2
LVM
@@ -231,29 +234,21 @@ To add a new topic:
4. Create a lesson file:
- ```text
NNN-topic-name-lesson.el
- ```
5. Create the matching quiz file:
- ```text
NNN+1-topic-name-quiz.el
- ```
6. Keep the lesson and quiz focused on one topic.
7. Save both files in:
- ```text
~/.emacs.d/lisp/linuxplus/
- ```
8. Tell the user to run:
- ```text
M-x linuxplus-load-all
- ```
9. Then tell the user to run the new lesson and quiz functions.
@@ -274,23 +269,47 @@ When helping with this project:
## Goal
The goal is to help the user make steady Linux+ certification progress through targeted, topic-based, Emacs-integrated lessons and quizzes.
+
## RECOVERY maintenance update - 2026-07-09
-Created a targeted review lesson pair based on missed Linux+ firewall
-book questions:
+Corrected the firewall review lesson pair to follow the repository numbering and loader conventions.
-- `linuxplus-lesson-120.el`
-- `linuxplus-quiz-120.el`
+Remove these incorrectly named files:
-Lesson 120 covers firewall ACLs, packet inspection, persistent
-configuration files, stateful firewall review points, firewalld runtime
-to permanent configuration, numbered UFW rules, simple UFW SSH blocking,
-DenyHosts, and Fail2Ban.
+* `linuxplus-lesson-120.el`
+* `linuxplus-quiz-120.el`
-Quiz 120 uses only true/false, yes/no, and single-choice questions.
-The lesson keeps text above an `ansi-term` buffer and includes GNU
-Emacs on GNU/Linux audio practice with `espeak-ng` and `espeak`.
+Create these replacement files:
-Include the book's expected wording, but preserve the real-world note
-that DenyHosts is strongly associated with `/etc/hosts.deny`, while
-Fail2Ban commonly blocks through firewall actions.
+* `104-firewall-review-lesson.el`
+* `105-firewall-review-quiz.el`
+
+Reason for correction:
+
+* `linuxplus-load-all.el` loads numbered Emacs Lisp files.
+* Lesson and quiz files use consecutive numbers.
+* The lesson file should be named `NNN-topic-name-lesson.el`.
+* The quiz file should be named `NNN+1-topic-name-quiz.el`.
+* Quiz files should call `linuxplus-start-quiz` instead of using their own `read-string` scoring loop.
+
+The corrected lesson function is:
+
+* `linuxplus-firewall-review-lesson`
+
+The corrected quiz function is:
+
+* `linuxplus-firewall-review-quiz`
+
+Lesson content is based on missed Linux+ firewall book questions:
+
+* firewall ACLs
+* packet inspection
+* persistent configuration files
+* stateful firewall review points
+* `firewall-cmd --runtime-to-permanent`
+* numbered UFW rules
+* simple UFW SSH blocking
+* DenyHosts
+* Fail2Ban
+
+The lesson preserves the real-world note that DenyHosts is strongly associated with `/etc/hosts.deny`, while Fail2Ban commonly blocks through firewall actions. For the book question, memorize the book's expected wording.
diff --git a/STUDY.md b/STUDY.md
index 56d2365..dd22776 100644
--- a/STUDY.md
+++ b/STUDY.md
@@ -12,17 +12,18 @@ The next lessons should focus on weak areas that have appeared in missed questio
Highest priority areas:
-```text
-1. Storage, LVM, and quotas
-2. Boot process, GRUB2, kernel startup, and systemd
-3. Kernel modules and hardware/system inspection
-4. Networking services, ports, packet filtering, and bandwidth tools
-5. Permissions, ACLs, ownership, and directory traversal
-6. Scheduled tasks, cron syntax, and automation
-7. Backup, archive, sync, and file transfer tools
-8. Mail filtering and redirection
-9. Cloud, containers, orchestration, and object storage
-10. Databases, web services, and service role recognition
+```
+1. Firewall basics, UFW, firewalld, and IDS recognition
+2. Storage, LVM, and quotas
+3. Boot process, GRUB2, kernel startup, and systemd
+4. Kernel modules and hardware/system inspection
+5. Networking services, ports, packet filtering, and bandwidth tools
+6. Permissions, ACLs, ownership, and directory traversal
+7. Scheduled tasks, cron syntax, and automation
+8. Backup, archive, sync, and file transfer tools
+9. Mail filtering and redirection
+10. Cloud, containers, orchestration, and object storage
+11. Databases, web services, and service role recognition
```
## Next Suggested Lesson/Quiz Pair
@@ -31,26 +32,28 @@ The next unused pair should continue the repository numbering scheme.
Suggested next files:
-```text
-104-storage-lvm-quotas-lesson.el
-105-storage-lvm-quotas-quiz.el
+```
+104-firewall-review-lesson.el
+105-firewall-review-quiz.el
```
Suggested topic:
-```text
-Storage, LVM, filesystems, and quotas
+```
+Firewall ACLs, packet inspection, persistent firewall configuration,
+stateful firewall behavior, firewalld runtime-to-permanent rules,
+numbered UFW rules, simple UFW SSH blocking, DenyHosts, and Fail2Ban
```
Reason:
-This topic reinforces `repquota`, quota reporting, LVM object recognition, and storage command selection.
+This topic reinforces several recent missed Linux+ book review questions.
## Study Format
Each weak area should be recorded using this pattern:
-```text
+```
Missed area:
Correct concept:
Exam wording trap:
@@ -61,7 +64,7 @@ Status:
Possible status values:
-```text
+```
Needs lesson
Needs quiz
Needs review
@@ -69,17 +72,106 @@ Improving
Solid
```
+## Weak Area: Firewall Review
+
+Missed area:
+
+```
+Firewall basics, stateful firewall behavior, firewalld persistence,
+UFW command syntax, and DenyHosts/Fail2Ban recognition
+```
+
+Correct concept:
+
+```
+Firewalls use ACLs, inspect network packets, and use configuration
+files for persistence.
+
+ACL means access control list. Firewall ACL rules allow or deny
+traffic based on details such as source address, destination
+address, protocol, port, or interface.
+
+A stateless firewall checks packets against rules without remembering
+the state of a connection.
+
+A stateful firewall tracks connection state. For this book review,
+remember that a stateful firewall can operate faster for established
+connections and can determine if packets are fragmented.
+
+firewalld can use runtime configuration and permanent configuration.
+After testing firewalld runtime rules, make them permanent with:
+
+ sudo firewall-cmd --runtime-to-permanent
+
+To view numbered UFW rules, use:
+
+ sudo ufw status numbered
+
+To block SSH using simple UFW syntax, use:
+
+ sudo ufw deny 22/tcp
+
+For this book item, remember DenyHosts and Fail2Ban as IDS tools.
+The expected answer associates them with /etc/hosts.deny.
+```
+
+Exam wording trap:
+
+```
+"Make firewalld runtime rules permanent" points to:
+
+ firewall-cmd --runtime-to-permanent
+
+"Numbered UFW rules" points to:
+
+ sudo ufw status numbered
+
+"Deny SSH with simple UFW syntax" points to:
+
+ sudo ufw deny 22/tcp
+
+DenyHosts is strongly associated with /etc/hosts.deny.
+
+Fail2Ban commonly blocks through firewall actions in real-world
+configurations, but for the book question, memorize the book's
+expected wording.
+```
+
+Commands/files to remember:
+
+```
+sudo firewall-cmd --runtime-to-permanent
+sudo ufw status numbered
+sudo ufw deny 22/tcp
+/etc/hosts.deny
+```
+
+Future lesson topic:
+
+```
+104-firewall-review-lesson.el
+105-firewall-review-quiz.el
+```
+
+Status:
+
+```
+Needs lesson
+Needs quiz
+Needs review
+```
+
## Weak Area: Quotas and repquota
Missed area:
-```text
+```
Quota reporting and quota command roles
```
Correct concept:
-```text
+```
repquota reports quota usage.
quotaon enables quotas.
quotaoff disables quotas.
@@ -89,7 +181,7 @@ edquota edits user or group quota limits.
Exam wording trap:
-```text
+```
"Report quotas" points to repquota, not quotaon.
"Enable quotas" points to quotaon, not repquota.
"Edit quotas" points to edquota.
@@ -97,7 +189,7 @@ Exam wording trap:
Commands/files to remember:
-```text
+```
repquota -a
quotaon -a
quotaoff -a
@@ -110,14 +202,14 @@ grpquota
Future lesson topic:
-```text
-104-storage-lvm-quotas-lesson.el
-105-storage-lvm-quotas-quiz.el
+```
+106-storage-lvm-quotas-lesson.el
+107-storage-lvm-quotas-quiz.el
```
Status:
-```text
+```
Needs lesson
Needs quiz
```
@@ -126,13 +218,13 @@ Needs quiz
Missed area:
-```text
+```
LVM command recognition and PV/VG/LV relationships
```
Correct concept:
-```text
+```
A physical volume is storage prepared for LVM.
A volume group is a pool of storage made from one or more physical volumes.
A logical volume is usable storage created from a volume group.
@@ -140,7 +232,7 @@ A logical volume is usable storage created from a volume group.
Exam wording trap:
-```text
+```
"Create a volume group" means vgcreate.
"Create a logical volume" means lvcreate.
"List logical volumes" means lvs.
@@ -148,7 +240,7 @@ Exam wording trap:
Commands/files to remember:
-```text
+```
pvcreate
vgcreate
lvcreate
@@ -165,14 +257,14 @@ xfs_growfs
Future lesson topic:
-```text
-104-storage-lvm-quotas-lesson.el
-105-storage-lvm-quotas-quiz.el
+```
+106-storage-lvm-quotas-lesson.el
+107-storage-lvm-quotas-quiz.el
```
Status:
-```text
+```
Needs lesson
Needs quiz
```
@@ -181,13 +273,13 @@ Needs quiz
Missed area:
-```text
+```
Choosing between df, du, lsblk, blkid, and findmnt
```
Correct concept:
-```text
+```
df shows mounted filesystem usage.
du shows file or directory space usage.
lsblk lists block devices.
@@ -197,7 +289,7 @@ findmnt shows mounted filesystems.
Exam wording trap:
-```text
+```
"How full is the filesystem?" usually means df.
"How large is this directory?" usually means du.
"Show disks and partitions" usually means lsblk.
@@ -205,7 +297,7 @@ Exam wording trap:
Commands/files to remember:
-```text
+```
df -h
du -sh PATH
lsblk
@@ -218,14 +310,14 @@ mount -a
Future lesson topic:
-```text
-104-storage-lvm-quotas-lesson.el
-105-storage-lvm-quotas-quiz.el
+```
+106-storage-lvm-quotas-lesson.el
+107-storage-lvm-quotas-quiz.el
```
Status:
-```text
+```
Needs lesson
Needs quiz
```
@@ -234,13 +326,13 @@ Needs quiz
Missed area:
-```text
+```
Bootloader location, kernel startup, PID 1, and service management
```
Correct concept:
-```text
+```
GRUB2 loads the Linux kernel and initramfs.
The kernel starts the first userspace process.
On most modern Linux systems, PID 1 is systemd.
@@ -249,7 +341,7 @@ systemctl controls systemd services.
Exam wording trap:
-```text
+```
"PID 1" usually points to systemd on modern Linux.
"Regenerate GRUB2 configuration" points to grub2-mkconfig or the distro equivalent.
"Enable a service at boot" is not the same as starting it immediately.
@@ -257,7 +349,7 @@ Exam wording trap:
Commands/files to remember:
-```text
+```
ps -p 1 -o pid,comm,args
systemctl status SERVICE
systemctl start SERVICE
@@ -272,14 +364,14 @@ grub2-mkconfig
Future lesson topic:
-```text
-106-boot-grub-systemd-lesson.el
-107-boot-grub-systemd-quiz.el
+```
+108-boot-grub-systemd-lesson.el
+109-boot-grub-systemd-quiz.el
```
Status:
-```text
+```
Needs review
```
@@ -287,13 +379,13 @@ Needs review
Missed area:
-```text
+```
Listing, loading, removing, and inspecting kernel modules
```
Correct concept:
-```text
+```
lsmod lists loaded kernel modules.
modprobe loads or removes modules and handles dependencies.
modinfo shows information about a module.
@@ -302,7 +394,7 @@ rmmod removes a module but does not handle dependencies as well as modprobe.
Exam wording trap:
-```text
+```
"List loaded modules" means lsmod.
"Load a module with dependencies" means modprobe.
"Remove a module with dependency handling" means modprobe -r.
@@ -310,7 +402,7 @@ Exam wording trap:
Commands/files to remember:
-```text
+```
lsmod
modprobe MODULE
modprobe -r MODULE
@@ -323,14 +415,14 @@ uname -r
Future lesson topic:
-```text
-108-kernel-modules-hardware-lesson.el
-109-kernel-modules-hardware-quiz.el
+```
+110-kernel-modules-hardware-lesson.el
+111-kernel-modules-hardware-quiz.el
```
Status:
-```text
+```
Needs review
```
@@ -338,13 +430,13 @@ Needs review
Missed area:
-```text
+```
User-specific SSH client config versus system-wide SSH client config
```
Correct concept:
-```text
+```
User SSH client config is normally ~/.ssh/config.
System-wide SSH client config is normally /etc/ssh/ssh_config.
The SSH server config is normally /etc/ssh/sshd_config.
@@ -353,7 +445,7 @@ User-specific client settings generally override system-wide client settings.
Exam wording trap:
-```text
+```
Do not confuse ssh_config with sshd_config.
ssh_config is client configuration.
sshd_config is server daemon configuration.
@@ -361,7 +453,7 @@ sshd_config is server daemon configuration.
Commands/files to remember:
-```text
+```
~/.ssh/config
/etc/ssh/ssh_config
/etc/ssh/sshd_config
@@ -373,14 +465,14 @@ systemctl status ssh
Future lesson topic:
-```text
-110-ssh-config-precedence-lesson.el
-111-ssh-config-precedence-quiz.el
+```
+112-ssh-config-precedence-lesson.el
+113-ssh-config-precedence-quiz.el
```
Status:
-```text
+```
Needs review
```
@@ -388,26 +480,26 @@ Needs review
Missed area:
-```text
+```
Service name to port/protocol mapping
```
Correct concept:
-```text
+```
/etc/services maps service names to port numbers and protocols.
getent services can query service mappings.
```
Exam wording trap:
-```text
+```
A question asking about named services and port numbers often points to /etc/services.
```
Commands/files to remember:
-```text
+```
/etc/services
getent services ssh
grep '^ssh' /etc/services
@@ -416,14 +508,14 @@ ss -tulpen
Future lesson topic:
-```text
-112-network-services-firewall-lesson.el
-113-network-services-firewall-quiz.el
+```
+114-network-services-firewall-lesson.el
+115-network-services-firewall-quiz.el
```
Status:
-```text
+```
Needs review
```
@@ -431,13 +523,13 @@ Needs review
Missed area:
-```text
+```
Linux packet filtering framework and related tools
```
Correct concept:
-```text
+```
netfilter is the Linux kernel packet filtering framework.
iptables and nftables are userspace tools for managing packet filtering rules.
nftables is the newer framework/tooling commonly replacing many iptables workflows.
@@ -445,14 +537,14 @@ nftables is the newer framework/tooling commonly replacing many iptables workflo
Exam wording trap:
-```text
+```
"Kernel packet filtering framework" points to netfilter.
"Firewall rules on modern Linux" may point to nftables.
```
Commands/files to remember:
-```text
+```
nft list ruleset
iptables -L
firewall-cmd
@@ -462,14 +554,14 @@ ss -tulpen
Future lesson topic:
-```text
-112-network-services-firewall-lesson.el
-113-network-services-firewall-quiz.el
+```
+114-network-services-firewall-lesson.el
+115-network-services-firewall-quiz.el
```
Status:
-```text
+```
Needs review
```
@@ -477,13 +569,13 @@ Needs review
Missed area:
-```text
+```
Choosing tools for network scanning, throughput testing, and interface inspection
```
Correct concept:
-```text
+```
nmap scans hosts and ports.
iperf tests network throughput.
ip shows addresses, routes, and links.
@@ -493,7 +585,7 @@ tcpdump captures packets.
Exam wording trap:
-```text
+```
"Throughput test" usually means iperf.
"Port scan" usually means nmap.
"Socket/listening port inspection" usually means ss.
@@ -502,7 +594,7 @@ Exam wording trap:
Commands/files to remember:
-```text
+```
nmap
iperf
ip addr
@@ -514,14 +606,14 @@ tcpdump
Future lesson topic:
-```text
-114-network-diagnostics-lesson.el
-115-network-diagnostics-quiz.el
+```
+116-network-diagnostics-lesson.el
+117-network-diagnostics-quiz.el
```
Status:
-```text
+```
Needs review
```
@@ -529,13 +621,13 @@ Needs review
Missed area:
-```text
+```
Directory permissions, ACL inspection, and ACL removal
```
Correct concept:
-```text
+```
Directory read permission allows listing names.
Directory execute permission allows traversal.
getfacl views ACLs.
@@ -545,7 +637,7 @@ setfacl -b removes ACL entries.
Exam wording trap:
-```text
+```
To access a file inside a directory, execute permission is needed on the directory path.
To list directory contents, read permission is needed on the directory.
ACL questions usually point to getfacl or setfacl.
@@ -553,7 +645,7 @@ ACL questions usually point to getfacl or setfacl.
Commands/files to remember:
-```text
+```
ls -ld DIR
chmod
chown
@@ -566,14 +658,14 @@ setfacl -b
Future lesson topic:
-```text
-116-permissions-acls-lesson.el
-117-permissions-acls-quiz.el
+```
+118-permissions-acls-lesson.el
+119-permissions-acls-quiz.el
```
Status:
-```text
+```
Needs review
```
@@ -581,13 +673,13 @@ Needs review
Missed area:
-```text
+```
Password aging, group membership, and account defaults
```
Correct concept:
-```text
+```
/etc/passwd stores basic user account information.
/etc/shadow stores password hashes and password aging information.
/etc/group stores group information.
@@ -597,14 +689,14 @@ login.defs defines UID/GID ranges and default password aging policy values.
Exam wording trap:
-```text
+```
Password aging is associated with /etc/shadow, chage, and login.defs, not /etc/passwd alone.
When adding a user to a supplementary group, use usermod -aG, not just -G.
```
Commands/files to remember:
-```text
+```
/etc/passwd
/etc/shadow
/etc/group
@@ -620,14 +712,14 @@ groups
Future lesson topic:
-```text
+```
Already covered in 102-user-management-lesson.el and 103-user-management-quiz.el.
Review if quiz score is weak.
```
Status:
-```text
+```
Needs review
```
@@ -635,26 +727,26 @@ Needs review
Missed area:
-```text
+```
Cron field order and scheduled command recognition
```
Correct concept:
-```text
+```
Cron field order is minute, hour, day of month, month, day of week, command.
```
Exam wording trap:
-```text
+```
Do not confuse hour and minute fields.
Do not confuse day-of-month with day-of-week.
```
Commands/files to remember:
-```text
+```
crontab -e
crontab -l
/etc/crontab
@@ -666,14 +758,14 @@ systemctl list-timers
Future lesson topic:
-```text
-118-scheduled-tasks-cron-lesson.el
-119-scheduled-tasks-cron-quiz.el
+```
+120-scheduled-tasks-cron-lesson.el
+121-scheduled-tasks-cron-quiz.el
```
Status:
-```text
+```
Needs lesson
Needs quiz
```
@@ -682,13 +774,13 @@ Needs quiz
Missed area:
-```text
+```
Choosing between rsync, tar, compression tools, and copy commands
```
Correct concept:
-```text
+```
rsync is useful for efficient file synchronization and backups.
tar creates archives.
gzip, bzip2, and xz compress data.
@@ -697,7 +789,7 @@ cp copies files.
Exam wording trap:
-```text
+```
"Local backup of a large file or directory while preserving metadata" often points to rsync.
"Create an archive" points to tar.
"Compress data" points to gzip, bzip2, or xz.
@@ -705,7 +797,7 @@ Exam wording trap:
Commands/files to remember:
-```text
+```
rsync -avh SOURCE DEST
rsync -avh --progress SOURCE DEST
tar -cf archive.tar DIR
@@ -718,14 +810,14 @@ xz
Future lesson topic:
-```text
-120-backup-archive-sync-lesson.el
-121-backup-archive-sync-quiz.el
+```
+122-backup-archive-sync-lesson.el
+123-backup-archive-sync-quiz.el
```
Status:
-```text
+```
Needs review
```
@@ -733,13 +825,13 @@ Needs review
Missed area:
-```text
+```
Using ls -d, mv safety options, sort fields, and command selection
```
Correct concept:
-```text
+```
ls -d shows the directory entry itself instead of listing its contents.
mv can move or rename files.
mv -i prompts before overwrite.
@@ -750,7 +842,7 @@ sort -r reverses sort order.
Exam wording trap:
-```text
+```
"Show metadata for the directory itself" points to ls -ld.
"Sort by a specific column" points to sort -k.
"Prompt before overwrite" points to -i.
@@ -759,7 +851,7 @@ Exam wording trap:
Commands/files to remember:
-```text
+```
ls -ld DIR
mv -i OLD NEW
mv -v OLD NEW
@@ -771,14 +863,14 @@ sort -r FILE
Future lesson topic:
-```text
+```
Already partly covered by file-search and permissions topics.
Add focused review only if needed.
```
Status:
-```text
+```
Needs review
```
@@ -786,13 +878,13 @@ Needs review
Missed area:
-```text
+```
Interpreting top CPU fields and process display output
```
Correct concept:
-```text
+```
top shows CPU and process activity.
%us or us is user CPU time.
%sy or sy is system/kernel CPU time.
@@ -802,14 +894,14 @@ top shows CPU and process activity.
Exam wording trap:
-```text
+```
"Stolen time" is associated with virtualization.
"User CPU time" is not the same as system/kernel CPU time.
```
Commands/files to remember:
-```text
+```
top
ps aux
ps -ef
@@ -819,14 +911,14 @@ free -h
Future lesson topic:
-```text
+```
Already covered in 20-top-cpu-fields-lesson.el and 21-top-cpu-fields-quiz.el.
Review if quiz score is weak.
```
Status:
-```text
+```
Needs review
```
@@ -834,13 +926,13 @@ Needs review
Missed area:
-```text
+```
Security log locations and filtering log output
```
Correct concept:
-```text
+```
Authentication and security events may appear in /var/log/secure on Red Hat-family systems.
Debian-family systems often use /var/log/auth.log.
journalctl queries the systemd journal.
@@ -848,14 +940,14 @@ journalctl queries the systemd journal.
Exam wording trap:
-```text
+```
Distribution family matters for auth/security log file names.
systemd journal questions often point to journalctl.
```
Commands/files to remember:
-```text
+```
/var/log/secure
/var/log/auth.log
journalctl
@@ -869,14 +961,14 @@ tail -f
Future lesson topic:
-```text
+```
Already covered in 30-auth-log-lesson.el, 31-auth-log-quiz.el, 80-log-filtering-lesson.el, and 81-log-filtering-quiz.el.
Review if quiz score is weak.
```
Status:
-```text
+```
Needs review
```
@@ -884,13 +976,13 @@ Needs review
Missed area:
-```text
+```
Package installation, dependency queries, and package manager recognition
```
Correct concept:
-```text
+```
rpm installs and queries RPM packages directly.
yum or dnf manage packages and dependencies on Red Hat-family systems.
apt manages packages on Debian-family systems.
@@ -899,14 +991,14 @@ yum deplist can show dependencies.
Exam wording trap:
-```text
+```
rpm works directly with RPM packages but does not resolve dependencies like yum/dnf.
Distribution family matters.
```
Commands/files to remember:
-```text
+```
rpm -ivh PACKAGE.rpm
rpm -qa
rpm -qi PACKAGE
@@ -918,14 +1010,14 @@ apt install PACKAGE
Future lesson topic:
-```text
+```
Already covered in 40-package-management-lesson.el and 41-package-management-quiz.el.
Review if quiz score is weak.
```
Status:
-```text
+```
Needs review
```
@@ -933,26 +1025,26 @@ Needs review
Missed area:
-```text
+```
Automatic mail processing, filtering, and redirection
```
Correct concept:
-```text
+```
Mail filters can automatically process, redirect, sort, or deliver incoming mail based on rules.
Depending on the system, this may involve procmail, sieve, aliases, forwarding files, or MTA rules.
```
Exam wording trap:
-```text
+```
"Automatically redirects incoming mail" points to a mail filter or mail-processing rule, not a user shell alias.
```
Commands/files to remember:
-```text
+```
/etc/aliases
~/.forward
procmail
@@ -965,14 +1057,14 @@ newaliases
Future lesson topic:
-```text
-122-mail-filtering-redirection-lesson.el
-123-mail-filtering-redirection-quiz.el
+```
+124-mail-filtering-redirection-lesson.el
+125-mail-filtering-redirection-quiz.el
```
Status:
-```text
+```
Needs lesson
Needs quiz
```
@@ -981,26 +1073,26 @@ Needs quiz
Missed area:
-```text
+```
nginx service role recognition
```
Correct concept:
-```text
+```
nginx can function as a web server, reverse proxy, and load balancer.
```
Exam wording trap:
-```text
+```
Do not limit nginx to static web serving only.
If the question mentions web serving plus load balancing or reverse proxying, nginx may be correct.
```
Commands/files to remember:
-```text
+```
nginx
systemctl status nginx
/etc/nginx/nginx.conf
@@ -1009,14 +1101,14 @@ systemctl status nginx
Future lesson topic:
-```text
-124-web-services-load-balancing-lesson.el
-125-web-services-load-balancing-quiz.el
+```
+126-web-services-load-balancing-lesson.el
+127-web-services-load-balancing-quiz.el
```
Status:
-```text
+```
Needs review
```
@@ -1024,27 +1116,27 @@ Needs review
Missed area:
-```text
+```
MongoDB storage/data model recognition
```
Correct concept:
-```text
+```
MongoDB is a document database.
MongoDB uses JSON-style documents and stores data internally as BSON.
```
Exam wording trap:
-```text
+```
MongoDB is not a traditional row/table-only relational database.
Questions mentioning JSON-style documents or BSON likely point to MongoDB.
```
Commands/files to remember:
-```text
+```
MongoDB
JSON
BSON
@@ -1053,14 +1145,14 @@ document database
Future lesson topic:
-```text
-126-databases-data-models-lesson.el
-127-databases-data-models-quiz.el
+```
+128-databases-data-models-lesson.el
+129-databases-data-models-quiz.el
```
Status:
-```text
+```
Needs review
```
@@ -1068,25 +1160,25 @@ Needs review
Missed area:
-```text
+```
Cloud object storage recognition
```
Correct concept:
-```text
+```
Azure Blob Storage is object storage for unstructured data.
```
Exam wording trap:
-```text
+```
"Object storage" and "unstructured data" may point to Azure Blob Storage in Azure-related questions.
```
Commands/files to remember:
-```text
+```
Azure Blob Storage
object storage
unstructured data
@@ -1095,14 +1187,14 @@ cloud storage
Future lesson topic:
-```text
-128-cloud-storage-lesson.el
-129-cloud-storage-quiz.el
+```
+130-cloud-storage-lesson.el
+131-cloud-storage-quiz.el
```
Status:
-```text
+```
Needs review
```
@@ -1110,26 +1202,26 @@ Needs review
Missed area:
-```text
+```
Container orchestration engine recognition
```
Correct concept:
-```text
+```
Kubernetes is a container orchestration platform.
Container orchestration manages deployment, scaling, scheduling, and operation of containers.
```
Exam wording trap:
-```text
+```
"Container orchestration" often points to Kubernetes.
```
Commands/files to remember:
-```text
+```
Kubernetes
kubectl
container orchestration
@@ -1140,14 +1232,14 @@ services
Future lesson topic:
-```text
-130-containers-orchestration-lesson.el
-131-containers-orchestration-quiz.el
+```
+132-containers-orchestration-lesson.el
+133-containers-orchestration-quiz.el
```
Status:
-```text
+```
Needs review
```
@@ -1155,25 +1247,25 @@ Needs review
Missed area:
-```text
+```
Version control tool recognition
```
Correct concept:
-```text
+```
Git is a distributed version control system.
```
Exam wording trap:
-```text
+```
Questions asking about source code version control usually point to Git.
```
Commands/files to remember:
-```text
+```
git status
git add
git commit
@@ -1186,14 +1278,14 @@ git push
Future lesson topic:
-```text
-132-git-version-control-lesson.el
-133-git-version-control-quiz.el
+```
+134-git-version-control-lesson.el
+135-git-version-control-quiz.el
```
Status:
-```text
+```
Needs review
```
@@ -1201,25 +1293,25 @@ Needs review
Missed area:
-```text
+```
Root login terminal restrictions
```
Correct concept:
-```text
+```
/etc/securetty controls which terminals root may log in from on systems that honor it.
```
Exam wording trap:
-```text
+```
"Which terminals permit root login?" points to /etc/securetty.
```
Commands/files to remember:
-```text
+```
/etc/securetty
root login
TTY
@@ -1228,14 +1320,14 @@ console
Future lesson topic:
-```text
-134-login-security-lesson.el
-135-login-security-quiz.el
+```
+136-login-security-lesson.el
+137-login-security-quiz.el
```
Status:
-```text
+```
Needs review
```
@@ -1243,26 +1335,26 @@ Needs review
Missed area:
-```text
+```
Returning to the previous working directory
```
Correct concept:
-```text
+```
cd - returns to the previous working directory.
```
Exam wording trap:
-```text
+```
cd .. moves to the parent directory.
cd - moves to the previous working directory.
```
Commands/files to remember:
-```text
+```
pwd
cd
cd ..
@@ -1272,13 +1364,13 @@ cd ~
Future lesson topic:
-```text
+```
Can be included in a shell basics or file operations review lesson.
```
Status:
-```text
+```
Needs review
```
@@ -1286,13 +1378,13 @@ Needs review
Missed area:
-```text
+```
Finding files, searching contents, and matching command to search task
```
Correct concept:
-```text
+```
find searches by file attributes and paths.
grep searches text contents.
locate uses a database to find paths quickly.
@@ -1302,7 +1394,7 @@ whereis locates binary, source, and manual page files.
Exam wording trap:
-```text
+```
"Search inside files" points to grep.
"Find files by name, size, time, owner, or permissions" points to find.
"Fast path lookup from a database" points to locate.
@@ -1310,7 +1402,7 @@ Exam wording trap:
Commands/files to remember:
-```text
+```
find
grep
locate
@@ -1322,14 +1414,14 @@ type
Future lesson topic:
-```text
+```
Already covered in 90-file-search-lesson.el and 91-file-search-quiz.el.
Review if quiz score is weak.
```
Status:
-```text
+```
Needs review
```
@@ -1339,50 +1431,52 @@ Use this queue when deciding future lesson order.
Immediate next lesson:
-```text
-104-storage-lvm-quotas-lesson.el
-105-storage-lvm-quotas-quiz.el
+```
+104-firewall-review-lesson.el
+105-firewall-review-quiz.el
```
Recommended follow-up sequence:
-```text
-106-boot-grub-systemd-lesson.el
-107-boot-grub-systemd-quiz.el
+```
+106-storage-lvm-quotas-lesson.el
+107-storage-lvm-quotas-quiz.el
-108-kernel-modules-hardware-lesson.el
-109-kernel-modules-hardware-quiz.el
+108-boot-grub-systemd-lesson.el
+109-boot-grub-systemd-quiz.el
-112-network-services-firewall-lesson.el
-113-network-services-firewall-quiz.el
+110-kernel-modules-hardware-lesson.el
+111-kernel-modules-hardware-quiz.el
-118-scheduled-tasks-cron-lesson.el
-119-scheduled-tasks-cron-quiz.el
+114-network-services-firewall-lesson.el
+115-network-services-firewall-quiz.el
-120-backup-archive-sync-lesson.el
-121-backup-archive-sync-quiz.el
+120-scheduled-tasks-cron-lesson.el
+121-scheduled-tasks-cron-quiz.el
-122-mail-filtering-redirection-lesson.el
-123-mail-filtering-redirection-quiz.el
+122-backup-archive-sync-lesson.el
+123-backup-archive-sync-quiz.el
-128-cloud-storage-lesson.el
-129-cloud-storage-quiz.el
+124-mail-filtering-redirection-lesson.el
+125-mail-filtering-redirection-quiz.el
-130-containers-orchestration-lesson.el
-131-containers-orchestration-quiz.el
+130-cloud-storage-lesson.el
+131-cloud-storage-quiz.el
+
+132-containers-orchestration-lesson.el
+133-containers-orchestration-quiz.el
```
## Quick Command Association Drill
Review this section frequently.
-```text
+```
repquota -a -> report quotas
quotaon -a -> enable quotas
quotaoff -a -> disable quotas
edquota -> edit quotas
quotacheck -> check/build quota files
-
pvcreate -> create physical volume
vgcreate -> create volume group
lvcreate -> create logical volume
@@ -1390,7 +1484,6 @@ pvs -> list physical volumes
vgs -> list volume groups
lvs -> list logical volumes
lvextend -> extend logical volume
-
df -h -> mounted filesystem usage
du -sh PATH -> file/directory usage
lsblk -> block devices
@@ -1401,7 +1494,6 @@ findmnt -> mounted filesystems
ps -p 1 -> inspect PID 1
systemctl -> manage systemd services
grub2-mkconfig -> generate GRUB2 configuration
-
lsmod -> list loaded kernel modules
modprobe -> load module with dependencies
modprobe -r -> remove module with dependency handling
@@ -1411,11 +1503,15 @@ modinfo -> show module information
netfilter -> kernel packet filtering framework
nftables -> modern packet filtering rules tool
iptables -> older/common packet filtering rules tool
-
getfacl -> view ACLs
setfacl -> modify ACLs
setfacl -b -> remove ACL entries
+firewall-cmd --runtime-to-permanent -> save firewalld runtime rules
+sudo ufw status numbered -> view numbered UFW rules
+sudo ufw deny 22/tcp -> block SSH with UFW
+/etc/hosts.deny -> DenyHosts/book IDS association
+
crontab -e -> edit user cron jobs
crontab -l -> list user cron jobs
minute hour dom month dow command -> cron field order
@@ -1423,7 +1519,6 @@ minute hour dom month dow command -> cron field order
rsync -avh -> sync/backup while preserving metadata
tar -> archive files
gzip/bzip2/xz -> compress data
-
nginx -> web server, reverse proxy, load balancer
MongoDB -> JSON-style documents stored as BSON
Azure Blob -> object storage for unstructured data
@@ -1439,7 +1534,7 @@ Add quiz results here after completing topic quizzes.
Example format:
-```text
+```
Date:
Lesson:
Quiz:
@@ -1450,7 +1545,7 @@ Next action:
## Current Notes
-```text
+```
Date:
Lesson:
Quiz:
@@ -1458,13 +1553,3 @@ Score:
Missed:
Next action:
```
-## Lesson 120
-
-- `linuxplus-lesson-120.el`
-- `linuxplus-quiz-120.el`
-- Topic: Firewall ACLs, packet inspection, persistent configuration,
- stateful firewall behavior, `firewall-cmd --runtime-to-permanent`,
- numbered UFW rules, simple UFW SSH blocking, DenyHosts, and Fail2Ban.
-- Practice: `sudo firewall-cmd --runtime-to-permanent`,
- `sudo ufw status numbered`, and `sudo ufw deny 22/tcp`.
-
\ No newline at end of file
diff --git a/linuxplus-lesson-120.el b/linuxplus-lesson-120.el
deleted file mode 100644
index 9a8d7e1..0000000
--- a/linuxplus-lesson-120.el
+++ /dev/null
@@ -1,91 +0,0 @@
-;;; Linux+ Lesson 120: Firewall review
-;;;
-;;; Review firewall ACLs, stateful behavior, firewalld, UFW, and IDS.
-;;;
-;;; This file is part of the Linux+ Learning project.
-;;;
-;;; Copyright (c) 2026, Scott C. MacCallum (scm@sdf.org).
-;;;
-;;; This program is free software: you can redistribute it and/or modify
-;;; it under the terms of the GNU Affero General Public License as
-;;; published by the Free Software Foundation, either version 3 of the
-;;; License, or (at your option) any later version.
-;;;
-;;; This program is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;;; GNU Affero General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU Affero General
-;;; Public License along with this program. If not, see
-;;; .
-
-;;; Commentary:
-
-;; Run with:
-;;
-;; M-x linuxplus-lesson-120
-;;
-;; This lesson displays text above an ansi-term practice buffer.
-
-;;; Code:
-
-(require 'term)
-
-(defun linuxplus-lesson-120 ()
- "Show Linux+ lesson 120 with a shell practice buffer."
- (interactive)
- (delete-other-windows)
- (let ((buffer (get-buffer-create "*Linux+ Lesson 120*")))
- (switch-to-buffer buffer)
- (read-only-mode -1)
- (erase-buffer)
- (insert "Linux+ Lesson 120: Firewall review\n\n")
- (insert "This lesson reviews firewall facts missed during book\n")
- (insert "practice. Treat this as Linux+ study wording.\n\n")
- (insert "Firewall basics:\n\n")
- (insert " Firewalls use ACLs, inspect network packets, and use\n")
- (insert " configuration files so rules can persist after restart.\n\n")
- (insert "ACL means access control list. An ACL is a list of rules\n")
- (insert "that allow or deny traffic based on details such as source,\n")
- (insert "destination, protocol, port, or interface.\n\n")
- (insert "Stateful firewall review:\n\n")
- (insert " A stateless firewall checks each packet by rule only.\n")
- (insert " A stateful firewall tracks connection state.\n")
- (insert " Your review answer associates stateful firewalls with\n")
- (insert " faster handling for established connections and with\n")
- (insert " detecting whether packets are fragmented.\n\n")
- (insert "firewalld runtime and permanent rules:\n\n")
- (insert " firewalld can have runtime rules and permanent rules.\n")
- (insert " Test changes at runtime first. After a successful test,\n")
- (insert " make them permanent with super user privileges:\n\n")
- (insert " sudo firewall-cmd --runtime-to-permanent\n\n")
- (insert "UFW review:\n\n")
- (insert " To view numbered UFW rules, use:\n\n")
- (insert " sudo ufw status numbered\n\n")
- (insert " Your review answer for blocking SSH is:\n\n")
- (insert " sudo ufw deny 22/tcp\n\n")
- (insert "IDS review:\n\n")
- (insert " For this book item, remember DenyHosts and Fail2Ban\n")
- (insert " as intrusion detection systems. The answer associates\n")
- (insert " them with modifying /etc/hosts.deny.\n\n")
- (insert "Real-world note: DenyHosts is strongly associated with\n")
- (insert "/etc/hosts.deny. Fail2Ban is commonly configured to block\n")
- (insert "attackers through firewall actions. For the book question,\n")
- (insert "memorize the book's expected wording.\n\n")
- (insert "Audio practice on GNU/Linux:\n\n")
- (insert " espeak-ng 'Use firewall cmd runtime to permanent.'\n")
- (insert " espeak 'Use sudo ufw status numbered.'\n")
- (insert " espeak-ng 'Use sudo ufw deny twenty two slash tcp.'\n\n")
- (insert "Practice below. Try sudo ufw status numbered if UFW is\n")
- (insert "installed, or review firewall-cmd --help if firewalld is\n")
- (insert "available on your system.\n")
- (goto-char (point-min))
- (read-only-mode 1)
- (split-window-below)
- (other-window 1)
- (ansi-term "/bin/bash")))
-
-(provide 'linuxplus-lesson-120)
-
-;;; linuxplus-lesson-120.el ends here
diff --git a/linuxplus-quiz-120.el b/linuxplus-quiz-120.el
deleted file mode 100644
index f19ebf5..0000000
--- a/linuxplus-quiz-120.el
+++ /dev/null
@@ -1,95 +0,0 @@
-;;; Linux+ Quiz 120: Firewall review
-;;;
-;;; Review firewall ACLs, stateful behavior, firewalld, UFW, and IDS.
-;;;
-;;; This file is part of the Linux+ Learning project.
-;;;
-;;; Copyright (c) 2026, Scott C. MacCallum (scm@sdf.org).
-;;;
-;;; This program is free software: you can redistribute it and/or modify
-;;; it under the terms of the GNU Affero General Public License as
-;;; published by the Free Software Foundation, either version 3 of the
-;;; License, or (at your option) any later version.
-;;;
-;;; This program is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;;; GNU Affero General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU Affero General
-;;; Public License along with this program. If not, see
-;;; .
-
-;;; Commentary:
-
-;; Run with:
-;;
-;; M-x linuxplus-quiz-120
-;;
-;; Questions are true/false, yes/no, or single-choice only.
-
-;;; Code:
-
-(require 'subr-x)
-
-(defvar linuxplus-quiz-120-score-file
- (expand-file-name "linuxplus-quiz-120-score.txt"
- user-emacs-directory)
- "File used to save the Linux+ quiz 120 score.")
-
-(defun linuxplus-quiz-120--ask (prompt answer)
- "Ask PROMPT and compare the response to ANSWER."
- (string= (downcase (string-trim (read-string prompt)))
- answer))
-
-(defun linuxplus-quiz-120 ()
- "Run Linux+ quiz 120 and save the score."
- (interactive)
- (let ((score 0)
- (total 8))
- (when (linuxplus-quiz-120--ask
- "True or false: Firewalls use ACLs. "
- "true")
- (setq score (1+ score)))
- (when (linuxplus-quiz-120--ask
- "Yes or no: Do firewalls inspect network packets? "
- "yes")
- (setq score (1+ score)))
- (when (linuxplus-quiz-120--ask
- "Which helps firewall rules persist? A) config files B) pwd "
- "a")
- (setq score (1+ score)))
- (when (linuxplus-quiz-120--ask
- "True or false: Stateful firewalls track connections. "
- "true")
- (setq score (1+ score)))
- (when (linuxplus-quiz-120--ask
- (concat "Which can be faster after a connection exists? "
- "A) stateful B) stateless ")
- "a")
- (setq score (1+ score)))
- (when (linuxplus-quiz-120--ask
- (concat "Which saves tested firewalld runtime rules? "
- "A) firewall-cmd --runtime-to-permanent "
- "B) ufw numbered ")
- "a")
- (setq score (1+ score)))
- (when (linuxplus-quiz-120--ask
- (concat "Which command views numbered UFW rules? "
- "A) sudo ufw status numbered "
- "B) sudo ufw list ")
- "a")
- (setq score (1+ score)))
- (when (linuxplus-quiz-120--ask
- (concat "Which simple command blocks SSH by port? "
- "A) sudo ufw deny 22/tcp "
- "B) sudo ufw allow 22/tcp ")
- "a")
- (setq score (1+ score)))
- (with-temp-file linuxplus-quiz-120-score-file
- (insert (format "Linux+ quiz 120 score: %d/%d\n" score total)))
- (message "Linux+ quiz 120 score: %d/%d" score total)))
-
-(provide 'linuxplus-quiz-120)
-
-;;; linuxplus-quiz-120.el ends here