config_generate 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549
  1. #!/bin/sh
  2. CFG=/etc/board.json
  3. . /usr/share/libubox/jshn.sh
  4. . /lib/functions/ipv4.sh
  5. [ -s $CFG ] || /bin/board_detect || exit 1
  6. [ -s /etc/config/network -a -s /etc/config/system ] && exit 0
  7. generate_bridge() {
  8. local name=$1
  9. local macaddr=$2
  10. uci -q batch <<-EOF
  11. set network.$name=device
  12. set network.$name.name=$name
  13. set network.$name.type=bridge
  14. EOF
  15. if [ -n "$macaddr" ]; then
  16. uci -q batch <<-EOF
  17. set network.$name.macaddr=$macaddr
  18. EOF
  19. fi
  20. }
  21. bridge_vlan_id=0
  22. generate_bridge_vlan() {
  23. local name=$1_vlan
  24. local device=$2
  25. local ports="$3"
  26. local vlan="$4"
  27. uci -q batch <<-EOF
  28. set network.$name=bridge-vlan
  29. set network.$name.device='$device'
  30. set network.$name.vlan='$vlan'
  31. set network.$name.ports='$ports'
  32. EOF
  33. }
  34. generate_static_network() {
  35. uci -q batch <<-EOF
  36. delete network.loopback
  37. set network.loopback='interface'
  38. set network.loopback.device='lo'
  39. set network.loopback.proto='static'
  40. add_list network.loopback.ipaddr='127.0.0.1/8'
  41. EOF
  42. [ -e /proc/sys/net/ipv6 ] && {
  43. uci -q batch <<-EOF
  44. delete network.globals
  45. set network.globals='globals'
  46. set network.globals.ula_prefix='auto'
  47. EOF
  48. }
  49. if json_is_a dsl object; then
  50. json_select dsl
  51. if json_is_a atmbridge object; then
  52. json_select atmbridge
  53. local vpi vci encaps payload nameprefix
  54. json_get_vars vpi vci encaps payload nameprefix
  55. uci -q batch <<-EOF
  56. delete network.atm
  57. set network.atm='atm-bridge'
  58. set network.atm.vpi='$vpi'
  59. set network.atm.vci='$vci'
  60. set network.atm.encaps='$encaps'
  61. set network.atm.payload='$payload'
  62. set network.atm.nameprefix='$nameprefix'
  63. EOF
  64. json_select ..
  65. fi
  66. if json_is_a modem object; then
  67. json_select modem
  68. local type annex firmware tone xfer_mode
  69. json_get_vars type annex firmware tone xfer_mode
  70. uci -q batch <<-EOF
  71. delete network.dsl
  72. set network.dsl='dsl'
  73. set network.dsl.annex='$annex'
  74. set network.dsl.firmware='$firmware'
  75. set network.dsl.tone='$tone'
  76. set network.dsl.xfer_mode='$xfer_mode'
  77. EOF
  78. json_select ..
  79. fi
  80. json_select ..
  81. fi
  82. }
  83. addr_offset=2
  84. generate_network() {
  85. local ports device macaddr protocol type ipaddr netmask vlan
  86. local bridge=$2
  87. json_select network
  88. json_select "$1"
  89. json_get_vars device macaddr metric protocol ipaddr netmask vlan
  90. json_get_values ports ports
  91. json_select ..
  92. json_select ..
  93. [ -n "$device" -o -n "$ports" ] || return
  94. # Force bridge for "lan" as it may have other devices (e.g. wireless)
  95. # bridged
  96. [ "$1" = "lan" -a -z "$ports" ] && {
  97. ports="$device"
  98. }
  99. [ -n "$ports" -a -z "$bridge" ] && {
  100. uci -q batch <<-EOF
  101. add network device
  102. set network.@device[-1].name='br-$1'
  103. set network.@device[-1].type='bridge'
  104. EOF
  105. for port in $ports; do uci add_list network.@device[-1].ports="$port"; done
  106. [ -n "$macaddr" ] && {
  107. for port in $ports; do
  108. uci -q batch <<-EOF
  109. add network device
  110. set network.@device[-1].name='$port'
  111. set network.@device[-1].macaddr='$macaddr'
  112. EOF
  113. done
  114. }
  115. device=br-$1
  116. type=
  117. macaddr=""
  118. }
  119. [ -n "$bridge" ] && {
  120. [ -z "$ports" ] && ports="$device"
  121. if [ -z "$vlan" ]; then
  122. bridge_vlan_id=$((bridge_vlan_id + 1))
  123. vlan=$bridge_vlan_id
  124. fi
  125. generate_bridge_vlan $1 $bridge "$ports" $vlan
  126. device=$bridge.$vlan
  127. type=""
  128. }
  129. if [ -n "$macaddr" ]; then
  130. uci -q batch <<-EOF
  131. add network device
  132. set network.@device[-1].name='$device'
  133. set network.@device[-1].macaddr='$macaddr'
  134. EOF
  135. fi
  136. uci -q batch <<-EOF
  137. delete network.$1
  138. set network.$1='interface'
  139. set network.$1.type='$type'
  140. set network.$1.device='$device'
  141. set network.$1.metric='$metric'
  142. set network.$1.proto='none'
  143. EOF
  144. case "$protocol" in
  145. static)
  146. local ipad netm prefix
  147. case "$1" in
  148. lan) ipad=${ipaddr:-"192.168.1.1"} ;;
  149. *) ipad=${ipaddr:-"192.168.$((addr_offset++)).1"} ;;
  150. esac
  151. netm=${netmask:-"255.255.255.0"}
  152. str2ip netm "$netm"
  153. netmask2prefix prefix "$netm"
  154. uci -q batch <<-EOF
  155. set network.$1.proto='static'
  156. add_list network.$1.ipaddr='$ipad/$prefix'
  157. EOF
  158. [ -e /proc/sys/net/ipv6 ] && uci set network.$1.ip6assign='60'
  159. ;;
  160. dhcp)
  161. # fixup IPv6 slave interface if parent is a bridge
  162. [ "$type" = "bridge" ] && device="br-$1"
  163. uci set network.$1.proto='dhcp'
  164. [ -e /proc/sys/net/ipv6 ] && {
  165. uci -q batch <<-EOF
  166. delete network.${1}6
  167. set network.${1}6='interface'
  168. set network.${1}6.device='$device'
  169. set network.${1}6.proto='dhcpv6'
  170. EOF
  171. }
  172. ;;
  173. pppoe)
  174. uci -q batch <<-EOF
  175. set network.$1.proto='pppoe'
  176. set network.$1.username='username'
  177. set network.$1.password='password'
  178. EOF
  179. [ -e /proc/sys/net/ipv6 ] && {
  180. uci -q batch <<-EOF
  181. set network.$1.ipv6='1'
  182. delete network.${1}6
  183. set network.${1}6='interface'
  184. set network.${1}6.device='@${1}'
  185. set network.${1}6.proto='dhcpv6'
  186. EOF
  187. }
  188. ;;
  189. ncm|\
  190. qmi|\
  191. mbim)
  192. uci -q batch <<-EOF
  193. set network.$1.proto='${protocol}'
  194. set network.$1.pdptype='ipv4'
  195. EOF
  196. ;;
  197. esac
  198. }
  199. generate_switch_vlans_ports() {
  200. local switch="$1"
  201. local port ports role roles num attr val
  202. #
  203. # autogenerate vlans
  204. #
  205. if json_is_a roles array; then
  206. json_get_keys roles roles
  207. json_select roles
  208. for role in $roles; do
  209. json_select "$role"
  210. json_get_vars ports
  211. json_select ..
  212. uci -q batch <<-EOF
  213. add network switch_vlan
  214. set network.@switch_vlan[-1].device='$switch'
  215. set network.@switch_vlan[-1].vlan='$role'
  216. set network.@switch_vlan[-1].ports='$ports'
  217. EOF
  218. done
  219. json_select ..
  220. fi
  221. #
  222. # write port specific settings
  223. #
  224. if json_is_a ports array; then
  225. json_get_keys ports ports
  226. json_select ports
  227. for port in $ports; do
  228. json_select "$port"
  229. json_get_vars num
  230. if json_is_a attr object; then
  231. json_get_keys attr attr
  232. json_select attr
  233. uci -q batch <<-EOF
  234. add network switch_port
  235. set network.@switch_port[-1].device='$switch'
  236. set network.@switch_port[-1].port=$num
  237. EOF
  238. for attr in $attr; do
  239. json_get_var val "$attr"
  240. uci -q set network.@switch_port[-1].$attr="$val"
  241. done
  242. json_select ..
  243. fi
  244. json_select ..
  245. done
  246. json_select ..
  247. fi
  248. }
  249. generate_switch() {
  250. local key="$1"
  251. local vlans
  252. json_select switch
  253. json_select "$key"
  254. json_get_vars enable reset blinkrate cpu_port \
  255. ar8xxx_mib_type ar8xxx_mib_poll_interval
  256. uci -q batch <<-EOF
  257. add network switch
  258. set network.@switch[-1].name='$key'
  259. set network.@switch[-1].reset='$reset'
  260. set network.@switch[-1].enable_vlan='$enable'
  261. set network.@switch[-1].blinkrate='$blinkrate'
  262. set network.@switch[-1].ar8xxx_mib_type='$ar8xxx_mib_type'
  263. set network.@switch[-1].ar8xxx_mib_poll_interval='$ar8xxx_mib_poll_interval'
  264. EOF
  265. generate_switch_vlans_ports "$1"
  266. json_select ..
  267. json_select ..
  268. }
  269. generate_static_system() {
  270. uci -q batch <<-EOF
  271. delete system.@system[0]
  272. add system system
  273. set system.@system[-1].hostname='OpenWrt'
  274. set system.@system[-1].timezone='GMT0'
  275. set system.@system[-1].zonename='UTC'
  276. set system.@system[-1].ttylogin='0'
  277. set system.@system[-1].log_size='128'
  278. set system.@system[-1].urandom_seed='0'
  279. delete system.ntp
  280. set system.ntp='timeserver'
  281. set system.ntp.enabled='1'
  282. set system.ntp.enable_server='0'
  283. add_list system.ntp.server='0.openwrt.pool.ntp.org'
  284. add_list system.ntp.server='1.openwrt.pool.ntp.org'
  285. add_list system.ntp.server='2.openwrt.pool.ntp.org'
  286. add_list system.ntp.server='3.openwrt.pool.ntp.org'
  287. EOF
  288. if json_is_a system object; then
  289. json_select system
  290. local hostname
  291. if json_get_var hostname hostname; then
  292. uci -q set "system.@system[-1].hostname=$hostname"
  293. fi
  294. local compat_version
  295. if json_get_var compat_version compat_version; then
  296. uci -q set "system.@system[-1].compat_version=$compat_version"
  297. else
  298. uci -q set "system.@system[-1].compat_version=1.0"
  299. fi
  300. local timezone
  301. if json_get_var timezone timezone; then
  302. uci -q set "system.@system[-1].timezone=$timezone"
  303. fi
  304. if json_is_a ntpserver array; then
  305. local keys key
  306. json_get_keys keys ntpserver
  307. json_select ntpserver
  308. uci -q delete "system.ntp.server"
  309. for key in $keys; do
  310. local server
  311. if json_get_var server "$key"; then
  312. uci -q add_list "system.ntp.server=$server"
  313. fi
  314. done
  315. json_select ..
  316. fi
  317. json_select ..
  318. fi
  319. }
  320. generate_rssimon() {
  321. local key="$1"
  322. local cfg="rssid_$key"
  323. local refresh threshold
  324. json_select rssimon
  325. json_select "$key"
  326. json_get_vars refresh threshold
  327. json_select ..
  328. json_select ..
  329. uci -q batch <<-EOF
  330. delete system.$cfg
  331. set system.$cfg='rssid'
  332. set system.$cfg.dev='$key'
  333. set system.$cfg.refresh='$refresh'
  334. set system.$cfg.threshold='$threshold'
  335. EOF
  336. }
  337. generate_led() {
  338. local key="$1"
  339. local cfg="led_$key"
  340. json_select led
  341. json_select "$key"
  342. json_get_vars name sysfs type trigger default
  343. uci -q batch <<-EOF
  344. delete system.$cfg
  345. set system.$cfg='led'
  346. set system.$cfg.name='$name'
  347. set system.$cfg.sysfs='$sysfs'
  348. set system.$cfg.trigger='$trigger'
  349. set system.$cfg.default='$default'
  350. EOF
  351. case "$type" in
  352. gpio)
  353. local gpio inverted
  354. json_get_vars gpio inverted
  355. uci -q batch <<-EOF
  356. set system.$cfg.trigger='gpio'
  357. set system.$cfg.gpio='$gpio'
  358. set system.$cfg.inverted='$inverted'
  359. EOF
  360. ;;
  361. netdev)
  362. local device mode
  363. json_get_vars device mode
  364. uci -q batch <<-EOF
  365. set system.$cfg.trigger='netdev'
  366. set system.$cfg.mode='$mode'
  367. set system.$cfg.dev='$device'
  368. EOF
  369. ;;
  370. usb)
  371. local device
  372. json_get_vars device
  373. uci -q batch <<-EOF
  374. set system.$cfg.trigger='usbdev'
  375. set system.$cfg.interval='50'
  376. set system.$cfg.dev='$device'
  377. EOF
  378. ;;
  379. usbport)
  380. local ports port
  381. json_get_values ports ports
  382. uci set system.$cfg.trigger='usbport'
  383. for port in $ports; do
  384. uci add_list system.$cfg.port=$port
  385. done
  386. ;;
  387. rssi)
  388. local iface minq maxq offset factor
  389. json_get_vars iface minq maxq offset factor
  390. uci -q batch <<-EOF
  391. set system.$cfg.trigger='rssi'
  392. set system.$cfg.iface='rssid_$iface'
  393. set system.$cfg.minq='$minq'
  394. set system.$cfg.maxq='$maxq'
  395. set system.$cfg.offset='$offset'
  396. set system.$cfg.factor='$factor'
  397. EOF
  398. ;;
  399. switch)
  400. local port_mask speed_mask mode
  401. json_get_vars port_mask speed_mask mode
  402. uci -q batch <<-EOF
  403. set system.$cfg.port_mask='$port_mask'
  404. set system.$cfg.speed_mask='$speed_mask'
  405. set system.$cfg.mode='$mode'
  406. EOF
  407. ;;
  408. portstate)
  409. local port_state
  410. json_get_vars port_state
  411. uci -q batch <<-EOF
  412. set system.$cfg.port_state='$port_state'
  413. EOF
  414. ;;
  415. timer|oneshot)
  416. local delayon delayoff
  417. json_get_vars delayon delayoff
  418. uci -q batch <<-EOF
  419. set system.$cfg.trigger='$type'
  420. set system.$cfg.delayon='$delayon'
  421. set system.$cfg.delayoff='$delayoff'
  422. EOF
  423. ;;
  424. esac
  425. json_select ..
  426. json_select ..
  427. }
  428. generate_gpioswitch() {
  429. local cfg="$1"
  430. json_select gpioswitch
  431. json_select "$cfg"
  432. local name pin default
  433. json_get_vars name pin default
  434. uci -q batch <<-EOF
  435. delete system.$cfg
  436. set system.$cfg='gpio_switch'
  437. set system.$cfg.name='$name'
  438. set system.$cfg.gpio_pin='$pin'
  439. set system.$cfg.value='$default'
  440. EOF
  441. json_select ..
  442. json_select ..
  443. }
  444. json_init
  445. json_load "$(cat ${CFG})"
  446. umask 077
  447. if [ ! -s /etc/config/network ]; then
  448. bridge_name=""
  449. touch /etc/config/network
  450. generate_static_network
  451. json_get_vars bridge
  452. [ -n "$bridge" ] && {
  453. json_select bridge
  454. json_get_vars name macaddr
  455. generate_bridge "$name" "$macaddr"
  456. json_select ..
  457. bridge_name=$name
  458. }
  459. json_get_keys keys network
  460. for key in $keys; do generate_network $key $bridge_name; done
  461. json_get_keys keys switch
  462. for key in $keys; do generate_switch $key; done
  463. fi
  464. if [ ! -s /etc/config/system ]; then
  465. touch /etc/config/system
  466. generate_static_system
  467. json_get_keys keys rssimon
  468. for key in $keys; do generate_rssimon $key; done
  469. json_get_keys keys gpioswitch
  470. for key in $keys; do generate_gpioswitch $key; done
  471. json_get_keys keys led
  472. for key in $keys; do generate_led $key; done
  473. fi
  474. uci commit