autodev.sh 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #!/usr/bin/env bash
  2. # Setup script environment
  3. set -o errexit #Exit immediately if a pipeline returns a non-zero status
  4. set -o errtrace #Trap ERR from shell functions, command substitutions, and commands from subshell
  5. set -o nounset #Treat unset variables as an error
  6. set -o pipefail #Pipe will exit with last non-zero status if applicable
  7. shopt -s expand_aliases
  8. alias die='EXIT=$? LINE=$LINENO error_exit'
  9. trap die ERR
  10. trap cleanup EXIT
  11. function error_exit() {
  12. trap - ERR
  13. local DEFAULT='Unknown failure occured.'
  14. local REASON="\e[97m${1:-$DEFAULT}\e[39m"
  15. local FLAG="\e[91m[ERROR] \e[93m$EXIT@$LINE"
  16. msg "$FLAG $REASON"
  17. exit $EXIT
  18. }
  19. function msg() {
  20. local TEXT="$1"
  21. echo -e "$TEXT"
  22. }
  23. function cleanup() {
  24. popd >/dev/null
  25. rm -rf $TEMP_DIR
  26. }
  27. TEMP_DIR=$(mktemp -d)
  28. pushd $TEMP_DIR >/dev/null
  29. # Array of device types to enable in container
  30. #CHAR_DEVS+=(major:minor)
  31. CHAR_DEVS+=("1:1") #mem (physical memory access)
  32. CHAR_DEVS+=("4:\([3-9]\|[1-5][0-9]\|6[0-3]\)") #tty* (virtual console, minor 3-63)
  33. CHAR_DEVS+=("4:\(6[4-9]\|[7-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)") #ttyS* (UART serial port, minor 64-255)
  34. CHAR_DEVS+=("10:200") #net/tun (TAP/TUN network device)
  35. CHAR_DEVS+=("116:.*") #(ALSA devices)
  36. CHAR_DEVS+=("166:.*") #ttyACM* (ACM USB modems)
  37. CHAR_DEVS+=("180:\([0-9]\|1[0-5]\)") #usb/hiddev* (UPS devices, minor 0-15)
  38. CHAR_DEVS+=("188:.*") #ttyUSB* (USB serial converters)
  39. CHAR_DEVS+=("189:.*") #bus/usb/* (USB serial converters - alternate devices)
  40. # Proccess char device string
  41. for char_dev in ${CHAR_DEVS[@]}; do
  42. [ ! -z "${CHAR_DEV_STRING-}" ] && CHAR_DEV_STRING+=" -o"
  43. CHAR_DEV_STRING+=" -regex \".*/${char_dev}\""
  44. done
  45. # Store autodev hook script in variable
  46. read -r -d '' HOOK_SCRIPT <<- EOF || true
  47. for char_dev in \$(find /sys/dev/char -regextype sed $CHAR_DEV_STRING); do
  48. dev="/dev/\$(sed -n "/DEVNAME/ s/^.*=\(.*\)$/\1/p" \${char_dev}/uevent)";
  49. mkdir -p \$(dirname \${LXC_ROOTFS_MOUNT}\${dev});
  50. for link in \$(udevadm info --query=property \$dev | sed -n "s/DEVLINKS=//p"); do
  51. mkdir -p \${LXC_ROOTFS_MOUNT}\$(dirname \$link);
  52. cp -dpR \$link \${LXC_ROOTFS_MOUNT}\${link};
  53. done;
  54. cp -dpR \$dev \${LXC_ROOTFS_MOUNT}\${dev};
  55. done;
  56. EOF
  57. HOOK_SCRIPT=${HOOK_SCRIPT//$'\n'/} #Remove newline char from variable
  58. # Remove autodev settings
  59. CTID=$1
  60. CTID_CONFIG_PATH=/etc/pve/lxc/${CTID}.conf
  61. sed '/autodev/d' $CTID_CONFIG_PATH >CTID.conf
  62. cat CTID.conf >$CTID_CONFIG_PATH
  63. # Add autodev settings
  64. cat <<EOF >> $CTID_CONFIG_PATH
  65. lxc.autodev: 1
  66. lxc.hook.autodev: bash -c '$HOOK_SCRIPT'
  67. EOF