forked from Ysurac/openmptcprouter-feeds
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
10 changed files
with
507 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
# | ||
# Copyright (C) 2008-2014 The LuCI Team <[email protected]> | ||
# | ||
# This is free software, licensed under the Apache License, Version 2.0 . | ||
# | ||
|
||
include $(TOPDIR)/rules.mk | ||
|
||
LUCI_TITLE:=Support for ModemManager | ||
LUCI_DEPENDS:=+modemmanager | ||
|
||
PKG_LICENSE:=Apache-2.0 | ||
|
||
include $(TOPDIR)/feeds/luci/luci.mk | ||
|
||
# call BuildPackage - OpenWrt buildroot signature |
101 changes: 101 additions & 0 deletions
101
luci-proto-modemmanager/htdocs/luci-static/resources/modemmanager_helper.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
'use strict'; | ||
'require baseclass'; | ||
'require fs'; | ||
|
||
return baseclass.extend({ | ||
|
||
_mmcliBin: '/usr/bin/mmcli', | ||
|
||
_emptyStringValue: '--', | ||
|
||
_parseIndex: function (dbusPath) { | ||
var index = dbusPath.split('/').slice(-1); | ||
return parseInt(index); | ||
}, | ||
|
||
_parseOutput: function (output) { | ||
try { | ||
return this._removeEmptyStrings(JSON.parse(output)); | ||
} catch (err) { | ||
return null; | ||
} | ||
}, | ||
|
||
_removeEmptyStrings: function (obj) { | ||
if (obj == null) { | ||
return obj; | ||
} | ||
|
||
if (typeof obj == 'string') { | ||
if (obj == this._emptyStringValue) { | ||
obj = null; | ||
} | ||
} else if (Array.isArray()) { | ||
obj = obj.map(L.bind(function (it) { | ||
return this._removeEmptyStrings(it); | ||
}, this)); | ||
} else { | ||
var keys = Object.keys(obj); | ||
keys.forEach(L.bind(function (key) { | ||
obj[key] = this._removeEmptyStrings(obj[key]); | ||
}, this)); | ||
} | ||
|
||
return obj; | ||
}, | ||
|
||
getModems: function () { | ||
return fs.exec_direct(this._mmcliBin, [ '-L', '-J' ]).then(L.bind(function (res) { | ||
var json = this._parseOutput(res); | ||
if (json == null) { | ||
return []; | ||
} | ||
var modems = json['modem-list']; | ||
var tasks = []; | ||
|
||
modems.forEach(L.bind(function (modem) { | ||
var index = this._parseIndex(modem); | ||
if (!isNaN(index)) { | ||
tasks.push(this.getModem(index)); | ||
} | ||
}, this)); | ||
return Promise.all(tasks); | ||
}, this)); | ||
}, | ||
|
||
getModem: function (index) { | ||
return fs.exec_direct(this._mmcliBin, [ '-m', index, '-J' ]).then(L.bind(function (modem) { | ||
return this._parseOutput(modem); | ||
}, this)); | ||
}, | ||
|
||
getModemSims: function (modem) { | ||
var tasks = []; | ||
var simSlots = modem.generic['sim-slots']; | ||
var sim = modem.generic.sim; | ||
if (sim != null && !simSlots.includes(sim)) { | ||
simSlots.push(sim); | ||
} | ||
|
||
simSlots.forEach(L.bind(function (modem) { | ||
var index = this._parseIndex(modem); | ||
if (!isNaN(index)) { | ||
tasks.push(this.getSim(index)); | ||
} | ||
}, this)); | ||
return Promise.all(tasks); | ||
}, | ||
|
||
getSim: function (index) { | ||
return fs.exec_direct(this._mmcliBin, [ '-i', index, '-J' ]).then(L.bind(function (sim) { | ||
return this._parseOutput(sim); | ||
}, this)); | ||
}, | ||
|
||
getModemLocation: function (modem) { | ||
var index = this._parseIndex(modem['dbus-path']); | ||
return fs.exec_direct(this._mmcliBin, [ '-m', index, '--location-get', '-J' ]).then(L.bind(function (location) { | ||
return this._parseOutput(location); | ||
}, this)); | ||
} | ||
}); |
164 changes: 164 additions & 0 deletions
164
luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,164 @@ | ||
'use strict'; | ||
'require fs'; | ||
'require form'; | ||
'require network'; | ||
'require modemmanager_helper as helper'; | ||
|
||
network.registerPatternVirtual(/^mobiledata-.+$/); | ||
network.registerErrorCode('MM_CONNECT_FAILED', _('Connection attempt failed.')); | ||
network.registerErrorCode('MM_CONNECT_IN_PROGRESS', _('Modem connection in progress. Please wait. This process will timeout after 2 minutes.')); | ||
network.registerErrorCode('DEVICE_NOT_MANAGED', _('Device not managed by ModemManager.')); | ||
network.registerErrorCode('INVALID_BEARER_LIST', _('Invalid bearer list. Possibly too many bearers created. This protocol supports one and only one bearer.')); | ||
network.registerErrorCode('UNKNOWN_METHOD', _('Unknown and unsupported connection method.')); | ||
network.registerErrorCode('DISCONNECT_FAILED', _('Disconnection attempt failed.')); | ||
network.registerErrorCode('MM_INVALID_ALLOWED_MODES_LIST', _('Unable to set allowed mode list.')); | ||
network.registerErrorCode('MM_NO_PREFERRED_MODE_CONFIGURED', _('No preferred mode configuration found.')); | ||
network.registerErrorCode('MM_NO_ALLOWED_MODE_CONFIGURED', _('No allowed mode configuration found.')); | ||
network.registerErrorCode('MM_FAILED_SETTING_PREFERRED_MODE', _('Unable to set preferred mode.')); | ||
|
||
return network.registerProtocol('modemmanager', { | ||
getI18n: function() { | ||
return _('ModemManager'); | ||
}, | ||
|
||
getIfname: function() { | ||
return this._ubus('l3_device') || 'modemmanager-%s'.format(this.sid); | ||
}, | ||
|
||
getOpkgPackage: function() { | ||
return 'modemmanager'; | ||
}, | ||
|
||
isFloating: function() { | ||
return true; | ||
}, | ||
|
||
isVirtual: function() { | ||
return true; | ||
}, | ||
|
||
getDevices: function() { | ||
return null; | ||
}, | ||
|
||
containsDevice: function(ifname) { | ||
return (network.getIfnameOf(ifname) == this.getIfname()); | ||
}, | ||
|
||
renderFormOptions: function(s) { | ||
var dev = this.getL3Device() || this.getDevice(), o; | ||
|
||
o = s.taboption('general', form.ListValue, '_modem_device', _('Modem device')); | ||
o.ucioption = 'device'; | ||
o.rmempty = false; | ||
o.load = function(section_id) { | ||
return helper.getModems().then(L.bind(function(devices) { | ||
for (var i = 0; i < devices.length; i++) { | ||
var generic = devices[i].modem.generic; | ||
this.value(generic.device, | ||
'%s - %s (%s)'.format(generic.manufacturer, generic.model, generic.device)); | ||
} | ||
return form.Value.prototype.load.apply(this, [section_id]); | ||
}, this)); | ||
}; | ||
|
||
o = s.taboption('general', form.Value, 'apn', _('APN')); | ||
o.validate = function(section_id, value) { | ||
if (value == null || value == '') | ||
return true; | ||
|
||
if (!/^[a-zA-Z0-9\-.]*[a-zA-Z0-9]$/.test(value)) | ||
return _('Invalid APN provided'); | ||
|
||
return true; | ||
}; | ||
|
||
o = s.taboption('general', form.Value, 'pincode', _('PIN')); | ||
o.datatype = 'and(uinteger,minlength(4),maxlength(8))'; | ||
|
||
o = s.taboption('general', form.Value, 'pukcode', _('PUK')); | ||
o.datatype = "uinteger"; | ||
|
||
o = s.taboption('general', form.ListValue, 'auth', _('Authentication Type')); | ||
o.value('both', _('PAP/CHAP (both)')); | ||
o.value('pap', 'PAP'); | ||
o.value('chap', 'CHAP'); | ||
o.value('none', _('None')); | ||
o.default = 'none'; | ||
|
||
o = s.taboption('general', form.ListValue, 'allowedmode', _('Allowed network technology'), | ||
_('Setting the allowed network technology.')); | ||
o.value('2g'); | ||
o.value('3g'); | ||
o.value('3g|2g'); | ||
o.value('4g'); | ||
o.value('4g|2g'); | ||
o.value('4g|3g'); | ||
o.value('4g|3g|2g'); | ||
o.value('5g'); | ||
o.value('5g|2g'); | ||
o.value('5g|3g'); | ||
o.value('5g|3g|2g'); | ||
o.value('5g|4g'); | ||
o.value('5g|4g|2g'); | ||
o.value('5g|4g|3g'); | ||
o.value('5g|4g|3g|2g'); | ||
o.value('',_('any')); | ||
o.default = ''; | ||
|
||
o = s.taboption('general', form.ListValue, 'preferredmode', _('Preferred network technology'), | ||
_('Setting the preferred network technology.')); | ||
o.value('2g'); | ||
o.value('3g'); | ||
o.value('4g'); | ||
o.value('5g'); | ||
o.value('none', _('None')); | ||
o.depends('allowedmode','3g|2g'); | ||
o.depends('allowedmode','4g|2g'); | ||
o.depends('allowedmode','4g|3g'); | ||
o.depends('allowedmode','4g|3g|2g'); | ||
o.depends('allowedmode','5g|2g'); | ||
o.depends('allowedmode','5g|3g'); | ||
o.depends('allowedmode','5g|3g|2g'); | ||
o.depends('allowedmode','5g|4g'); | ||
o.depends('allowedmode','5g|4g|2g'); | ||
o.depends('allowedmode','5g|4g|3g'); | ||
o.depends('allowedmode','5g|4g|3g|2g'); | ||
|
||
o = s.taboption('general', form.Value, 'username', _('PAP/CHAP username')); | ||
o.depends('auth', 'pap'); | ||
o.depends('auth', 'chap'); | ||
o.depends('auth', 'both'); | ||
|
||
o = s.taboption('general', form.Value, 'password', _('PAP/CHAP password')); | ||
o.depends('auth', 'pap'); | ||
o.depends('auth', 'chap'); | ||
o.depends('auth', 'both'); | ||
o.password = true; | ||
|
||
o = s.taboption('general', form.ListValue, 'iptype', _('IP Type')); | ||
o.value('ipv4v6', _('IPv4/IPv6 (both - defaults to IPv4)')) | ||
o.value('ipv4', _('IPv4 only')); | ||
o.value('ipv6', _('IPv6 only')); | ||
o.default = 'ipv4v6'; | ||
|
||
o = s.taboption('advanced', form.Value, 'mtu', _('Override MTU')); | ||
o.placeholder = dev ? (dev.getMTU() || '1500') : '1500'; | ||
o.datatype = 'max(9200)'; | ||
|
||
o = s.taboption('general', form.Value, 'signalrate', _('Signal Refresh Rate'), _("In seconds")); | ||
o.datatype = 'uinteger'; | ||
|
||
s.taboption('general', form.Value, 'metric', _('Gateway metric')); | ||
|
||
s.taboption('advanced', form.Flag, 'debugmode', _('Enable Debugmode')); | ||
|
||
o = s.taboption('advanced', form.ListValue, 'loglevel', _('Log output level')); | ||
o.value('ERR', _('Error')) | ||
o.value('WARN', _('Warning')); | ||
o.value('INFO', _('Info')); | ||
o.value('DEBUG', _('Debug')); | ||
o.default = 'ERR'; | ||
|
||
} | ||
}); |
Oops, something went wrong.