openwrtBuild 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. #!/usr/bin/env bash
  2. source ./functions
  3. #####################
  4. ##### DEFAULTS ######
  5. #####################
  6. # TP-Link Archer C7 v2
  7. _version="19.07.2"
  8. _target="ath79/generic"
  9. _profile="tplink_archer-c7-v2"
  10. # Raspberry Pi 4
  11. #_version="snapshot"
  12. #_target="brcm2708/bcm2711"
  13. #_profile="rpi-4"
  14. _debug="false" # Turn debugging on by default (useful for testing)
  15. #####################
  16. ##### FUNCTIONS #####
  17. #####################
  18. printHelpAndExit () {
  19. runDebug "${FUNCNAME[0]}"
  20. cat <<-'EOF'
  21. USAGE:
  22. buildOpenWRT [[OPTION] [VALUE]]...
  23. OPTIONS
  24. --version, -v OPENWRT_VERSION
  25. Default: 19.07.02
  26. --target, -t TARGET
  27. Default: ath79/generic
  28. --profile, -p PROFILE
  29. Default: tplink_archer-c7-v2
  30. --builddir, -b PATH
  31. Default: Current working directory
  32. --ssh-backup SSH path
  33. Example: root@192.168.1.1
  34. --debug, -d
  35. --help, -h
  36. EOF
  37. # Exit using passed exit code
  38. [[ -z $1 ]] && exit 0 || exit "$1"
  39. }
  40. parseInput () {
  41. runDebug "${FUNCNAME[0]}"
  42. if _input=$(getopt -o +v:t:p:b:dh -l version:,target:,profile:,builddir:,ssh-backup:debug,help -- "$@"); then
  43. eval set -- "$_input"
  44. while true; do
  45. case "$1" in
  46. --version|-v)
  47. shift && _version="$1"
  48. ;;
  49. --target|-t)
  50. shift && _target="$1"
  51. ;;
  52. --profile|-p)
  53. shift && _profile="$1"
  54. ;;
  55. --builddir|-b)
  56. shift && _builddir="$1"
  57. ;;
  58. --ssh-backup)
  59. shift && _ssh_backup="$1"
  60. ;;
  61. --debug|-d)
  62. echo "Debugging on"
  63. _debug="true"
  64. ;;
  65. --help|-h)
  66. _printHelpAndExit 0
  67. ;;
  68. --)
  69. shift
  70. break
  71. ;;
  72. esac
  73. shift
  74. done
  75. else
  76. echo "Incorrect options provided"
  77. printHelpAndExit 1
  78. fi
  79. }
  80. mkDirs () {
  81. runDebug "${FUNCNAME[0]}"
  82. [[ ! -d "$_builddir/output/sources" ]] && mkdir -p "$_builddir/output/sources"
  83. [[ ! -d "$_filesroot" ]] && mkdir -p "$_filesroot"
  84. [[ ! -d "$_builddir/bin" ]] && mkdir -p "$_builddir/bin"
  85. }
  86. installPrerequisites () {
  87. runDebug "${FUNCNAME[0]}"
  88. if [[ "$ID" == "fedora" ]]; then
  89. if ! sudo dnf -y install @c-development @development-tools @development-libs zlib-static elfutils-libelf-devel gawk unzip file wget python3 python2 > /dev/null 2>&1; then
  90. echo "Warning: Problem installing prerequisites"
  91. fi
  92. elif [[ "$ID" =~ ^(debian|ubuntu)$ ]]; then
  93. if ! sudo apt-get -y install build-essential libncurses5-dev libncursesw5-dev zlib1g-dev gawk git gettext libssl-dev xsltproc wget unzip python > /dev/null 2>&1; then
  94. echo "Warning: Problem installing prerequisites"
  95. fi
  96. fi
  97. }
  98. acquireImageBuilder () {
  99. runDebug "${FUNCNAME[0]}"
  100. local _url
  101. if [[ "$_version" == "snapshot" ]]; then
  102. _filename="openwrt-imagebuilder-${_target//\//-}.Linux-x86_64.tar.xz"
  103. _url="https://downloads.openwrt.org/snapshots/targets/$_target/$_filename"
  104. else
  105. _filename="openwrt-imagebuilder-$_version-${_target//\//-}.Linux-x86_64.tar.xz"
  106. _url="https://downloads.openwrt.org/releases/$_version/targets/$_target/$_filename"
  107. fi
  108. if [[ ! -f "$_builddir/output/sources/$_filename" ]]; then
  109. echo "Downloading $_url to $_builddir/output/sources"
  110. if ! wget -q -P "$_builddir/output/sources" "$_url"; then
  111. echo "Could not download Image Builder"
  112. exit 1
  113. fi
  114. else
  115. echo "Image builder already exists, skipping download..."
  116. fi
  117. }
  118. extractImageBuilder () {
  119. runDebug "${FUNCNAME[0]}"
  120. if [[ -f "$_builddir/output/sources/$_filename" ]]; then
  121. if ! tar -xf "$_builddir/output/sources/$_filename" -C "$_builddir/output/sources/"; then
  122. echo "Extraction failed"
  123. exit 1
  124. fi
  125. fi
  126. }
  127. makeImage () {
  128. runDebug "${FUNCNAME[0]}"
  129. # move to extracted source directory
  130. if ! pushd "$_builddir/output/sources/${_filename%.tar.xz}" > /dev/null 2>&1; then
  131. exit 1
  132. fi
  133. # build image
  134. if ! make -j4 image BIN_DIR="$_builddir/bin" PROFILE="$_profile" PACKAGES="${_packages[*]}" FILES="$_filesroot"; then
  135. echo "Make image failed!"
  136. exit 1
  137. fi
  138. if ! popd > /dev/null 2>&1; then
  139. exit 1
  140. fi
  141. }
  142. # TODO
  143. #flashImage () {
  144. #
  145. # if ! scp -rp "$_bin_path" "$_ssh_backup:/tmp/$_bin_name"; then
  146. # echo "Could not copy update file to device!"
  147. # exit 1
  148. # fi
  149. #
  150. #3 # shellcheck disable=SC2029
  151. # if ! ssh "$_ssh_backup" "sysupgrade -v /tmp/$_bin_name"; then
  152. #3 echo "sysupgrade failed!"
  153. # exit 1
  154. # fi
  155. #}
  156. __main () {
  157. parseInput "$@"
  158. mkDirs
  159. getOS
  160. installPrerequisites
  161. acquireImageBuilder
  162. extractImageBuilder
  163. [[ -n $_ssh_backup ]] && sshBackup
  164. makeImage
  165. #flashImage # TODO
  166. exit 0
  167. }
  168. __main "$@"