@@ -5,6 +5,8 @@ local util = require 'gluon.util'
5
5
local bit = require ' bit'
6
6
local fcntl = require ' posix.fcntl'
7
7
local unistd = require ' posix.unistd'
8
+ local ubus = require (' ubus' ).connect ()
9
+ local wireless = require ' gluon.wireless'
8
10
9
11
local configname = ' autoupdater-wifi-fallback'
10
12
local lockfilename = ' /var/lock/' .. configname .. ' .lock'
95
97
96
98
local function switch_to_fallback_mode (radio , ssid , bssid )
97
99
autil .log (' out' , ' connecting to ' .. radio .. ' ' .. ssid .. ' ' .. bssid )
98
- uci :delete_all (' wireless' , ' wifi-iface' )
99
- uci :section (' wireless' , ' wifi-iface' , ' fallback' , {
100
- device = radio ,
101
- network = ' fallback' ,
102
- mode = ' sta' ,
103
- disabled = false ,
104
- macaddr = util .generate_mac (3 , 10 ),
105
- bssid = bssid ,
106
- ssid = ssid ,
107
- ifname = ' fallback' ,
108
- encryption = ' none' ,
109
- })
110
- uci :set (' wireless' , radio , ' disabled' , false )
111
- uci :save (' wireless' )
112
-
113
- os.execute (' wifi' )
114
- os.execute (' sleep 5' )
115
- uci :revert (' wireless' )
100
+ os.execute (' sleep 2' )
101
+ ubus :call (' network' , ' add_dynamic' , {name = " fallback" , ifname = " fallback" , proto = " dhcp" , device = " fallback" , l3_device = " fallback" })
102
+ ubus :call (' network' , ' add_dynamic' , {name = " fallback6" , ifname = " fallback" , proto = " dhcpv6" , device = " fallback" , l3_device = " fallback" })
103
+ ubus :call (' network.interface.fallback' , ' add_device' , {name = " fallback" })
104
+ ubus :call (' network.interface.fallback6' , ' add_device' , {name = " fallback" })
105
+ ubus :call (' network.interface.fallback' , ' up' , {})
106
+ ubus :call (' network.interface.fallback6' , ' up' , {})
107
+ os.execute (' sleep 2' )
108
+ os.execute (' iw dev fallback connect ' .. ssid .. ' ' .. bssid )
116
109
os.execute (' sleep 20' )
117
110
end
118
111
119
112
local function revert_to_standard_mode ()
120
113
autil .log (' out' , ' going back to standard mode' )
121
- os.execute (' /etc/init.d/network restart' )
114
+ os.execute (' /etc/init.d/wpad start' )
115
+ os.execute (' wifi up' )
122
116
os.execute (' sleep 30' )
123
117
end
124
118
@@ -142,19 +136,32 @@ if (force or preflight_check()) and not connectivity_check() then
142
136
143
137
if force or tonumber (unreachable_since ) + offset < os.time () then
144
138
autil .log (' out' , ' going to fallback mode' )
139
+ os.execute (' wifi down' )
140
+ os.execute (' /etc/init.d/wpad status >/dev/null && /etc/init.d/wpad stop' )
145
141
for radio , netlist in pairs (autil .get_available_wifi_networks ()) do
142
+ local radio_config = uci :get_all (' wireless' , radio )
143
+ local phy = wireless .find_phy (radio_config )
144
+ autil .log (' out' , ' using ' .. phy .. ' to create fallback interface' )
145
+ os.execute (' iw phy ' .. phy .. ' interface add fallback type managed' )
146
+ os.execute (' ip link set dev fallback up' )
146
147
for _ , net in ipairs (netlist ) do
147
148
switch_to_fallback_mode (radio , net .ssid , net .bssid )
148
149
if run_autoupdater () == 0 then
149
150
break
150
151
end
152
+ ubus :call (' network.interface.fallback' , ' down' , {})
153
+ ubus :call (' network.interface.fallback' , ' remove' , {})
154
+ ubus :call (' network.interface.fallback6' , ' down' , {})
155
+ ubus :call (' network.interface.fallback6' , ' remove' , {})
156
+ os.execute (' iw dev fallback disconnect' )
151
157
end
158
+ os.execute (' iw dev fallback del' )
152
159
end
153
- -- this is only reached if no updated happened
160
+ -- this is only reached if no update happened
154
161
revert_to_standard_mode ()
155
162
end
156
163
else
157
164
uci :delete (configname , ' settings' , ' unreachable_since' )
158
165
uci :delete (configname , ' settings' , ' last_run' )
159
166
uci :save (configname )
160
- end
167
+ end
0 commit comments