config_generate 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. #!/bin/sh
  2. CFG=/etc/board.json
  3. . /usr/share/libubox/jshn.sh
  4. [ -s $CFG ] || /bin/board_detect || exit 1
  5. [ -s /etc/config/network -a -s /etc/config/system ] && exit 0
  6. generate_bridge() {
  7. local name=$1
  8. local macaddr=$2
  9. uci -q batch <<-EOF
  10. set network.$name=device
  11. set network.$name.name=$name
  12. set network.$name.type=bridge
  13. EOF
  14. if [ -n "$macaddr" ]; then
  15. uci -q batch <<-EOF
  16. set network.$name.macaddr=$macaddr
  17. EOF
  18. fi
  19. }
  20. bridge_vlan_id=0
  21. generate_bridge_vlan() {
  22. local name=$1_vlan
  23. local device=$2
  24. local ports="$3"
  25. local vlan="$4"
  26. uci -q batch <<-EOF
  27. set network.$name=bridge-vlan
  28. set network.$name.device='$device'
  29. set network.$name.vlan='$vlan'
  30. set network.$name.ports='$ports'
  31. EOF
  32. }
  33. generate_static_network() {
  34. uci -q batch <<-EOF
  35. delete network.loopback
  36. set network.loopback='interface'
  37. set network.loopback.device='lo'
  38. set network.loopback.proto='static'
  39. set network.loopback.ipaddr='127.0.0.1'
  40. set network.loopback.netmask='255.0.0.0'
  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 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.proto='none'
  142. EOF
  143. case "$protocol" in
  144. static)
  145. local ipad
  146. case "$1" in
  147. lan) ipad=${ipaddr:-"192.168.1.1"} ;;
  148. *) ipad=${ipaddr:-"192.168.$((addr_offset++)).1"} ;;
  149. esac
  150. netm=${netmask:-"255.255.255.0"}
  151. uci -q batch <<-EOF
  152. set network.$1.proto='static'
  153. set network.$1.ipaddr='$ipad'
  154. set network.$1.netmask='$netm'
  155. EOF
  156. [ -e /proc/sys/net/ipv6 ] && uci set network.$1.ip6assign='60'
  157. ;;
  158. dhcp)
  159. # fixup IPv6 slave interface if parent is a bridge
  160. [ "$type" = "bridge" ] && device="br-$1"
  161. uci set network.$1.proto='dhcp'
  162. [ -e /proc/sys/net/ipv6 ] && {
  163. uci -q batch <<-EOF
  164. delete network.${1}6
  165. set network.${1}6='interface'
  166. set network.${1}6.device='$device'
  167. set network.${1}6.proto='dhcpv6'
  168. EOF
  169. }
  170. ;;
  171. pppoe)
  172. uci -q batch <<-EOF
  173. set network.$1.proto='pppoe'
  174. set network.$1.username='username'
  175. set network.$1.password='password'
  176. EOF
  177. [ -e /proc/sys/net/ipv6 ] && {
  178. uci -q batch <<-EOF
  179. set network.$1.ipv6='1'
  180. delete network.${1}6
  181. set network.${1}6='interface'
  182. set network.${1}6.device='@${1}'
  183. set network.${1}6.proto='dhcpv6'
  184. EOF
  185. }
  186. ;;
  187. esac
  188. }
  189. generate_switch_vlans_ports() {
  190. local switch="$1"
  191. local port ports role roles num attr val
  192. #
  193. # autogenerate vlans
  194. #
  195. if json_is_a roles array; then
  196. json_get_keys roles roles
  197. json_select roles
  198. for role in $roles; do
  199. json_select "$role"
  200. json_get_vars ports
  201. json_select ..
  202. uci -q batch <<-EOF
  203. add network switch_vlan
  204. set network.@switch_vlan[-1].device='$switch'
  205. set network.@switch_vlan[-1].vlan='$role'
  206. set network.@switch_vlan[-1].ports='$ports'
  207. EOF
  208. done
  209. json_select ..
  210. fi
  211. #
  212. # write port specific settings
  213. #
  214. if json_is_a ports array; then
  215. json_get_keys ports ports
  216. json_select ports
  217. for port in $ports; do
  218. json_select "$port"
  219. json_get_vars num
  220. if json_is_a attr object; then
  221. json_get_keys attr attr
  222. json_select attr
  223. uci -q batch <<-EOF
  224. add network switch_port
  225. set network.@switch_port[-1].device='$switch'
  226. set network.@switch_port[-1].port=$num
  227. EOF
  228. for attr in $attr; do
  229. json_get_var val "$attr"
  230. uci -q set network.@switch_port[-1].$attr="$val"
  231. done
  232. json_select ..
  233. fi
  234. json_select ..
  235. done
  236. json_select ..
  237. fi
  238. }
  239. generate_switch() {
  240. local key="$1"
  241. local vlans
  242. json_select switch
  243. json_select "$key"
  244. json_get_vars enable reset blinkrate cpu_port \
  245. ar8xxx_mib_type ar8xxx_mib_poll_interval
  246. uci -q batch <<-EOF
  247. add network switch
  248. set network.@switch[-1].name='$key'
  249. set network.@switch[-1].reset='$reset'
  250. set network.@switch[-1].enable_vlan='$enable'
  251. set network.@switch[-1].blinkrate='$blinkrate'
  252. set network.@switch[-1].ar8xxx_mib_type='$ar8xxx_mib_type'
  253. set network.@switch[-1].ar8xxx_mib_poll_interval='$ar8xxx_mib_poll_interval'
  254. EOF
  255. generate_switch_vlans_ports "$1"
  256. json_select ..
  257. json_select ..
  258. }
  259. generate_static_system() {
  260. uci -q batch <<-EOF
  261. delete system.@system[0]
  262. add system system
  263. set system.@system[-1].hostname='OpenWrt'
  264. set system.@system[-1].timezone='UTC'
  265. set system.@system[-1].ttylogin='0'
  266. set system.@system[-1].log_size='64'
  267. set system.@system[-1].urandom_seed='0'
  268. delete system.ntp
  269. set system.ntp='timeserver'
  270. set system.ntp.enabled='1'
  271. set system.ntp.enable_server='0'
  272. add_list system.ntp.server='0.openwrt.pool.ntp.org'
  273. add_list system.ntp.server='1.openwrt.pool.ntp.org'
  274. add_list system.ntp.server='2.openwrt.pool.ntp.org'
  275. add_list system.ntp.server='3.openwrt.pool.ntp.org'
  276. EOF
  277. if json_is_a system object; then
  278. json_select system
  279. local hostname
  280. if json_get_var hostname hostname; then
  281. uci -q set "system.@system[-1].hostname=$hostname"
  282. fi
  283. local compat_version
  284. if json_get_var compat_version compat_version; then
  285. uci -q set "system.@system[-1].compat_version=$compat_version"
  286. else
  287. uci -q set "system.@system[-1].compat_version=1.0"
  288. fi
  289. if json_is_a ntpserver array; then
  290. local keys key
  291. json_get_keys keys ntpserver
  292. json_select ntpserver
  293. uci -q delete "system.ntp.server"
  294. for key in $keys; do
  295. local server
  296. if json_get_var server "$key"; then
  297. uci -q add_list "system.ntp.server=$server"
  298. fi
  299. done
  300. json_select ..
  301. fi
  302. json_select ..
  303. fi
  304. }
  305. generate_rssimon() {
  306. local key="$1"
  307. local cfg="rssid_$key"
  308. local refresh threshold
  309. json_select rssimon
  310. json_select "$key"
  311. json_get_vars refresh threshold
  312. json_select ..
  313. json_select ..
  314. uci -q batch <<-EOF
  315. delete system.$cfg
  316. set system.$cfg='rssid'
  317. set system.$cfg.dev='$key'
  318. set system.$cfg.refresh='$refresh'
  319. set system.$cfg.threshold='$threshold'
  320. EOF
  321. }
  322. generate_led() {
  323. local key="$1"
  324. local cfg="led_$key"
  325. json_select led
  326. json_select "$key"
  327. json_get_vars name sysfs type trigger default
  328. uci -q batch <<-EOF
  329. delete system.$cfg
  330. set system.$cfg='led'
  331. set system.$cfg.name='$name'
  332. set system.$cfg.sysfs='$sysfs'
  333. set system.$cfg.trigger='$trigger'
  334. set system.$cfg.default='$default'
  335. EOF
  336. case "$type" in
  337. gpio)
  338. local gpio inverted
  339. json_get_vars gpio inverted
  340. uci -q batch <<-EOF
  341. set system.$cfg.trigger='gpio'
  342. set system.$cfg.gpio='$gpio'
  343. set system.$cfg.inverted='$inverted'
  344. EOF
  345. ;;
  346. netdev)
  347. local device mode
  348. json_get_vars device mode
  349. uci -q batch <<-EOF
  350. set system.$cfg.trigger='netdev'
  351. set system.$cfg.mode='$mode'
  352. set system.$cfg.dev='$device'
  353. EOF
  354. ;;
  355. usb)
  356. local device
  357. json_get_vars device
  358. uci -q batch <<-EOF
  359. set system.$cfg.trigger='usbdev'
  360. set system.$cfg.interval='50'
  361. set system.$cfg.dev='$device'
  362. EOF
  363. ;;
  364. usbport)
  365. local ports port
  366. json_get_values ports ports
  367. uci set system.$cfg.trigger='usbport'
  368. for port in $ports; do
  369. uci add_list system.$cfg.port=$port
  370. done
  371. ;;
  372. rssi)
  373. local iface minq maxq offset factor
  374. json_get_vars iface minq maxq offset factor
  375. uci -q batch <<-EOF
  376. set system.$cfg.trigger='rssi'
  377. set system.$cfg.iface='rssid_$iface'
  378. set system.$cfg.minq='$minq'
  379. set system.$cfg.maxq='$maxq'
  380. set system.$cfg.offset='$offset'
  381. set system.$cfg.factor='$factor'
  382. EOF
  383. ;;
  384. switch)
  385. local port_mask speed_mask mode
  386. json_get_vars port_mask speed_mask mode
  387. uci -q batch <<-EOF
  388. set system.$cfg.port_mask='$port_mask'
  389. set system.$cfg.speed_mask='$speed_mask'
  390. set system.$cfg.mode='$mode'
  391. EOF
  392. ;;
  393. portstate)
  394. local port_state
  395. json_get_vars port_state
  396. uci -q batch <<-EOF
  397. set system.$cfg.port_state='$port_state'
  398. EOF
  399. ;;
  400. timer|oneshot)
  401. local delayon delayoff
  402. json_get_vars delayon delayoff
  403. uci -q batch <<-EOF
  404. set system.$cfg.trigger='$type'
  405. set system.$cfg.delayon='$delayon'
  406. set system.$cfg.delayoff='$delayoff'
  407. EOF
  408. ;;
  409. esac
  410. json_select ..
  411. json_select ..
  412. }
  413. generate_gpioswitch() {
  414. local cfg="$1"
  415. json_select gpioswitch
  416. json_select "$cfg"
  417. local name pin default
  418. json_get_vars name pin default
  419. uci -q batch <<-EOF
  420. delete system.$cfg
  421. set system.$cfg='gpio_switch'
  422. set system.$cfg.name='$name'
  423. set system.$cfg.gpio_pin='$pin'
  424. set system.$cfg.value='$default'
  425. EOF
  426. json_select ..
  427. json_select ..
  428. }
  429. json_init
  430. json_load "$(cat ${CFG})"
  431. umask 077
  432. if [ ! -s /etc/config/network ]; then
  433. bridge_name=""
  434. touch /etc/config/network
  435. generate_static_network
  436. json_get_vars bridge
  437. [ -n "$bridge" ] && {
  438. json_select bridge
  439. json_get_vars name macaddr
  440. generate_bridge "$name" "$macaddr"
  441. json_select ..
  442. bridge_name=$name
  443. }
  444. json_get_keys keys network
  445. for key in $keys; do generate_network $key $bridge_name; done
  446. json_get_keys keys switch
  447. for key in $keys; do generate_switch $key; done
  448. fi
  449. if [ ! -s /etc/config/system ]; then
  450. touch /etc/config/system
  451. generate_static_system
  452. json_get_keys keys rssimon
  453. for key in $keys; do generate_rssimon $key; done
  454. json_get_keys keys gpioswitch
  455. for key in $keys; do generate_gpioswitch $key; done
  456. json_get_keys keys led
  457. for key in $keys; do generate_led $key; done
  458. fi
  459. uci commit