diff --git a/Slax/briq/rootcopy/etc/issue b/Slax/briq/rootcopy/etc/issue new file mode 100644 index 0000000..7ac6f33 --- /dev/null +++ b/Slax/briq/rootcopy/etc/issue @@ -0,0 +1,10 @@ +\1 + _ ____ _____ + | | / __ \ / ____| + __| |_ __ __ _| | | | (___ + / _` | '_ \ / _` | | | |\___ \ + | (_| | | | | (_| | |__| |____) | + \__,_|_| |_|\__,_|\____/|_____/ + + powered by Briq + diff --git a/Slax/briq/rootcopy/usr/bin/dir2sb b/Slax/briq/rootcopy/usr/bin/dir2sb new file mode 100755 index 0000000..3ddd64d --- /dev/null +++ b/Slax/briq/rootcopy/usr/bin/dir2sb @@ -0,0 +1,58 @@ +#!/bin/bash +# Author: Tomas M. + +usage() +{ + echo "" + echo "Convert directory to .sb compressed module" + echo "Usage: $0 [source_directory.sb] [[target_file.sb]]" + echo " If source_directory does not have .sb suffix and it is not 'squashfs-root'," + echo " then the source_directory itself is included in the module and" + echo " then the target_file.sb parameter is required." + echo " If target_file.sb is not specified, the source_directory is erased" + echo " and replaced by the newly generated module file." +} + +P1="$(readlink -f "$1")" +P2="$(readlink -f "$2")" + +if [ "$P1" = "$P2" ]; then + P2="" +fi + +SB=$(echo "$P1" | grep -o "[.]sb/*\$") +if [ "$(echo "$P1" | grep -o "/squashfs-root/*\$")" != "" ]; then + SB="true" +fi + +if [ "$SB" = "" ]; then + KEEP="-keep-as-directory" + if [ "$P2" = "" ]; then + usage + exit 1 + fi +else + KEEP="" +fi + +if [ ! -d "$P1" ]; then + echo "Not a directory: $P1" >&2 + exit 2 +fi + + +if [ "$P2" = "" ]; then + TARGET="$P1".sb + while [ -e "$TARGET" ]; do TARGET="$TARGET"x; done + mksquashfs "$P1" "$TARGET" -comp xz -b 1024K -always-use-fragments $KEEP >/dev/null || exit 3 + umount "$P1" 2>/dev/null + rm -Rf "$P1" + mv "$TARGET" "$P1" +else + if [ -e "$P2" ]; then + echo "Target exists: $P2" >&2 + exit 4 + fi + + mksquashfs "$P1" "$P2" -comp xz -b 1024K -always-use-fragments $KEEP >/dev/null +fi diff --git a/Slax/briq/rootcopy/usr/bin/pacman2sb b/Slax/briq/rootcopy/usr/bin/pacman2sb new file mode 100755 index 0000000..8a82c31 --- /dev/null +++ b/Slax/briq/rootcopy/usr/bin/pacman2sb @@ -0,0 +1,32 @@ +#! /bin/bash -- + +# Aggrega file di pacchetti installati o aggiornati con Pacman +# dall'ultimo avvio di una distribuzione linux-live +# (cfr. https://www.linux-live.org/ ) senza persistenza attivata, +# creando un unico bundle .sb +# I file vengono letti dalla directory changes e da essa filtrati solo +# quelli appartenenti ai pacchetti di pacman. +# +# Autore: Guido Longoni + +IFS=$'\n' +OUTLST="/tmp/added_files_$$.lst" +CACHEDIR=$(sed -n -e '/^[[:space:]]*CacheDir/s|^[^=]*=[[:space:]]*||gp' -e 's|[[:space:]]*$||g' /etc/pacman.conf | head -n1) +OUTDIR="/tmp/sb_$$" +OUTFILE="$OUTDIR".sb +CHGDIR=$(realpath $(mount | sed -n -e '/squashfs/s|.* on \([^ ]*\)/.*|\1|gp' | head -n1)/../changes) + +mkdir -p '/tmp' +mkdir -p "$OUTDIR" +rm -rf "$OUTLST" +touch "$OUTLST" +for i in $(find "$CACHEDIR" -iname '*.pkg.tar.xz'); do + tar t -f $i >> "$OUTLST" 2>/dev/null +done +sort -u "$OUTLST" | grep -v '^\.' > "$OUTLST".tmp +mv "$OUTLST".tmp "$OUTLST" +rsync -av --old-d --files-from="$OUTLST" "$CHGDIR" "$OUTDIR" +dir2sb "$OUTDIR" "$OUTFILE" +rm -rf "$OUTDIR" +rm -rf "$OUTLST" + diff --git a/Slax/briq/rootcopy/usr/bin/pxe b/Slax/briq/rootcopy/usr/bin/pxe new file mode 100755 index 0000000..3aaff4e --- /dev/null +++ b/Slax/briq/rootcopy/usr/bin/pxe @@ -0,0 +1,86 @@ +#!/bin/bash +# Rebuild initial ramdisk with full network drivers, +# start DHCP and TFTP server in order to provide PXE service +# +# Author: Tomas M + +LIVE=/run/initramfs +FTPROOT=/var/state/dnsmasq/root + +# find out our own IP address. If more interfaces are available, use the first one +IP="$(hostname -I | cut -d " " -f 1)" +GW=$(ip route show | grep default | grep -o "via.*" | head -n 1 | cut -d " " -f 2) + +# if no IP is assigned to this computer, setup private address randomly +if [ "$IP" = "" ]; then + killall dhclient 2>/dev/null + IP="10."$(($RANDOM/130+1))"."$(($RANDOM/130+1))".1" + ifconfig $(ls -1 /sys/class/net | egrep -v '^lo$' | sort | head -n 1) $IP netmask 255.255.255.0 +fi + +# if gateway is not recognized, lets make our IP a gateway and enable forwarding +if [ "$GW" = "" ]; then + GW="$IP" + echo 1 > /proc/sys/net/ipv4/conf/all/forwarding + echo 1 > /proc/sys/net/ipv6/conf/all/forwarding +fi + +echo Starting PXE server on $IP ... + +# calculate C class range +RANGE=$(echo $IP | cut -d "." -f 1-3) + +# make sure dnsmasq can be started +killall dnsmasq 2>/dev/null +killall busybox 2>/dev/null +rm -Rf $FTPROOT 2>/dev/null +mkdir -p $FTPROOT/{pxelinux.cfg,tmp}/ + +# create root filesystem for ftfp +cd $LIVE +( find . -print | grep -v "memory" + cd / + find /lib/modules/$(uname -r)/kernel/drivers/net | grep -v wireless +) | cpio -pvd $FTPROOT/tmp 2>/dev/null + +cp /lib/modules/$(uname -r)/modules.* $FTPROOT/tmp/lib/modules/$(uname -r) +depmod -b $FTPROOT/tmp +rm $FTPROOT/tmp/lib/initramfs_escaped + +# pack root in initramfs +cd $FTPROOT/tmp +find . -print | cpio -o -H newc 2>/dev/null | gzip -f --fast >../initrfs.img +cd .. +rm -Rf tmp + +# link files here since copying is not necessary +ln -s $(find $LIVE/memory/{data,iso,toram} 2>/dev/null | grep vmlinuz | head -n 1) $FTPROOT/vmlinuz +ln -s $(find $LIVE/memory/{data,iso,toram} 2>/dev/null | grep pxelinux.0 | head -n 1) $FTPROOT/pxelinux.0 +ln -s $(find $LIVE/memory/{data,iso,toram} 2>/dev/null | grep ldlinux.c32 | head -n 1) $FTPROOT/ldlinux.c32 + +find $LIVE/memory/{data,iso,toram} 2>/dev/null | egrep "[.]sb\$" | sort -n | while read LINE; do + BAS="$(basename "$LINE")" + ln -s $LINE "$FTPROOT/$BAS" + echo $BAS >> "$FTPROOT/PXEFILELIST" +done + +echo "This is Slax PXE data server. PXE clients will download file list" > "$FTPROOT/index.html" + +# default pxelinux configuration. Keep xmode selection for clients the same like for the server +echo " +PROMPT 0 +DEFAULT slax +LABEL slax +KERNEL /vmlinuz +IPAPPEND 1 +APPEND initrd=/initrfs.img load_ramdisk=1 prompt_ramdisk=0 rw printk.time=0 $(cat /proc/cmdline | egrep -o 'slax.flags=[^ ]+' | sed -r 's:[,=]pxe::' | sed -r 's:[,=]toram::') +" > $FTPROOT/pxelinux.cfg/default + +# start the DHCP server and TFTP server +dnsmasq --enable-tftp --tftp-root=/var/state/dnsmasq/root \ +--dhcp-boot=pxelinux.0,"$IP",$IP \ +--dhcp-option=3,$GW \ +--dhcp-range=$RANGE.2,$RANGE.250,infinite --log-dhcp + +# start HTTP server at port 7529 (that are the numbers you type on your phone to write 'slax') +busybox httpd -p 7529 -h /var/state/dnsmasq/root diff --git a/Slax/briq/rootcopy/usr/bin/rmsbdir b/Slax/briq/rootcopy/usr/bin/rmsbdir new file mode 100755 index 0000000..42cb449 --- /dev/null +++ b/Slax/briq/rootcopy/usr/bin/rmsbdir @@ -0,0 +1,17 @@ +#!/bin/bash +# Author: Tomas M. + +if [ ! -e "$1" ]; then + echo + echo "Erase module directory created by sb2dir" + echo "Usage: $0 [source_directory.sb]" + exit 1 +fi + +if [ ! -d "$1" ]; then + echo "Directory does not exist: $1" >&2 + exit +fi + +umount "$1" 2>/dev/null +rm -Rf "$1" diff --git a/Slax/briq/rootcopy/usr/bin/savechanges b/Slax/briq/rootcopy/usr/bin/savechanges new file mode 100755 index 0000000..48e9c9e --- /dev/null +++ b/Slax/briq/rootcopy/usr/bin/savechanges @@ -0,0 +1,46 @@ +#!/bin/bash + +TMP=/tmp/changes$$ +EXCLUDE="^\$|/\$|[.]wh[.][.]wh[.]orph/|^[.]wh[.][.]wh[.]plnk/|^[.]wh[.][.]wh[.]aufs|^var/cache/|^var/backups/|^var/tmp/|^var/log/|^var/lib/apt/|^var/lib/dhcp/|^var/lib/systemd/|^sbin/fsck[.]aufs|^etc/resolv[.]conf|^root/[.]Xauthority|^root/[.]xsession-errors|^root/[.]fehbg|^root/[.]fluxbox/lastwallpaper|^root/[.]fluxbox/menu_resolution|^etc/mtab|^etc/fstab|^boot/|^dev/|^mnt/|^proc/|^run/|^sys/|^tmp/" +CHANGES=/run/initramfs/memory/changes + +if [ "$1" = "" ]; then + echo "" + echo "savechanges - save all changed files in a compressed filesystem bundle" + echo " - excluding some predefined files such as /etc/mtab," + echo " temp & log files, empty directories, apt cache, and such" + echo "" + echo "Usage:" + echo " $0 [ target_file.sb ] [ changes_directory ]" + echo "" + echo "If changes_directory is not specified, /run/initramfs/memory/changes is used." + echo "" + exit 1 +fi + +if [ ! "$2" = "" ]; then + CHANGES="$2" +fi + +# exclude the save_file itself of course +EXCLUDE="$EXCLUDE|^""$(readlink -f "$1" | cut -b 2- | sed -r "s/[.]/[.]/")""\$" + +CWD=$(pwd) + +cd $CHANGES || exit + +mkdir -p $TMP +mount -t tmpfs tmpfs $TMP + +find \( -type d -printf "%p/\n" , -not -type d -print \) \ + | sed -r "s/^[.]\\///" | egrep -v "$EXCLUDE" \ + | while read FILE; do + cp --parents -afr "$FILE" "$TMP" +done + +cd $CWD + +mksquashfs $TMP "$1" -comp xz -b 1024K -always-use-fragments -noappend + +umount $TMP +rmdir $TMP diff --git a/Slax/briq/rootcopy/usr/bin/sb b/Slax/briq/rootcopy/usr/bin/sb new file mode 100755 index 0000000..5346f44 --- /dev/null +++ b/Slax/briq/rootcopy/usr/bin/sb @@ -0,0 +1,29 @@ +#!/bin/bash + +if [ "$1" = "rm" ]; then + shift + rmsbdir "$@" + exit $? +fi + +if [ "$1" = "rmdir" ]; then + shift + rmsbdir "$@" + exit $? +fi + +if [ "$1" = "conv" ]; then + shift +fi + +if [ ! -r "$1" ]; then + echo File not found "$1" + exit 1 +fi + +if [ -d "$1" ]; then + dir2sb "$@" + exit $? +fi + +sb2dir "$@" diff --git a/Slax/briq/rootcopy/usr/bin/sb2dir b/Slax/briq/rootcopy/usr/bin/sb2dir new file mode 100755 index 0000000..4f580ec --- /dev/null +++ b/Slax/briq/rootcopy/usr/bin/sb2dir @@ -0,0 +1,33 @@ +#!/bin/bash +# Author: Tomas M. + +if [ ! -e "$1" ]; then + echo + echo "Convert .sb compressed module into directory with the same name" + echo "Usage: $0 [source_file.sb] [[optional output_directory]]" + echo " If the output_directory is specified, it must exist" + echo " If the output_directory is not specified, the name source_file.sb" + echo " is used and the directory is overmounted with tmpfs" + exit 1 +fi + +if [ ! -r "$1" ]; then + echo "File does not exist: $1" >&2 + exit +fi + +if [ "$2" = "" ]; then + SOURCE="$1".x + while [ -e "$SOURCE" ]; do SOURCE="$SOURCE"x; done + mv "$1" "$SOURCE" || exit + mkdir "$1" + mount -t tmpfs tmpfs "$1" + unsquashfs -f -dest "$1" "$SOURCE" >/dev/null || exit + rm "$SOURCE" +else + if [ ! -d "$2" ]; then + echo "Directory does not exist: $2" >&2 + exit + fi + unsquashfs -f -dest "$2" "$1" >/dev/null +fi diff --git a/Slax/briq/rootcopy/usr/bin/slax b/Slax/briq/rootcopy/usr/bin/slax new file mode 100755 index 0000000..a8843ad --- /dev/null +++ b/Slax/briq/rootcopy/usr/bin/slax @@ -0,0 +1,178 @@ +#!/bin/bash +# Slax management and control script +# Author: Tomas M + +# activate +# deactivate +# list + + +LIVE=/run/initramfs/memory +RAMSTORE=$LIVE/modules + +# Print error message and exit +# $1 = error message +# +die() +{ + echo "$1" >&2 + exit 1 +} + + +print_branches() +{ + local SI BUNDLE LOOP CWD + + SI="/sys/fs/aufs/$(cat /proc/mounts | grep 'aufs / aufs' | egrep -o 'si=([^,) ]+)' | tr = _)" + CWD="$(pwd)" + cd "$SI" + ls -v1 | grep -v xi_path | egrep 'br[0-9]+' | xargs cat | grep memory/bundles | rev | cut -b 4- | rev | while read BUNDLE; do + if mountpoint -q "$BUNDLE"; then + LOOP=$(cat /proc/mounts | fgrep " $BUNDLE squashfs" | cut -d " " -f 1) + echo -n "$BUNDLE" + echo -ne "\t" + losetup $LOOP | sed -r "s:.*[(]|[)].*::g" + fi + done | tac + cd "$CWD" +} + + +# Activate Slax Bundle +# $1 = file to activate +# +activate() +{ + local SB TGT BAS + + SB="$(readlink -f "$1")" + BAS="$(basename "$SB")" + + # check if file exists + if [ ! -r "$SB" ]; then + usage + die "file not found $SB" + fi + + # check if the file is part of aufs union, if yes we need to copy it outside + if df "$SB" | cut -d " " -f 1 | grep -q aufs; then + TGT="$RAMSTORE" + mkdir -p "$TGT" + if [ -r $TGT/$BAS ]; then die "File exists: $TGT/$BAS"; fi + cp -n "$SB" "$TGT/$BAS" + if [ $? -ne 0 ]; then die "Error copying file to $TGT/$BAS. Not enough free RAM or disk space?"; fi + SB="$TGT/$BAS" + fi + + # check if this particular file is already activated + if print_branches | cut -f 2 | fgrep -q "$SB"; then + exit + fi + + # mount remount,add + TGT="$LIVE/bundles/$BAS" + mkdir -p "$TGT" + + mount -n -o loop,ro "$SB" "$TGT" + if [ $? -ne 0 ]; then + die "Error mounting $SB to $TGT, perhaps corrupted download" + fi + + # add current branch to aufs union + mount -t aufs -o remount,add:1:"$TGT" aufs / + if [ $? -ne 0 ]; then + umount "$TGT" + rmdir "$TGT" + die "Error attaching bundle filesystem to Slax" + fi + + echo "Slax Bundle activated: $BAS" +} + + +# Deactivate Slax bundle of the given name +# $1 = path to bundle file, or its name +# +deactivate() +{ + local BUNDLES SB MATCH LOOP LOOPFILE + + BUNDLES=$LIVE/bundles + MODULES=$LIVE/modules + SB="$(basename "$1")" + + rmdir "$BUNDLES/$SB" 2>/dev/null # this fails unless the dir is + rmdir "$BUNDLES/$SB.sb" 2>/dev/null # forgotten there empty. It's safe this way + + if [ ! -d "$BUNDLES/$SB" ]; then + # we don't have real filename match, lets try to add .sb extension + if [ ! -d "$BUNDLES/$SB.sb" ]; then + # no, still no match. Lets use some guesswork + SB=$(print_branches | cut -f 2 | egrep -o "/[0-9]+-$SB.sb\$" | tail -n 1 | xargs -r basename) + else + SB="$SB.sb" + fi + fi + + if [ "$SB" = "" -o ! -d "$BUNDLES/$SB" ]; then + die "can't find active slax bundle $1" + fi + + echo "Attempting to deactivate Slax bundle $SB..." + mount -t aufs -o remount,verbose,del:"$BUNDLES/$SB" aufs / 2>/dev/null + if [ $? -ne 0 ]; then + die "Unable to deactivate Slax Bundle - still in use. See dmesg for more." + fi + + # remember what loop device was the bundle mounted to, it may be needed later + LOOP="$(cat /proc/mounts | fgrep " $BUNDLES/$SB " | cut -d " " -f 1)" + LOOPFILE="$(losetup "$LOOP" | cut -d " " -f 3 | sed -r 's:^.|.$::g')" + + umount "$BUNDLES/$SB" 2>/dev/null + if [ $? -ne 0 ]; then + die "Unable to umount Slax bundle loop-mount $BUNDLES/$SB" + fi + rmdir "$BUNDLES/$SB" + + # free the loop device manually since umount fails to do that if the bundle was activated on boot + losetup -d "$LOOP" 2>/dev/null + + if echo "$LOOPFILE" | grep -q $RAMSTORE; then + rm -f $LOOPFILE + fi + + echo "Slax Bundle deactivated: $SB" +} + + +usage() +{ + echo "Usage: $0 [ activate | deactivate | list ] [ file.sb ]" >&2 + if [ "$1" != "" ]; then + echo "$1" >&2 + fi +} + + +if [ "$1" = "" ]; then + usage + die +fi + +if [ "$1" = "activate" ]; then + activate "$2" +fi + +if [ "$1" = "deactivate" ]; then + deactivate "$2" +fi + +if [ "$1" = "list" ]; then + print_branches +fi + +if [ "$1" = "savechanges" ]; then + shift + savechanges "$@" +fi