forked from hummypkg/webif
e6366df3c8
git-svn-id: file:///root/webif/svn/humax/pkg/src/webif/trunk@1692 2a923420-c742-0410-a762-8d5b09965624
466 lines
12 KiB
Plaintext
Executable File
466 lines
12 KiB
Plaintext
Executable File
#!/mod/bin/jimsh
|
|
|
|
package require cgi
|
|
source /mod/webif/lib/setup
|
|
require settings.class plugin system.class
|
|
|
|
httpheader
|
|
|
|
if {[cgi_get act] eq "https"} {
|
|
set val [cgi_get val off]
|
|
if {$val in {0 off}} {
|
|
file delete /mod/etc/mongoose.cert
|
|
puts "HTTPS Server will be disabled after next reboot."
|
|
} else {
|
|
exec /mod/sbin/mongoose_mkcert
|
|
puts "HTTPS Server will be enabled after next reboot."
|
|
}
|
|
exit
|
|
}
|
|
|
|
if {[cgi_get act] eq "xtelnet"} {
|
|
set val [cgi_get val off]
|
|
if {$val in {0 off}} {
|
|
file delete /mod/boot/xtelnet
|
|
puts "Telnet server expert mode will be disabled after next reboot."
|
|
} else {
|
|
exec /mod/bin/busybox/touch /mod/boot/xtelnet
|
|
puts "Telnet server expert mode will be enabled after next reboot."
|
|
}
|
|
exit
|
|
}
|
|
|
|
set settings [settings new]
|
|
|
|
set hostname [$settings hostname]
|
|
set smtp_server [$settings smtp_server]
|
|
set channel_group [$settings channel_group]
|
|
set epg_style [$settings epg_style]
|
|
set pkgdev [$settings pkgdev]
|
|
set notoolbar [$settings notoolbar]
|
|
set nomobile [$settings nomobile]
|
|
set nohelplinks [$settings nohelplinks]
|
|
set nounwatchedcount [$settings nounwatchedcount]
|
|
set chanchangenc [$settings chanchangenc]
|
|
set xepghours [$settings xepghours]
|
|
if {$xepghours == 0} { set xepghours 4 }
|
|
set genrededup [$settings genrededup]
|
|
set autolog [$settings autolog]
|
|
|
|
# Handle updates
|
|
|
|
if {![dict exists $env REQUEST_URI]} { set env(REQUEST_URI) "" }
|
|
|
|
proc _handle_update {class var old text} {
|
|
global _cgi
|
|
global settings
|
|
|
|
if {[dict exists $_cgi $var]} {
|
|
set new [string trim [dict get $_cgi $var]]
|
|
if {$new == $old} {
|
|
puts "$text unchanged."
|
|
} elseif [string is $class -strict $new] {
|
|
$settings $var $new
|
|
puts "$text updated."
|
|
} else {
|
|
puts "Invalid value for $var."
|
|
}
|
|
exit
|
|
}
|
|
}
|
|
|
|
proc handle_int_update {var old {text "Value"}} {
|
|
_handle_update digit $var $old $text
|
|
}
|
|
|
|
proc handle_str_update {var old {text "Value"}} {
|
|
_handle_update alnum $var $old $text
|
|
}
|
|
|
|
handle_str_update hostname $hostname Hostname
|
|
_handle_update ascii smtp_server $smtp_server "SMTP Server"
|
|
handle_int_update channel_group $channel_group "Channel Group"
|
|
handle_int_update xepghours $xepghours "Grid EPG Hours"
|
|
handle_str_update epg_style $epg_style "EPG Type"
|
|
handle_int_update pkgdev $pkgdev "Development Package Display"
|
|
handle_int_update notoolbar $notoolbar "Disable toolbar"
|
|
handle_int_update nomobile $nomobile "Disable mobile link"
|
|
handle_int_update nohelplinks $nohelplinks "Disable help links"
|
|
handle_int_update chanchangenc $chanchangenc \
|
|
"Disable channel change confirmation"
|
|
handle_int_update nounwatchedcount $nounwatchedcount "Disable unwatched count"
|
|
handle_int_update genrededup $genrededup "Genre search dedup"
|
|
handle_int_update autolog $autolog "Auto-processing log level"
|
|
|
|
set acluser [cgi_get acluser "-"]
|
|
set aclpass [cgi_get aclpass "-"]
|
|
set aclpassc [cgi_get aclpassc "-"]
|
|
if {$acluser ne "-" && $aclpass ne "-"} {
|
|
if {![string length $acluser]} {
|
|
puts "No username provided."
|
|
exit
|
|
}
|
|
if {$aclpass ne $aclpassc} {
|
|
puts "Passwords do not match."
|
|
exit
|
|
}
|
|
if {[string length $aclpass] < 4} {
|
|
puts "Password is too short (< 4 characters)"
|
|
exit
|
|
}
|
|
puts [$settings addacluser $acluser $aclpass]
|
|
exit
|
|
}
|
|
|
|
set aclact [cgi_get aclact "-"]
|
|
if {$aclact ne "-" && $acluser ne "-"} {
|
|
switch $aclact {
|
|
"del" { puts [$settings delacluser $acluser] }
|
|
}
|
|
exit
|
|
}
|
|
|
|
header
|
|
|
|
puts {
|
|
<script type="text/javascript" src="/cgi-bin/settings.js"></script>
|
|
<script type="text/javascript" src="/js/jquery.form.js"></script>
|
|
<script type="text/javascript" src="/js/iphone-style-checkboxes.js"></script>
|
|
<link href=/css/iphone-style-checkboxes.css rel=stylesheet type=text/css />
|
|
<div id=accordion>
|
|
}
|
|
|
|
proc setting_toggle {name attr checked {invert 0} {val 0}} {
|
|
puts -nonewline "
|
|
<tr>
|
|
<th class=key>$name</th>
|
|
<td><input class=setting_toggle type=checkbox value=yes"
|
|
if {$checked} { puts -nonewline " checked" }
|
|
puts -nonewline " attr=$attr"
|
|
if {$invert} { puts -nonewline " invert=1" }
|
|
if {$val} { puts -nonewline " useval=1" }
|
|
puts -nonewline ">
|
|
<div id=${attr}_output></div>
|
|
</td>
|
|
</tr>
|
|
"
|
|
}
|
|
|
|
puts "
|
|
<h4>General Settings</h4>
|
|
<div><fieldset style=\"display: inline\">
|
|
<legend>
|
|
General Settings
|
|
</legend>
|
|
<table>
|
|
"
|
|
|
|
puts "
|
|
<tr>
|
|
<form class=auto id=hostname method=get action=$env(REQUEST_URI)>
|
|
<th class=key>Hostname</th>
|
|
<td><input name=hostname value=\"$hostname\"
|
|
class=\"text ui-widget-content ui-corner-all\"
|
|
length=20 maxlength=50>
|
|
<small>
|
|
<input id=hostname_submit value=\"change\" type=submit>
|
|
</small>
|
|
<div id=hostname_output></div>
|
|
</td>
|
|
</form>
|
|
</tr>
|
|
"
|
|
|
|
setting_toggle "HTTPS web server?" "https" \
|
|
[file exists /mod/etc/mongoose.cert] 0 1
|
|
setting_toggle "Slide-down toolbar?" "notoolbar" $(!$notoolbar) 1
|
|
setting_toggle "Mobile link on main page?" "nomobile" $(!$nomobile) 1
|
|
setting_toggle "Help links on main page?" "nohelplinks" $(!$nohelplinks) 1
|
|
setting_toggle "Unwatched count on folders?" "nounwatchedcount" $(!$nounwatchedcount) 1
|
|
if {[system pkginst ir]} {
|
|
setting_toggle "Disable channel change confirmation?" \
|
|
"chanchangenc" $chanchangenc 0
|
|
}
|
|
|
|
puts -nonewline "
|
|
<tr>
|
|
<form class=auto id=autolog method=get action=$env(REQUEST_URI)>
|
|
<th class=key>Auto-processing log level</th>
|
|
<td><select id=autolog name=autolog
|
|
class=\"text ui-widget-content ui-corner-all\">
|
|
"
|
|
puts "<option value=0"
|
|
if {$autolog == 0} { puts " selected" }
|
|
puts ">Actions and errors only\n"
|
|
puts "<option value=1"
|
|
if {$autolog == 1} { puts " selected" }
|
|
puts ">Actions, errors and scan information\n"
|
|
puts "<option value=2"
|
|
if {$autolog == 1} { puts " selected" }
|
|
puts ">Debugging information\n"
|
|
puts "
|
|
</select>
|
|
<small>
|
|
<input name=autolog value=\"set\" type=submit>
|
|
</small>
|
|
<div id=autolog_output></div>
|
|
</td>
|
|
</form>
|
|
</tr>
|
|
"
|
|
|
|
puts "
|
|
</table></fieldset></div>
|
|
|
|
<h4>EPG Settings</h4>
|
|
<div><fieldset style=\"display: inline\">
|
|
<legend>
|
|
EPG Settings
|
|
</legend>
|
|
<table>
|
|
"
|
|
|
|
puts "
|
|
<tr>
|
|
<form class=auto id=epg_style method=get action=$env(REQUEST_URI)>
|
|
<th class=key>Default Now/Next style</th>
|
|
<td><select id=epg_style name=epg_style
|
|
class=\"text ui-widget-content ui-corner-all\">
|
|
"
|
|
puts "<option value=standard"
|
|
if {$epg_style ne "grid"} { puts " selected" }
|
|
puts ">Standard\n"
|
|
puts "<option value=grid"
|
|
if {$epg_style eq "grid"} { puts " selected" }
|
|
puts ">Grid\n"
|
|
puts "
|
|
</select>
|
|
<small>
|
|
<input name=epg_style value=\"set\" type=submit>
|
|
</small>
|
|
<div id=epg_style_output></div>
|
|
</td>
|
|
</form>
|
|
</tr>
|
|
"
|
|
|
|
puts "
|
|
<tr>
|
|
<form class=auto id=channel_group method=get action=$env(REQUEST_URI)>
|
|
<th class=key>Channel Group for EPG</th>
|
|
<td><select id=channel_group name=channel_group
|
|
class=\"text ui-widget-content ui-corner-all\">
|
|
"
|
|
|
|
set i 0
|
|
puts "<option value=0>-- None --"
|
|
foreach grp [$settings channel_groups] {
|
|
incr i
|
|
puts -nonewline "<option value=$i"
|
|
if {$channel_group == $i} {
|
|
puts -nonewline " selected"
|
|
}
|
|
puts ">$grp"
|
|
}
|
|
|
|
puts "
|
|
</select>
|
|
<small>
|
|
<input name=channel_group value=\"set\" type=submit>
|
|
</small>
|
|
<div id=channel_group_output></div>
|
|
</td>
|
|
</form>
|
|
</tr>
|
|
"
|
|
|
|
puts "
|
|
<tr>
|
|
<form class=auto id=xepghours method=get action=$env(REQUEST_URI)>
|
|
<th class=key>Grid-style EPG Hours</th>
|
|
<td><select id=xepghours name=xepghours
|
|
class=\"text ui-widget-content ui-corner-all\">
|
|
"
|
|
|
|
foreach xehopt {2 3 4 5 6} {
|
|
puts -nonewline "<option value=$xehopt"
|
|
if {$xehopt == $xepghours} {
|
|
puts -nonewline " selected"
|
|
}
|
|
puts ">$xehopt hours"
|
|
}
|
|
|
|
puts "
|
|
</select>
|
|
<small>
|
|
<input name=xepghours value=\"set\" type=submit>
|
|
</small>
|
|
<div id=xepghours_output></div>
|
|
</td>
|
|
</form>
|
|
</tr>
|
|
"
|
|
|
|
setting_toggle "De-duplicate genre search results?" genrededup $genrededup
|
|
|
|
puts "
|
|
</table>
|
|
</fieldset></div>
|
|
"
|
|
|
|
#puts "
|
|
# <fieldset style=\"display: inline\">
|
|
# <legend> Email Settings </legend>
|
|
# <table>
|
|
#"
|
|
#
|
|
#puts "
|
|
# <tr>
|
|
# <form class=auto id=smtp_server method=get action=$env(REQUEST_URI)>
|
|
# <th class=key>SMTP Server for outbound email</th>
|
|
# <td><input name=smtp_server value=\"$smtp_server\"
|
|
# class=\"text ui-widget-content ui-corner-all\"
|
|
# length=20 maxlength=50>
|
|
# <small>
|
|
# <input id=smtp_server_submit value=\"change\" type=submit>
|
|
# </small>
|
|
# <div id=smtp_server_output></div>
|
|
# </td>
|
|
# </form>
|
|
# </tr>
|
|
#"
|
|
#
|
|
#puts "
|
|
# </table>
|
|
# </fieldset>
|
|
# <br><br>
|
|
#"
|
|
|
|
puts "
|
|
<h4>Web Interface User Access Control</h4>
|
|
<div>
|
|
<fieldset style=\"display: inline\">
|
|
<legend> Web Interface User Access Control </legend>
|
|
<table>
|
|
"
|
|
|
|
set aclusers [$settings aclusers]
|
|
if {[llength $aclusers]} {
|
|
puts "<tr><th colspan=5 class=odd>Existing Users</th></tr>"
|
|
foreach user [$settings aclusers] {
|
|
lassign $user user
|
|
puts "<tr><td align=center style=\"font-weight: bold\">
|
|
$user</td>"
|
|
puts "<th class=key>New password:
|
|
<input
|
|
class=\"aclpass text ui-widget-content ui-corner-all\"
|
|
type=password size=20 maxlength=50><br>"
|
|
puts "Again:
|
|
<input
|
|
class=\"aclpassc text ui-widget-content ui-corner-all\"
|
|
type=password size=20 maxlength=50></td>"
|
|
puts "<th class=key><button class=pwchange>
|
|
Change</button></td>"
|
|
puts "<th class=key><button class=userdel>
|
|
Delete User</button></td>"
|
|
puts "</tr>"
|
|
}
|
|
puts "<tr><td colspan=5 id=aclusermod_output> </td></tr>"
|
|
puts "<tr><td colspan=5> </td></tr>"
|
|
} else {
|
|
puts "<tr><td colspan=5 class=blood><b>
|
|
Add a user to enable authentication.</b></td></tr>"
|
|
}
|
|
|
|
puts "<tr><th colspan=5 class=odd>Add New User</th></tr>"
|
|
puts "
|
|
<form id=aclnewuser method=get action=$env(REQUEST_URI)>
|
|
<tr><th class=key>New User:</th><td>
|
|
<input
|
|
class=\"text ui-widget-content ui-corner-all\"
|
|
id=acluser name=acluser size=20 maxlength=50></td></tr>
|
|
<tr><th class=key>Password:</th><td>
|
|
<input type=password
|
|
class=\"text ui-widget-content ui-corner-all\"
|
|
id=aclpass name=aclpass size=20 maxlength=50></td></tr>
|
|
<tr><th class=key>Password (confirm):</th><td>
|
|
<input type=password
|
|
class=\"text ui-widget-content ui-corner-all\"
|
|
id=aclpassc name=aclpassc size=20 maxlength=50></td></tr>
|
|
<tr><td><input id=aclnewuser_submit value=\"Add User\" type=submit>
|
|
</td></tr>
|
|
</form>
|
|
</table>
|
|
<div id=aclnewuser_output></div>
|
|
</fieldset>
|
|
</div>
|
|
"
|
|
|
|
puts {
|
|
<script type=text/javascript>
|
|
$('#aclnewuser').ajaxForm({
|
|
target: '#aclnewuser_output',
|
|
success: function(txt) {
|
|
if (txt.indexOf('Success') >= 0)
|
|
window.location.reload(true);
|
|
}
|
|
});
|
|
|
|
$('button.userdel').click(function(el) {
|
|
var user = $('td:first', $(this).parents('tr')).text().trim();
|
|
$('#aclusermod_output').load(
|
|
'/cgi-bin/settings.jim?aclact=del&acluser=' +
|
|
encodeURIComponent(user), function(txt) {
|
|
if (txt.indexOf('Success') >= 0)
|
|
window.location.reload(true);
|
|
});
|
|
});
|
|
|
|
$('button.pwchange').click(function(el) {
|
|
var tr = $(this).parents('tr');
|
|
var user = $('td:first', $(tr)).text().trim();
|
|
var pass = $(tr).find('input.aclpass').val();
|
|
var passc = $(tr).find('input.aclpassc').val();
|
|
$('#aclusermod_output').load('/cgi-bin/settings.jim?' +
|
|
'acluser=' + encodeURIComponent(user) + '&' +
|
|
'aclpass=' + encodeURIComponent(pass) + '&' +
|
|
'aclpassc=' + encodeURIComponent(passc));
|
|
});
|
|
</script>
|
|
}
|
|
|
|
puts -nonewline "
|
|
<h4>Advanced Settings</h4>
|
|
<div>
|
|
<fieldset style=\"display: inline\">
|
|
<legend> Advanced Settings </legend>
|
|
<table>
|
|
"
|
|
setting_toggle "Show development and advanced packages?" "pkgdev" $pkgdev
|
|
|
|
if {[system modversion 1] >= 214} {
|
|
setting_toggle "Expert mode telnet server?" "xtelnet" \
|
|
[file exists /mod/boot/xtelnet] 0 1
|
|
}
|
|
|
|
puts "
|
|
</table>
|
|
</fieldset>
|
|
</div>
|
|
"
|
|
|
|
set hook settings
|
|
foreach plugin [lsort [glob -nocomplain /mod/webif/plugin/*]] {
|
|
if {[file isfile "$plugin/$hook.hook"]} {
|
|
puts "<h4>Settings for <i>[file tail $plugin]</i> package</h4>"
|
|
puts "<div class=pluginsettings>"
|
|
catch {source "$plugin/$hook.hook"}
|
|
puts "</div>"
|
|
}
|
|
}
|
|
|
|
puts "</div>"
|
|
|
|
footer
|
|
|