Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions extrarootfs/etc/init.d/rcS.d/10-services-extra.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#!/bin/sh

set -eu

for SERVICE in gadget sshd
do
ln -s "/etc/sv/${SERVICE}" /var/service
done
27 changes: 27 additions & 0 deletions extrarootfs/etc/init.d/rcS.d/20-getty.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#!/bin/sh

set -eu

function run_service() {
local DEVICE="$1"
local BASE="/etc/sv"
local SERVICE_TEMPLATE="getty@"
local SERVICE="${SERVICE_TEMPLATE}${DEVICE}"
local SERVICE_TEMPLATE_DIR="${BASE}/${SERVICE_TEMPLATE}"
local SERVICE_DIR="${BASE}/${SERVICE}"

cp -as "${SERVICE_TEMPLATE_DIR}" "${SERVICE_DIR}"
rm -f "${SERVICE_DIR}/supervise" "${SERVICE_DIR}/log/supervise"

ln -s "${SERVICE_DIR}" /var/service
}

for i in $(cat /proc/cmdline)
do
case $i in
getty=*)
device=${i#*=}
grep -q "^${device}:" /etc/inittab || run_service $device
;;
esac
done
35 changes: 35 additions & 0 deletions extrarootfs/etc/init.d/rcS.d/50-dhcpd.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#!/bin/sh

set -eu

function run_service() {
local DEVICE="$1"
local NETWORK="$2"
local BASE="/etc/sv"
local SERVICE_TEMPLATE="dhcpd@"
local SERVICE="${SERVICE_TEMPLATE}${DEVICE}"
local SERVICE_TEMPLATE_DIR="${BASE}/${SERVICE_TEMPLATE}"
local SERVICE_DIR="${BASE}/${SERVICE}"

cp -as "${SERVICE_TEMPLATE_DIR}" "${SERVICE_DIR}"
rm -f "${SERVICE_DIR}/supervise" "${SERVICE_DIR}/log/supervise"
cat > "${SERVICE_DIR}/conf" <<CONF
DEVICE=$DEVICE
NETWORK=$NETWORK
CONF

ln -s "${SERVICE_DIR}" /var/service
}


for i in $(cat /proc/cmdline)
do
case $i in
dhcpd=*)
dhcpd=${i#*=}
device=${dhcpd%%,*}
network=${dhcpd#*,}
run_service $device $network
;;
esac
done
32 changes: 32 additions & 0 deletions extrarootfs/etc/init.d/rcS.d/60-hostapd.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/bin/sh

set -eu

function run_service() {
local DEVICE="$1"
local BASE="/etc/sv"
local SERVICE_TEMPLATE="hostapd@"
local SERVICE="${SERVICE_TEMPLATE}${DEVICE}"
local SERVICE_TEMPLATE_DIR="${BASE}/${SERVICE_TEMPLATE}"
local SERVICE_DIR="${BASE}/${SERVICE}"

cp -as "${SERVICE_TEMPLATE_DIR}" "${SERVICE_DIR}"
rm -f "${SERVICE_DIR}/supervise" "${SERVICE_DIR}/log/supervise"
cat > "${SERVICE_DIR}/conf" <<CONF
DEVICE=$DEVICE
CONF

ln -s "${SERVICE_DIR}" /var/service
}


for i in $(cat /proc/cmdline)
do
case $i in
hostapd=*)
dhcpd=${i#*=}
device=${dhcpd%%,*}
run_service $device
;;
esac
done
3 changes: 0 additions & 3 deletions extrarootfs/etc/sv/busybox-syslogd/run

This file was deleted.

7 changes: 7 additions & 0 deletions extrarootfs/etc/sv/dhcpd@/log/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/sh

LOG_DIR="$( cd "$(dirname $0)/.." && echo ${PWD} )"
SERVICE_DIR="${LOG_DIR%/log}"
SERVICE_NAME="${SERVICE_DIR##*/}"

exec vlogger -t "${SERVICE_NAME}" -p daemon
36 changes: 36 additions & 0 deletions extrarootfs/etc/sv/dhcpd@/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#!/bin/sh

set -eu

exec 2>&1

[ -r ./conf ] && . ./conf

modprobe brcmfmac

echo "Waiting for ${DEVICE}..."
while ! grep -q "${DEVICE}:" /proc/net/dev
do
sleep 5
done


echo "Starting dhcp server for ${DEVICE}"

ifconfig $DEVICE ${NETWORK}.1 netmask 255.255.255.0 broadcast ${NETWORK}.255 up

cat > "/run/udhcpd-${DEVICE}.conf" <<DHCPDCONF
start ${NETWORK}.100
end ${NETWORK}.200
interface $DEVICE
lease_file /var/run/udhcpd-${DEVICE}.leases
option subnet 255.255.255.0
option router ${NETWORK}.1
option lease 43200
#option dns ${NETWORK}.1
option dns 8.8.8.8
option domain local
DHCPDCONF

touch "/var/run/udhcpd-${DEVICE}.leases"
exec udhcpd -f "/run/udhcpd-${DEVICE}.conf"
7 changes: 7 additions & 0 deletions extrarootfs/etc/sv/gadget/finish
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/sh

set -eu

exec 2>&1

exec "$(dirname $0)/service" stop
7 changes: 7 additions & 0 deletions extrarootfs/etc/sv/gadget/log/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/sh

LOG_DIR="$( cd "$(dirname $0)/.." && echo ${PWD} )"
SERVICE_DIR="${LOG_DIR%/log}"
SERVICE_NAME="${SERVICE_DIR##*/}"

exec vlogger -t "${SERVICE_NAME}" -p daemon
1 change: 1 addition & 0 deletions extrarootfs/etc/sv/gadget/log/supervise
9 changes: 9 additions & 0 deletions extrarootfs/etc/sv/gadget/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/bin/sh

set -eu

exec 2>&1

$(dirname $0)/service start

sleep infinity
130 changes: 130 additions & 0 deletions extrarootfs/etc/sv/gadget/service
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
#!/bin/sh

set -eux

exec 2>&1

CONFIG_PATH="/sys/kernel/config"
GADGET_PATH="${CONFIG_PATH}/usb_gadget/pi"

ID_VENDOR_ETHERNET="0x0bda"
ID_PRODUCT_ETHERNET="0x8153"
ID_VENDOR_LINUX_FOUNDATION="0x1d6b"
ID_PRODUCT_COMPOSITE="0x0104"

ID_VENDOR="$ID_VENDOR_ETHERNET"
ID_PRODUCT="$ID_PRODUCT_ETHERNET"
SERIAL_NUMBER="fedcba9876543210"

function enable() {
ls /sys/class/udc > "${GADGET_PATH}/UDC"
}


function disable() {
echo "" > "${GADGET_PATH}/UDC"
}


function create_configuration() {
mkdir -p "${GADGET_PATH}/configs/c.1/strings/0x409"
echo "Config 1: ECM network" > "${GADGET_PATH}/configs/c.1/strings/0x409/configuration"
echo 250 > "${GADGET_PATH}/configs/c.1/MaxPower"
}


function remove_configuration() {
rmdir "${GADGET_PATH}/configs/c.1/strings/0x409"
rmdir "${GADGET_PATH}/configs/c.1"
}



function create_serial_function() {
mkdir -p "${GADGET_PATH}/functions/acm.usb0"
ln -s "${GADGET_PATH}/functions/acm.usb0" "${GADGET_PATH}/configs/c.1/"
}


function remove_serial_function() {
rm "${GADGET_PATH}/configs/c.1/acm.usb0"
rmdir "${GADGET_PATH}/functions/acm.usb0"
}


function create_ethernet_function() {
mkdir -p "${GADGET_PATH}/functions/ecm.usb0"
# first byte of address must be even
#HOST="48:6f:73:74:50:43" # "HostPC"
#SELF="42:61:64:55:53:42" # "BadUSB"
#echo $HOST > "${GADGET_PATH}/functions/ecm.usb0/host_addr"
#echo $SELF > "${GADGET_PATH}/functions/ecm.usb0/dev_addr"
ln -s "${GADGET_PATH}/functions/ecm.usb0" "${GADGET_PATH}/configs/c.1/"
}


function remove_ethernet_function() {
rm "${GADGET_PATH}/configs/c.1/ecm.usb0"
rmdir "${GADGET_PATH}/functions/ecm.usb0"
}


function create_gadget() {
mkdir "$GADGET_PATH"

echo "$ID_VENDOR" > "${GADGET_PATH}/idVendor"
echo "$ID_PRODUCT" > "${GADGET_PATH}/idProduct"

echo 0x0100 > "${GADGET_PATH}/bcdDevice" # v1.0.0
echo 0x0200 > "${GADGET_PATH}/bcdUSB" # USB2

mkdir -p "${GADGET_PATH}/strings/0x409"
echo "$SERIAL_NUMBER" > "${GADGET_PATH}/strings/0x409/serialnumber"
echo "nobody" > "${GADGET_PATH}/strings/0x409/manufacturer"
echo "Composite USB Device" > "${GADGET_PATH}/strings/0x409/product"

}


function remove_gadget() {
rmdir "${GADGET_PATH}/strings/0x409"
sleep 1
rmdir "${GADGET_PATH}"
}


function start() {
modprobe libcomposite
mount -t configfs none "$CONFIG_PATH"

create_gadget
create_configuration
create_serial_function
create_ethernet_function
enable
sv up getty@ttyGS0
}


function stop() {
sv down getty@ttyGS0
ifconfig usb0 down
disable

remove_ethernet_function
remove_serial_function
remove_configuration
remove_gadget

umount "$CONFIG_PATH"
}


case $1 in
start|stop|enable|disable)
$1
;;
*)
echo "Invalid command: $1"
;;
esac
1 change: 1 addition & 0 deletions extrarootfs/etc/sv/gadget/supervise
7 changes: 7 additions & 0 deletions extrarootfs/etc/sv/getty@/log/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/sh

