248 lines
4.5 KiB
Lua
248 lines
4.5 KiB
Lua
#!/usr/bin/lua
|
|
|
|
drv = {}
|
|
idV = arg[1]
|
|
idP = arg[2]
|
|
pflag = arg[3]
|
|
if pflag == nil then
|
|
pflag = 1
|
|
end
|
|
|
|
special = {}
|
|
-- PPP special cases
|
|
-- VID PID port #
|
|
special[1] = "1bbb" ; special[2] = "0017" ; special[3] = 13
|
|
special[4] = "12d1" ; special[5] = nil ; special[6] = 10
|
|
special[7] = "1546" ; special[8] = "01a6" ; special[9] = 0
|
|
special[10] = "1546" ; special[11] = "01a5" ; special[12] = 0
|
|
special[13] = "1199" ; special[14] = "68a3" ; special[15] = 14
|
|
special[16] = "2001" ; special[17] = "7e35" ; special[18] = 15
|
|
|
|
|
|
retval = 0
|
|
echo = 1
|
|
|
|
printf = function(s,...)
|
|
if pflag ~= 0 then
|
|
io.write(s:format(...))
|
|
local ss = s:format(...)
|
|
if echo == 1 then
|
|
os.execute("/usr/lib/rooter/logprint.sh " .. ss)
|
|
end
|
|
end
|
|
end
|
|
|
|
function trim(s)
|
|
return (s:gsub("^%s*(.-)%s*$", "%1"))
|
|
end
|
|
|
|
function checkserial()
|
|
local got = 0
|
|
j = 1
|
|
repeat
|
|
if drv[j] ~= nil then
|
|
if drv[j] == "option" or drv[j] == "qcserial" or drv[j] == "usb_serial" or drv[j] == "sierra" then
|
|
got = 1
|
|
break
|
|
end
|
|
j = j + 1
|
|
end
|
|
until drv[j] == nil
|
|
return got
|
|
end
|
|
|
|
function countserial()
|
|
local got = 0
|
|
j = 1
|
|
repeat
|
|
if drv[j] ~= nil then
|
|
if drv[j] == "option" or drv[j] == "sierra" or drv[j] == "usb_serial" or drv[j] == "qcserial" then
|
|
got = got + 1
|
|
end
|
|
j = j + 1
|
|
end
|
|
until drv[j] == nil
|
|
return got
|
|
end
|
|
|
|
-- MAIN
|
|
|
|
local t = {}
|
|
|
|
local i=0
|
|
local file = io.open("/tmp/wdrv", "r")
|
|
repeat
|
|
local line = file:read("*line")
|
|
if line == nil then
|
|
break
|
|
end
|
|
if string.len(line) > 5 then
|
|
s, e = line:find("Vendor=")
|
|
if s ~= nil then
|
|
cs, ce = line:find(" ", e)
|
|
m_idV = trim(line:sub(e+1, cs-1))
|
|
s, e = line:find("ProdID=")
|
|
cs, ce = line:find(" ", e)
|
|
m_idP = trim(line:sub(e+1, cs-1))
|
|
if m_idV == idV and m_idP == idP then
|
|
repeat
|
|
line = file:read("*line")
|
|
if line == nil then
|
|
break
|
|
end
|
|
if string.len(line) > 5 then
|
|
s, e = line:find("T:")
|
|
if s ~= nil then
|
|
break
|
|
end
|
|
s, e = line:find("Cls=02")
|
|
if s ~= nil then
|
|
t[i] = trim(line:sub(63))
|
|
i = i + 1
|
|
end
|
|
s, e = line:find("Cls=ff")
|
|
if s ~= nil then
|
|
t[i] = trim(line:sub(63))
|
|
i = i + 1
|
|
end
|
|
s, e = line:find("1 Cls=e0")
|
|
if s ~= nil then
|
|
t[i] = trim(line:sub(63))
|
|
i = i + 1
|
|
end
|
|
s, e = line:find("Cls=0a")
|
|
if s ~= nil then
|
|
t[i] = trim(line:sub(63))
|
|
i = i + 1
|
|
end
|
|
s, e = line:find("Cls=0e")
|
|
if s ~= nil then
|
|
t[i] = trim(line:sub(63))
|
|
i = i + 1
|
|
end
|
|
s, e = line:find("Cls=07")
|
|
if s ~= nil then
|
|
t[i] = trim(line:sub(63))
|
|
i = i + 1
|
|
end
|
|
s, e = line:find("Cls=08")
|
|
if s ~= nil then
|
|
t[i] = trim(line:sub(63))
|
|
i = i + 1
|
|
end
|
|
end
|
|
until 1==0
|
|
break
|
|
end
|
|
end
|
|
end
|
|
until 1==0
|
|
file:close()
|
|
if i > 0 then
|
|
file = io.open("/tmp/drv", "w")
|
|
for j=0,i-1 do
|
|
drv[j+1] = t[j]
|
|
drver = string.format("%s%d%s%q", "DRIVER", j+1, "=", t[j])
|
|
file:write(drver .. "\n")
|
|
end
|
|
ports = countserial()
|
|
drver = string.format("%s%s%d%s", "PORTN", "=\"", ports, "\"")
|
|
file:write(drver .. "\n")
|
|
file:close()
|
|
end
|
|
|
|
i = 1
|
|
repeat
|
|
if drv[i] ~= nil then
|
|
printf("Driver Name : %d %s\n", i, drv[i])
|
|
i = i + 1
|
|
end
|
|
until drv[i] == nil
|
|
|
|
i = 1
|
|
repeat
|
|
if drv[i] ~= nil then
|
|
if drv[i] == "sierra_net" then
|
|
retval = 1
|
|
break
|
|
end
|
|
if drv[i] == "qmi_wwan" then
|
|
retval = 2
|
|
break
|
|
end
|
|
if drv[i] == "cdc_mbim" then
|
|
retval = 3
|
|
break
|
|
end
|
|
if drv[i] == "huawei_cdc_ncm" then
|
|
if i == 2 then
|
|
retval = 4
|
|
else
|
|
if i == 3 then
|
|
retval = 6
|
|
else
|
|
retval = 7
|
|
end
|
|
end
|
|
break
|
|
end
|
|
if drv[i] == "cdc_ncm" then
|
|
if i == 2 then
|
|
retval = 24
|
|
else
|
|
if i == 3 then
|
|
retval = 26
|
|
else
|
|
retval = 27
|
|
end
|
|
end
|
|
break
|
|
end
|
|
if drv[i] == "cdc_ether" or drv[i] == "rndis_host" then
|
|
retval = 5
|
|
break
|
|
end
|
|
if drv[i] == "ipheth" then
|
|
retval = 9
|
|
break
|
|
end
|
|
if drv[i] == "uvcvideo" then
|
|
retval = 99
|
|
break
|
|
end
|
|
if drv[i] == "usblp" then
|
|
retval = 98
|
|
break
|
|
end
|
|
if drv[i] == "usb-storage" then
|
|
retval = 97
|
|
end
|
|
i = i + 1
|
|
end
|
|
until drv[i] == nil
|
|
|
|
if retval == 0 then
|
|
if checkserial() == 1 then
|
|
retval = 11
|
|
k = 1
|
|
vendor = special[k]
|
|
while vendor ~= nil do
|
|
if idV == vendor then
|
|
if special[k+1] == nil then
|
|
retval = special[k+2]
|
|
break
|
|
else
|
|
if special[k+1] == idP then
|
|
retval = special[k+2]
|
|
break
|
|
end
|
|
end
|
|
end
|
|
k = k + 3
|
|
vendor = special[k]
|
|
end
|
|
end
|
|
end
|
|
|
|
os.exit(retval)
|