167 lines
4.9 KiB
Bash
Executable file
167 lines
4.9 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
PREREQ=""
|
|
prereqs() {
|
|
echo "$PREREQ"
|
|
}
|
|
case $1 in
|
|
# get pre-requisites
|
|
prereqs)
|
|
prereqs
|
|
exit 0
|
|
;;
|
|
esac
|
|
|
|
USB_FUNCTIONS=rndis
|
|
ANDROID_USB=/sys/class/android_usb/android0
|
|
GADGET_DIR=/config/usb_gadget
|
|
LOCAL_IP=192.168.2.15
|
|
EXPLICIT_BUSYBOX="/bin/busybox"
|
|
TELNET_DEBUG_PORT=23
|
|
|
|
write() {
|
|
echo -n "$2" >"$1"
|
|
}
|
|
|
|
# This sets up the USB with whatever USB_FUNCTIONS are set to via configfs
|
|
usb_setup_configfs() {
|
|
G_USB_ISERIAL=$GADGET_DIR/g1/strings/0x409/serialnumber
|
|
|
|
mkdir $GADGET_DIR/g1
|
|
write $GADGET_DIR/g1/idVendor "0x18D1"
|
|
write $GADGET_DIR/g1/idProduct "0xD001"
|
|
mkdir $GADGET_DIR/g1/strings/0x409
|
|
write $GADGET_DIR/g1/strings/0x409/serialnumber "$1"
|
|
write $GADGET_DIR/g1/strings/0x409/manufacturer "Halium initrd"
|
|
write $GADGET_DIR/g1/strings/0x409/product "Failed to boot"
|
|
|
|
if echo $USB_FUNCTIONS | grep -q "rndis"; then
|
|
NETWORK_FUNCTION=""
|
|
for function in ncm.usb0 rndis.usb0 rndis_bam.rndis; do
|
|
if mkdir $GADGET_DIR/g1/functions/$function; then
|
|
NETWORK_FUNCTION=$function
|
|
break
|
|
fi
|
|
done
|
|
|
|
if [ -z "$NETWORK_FUNCTION" ]; then
|
|
echo "Error: No USB network gadget function available" >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
echo $USB_FUNCTIONS | grep -q "mass_storage" && mkdir $GADGET_DIR/g1/functions/storage.0
|
|
|
|
mkdir $GADGET_DIR/g1/configs/c.1
|
|
mkdir $GADGET_DIR/g1/configs/c.1/strings/0x409
|
|
write $GADGET_DIR/g1/configs/c.1/strings/0x409/configuration "$USB_FUNCTIONS"
|
|
|
|
if echo $USB_FUNCTIONS | grep -q "rndis"; then
|
|
ln -s $GADGET_DIR/g1/functions/$NETWORK_FUNCTION $GADGET_DIR/g1/configs/c.1
|
|
fi
|
|
echo $USB_FUNCTIONS | grep -q "mass_storage" && ln -s $GADGET_DIR/g1/functions/storage.0 $GADGET_DIR/g1/configs/c.1
|
|
|
|
echo "$(ls /sys/class/udc | grep -v dummy | head -1)" > $GADGET_DIR/g1/UDC
|
|
}
|
|
|
|
# This sets up the USB with whatever USB_FUNCTIONS are set to via android_usb
|
|
usb_setup_android_usb() {
|
|
G_USB_ISERIAL=$ANDROID_USB/iSerial
|
|
write $ANDROID_USB/enable 0
|
|
write $ANDROID_USB/functions ""
|
|
write $ANDROID_USB/enable 1
|
|
usleep 500000 # 0.5 delay to attempt to remove rndis function
|
|
write $ANDROID_USB/enable 0
|
|
write $ANDROID_USB/idVendor 18D1
|
|
write $ANDROID_USB/idProduct D001
|
|
write $ANDROID_USB/iManufacturer "Halium initrd"
|
|
write $ANDROID_USB/iProduct "Failed to boot"
|
|
write $ANDROID_USB/iSerial "$1"
|
|
write $ANDROID_USB/functions $USB_FUNCTIONS
|
|
write $ANDROID_USB/enable 1
|
|
}
|
|
|
|
# This determines which USB setup method is going to be used
|
|
usb_setup() {
|
|
mkdir /config || true
|
|
mount -t configfs none /config || true
|
|
|
|
if [ -d $ANDROID_USB ]; then
|
|
usb_setup_android_usb $1
|
|
elif [ -d $GADGET_DIR ]; then
|
|
usb_setup_configfs $1
|
|
fi
|
|
}
|
|
|
|
usb_info() {
|
|
# make sure USB is settled
|
|
echo "########################## usb_info: $1"
|
|
sleep 1
|
|
write $G_USB_ISERIAL "$1"
|
|
}
|
|
|
|
inject_loop() {
|
|
INJ_DIR=/init-ctl
|
|
INJ_STDIN=$INJ_DIR/stdin
|
|
|
|
mkdir $INJ_DIR
|
|
mkfifo $INJ_STDIN
|
|
echo "This entire directory is for debugging init - it can safely be removed" >$INJ_DIR/README
|
|
|
|
echo "########################## Beginning inject loop"
|
|
while :; do
|
|
while read IN; do
|
|
if [ "$IN" = "continue" ]; then break 2; fi
|
|
$IN
|
|
done <$INJ_STDIN
|
|
done
|
|
rm -rf $INJ_DIR # Clean up if we exited nicely
|
|
echo "########################## inject loop done"
|
|
}
|
|
|
|
usb_setup "halium-initrd telnet 192.168.2.15"
|
|
|
|
USB_IFACE=notfound
|
|
/sbin/ifconfig rndis0 $LOCAL_IP && USB_IFACE=rndis0
|
|
if [ x$USB_IFACE = xnotfound ]; then
|
|
/sbin/ifconfig usb0 $LOCAL_IP && USB_IFACE=usb0
|
|
fi
|
|
# Report for the logs
|
|
/sbin/ifconfig -a
|
|
|
|
# Unable to set up USB interface? Reboot.
|
|
if [ x$USB_IFACE = xnotfound ]; then
|
|
usb_info "Halium initrd Debug: ERROR: could not setup USB as usb0 or rndis0"
|
|
dmesg
|
|
sleep 60 # plenty long enough to check usb on host
|
|
reboot -f
|
|
fi
|
|
|
|
# Create /etc/udhcpd.conf file.
|
|
echo "start 192.168.2.20" >/etc/udhcpd.conf
|
|
echo "end 192.168.2.90" >>/etc/udhcpd.conf
|
|
echo "lease_file /var/udhcpd.leases" >>/etc/udhcpd.conf
|
|
echo "interface $USB_IFACE" >>/etc/udhcpd.conf
|
|
echo "option subnet 255.255.255.0" >>/etc/udhcpd.conf
|
|
|
|
# Be explicit about busybox so this works in a rootfs too
|
|
echo "########################## starting dhcpd"
|
|
$EXPLICIT_BUSYBOX udhcpd
|
|
|
|
# Non-blocking telnetd
|
|
echo "########################## starting telnetd"
|
|
# We run telnetd on different ports pre/post-switch_root This
|
|
# avoids problems with an unterminated pre-switch_root telnetd
|
|
# hogging the port
|
|
$EXPLICIT_BUSYBOX telnetd -b ${LOCAL_IP}:${TELNET_DEBUG_PORT} -l /bin/sh
|
|
|
|
# For some reason this does not work in rootfs
|
|
usb_info "Halium initrd Debug telnet on port $TELNET_DEBUG_PORT on $USB_IFACE $LOCAL_IP - also running udhcpd"
|
|
|
|
ps -wlT
|
|
ps -ef
|
|
netstat -lnp
|
|
cat /proc/mounts
|
|
sync
|
|
|
|
# Run command injection loop = can be exited via 'continue'
|
|
inject_loop
|