LOG_DIR="$( cd "$(dirname $0)/.." && echo ${PWD} )"
SERVICE_DIR="${LOG_DIR%/log}"
SERVICE_NAME="${SERVICE_DIR##*/}"

exec vlogger -t "${SERVICE_NAME}" -p daemon
19 changes: 19 additions & 0 deletions extrarootfs/etc/sv/getty@/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#!/bin/sh

set -eu

exec 2>&1

SERVICE_DIR="$( cd "$(dirname $0)" && echo ${PWD} )"
SERVICE_NAME="${SERVICE_DIR##*/}"
DEVICE="${SERVICE_NAME##*@}"

while [ ! -e "/dev/$DEVICE" ]
do
echo "Waiting for ${DEVICE}..."
sleep 5
done

echo "Starting getty for ${DEVICE}"

exec /sbin/getty -L "/dev/${DEVICE}" 115200 vt100
7 changes: 7 additions & 0 deletions extrarootfs/etc/sv/hostapd@/finish
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/sh

set -eu

exec 2>&1

grep -q "ap0:" /proc/net/dev && iw dev ap0 del
7 changes: 7 additions & 0 deletions extrarootfs/etc/sv/hostapd@/log/run
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/sh

LOG_DIR="$( cd "$(dirname $0)/.." && echo ${PWD} )"
SERVICE_DIR="${LOG_DIR%/log}"
SERVICE_NAME="${SERVICE_DIR##*/}"

exec vlogger -t "${SERVICE_NAME}" -p daemon
Loading