I would like to donate a router

2024-02-28 Thread Frank Flores
I recently received a new in box LinkSys EA9500 v1.1 US version
router. I opened it and tried to use it in my home network but found
the native firmware to be undesirable and its performance less than
stellar. I would like to donate it to OpenWRT if you would like to
have it. Anyone interested?

Thank you for your work on making the world more open.
-Frank
-- 
MONEY IS OVER!
IF YOU WANT IT
=
The causes of my servitude can be traced to the tyranny of money.
-Serj Tankian

___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


[PATCH V3 1/3] base-files: sysupgrade: add tar.sh with helpers for building archives

2024-02-28 Thread Rafał Miłecki
From: Jo-Philipp Wich 

This allows building uncompressed tar archives from shell scripts (and
compressing them later if needed)

Signed-off-by: Rafał Miłecki 
---
V2: Simplify dd in __tar_print_padding (I still think helper is useful)
Hardcode 0/0/ root/root for now as most likely it'll be enough
Simplify name validation (leasing slash)
Reorder some variables
V3: Fix dd in __tar_print_padding
Rename functions
Drop unused functions
Document usage

 package/base-files/files/lib/upgrade/tar.sh | 71 +
 1 file changed, 71 insertions(+)
 create mode 100644 package/base-files/files/lib/upgrade/tar.sh

