For 4G USB Modem Dongle (Huawei) E3372-325 — first seconds you can see in lsusb Bus 005 Device 013: ID 3566:2001 Mobile Mobile and after Bus 005 Device 015: ID 12d1:155e Huawei Technologies Co., Ltd. Mobile
Full instruction here https://blog.tanatos.org/posts/huawei_e3372h-325_brovi_with_linux/.
So 2 scripts are below
/usr/local/bin/brovi_switch (make it executable!)
#!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # vim: filetype=bash # 2023-01-28 Pavel Piatruk, piatruk.by ID=$$ USB_ID=$(basename $DEVPATH) { #set|sort #ls -la /sys/$DEVPATH echo bInterfaceClass on ports as follows grep -H . /sys$DEVPATH/1*/bInterfaceClass IC=$( grep -h . /sys$DEVPATH/*:1.0/bInterfaceClass ) echo "got bInterfaceClass on 1st port $IC" echo usb_modeswitch -b $BUSNUM -g $DEVNUM -v 3566 -p 2001 case $IC in 08) echo Storage MODE ;; e0) echo "Already RNDIS" LOCKFILE=/var/run/brovi.$USB_ID.lock if [[ -e $LOCKFILE ]] then LOCKFILE_AGE=$(( $(date +%s ) - $(stat $LOCKFILE -c %Y) )) echo LOCKFILE_AGE=$LOCKFILE_AGE fi if [[ -n $LOCKFILE_AGE ]] && [[ $LOCKFILE_AGE -lt 10 ]] then echo was switched VERY recently, noop else set > $LOCKFILE CMDS=( "usb_modeswitch -b $BUSNUM -g $DEVNUM -v $ID_VENDOR_ID -p $ID_MODEL_ID -W -R -w 400 " "usb_modeswitch -b $BUSNUM -g $DEVNUM -v $ID_VENDOR_ID -p $ID_MODEL_ID -W -R " ) i=0 for CMD in "${CMDS[@]}" do i=$(($i+1)) echo "=====STEP$i, run: $CMD" $CMD done fi ;; ff) echo Serial Port ;; *) echo Unknown mode ;; esac } | logger -t BROVI exit 0
and UDEV script /etc/udev/rules.d/40-huawei.rules
ACTION!="add", GOTO="modeswitch_rules_end" SUBSYSTEM!="usb", GOTO="modeswitch_rules_end" # All known install partitions are on interface 0 ATTRS{bInterfaceNumber}!="00", GOTO="modeswitch_rules_end" GOTO="modeswitch_rules_begin" LABEL="modeswitch_rules_begin" # Huawei E3372-325 ATTR{idVendor}=="3566", ATTR{idProduct}=="2001", RUN+="/usr/local/bin/brovi_switch %k %p" LABEL="modeswitch_rules_end"