diff --git a/package/base-files/files/lib/upgrade/tar.sh 
b/package/base-files/files/lib/upgrade/tar.sh
new file mode 100644
index 00..a9d1d559e6
--- /dev/null
+++ b/package/base-files/files/lib/upgrade/tar.sh
@@ -0,0 +1,71 @@
+# SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+# Example usage:
+#
+# {
+# tar_print_member "date.txt" "It's $(date +"%Y")"
+# tar_print_trailer
+# } > test.tar
+
+__tar_print_padding() {
+   dd if=/dev/zero bs=1 count=$1 2>/dev/null
+}
+
+tar_print_member() {
+   local name="$1"
+   local content="$2"
+   local mtime="${3:-$(date +%s)}"
+   local mode=644
+   local uid=0
+   local gid=0
+   local size=${#content}
+   local type=0
+   local link=""
+   local username="root"
+   local groupname="root"
+
+   # 100 byte of padding bytes, using 0x01 since the shell does not 
tolerate null bytes in strings
+   local 
pad=$'\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1'
+
+   # validate name (strip leading slash if present)
+   name=${name#/}
+
+   # truncate string header values to their maximum length
+   name=${name:0:100}
+   link=${link:0:100}
+   username=${username:0:32}
+   groupname=${groupname:0:32}
+
+   # construct header part before checksum field
+   local header1="${name}${pad:0:$((100 - ${#name}))}"
+   header1="${header1}$(printf '%07d\1' $mode)"
+   header1="${header1}$(printf '%07o\1' $uid)"
+   header1="${header1}$(printf '%07o\1' $gid)"
+   header1="${header1}$(printf '%011o\1' $size)"
+   header1="${header1}$(printf '%011o\1' $mtime)"
+
+   # construct header part after checksum field
+   local header2="$(printf '%d' $type)"
+   header2="${header2}${link}${pad:0:$((100 - ${#link}))}"
+   header2="${header2}ustar  ${pad:0:1}"
+   header2="${header2}${username}${pad:0:$((32 - ${#username}))}"
+   header2="${header2}${groupname}${pad:0:$((32 - ${#groupname}))}"
+
+   # calculate checksum over header fields
+   local checksum=0
+   for byte in $(printf '%s%8s%s' "$header1" "" "$header2" | tr '\1' '\0' 
| hexdump -ve '1/1 "%u "'); do
+   checksum=$((checksum + byte))
+   done
+
+   # print member header, padded to 512 byte
+   printf '%s%06o\0 %s' "$header1" $checksum "$header2" | tr '\1' '\0'
+   __tar_print_padding 183
+
+   # print content data, padded to multiple of 512 byte
+   printf "%s" "$content"
+   __tar_print_padding $((512 - (size % 512)))
+}
+
+tar_print_trailer() {
+   __tar_print_padding 1024
+}
-- 
2.35.3


___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


[PATCH V3 3/3] base-files: sysupgrade: add uci-defaults script disabling services #2

2024-02-28 Thread Rafał Miłecki
From: Rafał Miłecki 

Disabled services should be kept disabled after sysupgrade. This can be
easily handled using a proper uci-defaults script.

Extend sysupgrade to check for disabled services, generate uci-defaults
script disabling them and include it in backup.

Cc: Christian Marangi 
Cc: Jo-Philipp Wich 
Cc: Jonas Gorski 
Signed-off-by: Rafał Miłecki 
---
 package/base-files/files/sbin/sysupgrade | 9 +
 1 file changed, 9 insertions(+)

diff --git a/package/base-files/files/sbin/sysupgrade 
b/package/base-files/files/sbin/sysupgrade
index a11e17615c..78ec455067 100755
--- a/package/base-files/files/sbin/sysupgrade
+++ b/package/base-files/files/sbin/sysupgrade
@@ -236,6 +236,7 @@ include /lib/upgrade
 
 create_backup_archive() {
local conf_tar="$1"
+   local disabled
 
[ "$(rootfs_type)" = "tmpfs" ] && {
echo "Cannot save config while running from ramdisk." >&2
@@ -250,6 +251,14 @@ create_backup_archive() {
[ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V=""
sed -i -e 's,^/,,' "$CONFFILES"
{
+   for service in /etc/init.d/*; do
+   if ! $service enabled; then
+   disabled="$disabled$service disable\n"
+   fi
+   done
+   disabled="$disabled\nexit 0"
+   tar_print_member "/etc/uci-defaults/10_disable_services" 
"$(echo -e $disabled)"
+
# Part of archive with installed packages info
if [ "$SAVE_INSTALLED_PKGS" -eq 1 ]; then
# Format: pkg-name{rom,overlay,unknown}
-- 
2.35.3


___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


[PATCH V3 2/3] base-files: sysupgrade: use tar helper to include installed_packages.txt

2024-02-28 Thread Rafał Miłecki
From: Rafał Miłecki 

Replace mount + overlay with manually built tar archive that gets
prepended to the actual config files backup. This allows more
flexibility with including extra backup files. They can be included at
any paths and don't require writing to flash or mounting an overlay
which has its own limitations (mount points).

Signed-off-by: Rafał Miłecki 
---
 package/base-files/files/sbin/sysupgrade | 44 +---
 1 file changed, 16 insertions(+), 28 deletions(-)

diff --git a/package/base-files/files/sbin/sysupgrade 
b/package/base-files/files/sbin/sysupgrade
index 6b3fb0666f..a11e17615c 100755
--- a/package/base-files/files/sbin/sysupgrade
+++ b/package/base-files/files/sbin/sysupgrade
@@ -237,8 +237,6 @@ include /lib/upgrade
 create_backup_archive() {
local conf_tar="$1"
 
-   local umount_etcbackup_dir=0
-
[ "$(rootfs_type)" = "tmpfs" ] && {
echo "Cannot save config while running from ramdisk." >&2
ask_bool 0 "Abort" && exit
@@ -248,41 +246,31 @@ create_backup_archive() {
run_hooks "$CONFFILES" $sysupgrade_init_conffiles
ask_bool 0 "Edit config file list" && vi "$CONFFILES"
 
-   if [ "$SAVE_INSTALLED_PKGS" -eq 1 ]; then
-   echo "${INSTALLED_PACKAGES}" >> "$CONFFILES"
-   mkdir -p "$ETCBACKUP_DIR"
-   # Avoid touching filesystem on each backup
-   RAMFS="$(mktemp -d -t sysupgrade.XX)"
-   mkdir -p "$RAMFS/upper" "$RAMFS/work"
-   mount -t overlay overlay -o 
lowerdir=$ETCBACKUP_DIR,upperdir=$RAMFS/upper,workdir=$RAMFS/work 
$ETCBACKUP_DIR &&
-   umount_etcbackup_dir=1 || {
-   echo "Cannot mount '$ETCBACKUP_DIR' as tmpfs to 
avoid touching disk while saving the list of installed packages." >&2
-   ask_bool 0 "Abort" && exit
-   }
-
-   # Format: pkg-name{rom,overlay,unknown}
-   # rom is used for pkgs in /rom, even if updated later
-   find /usr/lib/opkg/info -name "*.control" \( \
-   \( -exec test -f /rom/{} \; -exec echo {} rom \; \) -o \
-   \( -exec test -f /overlay/upper/{} \; -exec echo {} 
overlay \; \) -o \
-   \( -exec echo {} unknown \; \) \
-   \) | sed -e 's,.*/,,;s/\.control /\t/' > 
${INSTALLED_PACKAGES}
-   fi
-
v "Saving config files..."
[ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V=""
sed -i -e 's,^/,,' "$CONFFILES"
-   tar c${TAR_V}zf "$conf_tar" -C / -T "$CONFFILES"
+   {
+   # Part of archive with installed packages info
+   if [ "$SAVE_INSTALLED_PKGS" -eq 1 ]; then
+   # Format: pkg-name{rom,overlay,unknown}
+   # rom is used for pkgs in /rom, even if updated later
+   tar_print_member "$INSTALLED_PACKAGES" "$(find 
/usr/lib/opkg/info -name "*.control" \( \
+   \( -exec test -f /rom/{} \; -exec echo {} rom 
\; \) -o \
+   \( -exec test -f /overlay/upper/{} \; -exec 
echo {} overlay \; \) -o \
+   \( -exec echo {} unknown \; \) \
+   \) | sed -e 's,.*/,,;s/\.control /\t/')"
+   fi
+
+   # Rest of archive with config files and ending padding
+   tar c${TAR_V} -C / -T "$CONFFILES"
+   } | gzip > "$conf_tar"
+
local err=$?
if [ "$err" -ne 0 ]; then
echo "Failed to create the configuration backup."
rm -f "$conf_tar"
fi
 
-   [ "$umount_etcbackup_dir" -eq 1 ] && {
-   umount "$ETCBACKUP_DIR"
-   rm -rf "$RAMFS"
-   }
rm -f "$CONFFILES"
 
return "$err"
-- 
2.35.3


___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


Re: [PATCH V2 1/3] base-files: sysupgrade: add tar.sh with helpers for building archives

2024-02-28 Thread Jo-Philipp Wich

Hi Rafał,

comments inline. Sorry for the bikeshedding ahead.

~ Jo


[...]
+
+__tar_print_padding() {
+   dd if=/dev/zero bs=$1 count=1 2>/dev/null


$1 may be 0 which is an invalid value for `bs=`:

  root@OpenWrt:~# dd bs=0
  dd: number 0 is not in 1..2147483647 range

A value of "0" is valid for `count=` though:

  root@OpenWrt:~# dd bs=1 count=0
  0+0 records in
  0+0 records out

So either revert to the previous version or hardcode `bs` to 1, pass the
desired size via `count=` and live with slightly less efficiency (which likely
does not matter at all).


+}
+
+__tar_make_member() {
+   local name="$1"
+   local content="$2"


If you make this `local mtime=${3:-$(date +%s)}` you can rename this function 
to `tar_make_member_inline()` and drop the extra wrapper.



+   local mtime="$3"
+   local mode=644
[...]
+}
+
+tar_make_member_from_file() {


This `tar_make_member_from_file()` wrapper is unused and very trivial, the
only thing it adds is defaulting the mtime value to the mtime of the given
file path. I suggest to drop `tar_make_member_from_file()` entirely and to
rename  `tar_make_member_inline()` below to simply `tar_make_member()`.

Maybe also consider renaming it to `tar_print_member()` or
`tar_output_member()` since that is what it does.


+   local name="$1"
+
+   __tar_make_member "$name" "$(cat $name)" "$(date +%s -r "$1")"
+}
+
+tar_make_member_inline() {
+   local name="$1"
+   local content="$2"
+   local mtime="${3:-$(date +%s)}"
+
+   __tar_make_member "$name" "$content" "$mtime"
+}
+


Analogous to the suggested name change above, the `tar_close()` function 
should probably be renamed to `tar_print_trailer()` or `tar_output_trailer()`

as well.


+tar_close() {
+   __tar_print_padding 1024
+}


___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


[PATCH V2 2/3] base-files: sysupgrade: use tar helper to include installed_packages.txt

2024-02-28 Thread Rafał Miłecki
From: Rafał Miłecki 

Replace mount + overlay with manually built tar archive that gets
prepended to the actual config files backup. This allows more
flexibility with including extra backup files. They can be included at
any paths and don't require writing to flash or mounting an overlay
which has its own limitations (mount points).

Signed-off-by: Rafał Miłecki 
---
 package/base-files/files/sbin/sysupgrade | 44 +---
 1 file changed, 16 insertions(+), 28 deletions(-)

diff --git a/package/base-files/files/sbin/sysupgrade 
b/package/base-files/files/sbin/sysupgrade
index 6b3fb0666f..9d5d736aef 100755
--- a/package/base-files/files/sbin/sysupgrade
+++ b/package/base-files/files/sbin/sysupgrade
@@ -237,8 +237,6 @@ include /lib/upgrade
 create_backup_archive() {
local conf_tar="$1"
 
-   local umount_etcbackup_dir=0
-
[ "$(rootfs_type)" = "tmpfs" ] && {
echo "Cannot save config while running from ramdisk." >&2
ask_bool 0 "Abort" && exit
@@ -248,41 +246,31 @@ create_backup_archive() {
run_hooks "$CONFFILES" $sysupgrade_init_conffiles
ask_bool 0 "Edit config file list" && vi "$CONFFILES"
 
-   if [ "$SAVE_INSTALLED_PKGS" -eq 1 ]; then
-   echo "${INSTALLED_PACKAGES}" >> "$CONFFILES"
-   mkdir -p "$ETCBACKUP_DIR"
-   # Avoid touching filesystem on each backup
-   RAMFS="$(mktemp -d -t sysupgrade.XX)"
-   mkdir -p "$RAMFS/upper" "$RAMFS/work"
-   mount -t overlay overlay -o 
lowerdir=$ETCBACKUP_DIR,upperdir=$RAMFS/upper,workdir=$RAMFS/work 
$ETCBACKUP_DIR &&
-   umount_etcbackup_dir=1 || {
-   echo "Cannot mount '$ETCBACKUP_DIR' as tmpfs to 
avoid touching disk while saving the list of installed packages." >&2
-   ask_bool 0 "Abort" && exit
-   }
-
-   # Format: pkg-name{rom,overlay,unknown}
-   # rom is used for pkgs in /rom, even if updated later
-   find /usr/lib/opkg/info -name "*.control" \( \
-   \( -exec test -f /rom/{} \; -exec echo {} rom \; \) -o \
-   \( -exec test -f /overlay/upper/{} \; -exec echo {} 
overlay \; \) -o \
-   \( -exec echo {} unknown \; \) \
-   \) | sed -e 's,.*/,,;s/\.control /\t/' > 
${INSTALLED_PACKAGES}
-   fi
-
v "Saving config files..."
[ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V=""
sed -i -e 's,^/,,' "$CONFFILES"
-   tar c${TAR_V}zf "$conf_tar" -C / -T "$CONFFILES"
+   {
+   # Part of archive with installed packages info
+   if [ "$SAVE_INSTALLED_PKGS" -eq 1 ]; then
+   # Format: pkg-name{rom,overlay,unknown}
+   # rom is used for pkgs in /rom, even if updated later
+   tar_make_member_inline "$INSTALLED_PACKAGES" "$(find 
/usr/lib/opkg/info -name "*.control" \( \
+   \( -exec test -f /rom/{} \; -exec echo {} rom 
\; \) -o \
+   \( -exec test -f /overlay/upper/{} \; -exec 
echo {} overlay \; \) -o \
+   \( -exec echo {} unknown \; \) \
+   \) | sed -e 's,.*/,,;s/\.control /\t/')"
+   fi
+
+   # Rest of archive with config files and ending padding
+   tar c${TAR_V} -C / -T "$CONFFILES"
+   } | gzip > "$conf_tar"
+
local err=$?
if [ "$err" -ne 0 ]; then
echo "Failed to create the configuration backup."
rm -f "$conf_tar"
fi
 
-   [ "$umount_etcbackup_dir" -eq 1 ] && {
-   umount "$ETCBACKUP_DIR"
-   rm -rf "$RAMFS"
-   }
rm -f "$CONFFILES"
 
return "$err"
-- 
2.35.3


___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


[PATCH V2 3/3] base-files: sysupgrade: add uci-defaults script disabling services #2

2024-02-28 Thread Rafał Miłecki
From: Rafał Miłecki 

Disabled services should be kept disabled after sysupgrade. This can be
easily handled using a proper uci-defaults script.

Extend sysupgrade to check for disabled services, generate uci-defaults
script disabling them and include it in backup.

Cc: Christian Marangi 
Cc: Jo-Philipp Wich 
Cc: Jonas Gorski 
Signed-off-by: Rafał Miłecki 
---
 package/base-files/files/sbin/sysupgrade | 9 +
 1 file changed, 9 insertions(+)

diff --git a/package/base-files/files/sbin/sysupgrade 
b/package/base-files/files/sbin/sysupgrade
index 9d5d736aef..8c6200d7e9 100755
--- a/package/base-files/files/sbin/sysupgrade
+++ b/package/base-files/files/sbin/sysupgrade
@@ -236,6 +236,7 @@ include /lib/upgrade
 
 create_backup_archive() {
local conf_tar="$1"
+   local disabled
 
[ "$(rootfs_type)" = "tmpfs" ] && {
echo "Cannot save config while running from ramdisk." >&2
@@ -250,6 +251,14 @@ create_backup_archive() {
[ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V=""
sed -i -e 's,^/,,' "$CONFFILES"
{
+   for service in /etc/init.d/*; do
+   if ! $service enabled; then
+   disabled="$disabled$service disable\n"
+   fi
+   done
+   disabled="$disabled\nexit 0"
+   tar_make_member_inline "/etc/uci-defaults/10_disable_services" 
"$(echo -e $disabled)"
+
# Part of archive with installed packages info
if [ "$SAVE_INSTALLED_PKGS" -eq 1 ]; then
# Format: pkg-name{rom,overlay,unknown}
-- 
2.35.3


___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


[PATCH V2 1/3] base-files: sysupgrade: add tar.sh with helpers for building archives

2024-02-28 Thread Rafał Miłecki
From: Jo-Philipp Wich 

This allows building uncompressed tar archives from shell scripts (and
compressing them later if needed)

Signed-off-by: Rafał Miłecki 
---
V2: Simplify dd in __tar_print_padding (I still think helper is useful)
Hardcode 0/0/ root/root for now as most likely it'll be enough
Simplify name validation (leasing slash)
Reorder some variables

 package/base-files/files/lib/upgrade/tar.sh | 78 +
 1 file changed, 78 insertions(+)
 create mode 100644 package/base-files/files/lib/upgrade/tar.sh

diff --git a/package/base-files/files/lib/upgrade/tar.sh 
b/package/base-files/files/lib/upgrade/tar.sh
new file mode 100644
index 00..406d5fd71b
--- /dev/null
+++ b/package/base-files/files/lib/upgrade/tar.sh
@@ -0,0 +1,78 @@
+# SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+__tar_print_padding() {
+   dd if=/dev/zero bs=$1 count=1 2>/dev/null
+}
+
+__tar_make_member() {
+   local name="$1"
+   local content="$2"
+   local mtime="$3"
+   local mode=644
+   local uid=0
+   local gid=0
+   local size=${#content}
+   local type=0
+   local link=""
+   local username="root"
+   local groupname="root"
+
+   # 100 byte of padding bytes, using 0x01 since the shell does not 
tolerate null bytes in strings
+   local 
pad=$'\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1'
+
+   # validate name (strip leading slash if present)
+   name=${name#/}
+
+   # truncate string header values to their maximum length
+   name=${name:0:100}
+   link=${link:0:100}
+   username=${username:0:32}
+   groupname=${groupname:0:32}
+
+   # construct header part before checksum field
+   local header1="${name}${pad:0:$((100 - ${#name}))}"
+   header1="${header1}$(printf '%07d\1' $mode)"
+   header1="${header1}$(printf '%07o\1' $uid)"
+   header1="${header1}$(printf '%07o\1' $gid)"
+   header1="${header1}$(printf '%011o\1' $size)"
+   header1="${header1}$(printf '%011o\1' $mtime)"
+
+   # construct header part after checksum field
+   local header2="$(printf '%d' $type)"
+   header2="${header2}${link}${pad:0:$((100 - ${#link}))}"
+   header2="${header2}ustar  ${pad:0:1}"
+   header2="${header2}${username}${pad:0:$((32 - ${#username}))}"
+   header2="${header2}${groupname}${pad:0:$((32 - ${#groupname}))}"
+
+   # calculate checksum over header fields
+   local checksum=0
+   for byte in $(printf '%s%8s%s' "$header1" "" "$header2" | tr '\1' '\0' 
| hexdump -ve '1/1 "%u "'); do
+   checksum=$((checksum + byte))
+   done
+
+   # print member header, padded to 512 byte
+   printf '%s%06o\0 %s' "$header1" $checksum "$header2" | tr '\1' '\0'
+   __tar_print_padding 183
+
+   # print content data, padded to multiple of 512 byte
+   printf "%s" "$content"
+   __tar_print_padding $((512 - (size % 512)))
+}
+
+tar_make_member_from_file() {
+   local name="$1"
+
+   __tar_make_member "$name" "$(cat $name)" "$(date +%s -r "$1")"
+}
+
+tar_make_member_inline() {
+   local name="$1"
+   local content="$2"
+   local mtime="${3:-$(date +%s)}"
+
+   __tar_make_member "$name" "$content" "$mtime"
+}
+
+tar_close() {
+   __tar_print_padding 1024
+}
-- 
2.35.3


___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel