test
This commit is contained in:
234
lib/system/templates/system_home.html
Normal file
234
lib/system/templates/system_home.html
Normal file
@@ -0,0 +1,234 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
|
||||
<script type="text/javascript">
|
||||
hideMenuModule();
|
||||
</script>
|
||||
|
||||
<div>
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
|
||||
<h3>시스템</h3>
|
||||
<hr>
|
||||
{{ macros.info_text_and_buttons('python_version', 'Python', [['globalLinkBtn', '패키지 관리', [('url','/system/python')]]], info['python_version']) }}
|
||||
{{ macros.info_text('platform', 'Platform', info['platform']) }}
|
||||
{{ macros.info_text('processor', 'Processor', info['processor']) }}
|
||||
{{ macros.info_text_and_buttons('version_str', '버전', [['globalOpenBtn', '업데이트 내역', [('url','https://sjva.me/wiki/public/changelog')]], ['recent_version_btn', '최신버전 확인']], info['version']) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-inline-block"></div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<h3>App 환경</h3>
|
||||
<hr>
|
||||
{{ macros.info_text_and_buttons('running_type', '실행타입', [['config_show_btn', 'Config 확인']], info['running_type'] + ' → 비동기 작업 ' + info['use_celery']) }}
|
||||
{{ macros.info_text_and_buttons('config_filepath', 'Config', [['globalEditBtn', '편집', [('file',info['config_filepath'])]]], value=info['config_filepath']) }}
|
||||
{{ macros.info_text('path_app', 'Path App', info['path_app']) }}
|
||||
{{ macros.info_text('path_data', 'Path Data', info['path_data']) }}
|
||||
{{ macros.info_text('path_working', 'Path Working', info['path_working']) }}
|
||||
{{ macros.info_text('time', '실행 시간') }}
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6">
|
||||
<h3>모니터링</h3>
|
||||
<hr>
|
||||
{{ macros.info_text('cpu_percent', 'CPU 사용량') }}
|
||||
{{ macros.info_text('memory', '메모리') }}
|
||||
{{ macros.info_text('disk', '디스크') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-inline-block"></div>
|
||||
|
||||
<h3>스케쥴</h3>
|
||||
<div id="scheduler_list_div"></div>
|
||||
</div> <!--전체-->
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function(){
|
||||
var socket = io.connect(window.location.href);
|
||||
|
||||
socket.on('start', function(data){
|
||||
});
|
||||
|
||||
socket.on('status', function(data) {
|
||||
make_system(data.system);
|
||||
make_scheduler_list(data.scheduler);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$("body").on('click', '#recent_version_btn', function(e){
|
||||
e.preventDefault();
|
||||
globalSendCommand('recent_version');
|
||||
});
|
||||
|
||||
|
||||
|
||||
$("body").on('click', '#config_show_btn', function(e){
|
||||
e.preventDefault();
|
||||
globalSendCommand('get_config', null, null, null, 'Config');
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
function make_system(data) {
|
||||
str = data.version;
|
||||
if (data.version == data.recent_version) {
|
||||
str += text_color(" (최신 버전)", 'blue');
|
||||
} else {
|
||||
str += text_color(" (최신 버전 : " + data.recent_version+')', 'red');
|
||||
}
|
||||
$('#version_str').html(str);
|
||||
|
||||
str = '<table id="result_table" class="table table-sm" style="margin-bottom:0px" ><thead class=""><tr> \
|
||||
<th style="width:50%;text-align:center;font-size:11px;">시작시간</th> \
|
||||
<th style="width:30%;text-align:center;font-size:11px;">경과</th> \
|
||||
<th style="width:20%;text-align:center;font-size:11px;">재시작</th> \
|
||||
</tr></thead><tbody id="list">';
|
||||
str += '<tr class="chover">';
|
||||
str += '<td scope="col" style="width:50%;text-align:center;">' + data['time'][0] + '</td>';
|
||||
str += '<td scope="col" style="width:30%;text-align:center;">' + data['time'][1] + '</td>';
|
||||
str += '<td scope="col" style="width:20%;text-align:center;">' + data['time'][2] + '</td>';
|
||||
str += '</tr></table>';
|
||||
$('#time').html(str);
|
||||
|
||||
if (data['memory'] == 'not supported') {
|
||||
str = data['memory'];
|
||||
} else {
|
||||
str = '<table id="result_table" class="table table-sm" style="margin-bottom:0px"><thead class=""><tr> \
|
||||
<th style="width:25%;text-align:center;font-size:11px;">전체</th> \
|
||||
<th style="width:25%;text-align:center;font-size:11px;">사용량</th> \
|
||||
<th style="width:25%;text-align:center;font-size:11px;">남은량</th> \
|
||||
<th style="width:25%;text-align:center;font-size:11px;">%</th> \
|
||||
</tr></thead><tbody id="list">';
|
||||
str += '<tr class="chover">';
|
||||
str += '<td scope="col" style="text-align:center;">' + data['memory'][0] + '</td>';
|
||||
str += '<td scope="col" style="text-align:center;">' + data['memory'][1] + '</td>';
|
||||
str += '<td scope="col" style="text-align:center;">' + data['memory'][2] + '</td>';
|
||||
str += '<td scope="col" style="text-align:center;">' + data['memory'][3] + '</td>';
|
||||
str += '</tr></table>';
|
||||
}
|
||||
$('#memory').html(str);
|
||||
|
||||
if (data['disk'] == 'not supported') {
|
||||
str = data['disk'];
|
||||
} else {
|
||||
str = '<table id="result_table" class="table table-sm" style="margin-bottom:0px"><thead class=""><tr> \
|
||||
<th style="width:25%;text-align:center;font-size:11px;">전체</th> \
|
||||
<th style="width:25%;text-align:center;font-size:11px;">사용량</th> \
|
||||
<th style="width:25%;text-align:center;font-size:11px;">남은량</th> \
|
||||
<th style="width:25%;text-align:center;font-size:11px;">%</th> \
|
||||
</tr></thead><tbody id="list">';
|
||||
str += '<tr class="chover">';
|
||||
str += '<td scope="col" style="text-align:center;">' + data['disk'][0] + '</td>';
|
||||
str += '<td scope="col" style="text-align:center;">' + data['disk'][1] + '</td>';
|
||||
str += '<td scope="col" style="text-align:center;">' + data['disk'][2] + '</td>';
|
||||
str += '<td scope="col" style="text-align:center;">' + data['disk'][3] + '</td>';
|
||||
str += '</tr></table>';
|
||||
if (data['disk'][4] != '/') {
|
||||
str += '드라이브 ' + data['disk'][4];
|
||||
}
|
||||
}
|
||||
$('#disk').html(str);
|
||||
}
|
||||
|
||||
|
||||
function make_scheduler_list(data) {
|
||||
str = `
|
||||
<table id="result_table" class="table table-sm ">
|
||||
<thead class="">
|
||||
<tr>
|
||||
<th rowspan='2' style="width:10%;text-align:center;vertical-align:middle;">NO</th>
|
||||
<th style="width:10%;text-align:center;vertical-align:middle;">플러그인<br>ID</th>
|
||||
<th style="width:10%;text-align:center;vertical-align:middle;">상태</th>
|
||||
<th style="width:10%;text-align:center;vertical-align:middle;">다음 실행시간</th>
|
||||
<th style="width:10%;text-align:center;vertical-align:middle;">남은 시간</th>
|
||||
<th style="width:10%;text-align:center;vertical-align:middle;">주기</th>
|
||||
<th style="width:10%;text-align:center;vertical-align:middle;">이전소요시간<br>실행횟수</th>
|
||||
<th style="width:20%;text-align:center;vertical-align:middle;">설명</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="scheduler_list">`;
|
||||
|
||||
TD_STR = '<td scope="col" style="width:10%; text-align:center;">';
|
||||
for(var i in data) {
|
||||
if (data[i].is_running) {
|
||||
str += '<tr class="bg-light">';
|
||||
} else {
|
||||
str += '<tr>';
|
||||
}
|
||||
str += '<td scope="col" style="width:5%; text-align:center;">' + (parseInt(i)+1) + '</td>';
|
||||
str += '<td scope="col" style="width:10%; text-align:center;">' + (data[i].plugin) + '<br>' + (data[i].id) + '</td>';
|
||||
str += '<td scope="col" style="width:10%; text-align:center;">' + ((data[i].is_running) ?'실행중':'대기중') + '</td>';
|
||||
str += '<td scope="col" style="width:10%; text-align:center;">' + (data[i].next_run_time) + '</td>';
|
||||
str += '<td scope="col" style="width:10%; text-align:center;">' + (data[i].remain_time) + '</td>';
|
||||
|
||||
str += '<td scope="col" style="width:10%; text-align:center;">' + (data[i].interval) + '</td>';
|
||||
str += '<td scope="col" style="width:10%; text-align:center;">' + (data[i].running_timedelta) + '<br>' + (data[i].count) +'</td>';
|
||||
str += '<td scope="col" style="width:10%; text-align:center;">' + (data[i].description) + '</td>';
|
||||
str += '</tr>';
|
||||
}
|
||||
str += `
|
||||
</tbody>
|
||||
</table>`;
|
||||
|
||||
$("#scheduler_list_div").html(str);
|
||||
return;
|
||||
|
||||
|
||||
str = m_row_start(p='0');
|
||||
str += m_col(1, '<strong>NO</strong>');
|
||||
str += m_col(2, '<strong>플러그인 & ID</strong>');
|
||||
//str += m_col(2, '<strong>생성 & 다음 실행</strong>');
|
||||
str += m_col(2, '<strong>다음 실행 (남은시간)</strong>');
|
||||
str += m_col(1, '<strong>이전소요/횟수</strong>');
|
||||
str += m_col(2, '<strong>Interval & Cron</strong>');
|
||||
str += m_col(1, '<strong>상태</strong>');
|
||||
str += m_col(3, '<strong>설 명</strong>');
|
||||
str += m_row_end();
|
||||
str += m_hr();
|
||||
|
||||
for(var i in data) {
|
||||
if (data[i].is_running) {
|
||||
str += m_row_start_color2(0);
|
||||
} else {
|
||||
str += m_row_start(p='0');
|
||||
}
|
||||
|
||||
str += m_col(1, data[i].no);
|
||||
tmp = '<strong>'+data[i].plugin+'</strong><br>' + data[i].id;
|
||||
str += m_col(2, tmp);
|
||||
|
||||
//tmp = ''+''+'' + data[i].make_time + '<br>';
|
||||
//tmp += ''+''+'' + data[i].next_run_time + '<br>';
|
||||
tmp = ''+''+'' + data[i].next_run_time + '<br>';
|
||||
if (data[i].remain_time != '') {
|
||||
tmp += '('+data[i].remain_time+')';
|
||||
}
|
||||
str += m_col(2, tmp);
|
||||
tmp = ''+''+'' + data[i].running_timedelta + '초 / ';
|
||||
tmp += ''+''+'' + data[i].count + '회';
|
||||
str += m_col(1, tmp);
|
||||
|
||||
tmp = ''+''+'' + data[i].interval + ' <br>';
|
||||
str += m_col(2, tmp);
|
||||
tmp = ''+''+'' + ((data[i].is_running) ?'실행중':'대기중') + '';
|
||||
if (data[i].run == false) {
|
||||
tmp += '(F)'
|
||||
}
|
||||
str += m_col(1, tmp);
|
||||
str += m_col(3, data[i].description);
|
||||
str += m_row_end();
|
||||
str += m_hr();
|
||||
}
|
||||
document.getElementById("scheduler_list_div").innerHTML = str;
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
133
lib/system/templates/system_log.html
Normal file
133
lib/system/templates/system_log.html
Normal file
@@ -0,0 +1,133 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<style>
|
||||
.tab-pane {
|
||||
border-left: 1px solid #ddd;
|
||||
border-right: 1px solid #ddd;
|
||||
border-bottom: 1px solid #ddd;
|
||||
border-radius: 0px 0px 5px 5px;
|
||||
padding: 10px;
|
||||
}
|
||||
.nav-tabs { margin-bottom: 0; }
|
||||
</style>
|
||||
|
||||
<div>
|
||||
{{ macros.setting_top(left='로그 파일 선택') }}
|
||||
<div class="input-group col-sm-9">
|
||||
<div id='log_select1_div'></div>
|
||||
<div id='log_select2_div'></div>
|
||||
</div>
|
||||
{{ macros.setting_bottom() }}
|
||||
<nav>
|
||||
{{ macros.m_tab_head_start() }}
|
||||
{{ macros.m_tab_head('이전', true) }}
|
||||
{{ macros.m_tab_head('실시간', false) }}
|
||||
{{ macros.m_tab_head_end() }}
|
||||
</nav>
|
||||
<div class="tab-content" id="nav-tabContent">
|
||||
{{ macros.m_tab_content_start('이전', true) }}
|
||||
<div>
|
||||
<textarea id="log" class="col-md-12" rows="30" charswidth="23" disabled style="background-color:#ffffff;visibility:hidden"></textarea>
|
||||
</div>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
{{ macros.m_tab_content_start('실시간', false) }}
|
||||
<div>
|
||||
<textarea id="add" class="col-md-12" rows="30" charswidth="23" disabled style="background-color:#ffffff;visibility:visible"></textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-inline">
|
||||
<label class="form-check-label" for="auto_scroll">자동 스크롤</label>
|
||||
<input id="auto_scroll" name="auto_scroll" class="form-control form-control-sm" type="checkbox" data-toggle="toggle" checked>
|
||||
<span class='text-left' style="padding-left:25px; padding-top:0px">
|
||||
<button id="clear" class="btn btn-sm btn-outline-success">리셋</button>
|
||||
</span>
|
||||
</div>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
var package_name = "{{arg['package_name']}}";
|
||||
var sub = "{{arg['sub']}}";
|
||||
var log_list = "{{arg['log_list']}}";
|
||||
var all_list = "{{arg['all_list']}}";
|
||||
|
||||
var protocol = window.location.protocol;
|
||||
var socket = io.connect(protocol + "//" + document.domain + ":" + location.port + "/log");
|
||||
var current_filename = '';
|
||||
var start_filename = "{{arg['filename']}}";
|
||||
|
||||
$(document).ready(function() {
|
||||
$('#main_container').attr('class', 'container-fluid');
|
||||
ResizeTextArea()
|
||||
make_form()
|
||||
if (start_filename != '')
|
||||
document.getElementById('log_select').value = start_filename;
|
||||
$('#log_select').change();
|
||||
})
|
||||
|
||||
function make_form() {
|
||||
str = '<select id="log_select" name="log_select" class="form-control form-control-sm">';
|
||||
data = log_list.split('|')
|
||||
for(var i in data) {
|
||||
str += '<option value="' + data[i] + '">' + data[i] + '</option>';
|
||||
}
|
||||
document.getElementById("log_select1_div").innerHTML = str;
|
||||
|
||||
str = '<select id="log_select" name="log_select" class="form-control form-control-sm">';
|
||||
data = all_list.split('|')
|
||||
for(var i in data) {
|
||||
str += '<option value="' + data[i] + '">' + data[i] + '</option>';
|
||||
}
|
||||
document.getElementById("log_select2_div").innerHTML = str;
|
||||
}
|
||||
|
||||
$("body").on('change', '#log_select', function(e){
|
||||
e.preventDefault();
|
||||
filename = $(this)[0].value;
|
||||
current_filename = filename;
|
||||
$('#loading').show();
|
||||
socket.emit("start", {'filename':filename} );
|
||||
});
|
||||
|
||||
|
||||
function ResizeTextArea() {
|
||||
ClientHeight = window.innerHeight
|
||||
$("#log").height(ClientHeight-260);
|
||||
$("#add").height(ClientHeight-280);
|
||||
}
|
||||
|
||||
$(window).resize(function() {
|
||||
ResizeTextArea();
|
||||
});
|
||||
|
||||
|
||||
socket.on('on_start', function(data){
|
||||
document.getElementById("log").innerHTML += data.data;
|
||||
document.getElementById("log").scrollTop = document.getElementById("log").scrollHeight;
|
||||
document.getElementById("log").style.visibility = 'visible';
|
||||
$('#loading').hide();
|
||||
});
|
||||
|
||||
socket.on('add', function(data){
|
||||
if (data.filename == current_filename) {
|
||||
var chk = $('#auto_scroll').is(":checked");
|
||||
document.getElementById("add").innerHTML += data.data;
|
||||
if (chk) document.getElementById("add").scrollTop = document.getElementById("add").scrollHeight;
|
||||
}
|
||||
});
|
||||
|
||||
$("#clear").click(function(e) {
|
||||
e.preventDefault();
|
||||
document.getElementById("add").innerHTML = '';
|
||||
});
|
||||
|
||||
$("#auto_scroll").click(function(){
|
||||
var chk = $(this).is(":checked");//.attr('checked');
|
||||
});
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
72
lib/system/templates/system_login.html
Normal file
72
lib/system/templates/system_login.html
Normal file
@@ -0,0 +1,72 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<script type="text/javascript">
|
||||
hideMenu();
|
||||
</script>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-4"></div>
|
||||
<div class="login-form col-sm-4 border">
|
||||
<!--<form action="/login" method="post" _lpchecked="1">
|
||||
-->
|
||||
<form id="login_form">
|
||||
<input type="hidden" id="next" name="next" value="{{next}}">
|
||||
<h2 class="text-center">Log in</h2>
|
||||
<div class="form-group">
|
||||
<div class="input-group">
|
||||
<span class="input-group-addon"><i class="fa fa-user"></i></span>
|
||||
<input type="text" class="form-control" name="username" id="username" placeholder="Username" required="required" autocomplete="off" >
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="input-group">
|
||||
<span class="input-group-addon"><i class="fa fa-lock"></i></span>
|
||||
<input type="password" class="form-control" name="password" id="password" placeholder="Password" required="required" autocomplete="off" >
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<button id="login_btn" class="btn btn-primary login-btn btn-block">Sign in</button>
|
||||
</div>
|
||||
<div class="clearfix">
|
||||
<label class="pull-left checkbox-inline"><input type="checkbox" name='remember' id='remember' checked> Remember me</label>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-sm-4"></div>
|
||||
</div>
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
$("body").on('click', '#login_btn', function(e){
|
||||
e.preventDefault();
|
||||
|
||||
globalSendCommand('login',
|
||||
$('#username').val(),
|
||||
$('#password').val(),
|
||||
$("#remember").is(":checked"),
|
||||
'',
|
||||
function(data) {
|
||||
if (data == 'redirect') {
|
||||
next = document.getElementById("next").value;
|
||||
console.log(next)
|
||||
if (next == '' || next == 'None' || next == '/system/restart' || '/system/shutdown') {
|
||||
next = '/'
|
||||
}
|
||||
//console.log(next)
|
||||
window.location.href = next;
|
||||
} else if (data == 'no_id') {
|
||||
$.notify('<strong>ID가 없습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
} else if (data == 'wrong_password') {
|
||||
$.notify('<strong>암호가 틀립니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
||||
182
lib/system/templates/system_plugin.html
Normal file
182
lib/system/templates/system_plugin.html
Normal file
@@ -0,0 +1,182 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<style type="text/css">
|
||||
.my_hover:hover{
|
||||
background-color: #ffff00;
|
||||
transition: all 0.01s ease-in-out;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div>
|
||||
<nav>
|
||||
{{ macros.m_tab_head_start() }}
|
||||
{{ macros.m_tab_head2('normal', '일반', false) }}
|
||||
{{ macros.m_tab_head2('list', '플러그인 목록', true) }}
|
||||
{{ macros.m_tab_head_end() }}
|
||||
</nav>
|
||||
|
||||
<div class="tab-content" id="nav-tabContent">
|
||||
|
||||
{{ macros.m_tab_content_start('normal', false) }}
|
||||
<form id='setting' name='setting'>
|
||||
{{ macros.setting_input_text('plugin_dev_path', '개발용 플러그인 경로', value=arg['plugin_dev_path'], desc=['플러그인을 개발할 때 사용하는 경로'], col='9') }}
|
||||
{{ macros.setting_button([['setting_save', '저장']]) }}
|
||||
|
||||
</form>
|
||||
</form>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
{{ macros.m_tab_content_start('list', true) }}
|
||||
{{ macros.setting_input_text_and_buttons('plugin_git', '플러그인 수동 설치', [['plugin_install_btn', '설치']], value='https://github.com/', desc=['SJVA.ME 플러그인 게시판에 있는 링크 주소를 입력하세요.']) }}
|
||||
|
||||
{{ macros.m_hr_head_top() }}
|
||||
{{ macros.m_row_start('0') }}
|
||||
{{ macros.m_col(3, macros.m_strong('Name')) }}
|
||||
{{ macros.m_col(1, macros.m_strong('Dev.')) }}
|
||||
{{ macros.m_col(1, macros.m_strong('Category')) }}
|
||||
{{ macros.m_col(1, macros.m_strong('Version')) }}
|
||||
{{ macros.m_col(6, macros.m_strong('Description')) }}
|
||||
{{ macros.m_row_end() }}
|
||||
{{ macros.m_hr_head_bottom() }}
|
||||
<div id="plugin_list_div"></div>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
</div><!--tab-content-->
|
||||
</div> <!--전체-->
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
var package_name = 'system';
|
||||
var current_data;
|
||||
var install = "{{arg['install']}}";
|
||||
|
||||
$(document).ready(function(){
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/plugin_list',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
current_data = data
|
||||
make_plugin_list();
|
||||
if (install != '') {
|
||||
$('#plugin_git').val(install);
|
||||
//notify('플러그인이 설치되어 있지 않습니다.', 'danger');
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//설정 저장
|
||||
$("#setting_save").click(function(e) {
|
||||
e.preventDefault();
|
||||
var formData = get_formdata('#setting');
|
||||
setting_save_func(formData, true)
|
||||
//
|
||||
});
|
||||
|
||||
|
||||
function setting_save_func(formData, noti) {
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/setting_save',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: formData,
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret) {
|
||||
if (noti) {
|
||||
$.notify('<strong>설정을 저장하였습니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
window.location.href = "/"
|
||||
}
|
||||
} else {
|
||||
$.notify('<strong>설정 저장에 실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function make_plugin_list() {
|
||||
str = ''
|
||||
console.log(current_data)
|
||||
for (i in current_data) {
|
||||
console.log(i)
|
||||
console.log(current_data[i])
|
||||
str += m_row_start();
|
||||
str += m_col(3, i)
|
||||
|
||||
if (current_data[i].info != null) {
|
||||
str += m_col(1, current_data[i].info.developer);
|
||||
str += m_col(1, current_data[i].info.category);
|
||||
str += m_col(1, current_data[i].info.version);
|
||||
tmp = ''
|
||||
tmp += m_button('plugin_uninstall_btn', '삭제', [{'key':'plugin_name', 'value':current_data[i].info.name}]);
|
||||
if (current_data[i].info.local_info != null) {
|
||||
tmp += m_button('global_link_btn', 'GIT', [{'key':'url', 'value':current_data[i].info.local_info.home}]);
|
||||
if (current_data[i].info.local_info.home != current_data[i].info.local_info.more && current_data[i].info.local_info.more.startsWith('http'))
|
||||
tmp += m_button('global_link_btn', 'MORE', [{'key':'url', 'value':current_data[i].info.local_info.more}]);
|
||||
}
|
||||
|
||||
tmp = m_button_group(tmp)
|
||||
str += m_col(6, current_data[i].info.description +'<br><br>'+ tmp)
|
||||
}
|
||||
str += m_row_end();
|
||||
if (i != current_data.length -1) str += m_hr(0);
|
||||
}
|
||||
document.getElementById("plugin_list_div").innerHTML = str;
|
||||
}
|
||||
|
||||
|
||||
|
||||
$("body").on('click', '#plugin_install_btn', function(e){
|
||||
e.preventDefault();
|
||||
plugin_git = document.getElementById("plugin_git").value
|
||||
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/plugin_install',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data:{plugin_git:plugin_git},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
t = (data.ret == 'success') ? 'success' : 'warning'
|
||||
$.notify('<strong>'+data.log+'</strong>', {
|
||||
type: t
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$("body").on('click', '#plugin_uninstall_btn', function(e){
|
||||
e.preventDefault();
|
||||
plugin_name = $(this).data('plugin_name')
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/plugin_uninstall',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data:{plugin_name:plugin_name},
|
||||
success: function (data) {
|
||||
if (data == 'success') {
|
||||
$.notify('<strong>재시작시 적용됩니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
$.notify('<strong>실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
40
lib/system/templates/system_restart.html
Normal file
40
lib/system/templates/system_restart.html
Normal file
@@ -0,0 +1,40 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<script type="text/javascript">
|
||||
hideMenu();
|
||||
</script>
|
||||
|
||||
<div>
|
||||
<h4>
|
||||
{% if sub == 'restart' %}
|
||||
시스템 재시작 중입니다. <br>
|
||||
완료시 이전 페이지로 이동합니다.
|
||||
|
||||
{% elif sub == 'shutdown' %}
|
||||
시스템이 종료되었습니다.
|
||||
{% endif %}
|
||||
</h4>
|
||||
</div>
|
||||
{% if sub == 'restart' %}
|
||||
|
||||
<script type="text/javascript">
|
||||
var referer = "{{referer}}";
|
||||
|
||||
$(document).ready(function() {
|
||||
if (MODULE_NAME == 'restart') {
|
||||
$('#loading').show();
|
||||
setTimeout(function(){
|
||||
}, 2000);
|
||||
|
||||
var protocol = window.location.protocol;
|
||||
var restartSocket = io.connect(window.location.href);
|
||||
|
||||
restartSocket.on('connect', function(data){
|
||||
console.log('접속 받음')
|
||||
window.location.href = referer;
|
||||
});
|
||||
}
|
||||
})
|
||||
</script>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
50
lib/system/templates/system_setting_auth.html
Normal file
50
lib/system/templates/system_setting_auth.html
Normal file
@@ -0,0 +1,50 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<div>
|
||||
{{ macros.m_button_group([['globalSettingSaveBtn', '설정 저장']])}}
|
||||
{{ macros.m_row_start('5') }}
|
||||
{{ macros.m_row_end() }}
|
||||
{{ macros.m_hr() }}
|
||||
|
||||
<form id='setting' name='setting'>
|
||||
{{ macros.setting_checkbox('use_login', '로그인 사용', value=arg['use_login']) }}
|
||||
<div id="use_login_div" class="collapse">
|
||||
{{ macros.setting_input_text('web_id', '로그인 ID', value=arg['web_id'], desc=['초기값은 admin입니다.'], col='3') }}
|
||||
{{ macros.setting_input_text('web_pw', '로그인 암호', value=arg['web_pw'], col='3', type='password', desc=['초기값은 sjva입니다.']) }}
|
||||
</div>
|
||||
|
||||
{{ macros.m_hr() }}
|
||||
|
||||
{{ macros.setting_checkbox('use_apikey', 'APIKEY 사용', value=arg['use_apikey'], desc=['On : 모든 API 요청 시 apikey 값을 입력해야 합니다.', '없거나 틀릴 경우 에러코드 403리턴']) }}
|
||||
<div id="use_apikey_div" class="collapse">
|
||||
{{ macros.setting_input_text_and_buttons('apikey', 'APIKEY', [['apikey_generate_btn', '자동생성']], col='4', value=arg['apikey']) }}
|
||||
</div>
|
||||
{{ macros.m_hr() }}
|
||||
</form>
|
||||
</div> <!--전체-->
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
$(document).ready(function(){
|
||||
use_collapse("use_login");
|
||||
use_collapse("use_apikey");
|
||||
});
|
||||
|
||||
$('#use_login').change(function() {
|
||||
use_collapse('use_login');
|
||||
});
|
||||
|
||||
$('#use_apikey').change(function() {
|
||||
use_collapse('use_apikey');
|
||||
});
|
||||
|
||||
$("body").on('click', '#apikey_generate_btn', function(e) {
|
||||
e.preventDefault();
|
||||
globalSendCommand('apikey_generate', null, null, null, null, function(ret){
|
||||
$("#apikey").val(ret);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
420
lib/system/templates/system_setting_basic copy.html
Normal file
420
lib/system/templates/system_setting_basic copy.html
Normal file
@@ -0,0 +1,420 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
<style type="text/css">
|
||||
.my_hover:hover{
|
||||
background-color: #ffff00;
|
||||
transition: all 0.01s ease-in-out;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div>
|
||||
<nav>
|
||||
{{ macros.m_tab_head_start() }}
|
||||
{{ macros.m_tab_head2('normal', '일반', true) }}
|
||||
{{ macros.m_tab_head2('web', '웹', false) }}
|
||||
{{ macros.m_tab_head2('menu', '메뉴', false) }}
|
||||
{{ macros.m_tab_head2('link', '링크', false) }}
|
||||
{{ macros.m_tab_head2('download', '다운로드', false) }}
|
||||
{{ macros.m_tab_head_end() }}
|
||||
</nav>
|
||||
|
||||
<div class="tab-content" id="nav-tabContent">
|
||||
{{ macros.m_tab_content_start('normal', true) }}
|
||||
<form id='setting' name='setting'>
|
||||
{{ macros.setting_input_int('port', 'Port', value=arg['port'], min='1', placeholder='Port', desc=['포트 번호입니다.', '네이티브 설치 혹은 도커 네트워크 타입이 호스트일 경우 반영됩니다.', '도커 브릿지 모드인 경우는 docker run -p 옵션에서 변경하시기 바랍니다.', '경고 : -p 브릿지 모드로 사용중 일 경우 9999번을 절대 변경하지 마세요.']) }}
|
||||
{{ macros.setting_input_text_and_buttons('ddns', 'DDNS', [['ddns_test_btn', '테스트']], value=arg['ddns'], desc=['외부에서 접근시 사용할 DDNS. http:// 나 https:// 로 시작해야합니다.', 'RSS, Plex Callback, KLive 등에서 URL생성시 사용합니다.', '테스트 버튼 클릭 후 버전을 확인 할 수 있어야 합니다.']) }}
|
||||
{{ macros.setting_input_text('auto_restart_hour', '자동 재시작 시간', value=arg['auto_restart_hour'], col='3', desc=['자동 재시작 간격(시간단위)이나 Cron 설정을 입력합니다.', '0이면 재시작 안함.']) }}
|
||||
{{ macros.setting_select('log_level', '로그 레벨', [['10', 'DEBUG'],['20', 'INFO'],['30', 'WARNING'],['40', 'ERROR'], ['50', 'CRITICAL'] ], value=arg['log_level'], col='3') }}
|
||||
{{ macros.setting_button([['setting_save', '저장']]) }}
|
||||
</form>
|
||||
</form>
|
||||
{{ macros.m_hr() }}
|
||||
{{ macros.setting_input_text_and_buttons('command_text', 'Command', [['command_run_btn', 'Run']], value='', desc='') }}
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
|
||||
{{ macros.m_tab_content_start('web', false) }}
|
||||
<form id='setting2' name='setting2'>
|
||||
{{ macros.setting_select('theme', '테마 선택', [['Default','Default'], ['Cerulean','Cerulean'], ['Cosmo','Cosmo'], ['Cyborg','Cyborg'], ['Darkly','Darkly'], ['Flatly','Flatly'], ['Journal','Journal'], ['Litera','Litera'], ['Lumen','Lumen'], ['Lux','Lux'], ['Materia','Materia'], ['Minty','Minty'], ['Morph','Morph'],['Pulse','Pulse'], ['Quartz','Quartz'], ['Sandstone','Sandstone'], ['Simplex','Simplex'], ['Sketchy','Sketchy'], ['Slate','Slate'], ['Solar','Solar'], ['Spacelab','Spacelab'], ['Superhero','Superhero'], ['United','United'], ['Vapor','Vapor'], ['Yeti','Yeti'], ['Zephyr','Zephyr']], value=arg['theme'], desc=['https://bootswatch.com'], col='6') }}
|
||||
{{ macros.setting_input_text('web_title', '웹 타이틀', value=arg['web_title']) }}
|
||||
{{ macros.setting_button([['setting_save2', '저장']]) }}
|
||||
</form>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
|
||||
{{ macros.m_tab_content_start('menu', false) }}
|
||||
<form id='setting3' name='setting3'>
|
||||
{% if arg['use_category_vod'] == 'True' %}
|
||||
{{ macros.m_hr() }}
|
||||
{{ macros.setting_button_with_info([['menu_toggle_btn', 'Toggle', [{'key':'category', 'value':'vod'}]]], left='VOD', desc=None) }}
|
||||
<div id="menu_vod_div" class="collapse">
|
||||
{{ macros.setting_checkbox('use_plugin_ffmpeg', 'FFMPEG', value=arg['use_plugin_ffmpeg']) }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if arg['use_category_file_process'] == 'True' %}
|
||||
{{ macros.m_hr() }}
|
||||
{{ macros.setting_button_with_info([['menu_toggle_btn', 'Toggle', [{'key':'category', 'value':'file_process'}]]], left='파일처리', desc=None) }}
|
||||
<div id="menu_file_process_div" class="collapse">
|
||||
{{ macros.setting_checkbox('use_plugin_ktv', '국내TV', value=arg['use_plugin_ktv']) }}
|
||||
{{ macros.setting_checkbox('use_plugin_fileprocess_movie', '영화', value=arg['use_plugin_fileprocess_movie']) }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if arg['use_category_plex'] == 'True' %}
|
||||
{{ macros.m_hr() }}
|
||||
{{ macros.setting_button_with_info([['menu_toggle_btn', 'Toggle', [{'key':'category', 'value':'plex'}]]], left='PLEX', desc=None) }}
|
||||
<div id="menu_plex_div" class="collapse">
|
||||
{{ macros.setting_checkbox('use_plugin_plex', 'PLEX', value=arg['use_plugin_plex']) }}
|
||||
{{ macros.setting_checkbox('use_plugin_gdrive_scan', 'GDrive 스캔', value=arg['use_plugin_gdrive_scan']) }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if arg['use_category_tool'] == 'True' %}
|
||||
{{ macros.m_hr() }}
|
||||
{{ macros.setting_button_with_info([['menu_toggle_btn', 'Toggle', [{'key':'category', 'value':'tool'}]]], left='툴', desc=None) }}
|
||||
<div id="menu_tool_div" class="collapse">
|
||||
{{ macros.setting_checkbox('use_plugin_rclone', 'RClone', value=arg['use_plugin_rclone']) }}
|
||||
{{ macros.setting_checkbox('use_plugin_daum_tv', 'Daum TV', value=arg['use_plugin_daum_tv']) }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{{ macros.setting_button([['setting_save3', '저장']]) }}
|
||||
</form>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
|
||||
{{ macros.m_tab_content_start('link', false) }}
|
||||
{{ macros.m_button_group([['link_add_btn', '추가'], ['link_add_divider_btn', 'Divider Line 추가'], ['link_save_btn', '저장'], ['link_reset_btn', '초기화']])}}
|
||||
{{ macros.m_row_start('0') }}
|
||||
{{ macros.m_row_end() }}
|
||||
|
||||
{{ macros.m_hr_head_top() }}
|
||||
{{ macros.m_row_start('0') }}
|
||||
{{ macros.m_col(1, macros.m_strong('Idx')) }}
|
||||
{{ macros.m_col(4, macros.m_strong('Title')) }}
|
||||
{{ macros.m_col(4, macros.m_strong('URL')) }}
|
||||
{{ macros.m_col(3, macros.m_strong('Action')) }}
|
||||
{{ macros.m_row_end() }}
|
||||
{{ macros.m_hr_head_bottom() }}
|
||||
<form id="link_form" name="link_form">
|
||||
<div id="link_list_div"></div>
|
||||
</form>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
{{ macros.m_tab_content_start('download', false) }}
|
||||
{{ macros.setting_button_with_info([['global_link_btn', '다운로드', [{'key':'url', 'value':'https://github.com/soju6jan/soju6jan.github.io/blob/master/etc/hdhomerun_scan_191214.zip'}]], ['global_link_btn', '매뉴얼', [{'key':'url', 'value':'.'}]]], left='HDHomerun Scan Tool', desc=['HDHomerun 스캔하여 TVH용 프리셋 파일을 만들어주는 Windows용 프로그램', '8VSB 지원 케이블용']) }}
|
||||
<!--
|
||||
{{ macros.setting_button_with_info([['global_link_btn', '다운로드', [{'key':'url', 'value':'https://github.com/soju6jan/soju6jan.github.io/raw/master/etc/sjva_lc_0.1.1.apk'}]], ['global_link_btn', '매뉴얼', [{'key':'url', 'value':'.'}]]], left='SJVA for Live Channels', desc=['Android TV Live Channels 앱에 채널 소스를 제공하는 앱.', 'Klive, Plex 지원']) }}
|
||||
{{ macros.setting_button_with_info([['global_link_btn', '티빙 애드온', [{'key':'url', 'value':'https://github.com/soju6jan/soju6jan.github.io/blob/master/kodi_plugin/plugin.video.tving.zip'}]]], left='KODI', desc=None) }}
|
||||
-->
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
</div><!--tab-content-->
|
||||
</div> <!--전체-->
|
||||
|
||||
<!-- 링크 모달 -->
|
||||
{{ macros.m_modal_start('link_edit_modal', '링크', 'modal-lg') }}
|
||||
<form id="link_form">
|
||||
<input type="hidden" id="link_edit_index" name="link_edit_index"/>
|
||||
{{ macros.setting_input_text('link_edit_title', '제목') }}
|
||||
{{ macros.setting_input_text('link_edit_url', 'URL') }}
|
||||
{{ macros.setting_button([['link_edit_confirm_btn', '확인'], ['link_edit_cancel_btn', '취소']]) }}
|
||||
</form>
|
||||
{{ macros.m_modal_end() }}
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
var package_name = 'system';
|
||||
var current_data;
|
||||
var link_data;
|
||||
|
||||
$(document).ready(function(){
|
||||
$(function() {
|
||||
});
|
||||
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/get_link_list',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
link_data = data
|
||||
make_link_data();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
function setting_save_func(formData, noti) {
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/setting_save_system',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: formData,
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret) {
|
||||
if (noti) {
|
||||
$.notify('<strong>설정을 저장하였습니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
window.location.href = "/"
|
||||
}
|
||||
} else {
|
||||
$.notify('<strong>설정 저장에 실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//설정 저장
|
||||
$("#setting_save").click(function(e) {
|
||||
e.preventDefault();
|
||||
var formData = get_formdata('#setting');
|
||||
setting_save_func(formData, true)
|
||||
});
|
||||
|
||||
//설정 저장
|
||||
$("#setting_save2").click(function(e) {
|
||||
e.preventDefault();
|
||||
var formData = get_formdata('#setting2');
|
||||
setting_save_func(formData, false)
|
||||
});
|
||||
|
||||
$("#setting_save4").click(function(e) {
|
||||
e.preventDefault();
|
||||
var formData = get_formdata('#setting4');
|
||||
setting_save_func(formData, true)
|
||||
});
|
||||
|
||||
$("#setting_save3").click(function(e) {
|
||||
e.preventDefault();
|
||||
var formData = get_formdata('#setting3');
|
||||
setting_save_func(formData, true)
|
||||
$.notify('<strong>재시작해야 적용됩니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$("body").on('click', '#ddns_test_btn', function(e){
|
||||
e.preventDefault();
|
||||
ddns = document.getElementById('ddns').value;
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/ddns_test',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data:{ddns:ddns},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
console.log(data)
|
||||
if (data == 'fail') {
|
||||
$.notify('<strong>접속에 실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
} else {
|
||||
$.notify('<strong>Version:'+ data+'</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
$("body").on('click', '#menu_toggle_btn', function(e){
|
||||
e.preventDefault();
|
||||
category = $(this).data('category')
|
||||
var div_name = '#menu_'+category+'_div'
|
||||
$(div_name).collapse('toggle')
|
||||
});
|
||||
|
||||
$("body").on('click', '#command_run_btn', function(e){
|
||||
e.preventDefault();
|
||||
command_text = document.getElementById('command_text').value;
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/command_run',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data:{command_text:command_text},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
if (data.ret == 'success') {
|
||||
$.notify('<strong>성공 : '+ data.log +'</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
$.notify('<strong>실패 : ' + data.log+'</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// 링크
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// 화면 상단 버튼 START
|
||||
$("body").on('click', '#link_add_btn', function(e){
|
||||
e.preventDefault();
|
||||
document.getElementById("link_edit_index").value = -1;
|
||||
document.getElementById('link_edit_title').value = '';
|
||||
document.getElementById('link_edit_url').value = '';
|
||||
$('#link_edit_modal').modal();
|
||||
});
|
||||
|
||||
$("body").on('click', '#link_add_divider_btn', function(e){
|
||||
e.preventDefault();
|
||||
tmp = {}
|
||||
tmp['type'] = 'divider'
|
||||
link_data.splice(link_data.length, 0, tmp);
|
||||
make_link_data()
|
||||
});
|
||||
|
||||
$("body").on('click', '#link_save_btn', function(e){
|
||||
e.preventDefault();
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/link_save',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data:{link_data:JSON.stringify(link_data)},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
if (data) {
|
||||
$.notify('<strong>저장 후 적용하였습니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
$.notify('<strong>실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("body").on('click', '#link_reset_btn', function(e){
|
||||
e.preventDefault();
|
||||
link_data = []
|
||||
make_link_data()
|
||||
});
|
||||
// 화면 상단 버튼 END
|
||||
|
||||
// 리스트 각 항목 별 버튼 START
|
||||
$("body").on('click', '#link_item_up_btn', function(e){
|
||||
e.preventDefault();
|
||||
target_id = $(this).data('index')
|
||||
target = link_data[target_id]
|
||||
if (target_id != 0) {
|
||||
link_data.splice(target_id, 1);
|
||||
link_data.splice(target_id-1, 0, target);
|
||||
}
|
||||
make_link_data()
|
||||
});
|
||||
|
||||
$("body").on('click', '#link_item_down_btn', function(e){
|
||||
e.preventDefault();
|
||||
target_id = $(this).data('index')
|
||||
target = link_data[target_id]
|
||||
if (link_data.length -1 != target_id) {
|
||||
link_data.splice(target_id, 1);
|
||||
link_data.splice(target_id+1, 0, target);
|
||||
}
|
||||
make_link_data()
|
||||
});
|
||||
|
||||
$("body").on('click', '#link_item_delete_btn', function(e){
|
||||
e.preventDefault();
|
||||
target_id = $(this).data('index')
|
||||
target = link_data[target_id]
|
||||
link_data.splice(target_id, 1);
|
||||
make_link_data()
|
||||
});
|
||||
|
||||
$("body").on('click', '#link_item_edit_btn', function(e){
|
||||
e.preventDefault();
|
||||
target_id = $(this).data('index')
|
||||
target = link_data[target_id]
|
||||
document.getElementById('link_edit_index').value = target_id
|
||||
document.getElementById('link_edit_title').value = target.title
|
||||
document.getElementById('link_edit_url').value = target.url
|
||||
$('#link_edit_modal').modal();
|
||||
});
|
||||
// 리스트 각 항목 별 버튼 END
|
||||
|
||||
// START 모달 버튼
|
||||
$("body").on('click', '#link_edit_confirm_btn', function(e){
|
||||
e.preventDefault();
|
||||
edit_index = parseInt(document.getElementById('link_edit_index').value)
|
||||
tmp = {}
|
||||
tmp['type'] = 'link'
|
||||
tmp['title'] = document.getElementById('link_edit_title').value
|
||||
tmp['url'] = document.getElementById('link_edit_url').value
|
||||
if (edit_index == -1) {
|
||||
link_data.splice(link_data.length, 0, tmp);
|
||||
} else {
|
||||
link_data.splice(target_id, 1);
|
||||
link_data.splice(target_id, 0, tmp);
|
||||
}
|
||||
make_link_data()
|
||||
$('#link_edit_modal').modal('hide');
|
||||
});
|
||||
|
||||
$("body").on('click', '#link_edit_cancel_btn', function(e){
|
||||
e.preventDefault();
|
||||
$('#link_edit_modal').modal('hide');
|
||||
});
|
||||
// END 모달 버튼
|
||||
|
||||
|
||||
|
||||
function make_link_data() {
|
||||
str = ''
|
||||
for (i in link_data) {
|
||||
//console.log(link_data[i])
|
||||
str += m_row_start_hover();
|
||||
str += m_col(1, parseInt(i)+1);
|
||||
|
||||
if (link_data[i].type == 'link') {
|
||||
str += m_col(4, link_data[i].title)
|
||||
str += m_col(4, link_data[i].url)
|
||||
} else {
|
||||
str += m_col(8, '---Divider Line---')
|
||||
}
|
||||
tmp = ''
|
||||
tmp += m_button('link_item_up_btn', 'UP', [{'key':'index', 'value':i}]);
|
||||
tmp += m_button('link_item_down_btn', 'DOWN', [{'key':'index', 'value':i}]);
|
||||
tmp += m_button('link_item_delete_btn', '삭제', [{'key':'index', 'value':i}]);
|
||||
if (link_data[i].type == 'link') {
|
||||
tmp += m_button('link_item_edit_btn', '편집', [{'key':'index', 'value':i}]);
|
||||
tmp += m_button('global_link_btn', 'Go', [{'key':'url', 'value':link_data[i].url}]);
|
||||
}
|
||||
tmp = m_button_group(tmp)
|
||||
str += m_col(3, tmp)
|
||||
str += m_row_end();
|
||||
if (i != link_data.length -1) str += m_hr(0);
|
||||
}
|
||||
document.getElementById("link_list_div").innerHTML = str;
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
$("body").on('click', '#go_filebrowser_btn', function(e){
|
||||
e.preventDefault();
|
||||
url = document.getElementById('url_filebrowser').value
|
||||
window.open(url, "_blank");
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
136
lib/system/templates/system_setting_basic.html
Normal file
136
lib/system/templates/system_setting_basic.html
Normal file
@@ -0,0 +1,136 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
|
||||
<div>
|
||||
{{ macros.m_button_group([['globalSettingSaveBtn', '설정 저장']])}}
|
||||
{{ macros.m_row_start('5') }}
|
||||
{{ macros.m_row_end() }}
|
||||
{{ macros.m_hr() }}
|
||||
|
||||
<form id='setting' name='setting'>
|
||||
{{ macros.setting_input_int('port', 'Port', value=arg['port'], min='1', placeholder='Port', desc=['포트 번호입니다.', '네이티브 설치 혹은 도커 네트워크 타입이 호스트일 경우 반영됩니다.', '도커 브릿지 모드인 경우는 docker run -p 옵션에서 변경하시기 바랍니다.', '경고 : -p 브릿지 모드로 사용중 일 경우 9999번을 변경하지 마세요.']) }}
|
||||
{{ macros.setting_input_text_and_buttons('ddns', 'DDNS', [['ddns_test_btn', '테스트']], value=arg['ddns'], desc=['외부에서 접근시 사용할 DDNS. http:// 나 https:// 로 시작해야합니다.', 'URL생성시 사용합니다.', '테스트 버튼 클릭 후 버전을 확인 할 수 있어야 합니다.']) }}
|
||||
{{ macros.setting_input_text('restart_interval', '자동 재시작 시간', value=arg['restart_interval'], col='3', desc=['자동 재시작 간격(시간단위)이나 Cron 설정을 입력합니다.', '0이면 재시작 안함.']) }}
|
||||
{{ macros.setting_select('log_level', '로그 레벨', [['10', 'DEBUG'],['20', 'INFO'],['30', 'WARNING'],['40', 'ERROR'], ['50', 'CRITICAL'] ], value=arg['log_level'], col='3') }}
|
||||
{{ macros.m_hr() }}
|
||||
</form>
|
||||
</div><!--전체-->
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
$(document).ready(function(){
|
||||
});
|
||||
|
||||
$("body").on('click', '#ddns_test_btn', function(e){
|
||||
e.preventDefault();
|
||||
globalSendCommand('ddns_test', $('#ddns').val());
|
||||
|
||||
ddns = document.getElementById('ddns').value;
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/ddns_test',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data:{ddns:ddns},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
console.log(data)
|
||||
if (data == 'fail') {
|
||||
$.notify('<strong>접속에 실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
} else {
|
||||
$.notify('<strong>Version:'+ data+'</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
function setting_save_func(formData, noti) {
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/setting_save_system',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: formData,
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret) {
|
||||
if (noti) {
|
||||
$.notify('<strong>설정을 저장하였습니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
window.location.href = "/"
|
||||
}
|
||||
} else {
|
||||
$.notify('<strong>설정 저장에 실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//설정 저장
|
||||
$("#setting_save").click(function(e) {
|
||||
e.preventDefault();
|
||||
var formData = get_formdata('#setting');
|
||||
setting_save_func(formData, true)
|
||||
});
|
||||
|
||||
//설정 저장
|
||||
$("#setting_save2").click(function(e) {
|
||||
e.preventDefault();
|
||||
var formData = get_formdata('#setting2');
|
||||
setting_save_func(formData, false)
|
||||
});
|
||||
|
||||
$("#setting_save4").click(function(e) {
|
||||
e.preventDefault();
|
||||
var formData = get_formdata('#setting4');
|
||||
setting_save_func(formData, true)
|
||||
});
|
||||
|
||||
$("#setting_save3").click(function(e) {
|
||||
e.preventDefault();
|
||||
var formData = get_formdata('#setting3');
|
||||
setting_save_func(formData, true)
|
||||
$.notify('<strong>재시작해야 적용됩니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
$("body").on('click', '#command_run_btn', function(e){
|
||||
e.preventDefault();
|
||||
command_text = document.getElementById('command_text').value;
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/command_run',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data:{command_text:command_text},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
if (data.ret == 'success') {
|
||||
$.notify('<strong>성공 : '+ data.log +'</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
$.notify('<strong>실패 : ' + data.log+'</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
144
lib/system/templates/system_setting_env.html
Normal file
144
lib/system/templates/system_setting_env.html
Normal file
@@ -0,0 +1,144 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
|
||||
<div>
|
||||
<nav>
|
||||
{{ macros.m_tab_head_start() }}
|
||||
{{ macros.m_tab_head2('system', '시스템 변수', true) }}
|
||||
{{ macros.m_tab_head2('celery', 'celery 상태', false) }}
|
||||
{{ macros.m_tab_head_end() }}
|
||||
</nav>
|
||||
|
||||
<div class="tab-content" id="nav-tabContent">
|
||||
{{ macros.m_tab_content_start('system', true) }}
|
||||
<form id='setting' name='setting'>
|
||||
{{ macros.setting_input_textarea('export', '환경변수', desc=['',
|
||||
'도커를 재시작하거나 sjva3.sh 스크립트를 재시작해야 적용됩니다.',
|
||||
'구동 환경에 따라 사용하는 변수가 다릅니다.',
|
||||
'',
|
||||
'USE_CELERY : 멀티프로세싱 작업 사용 여부 설정. true or false',
|
||||
'CELERY_WORKER_COUNT : 작업 프로세스 개수.',
|
||||
'USE_GEVENT : 비동기 라이브러리 사용 설정. true or false. 클수록 메모리를 많이 소비하는 대신 더 원할하게 동작', '',
|
||||
'REDIS_PORT : celery에서 사용하는 redis port. 특별한 경우외에는 변경하지 마세요',
|
||||
'SJVA_PORT : 이 변수가 있는 경우 DB값을 무시하고 port로 설정',
|
||||
],
|
||||
value=arg['export'], row='10') }}
|
||||
{{ macros.setting_button([['setting_save_btn', '저장'], ['shutdown_btn', '시스템 종료']]) }}
|
||||
</form>
|
||||
</form>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
{{ macros.m_tab_content_start('celery', false) }}
|
||||
{{ macros.setting_button([['celery_test_btn', 'Celery Test'], ['worker_start_btn', '워커 재시작'], ['ps_btn', '프로세스 목록']]) }}
|
||||
|
||||
{{ macros.m_tab_content_end() }}
|
||||
</div><!--tab-content-->
|
||||
</div> <!--전체-->
|
||||
|
||||
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
var package_name = "{{arg['package_name']}}";
|
||||
var sub = "{{arg['sub'] }}";
|
||||
|
||||
$(document).ready(function(){
|
||||
|
||||
});
|
||||
|
||||
$("body").on('click', '#setting_save_btn', function(e){
|
||||
e.preventDefault();
|
||||
var formData = get_formdata('#setting');
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/' + sub + '/setting_save',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: formData,
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret) {
|
||||
$.notify('<strong>시스템 변수를 저장하였습니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
$.notify('<strong>시스템 변수 저장에 실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
$("body").on('click', '#shutdown_btn', function(e){
|
||||
e.preventDefault();
|
||||
shutdown_confirm();
|
||||
});
|
||||
|
||||
$("body").on('click', '#celery_test_btn', function(e){
|
||||
e.preventDefault();
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/' + sub + '/celery_test',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {},
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret.ret == 'success') {
|
||||
$.notify('<strong>'+ ret.data+'</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else if (ret.ret == 'timeout' || ret.ret == 'no_celery') {
|
||||
$.notify('<strong>'+ ret.data+'</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
//m_modal(ret)
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$("body").on('click', '#ps_btn', function(e){
|
||||
e.preventDefault();
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/' + sub + '/ps',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {},
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("body").on('click', '#worker_start_btn', function(e){
|
||||
e.preventDefault();
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/' + sub + '/worker_start',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {},
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret.ret == 'success') {
|
||||
$.notify('<strong>'+ ret.data+'</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else if (ret.ret == 'timeout' || ret.ret == 'no_celery' || ret.ret == 'not_registered') {
|
||||
$.notify('<strong>'+ ret.data+'</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
//m_modal(ret)
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
31
lib/system/templates/system_setting_memo.html
Normal file
31
lib/system/templates/system_setting_memo.html
Normal file
@@ -0,0 +1,31 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
|
||||
<div>
|
||||
{{ macros.m_button_group([['globalSettingSaveBtn', '설정 저장']])}}
|
||||
{{ macros.m_row_start('5') }}
|
||||
{{ macros.m_row_end() }}
|
||||
<nav>
|
||||
{{ macros.m_tab_head_start() }}
|
||||
{{ macros.m_tab_head2('memo', '메모', true) }}
|
||||
{{ macros.m_tab_head_end() }}
|
||||
</nav>
|
||||
<form id='setting' name='setting'>
|
||||
<div class="tab-content" id="nav-tabContent">
|
||||
{{ macros.m_tab_content_start('memo', true) }}
|
||||
<div>
|
||||
<textarea id="memo" name="memo" class="col-md-12" rows="30" charswidth="23" style="visibility:visible" value="">{{ arg['memo'] }}</textarea>
|
||||
</div>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
</div><!--tab-content-->
|
||||
</form>
|
||||
</div> <!--전체-->
|
||||
|
||||
<script type="text/javascript">
|
||||
var package_name = "{{arg['package_name']}}";
|
||||
var sub = "{{arg['sub'] }}";
|
||||
|
||||
$(document).ready(function(){
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
208
lib/system/templates/system_setting_notify.html
Normal file
208
lib/system/templates/system_setting_notify.html
Normal file
@@ -0,0 +1,208 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
|
||||
<div>
|
||||
{{ macros.m_button_group([['globalSettingSaveBtn', '설정 저장']])}}
|
||||
{{ macros.m_row_start('5') }}
|
||||
{{ macros.m_row_end() }}
|
||||
<nav>
|
||||
{{ macros.m_tab_head_start() }}
|
||||
{{ macros.m_tab_head2('basic', 'Basic', true) }}
|
||||
{{ macros.m_tab_head2('advanced', 'Advanced', false) }}
|
||||
{{ macros.m_tab_head_end() }}
|
||||
</nav>
|
||||
<form id='setting' name='setting'>
|
||||
<div class="tab-content" id="nav-tabContent">
|
||||
{{ macros.m_tab_content_start('basic', true) }}
|
||||
{{ macros.setting_checkbox('notify_telegram_use', '텔레그램 사용', value=arg['notify_telegram_use']) }}
|
||||
<div id="notify_telegram_use_div" class="collapse">
|
||||
{{ macros.setting_input_text('notify_telegram_token', 'Bot Token', value=arg['notify_telegram_token']) }}
|
||||
{{ macros.setting_input_text('notify_telegram_chat_id', 'My Chat ID', value=arg['notify_telegram_chat_id'], col='3') }}
|
||||
{{ macros.setting_input_text_and_buttons('tmp_text_telegram', 'Test', [['tmp_telegram_test_btn', '전송']], value='테스트 메시지입니다.', col='9', desc=['사용자가 먼저 봇과 대화를 시작하여 대화창이 생성된 상태여야 합니다.', '(대화창이 있을 경우에만 알림 수신)']) }}
|
||||
{{ macros.setting_checkbox('notify_telegram_disable_notification', '알람 Disable', value=arg['notify_telegram_disable_notification'], desc='On : 알람 소리 없이 메시지를 수신합니다.') }}
|
||||
</div>
|
||||
{{ macros.m_hr() }}
|
||||
{{ macros.setting_checkbox('notify_discord_use', '디스코드 사용', value=arg['notify_discord_use']) }}
|
||||
<div id="notify_discord_use_div" class="collapse">
|
||||
{{ macros.setting_input_text('notify_discord_webhook', '웹훅', value=arg['notify_discord_webhook']) }}
|
||||
{{ macros.setting_input_text_and_buttons('tmp_text_discord', 'Test', [['tmp_discord_test_btn', '전송']], value='테스트 메시지입니다.', col='9') }}
|
||||
|
||||
</div>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
{{ macros.m_tab_content_start('advanced', false) }}
|
||||
{{ macros.setting_checkbox('notify_advaned_use', '사용', value=arg['notify_advaned_use'], desc=['충분히 내용 숙지하고 사용하세요.', '사용시 기본설정은 무시됩니다.']) }}
|
||||
<div id="notify_advaned_use_div" class="collapse">
|
||||
{{ macros.setting_input_textarea('notify_advaned_policy', '정책', value=arg['notify_advaned_policy'], row='30') }}
|
||||
{{ macros.setting_input_text_and_buttons('tmp_text_advanced', 'Test', [['tmp_advanced_test_btn', '전송']], value='테스트 메시지입니다.', col='9', desc=['메시지 ID = 형식', '형식의 구분자 |', '텔레그램 : bot_token,chat_id | 디스코드 : 웹훅 URL', '예) DEFAULT = 794150118:AAEAAAAAAAAAAAAAAA,186485141|https://discordapp.com/api/webhooks/626295849....', '모든 알림을 텔레그램과 디스코드에 보냄']) }}
|
||||
{{ macros.setting_input_text('tmp_message_id', 'Test Message ID', value='DEFAULT') }}
|
||||
</div>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
</div><!--tab-content-->
|
||||
</form>
|
||||
</div> <!--전체-->
|
||||
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
var package_name = "{{arg['package_name']}}";
|
||||
var sub = "{{arg['sub'] }}";
|
||||
|
||||
$(document).ready(function(){
|
||||
use_collapse("notify_telegram_use");
|
||||
use_collapse("notify_discord_use");
|
||||
use_collapse("notify_advaned_use");
|
||||
});
|
||||
|
||||
$('#notify_telegram_use').change(function() {
|
||||
use_collapse('notify_telegram_use');
|
||||
});
|
||||
|
||||
$('#notify_discord_use').change(function() {
|
||||
use_collapse('notify_discord_use');
|
||||
});
|
||||
|
||||
$('#notify_advaned_use').change(function() {
|
||||
use_collapse('notify_advaned_use');
|
||||
});
|
||||
|
||||
|
||||
$("body").on('click', '#tmp_telegram_test_btn', function(e){
|
||||
e.preventDefault();
|
||||
bot_token = document.getElementById("notify_telegram_token").value;
|
||||
chat_id = document.getElementById("notify_telegram_chat_id").value;
|
||||
text = document.getElementById("tmp_text_telegram").value;
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/telegram_test',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data:{bot_token:bot_token, chat_id:chat_id, text:text},
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret) {
|
||||
$.notify('<strong>전송 하였습니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
$.notify('<strong>전송에 실패하였습니다.<br>'+ret+'</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("body").on('click', '#tmp_discord_test_btn', function(e){
|
||||
e.preventDefault();
|
||||
url = document.getElementById("notify_discord_webhook").value;
|
||||
text = document.getElementById("tmp_text_discord").value;
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/discord_test',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data:{url:url, text:text},
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret) {
|
||||
$.notify('<strong>전송 하였습니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
$.notify('<strong>전송에 실패하였습니다.<br>'+ret+'</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("body").on('click', '#tmp_advanced_test_btn', function(e){
|
||||
e.preventDefault();
|
||||
policy = document.getElementById("notify_advaned_policy").value;
|
||||
text = document.getElementById("tmp_text_advanced").value;
|
||||
message_id = document.getElementById("tmp_message_id").value;
|
||||
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/advanced_test',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data:{policy:policy, text:text, message_id:message_id},
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret) {
|
||||
$.notify('<strong>전송 하였습니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
$.notify('<strong>전송에 실패하였습니다.<br>'+ret+'</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
$("body").on('click', '#capture_btn', function(e){
|
||||
e.preventDefault();
|
||||
url = document.getElementById('tmp_go_url').value
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/capture',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {url:url},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
if (data.ret == 'success') {
|
||||
tmp = '<img src="' + data.data + '" class="img-fluid">'
|
||||
document.getElementById("image_div").innerHTML = tmp;
|
||||
} else {
|
||||
$.notify('<strong>실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//, ['full_capture_btn', '전체 캡처 이미지 다운']
|
||||
$("body").on('click', '#full_capture_btn', function(e){
|
||||
e.preventDefault();
|
||||
url = document.getElementById('tmp_go_url').value
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/full_capture',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {url:url},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
if (data.ret == 'success') {
|
||||
console.log('xxx')
|
||||
tmp = '<img src="' + data.data + '" class="img-fluid">'
|
||||
document.getElementById("image_div").innerHTML = tmp;
|
||||
} else {
|
||||
$.notify('<strong>실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
166
lib/system/templates/system_setting_selenium.html
Normal file
166
lib/system/templates/system_setting_selenium.html
Normal file
@@ -0,0 +1,166 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
|
||||
<div>
|
||||
{{ macros.m_button_group([['globalSettingSaveBtn', '설정 저장']])}}
|
||||
{{ macros.m_row_start('5') }}
|
||||
{{ macros.m_row_end() }}
|
||||
<nav>
|
||||
{{ macros.m_tab_head_start() }}
|
||||
{{ macros.m_tab_head2('normal', '일반', true) }}
|
||||
{{ macros.m_tab_head2('test', '테스트', false) }}
|
||||
{{ macros.m_tab_head_end() }}
|
||||
</nav>
|
||||
<div class="tab-content" id="nav-tabContent">
|
||||
{{ macros.m_tab_content_start('normal', true) }}
|
||||
<form id='setting' name='setting'>
|
||||
{{ macros.setting_input_text_and_buttons('selenium_remote_url', 'Selenium Remote URL', [['selenium_go_btn', 'GO'], ['selenium_manual_go_btn', '매뉴얼']], value=arg['selenium_remote_url'], placeholder='예) http://127.0.0.1:4444/wd/hub', desc=['SJVA에서 Selenium이 필요한 경우 사용할 Remote URL', 'Docker 환경에서 필요하며, Native 환경에서는 실행파일이 SJVA Root/bin/플랫폼 안에 직접 넣어줘야합니다.', 'Native 환경에서도 이 값을 입력하는 경우는 이를 사용합니다.', 'Selenium 공식 Docker 이미지인 경우 /wd/hub를 붙여야합니다.']) }}
|
||||
{{ macros.setting_input_textarea('selenium_remote_default_option', '기본 크롬 옵션(Remote)', value=arg['selenium_remote_default_option'], row='3', desc=['구분자 | 또는 엔터']) }}
|
||||
{{ macros.setting_input_textarea('selenium_binary_default_option', '기본 크롬 옵션(Binary)', value=arg['selenium_binary_default_option'], row='3', desc=['구분자 | 또는 엔터']) }}
|
||||
</form>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
{{ macros.m_tab_content_start('test', false) }}
|
||||
{{ macros.setting_input_text_and_buttons('tmp_go_url', '테스트 URL', [['selenium_test_btn', 'GO'], ['capture_btn', '화면표시'], ['cookie_btn', '쿠키정보']], value='https://search.daum.net/search?w=tv&q=%EB%82%98%EC%81%9C%20%EB%85%80%EC%84%9D%EB%93%A4%20%3A%20%EC%95%85%EC%9D%98%20%EB%8F%84%EC%8B%9C&irk=78543&irt=tv-program&DA=TVP') }}
|
||||
{{ macros.setting_input_text_and_buttons('tmp_daum_capcha', '다음 캡챠', [['tmp_daum_capcha_btn', '캡챠 풀기']], value='') }}
|
||||
<div id="image_div"></div>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
</div><!--tab-content-->
|
||||
</div> <!--전체-->
|
||||
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
var package_name = "{{arg['package_name']}}";
|
||||
var sub = "{{arg['sub'] }}";
|
||||
|
||||
$(document).ready(function(){
|
||||
});
|
||||
|
||||
$("body").on('click', '#selenium_manual_go_btn', function(e){
|
||||
e.preventDefault();
|
||||
url = "https://soju6jan.com/archives/1380"
|
||||
window.open(url, "_blank");
|
||||
});
|
||||
|
||||
$("body").on('click', '#selenium_go_btn', function(e){
|
||||
e.preventDefault();
|
||||
url = document.getElementById('selenium_remote_url').value
|
||||
window.open(url, "_blank");
|
||||
});
|
||||
|
||||
$("body").on('click', '#selenium_test_btn', function(e){
|
||||
e.preventDefault();
|
||||
url = document.getElementById('tmp_go_url').value
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/selenium_test_go',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {url:url},
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret == 'success') {
|
||||
$.notify('<strong>로딩하였습니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
$.notify('<strong>실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("body").on('click', '#capture_btn', function(e){
|
||||
e.preventDefault();
|
||||
url = document.getElementById('tmp_go_url').value
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/capture',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {url:url},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
if (data.ret == 'success') {
|
||||
tmp = '<img src="' + data.data + '" class="img-fluid">'
|
||||
document.getElementById("image_div").innerHTML = tmp;
|
||||
} else {
|
||||
$.notify('<strong>실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//, ['full_capture_btn', '전체 캡처 이미지 다운']
|
||||
$("body").on('click', '#full_capture_btn', function(e){
|
||||
e.preventDefault();
|
||||
url = document.getElementById('tmp_go_url').value
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/full_capture',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {url:url},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
if (data.ret == 'success') {
|
||||
console.log('xxx')
|
||||
tmp = '<img src="' + data.data + '" class="img-fluid">'
|
||||
document.getElementById("image_div").innerHTML = tmp;
|
||||
} else {
|
||||
$.notify('<strong>실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$("body").on('click', '#cookie_btn', function(e){
|
||||
e.preventDefault();
|
||||
url = document.getElementById('tmp_go_url').value
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/cookie',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {url:url},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
m_modal(data);
|
||||
return;
|
||||
if (data.ret == 'success') {
|
||||
m_modal(data);
|
||||
} else {
|
||||
$.notify('<strong>실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("body").on('click', '#tmp_daum_capcha_btn', function(e){
|
||||
e.preventDefault();
|
||||
daum_capcha = document.getElementById('tmp_daum_capcha').value
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/daum_capcha',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {daum_capcha:daum_capcha},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
if (data.ret == 'success') {
|
||||
$.notify('<strong>전달 하였습니다. 페이지 다시 로딩 & 쿠키 정보 확인하여 Site Daum에 입력하세요.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
179
lib/system/templates/system_setting_site.html
Normal file
179
lib/system/templates/system_setting_site.html
Normal file
@@ -0,0 +1,179 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
|
||||
<div>
|
||||
{{ macros.m_button_group([['globalSettingSaveBtn', '설정 저장']])}}
|
||||
{{ macros.m_row_start('5') }}
|
||||
{{ macros.m_row_end() }}
|
||||
<nav>
|
||||
{{ macros.m_tab_head_start() }}
|
||||
{{ macros.m_tab_head2('daum', 'Daum', true) }}
|
||||
{{ macros.m_tab_head2('wavve', '웨이브', false) }}
|
||||
{{ macros.m_tab_head2('tving', '티빙', false) }}
|
||||
{{ macros.m_tab_head_end() }}
|
||||
</nav>
|
||||
<form id='setting' name='setting'>
|
||||
<div class="tab-content" id="nav-tabContent">
|
||||
{{ macros.m_tab_content_start('daum', true) }}
|
||||
<!--{{ macros.setting_input_text_and_buttons('site_daum_cookie', 'Cookie', [['site_daum_cookie_btn', 'Refresh']], value=arg['site_daum_cookie'], desc=['지금은 TIARA=값 만 입력하세요', 'Refresh는 Selenium 연결이 가능한 경우만 실행됩니다.']) }}-->
|
||||
{{ macros.setting_input_text('site_daum_cookie', 'Cookie', value=arg['site_daum_cookie'], desc=['TIARA=값 만 입력']) }}
|
||||
{{ macros.setting_input_text('site_daum_proxy', 'Proxy', value=arg['site_daum_proxy']) }}
|
||||
|
||||
{{ macros.m_hr() }}
|
||||
{{ macros.setting_input_text_and_buttons('site_daum_test', 'Test', [['site_daum_test_btn', 'Test']], value=arg['site_daum_test'], desc=['영화 or 방송제목']) }}
|
||||
<!--
|
||||
{{ macros.m_hr() }}
|
||||
{{ macros.info_text('', '자동', value='Cookie 값 자동으로 변경하는 스케쥴링입니다. Selenium 연결이 가능해야 합니다.') }}
|
||||
{{ macros.setting_scheduler_button(arg['scheduler'], arg['is_running']) }}
|
||||
{{ macros.setting_input_text('site_daum_interval', '스케쥴링 실행 정보', value=arg['site_daum_interval'], col='3', desc=['Inverval(minute 단위)이나 Cron 설정']) }}
|
||||
{{ macros.setting_checkbox('site_daum_auto_start', '시작시 자동실행', value=arg['site_daum_auto_start'], desc='On : 시작시 자동으로 스케쥴러에 등록됩니다.') }}
|
||||
-->
|
||||
<!--{{ macros.m_hr() }}
|
||||
{{ macros.info_text_go('site_get_daum_cookie_url', 'Daum Cookie API', value=arg['site_get_daum_cookie_url'], desc=['Plex의 SJ Daum Agent 설정에 이 값을 입력하면 검색 실패시 자동적으로 새로운 쿠키값을 가져옵니다.'] ) }}-->
|
||||
{{ macros.m_tab_content_end() }}
|
||||
{{ macros.m_tab_content_start('wavve', false) }}
|
||||
{{ macros.setting_input_textarea('site_wavve_credential', 'Credential', value=arg['site_wavve_credential'], row='3') }}
|
||||
{{ macros.setting_checkbox('site_wavve_use_proxy', 'Proxy 사용', value=arg['site_wavve_use_proxy'], desc=None) }}
|
||||
<div id="site_wavve_use_proxy_div" class="collapse">
|
||||
{{ macros.setting_input_text('site_wavve_proxy_url', 'Proxy URL', value=arg['site_wavve_proxy_url'], desc=None) }}
|
||||
</div>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
{{ macros.m_tab_content_start('tving', false) }}
|
||||
{{ macros.setting_radio('site_tving_login_type', '로그인 타입', ['CJONE', 'TVING'], value=arg['site_tving_login_type']) }}
|
||||
{{ macros.setting_input_text('site_tving_id', 'ID', value=arg['site_tving_id'], col='3') }}
|
||||
{{ macros.setting_input_text_and_buttons('site_tving_pw', '암호', [['site_tving_login_btn', '토큰 가져오기']], value=arg['site_tving_pw'], col='6', type='password') }}
|
||||
{{ macros.setting_input_text_and_buttons('site_tving_token', '토큰', [['site_tving_deviceid_btn', 'DeviceID 목록 가져오기']], value=arg['site_tving_token'], col='8', desc=['계정 정보대신 이 값을 사용합니다.', '이 값을 수동으로 넣는 경우 계정정보를 입력할 필요가 없습니다.', '_tving_token=XXXXXX 형식']) }}
|
||||
{{ macros.setting_input_text('site_tving_deviceid', 'Device ID', value=arg['site_tving_deviceid'], col='3', desc=['model이 PC인 항목의 uuid 값 입력']) }}
|
||||
{{ macros.setting_input_text('site_tving_uuid', 'UUID', value=arg['site_tving_uuid'], col='3', desc=['uuid']) }}
|
||||
{{ macros.setting_checkbox('site_tving_use_proxy', 'Proxy 사용', value=arg['site_tving_use_proxy'], desc=None) }}
|
||||
<div id="site_tving_use_proxy_div" class="collapse">
|
||||
{{ macros.setting_input_text('site_tving_proxy_url', 'Proxy URL', value=arg['site_tving_proxy_url'], desc=None) }}
|
||||
</div>
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
</div><!--tab-content-->
|
||||
</form>
|
||||
</div> <!--전체-->
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
var package_name = "{{arg['package_name']}}";
|
||||
var sub = "{{arg['sub'] }}";
|
||||
|
||||
$(document).ready(function(){
|
||||
use_collapse("site_wavve_use_proxy");
|
||||
use_collapse("site_tving_use_proxy");
|
||||
});
|
||||
|
||||
$('#site_wavve_use_proxy').change(function() {
|
||||
use_collapse('site_wavve_use_proxy');
|
||||
});
|
||||
$('#site_tving_use_proxy').change(function() {
|
||||
use_collapse('site_tving_use_proxy');
|
||||
});
|
||||
|
||||
|
||||
$("body").on('click', '#site_daum_test_btn', function(e){
|
||||
e.preventDefault();
|
||||
site_daum_test = document.getElementById("site_daum_test").value;
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/site_daum_test',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data:{site_daum_test:site_daum_test},
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
m_modal(ret);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$("body").on('click', '#site_daum_cookie_btn', function(e){
|
||||
e.preventDefault();
|
||||
$.notify('<strong>잠시 기다려 주세요</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/site_daum_cookie_refresh',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data:{},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
if (data.ret) {
|
||||
document.getElementById("site_daum_cookie").value = data.data
|
||||
$.notify('<strong>갱신하였습니다. 저장버튼을 눌러야 적용됩니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
$.notify('<strong>갱신에 실패하였습니다. Selenium 설정을 확인하세요.<br>'+ret.log+'</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$("body").on('change', '#scheduler', function(e){
|
||||
var ret = $(this).prop('checked');
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/scheduler',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {scheduler : ret},
|
||||
dataType: "json",
|
||||
success: function (list) {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
// 티빙
|
||||
$("body").on('click', '#site_tving_login_btn', function(e) {
|
||||
e.preventDefault();
|
||||
tving_id = document.getElementById("site_tving_id").value;
|
||||
tving_pw = document.getElementById("site_tving_pw").value;
|
||||
tving_login_type = ($("#site_tving_login_type0").prop('checked')) ? '0' : '1';
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/' + sub + '/tving_login',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {tving_id:tving_id, tving_pw:tving_pw, tving_login_type:tving_login_type},
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret.ret) {
|
||||
notify("토큰값을 가져왔습니다.<br>저장버튼을 눌러야 값을 저장합니다.", "success");
|
||||
document.getElementById("site_tving_token").value = ret['token'];
|
||||
} else {
|
||||
notify("로그인에 실패하였습니다.", "warning");
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("body").on('click', '#site_tving_deviceid_btn', function(e) {
|
||||
e.preventDefault();
|
||||
tving_token = document.getElementById("site_tving_token").value;
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/' + sub + '/tving_deviceid',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {tving_token:tving_token},
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret.ret) {
|
||||
m_modal(ret.device_list, "Device ID");
|
||||
} else {
|
||||
notify("실패하였습니다.", "warning");
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
85
lib/system/templates/system_setting_telegram_bot.html
Normal file
85
lib/system/templates/system_setting_telegram_bot.html
Normal file
@@ -0,0 +1,85 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
|
||||
<div>
|
||||
{{ macros.m_button_group([['globalSettingSaveBtn', '설정 저장']])}}
|
||||
{{ macros.m_row_start('5') }}
|
||||
{{ macros.m_row_end() }}
|
||||
<nav>
|
||||
{{ macros.m_tab_head_start() }}
|
||||
{{ macros.m_tab_head2('normal', '일반', true) }}
|
||||
{{ macros.m_tab_head_end() }}
|
||||
</nav>
|
||||
<form id='setting' name='setting'>
|
||||
<div class="tab-content" id="nav-tabContent">
|
||||
{{ macros.m_tab_content_start('normal', true) }}
|
||||
{{ macros.setting_scheduler_button(arg['scheduler'], arg['is_running']) }}
|
||||
{{ macros.setting_checkbox('telegram_bot_auto_start', '시작시 자동실행', value=arg['telegram_bot_auto_start'], desc='On : 시작시 자동으로 스케쥴러에 등록됩니다.') }}
|
||||
{{ macros.setting_input_text('telegram_bot_token', 'Bot Token', value=arg['telegram_bot_token']) }}
|
||||
|
||||
{{ macros.setting_checkbox('telegram_resend', '전달 사용', value=arg['telegram_resend'], desc=['On : 수신 받은 데이터를 전달합니다.']) }}
|
||||
<div id="telegram_resend_div" class="collapse">
|
||||
{{ macros.setting_input_textarea('telegram_resend_chat_id', '수신 받을 Chat ID', value=arg['telegram_resend_chat_id'], row='3', desc=['받은 메시지를 보낼 Chat ID', 'Chat ID 별 구분자 | 또는 엔터']) }}
|
||||
</div>
|
||||
<!--
|
||||
{{ macros.m_hr() }}
|
||||
{{ macros.setting_button([['open_url1_btn', 'BotFather'], ['open_url2_btn', 'SJVA Bot Channel'], ['open_url3_btn', 'SJVA Bot Channel 관리 봇']]) }}
|
||||
-->
|
||||
{{ macros.m_tab_content_end() }}
|
||||
</div><!--tab-content-->
|
||||
</form>
|
||||
</div> <!--전체-->
|
||||
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
var package_name = "{{arg['package_name']}}";
|
||||
var sub = "{{arg['sub'] }}";
|
||||
|
||||
|
||||
$(document).ready(function(){
|
||||
use_collapse("telegram_resend");
|
||||
});
|
||||
|
||||
$('#telegram_resend').change(function() {
|
||||
use_collapse('telegram_resend');
|
||||
});
|
||||
|
||||
$("body").on('change', '#scheduler', function(e){
|
||||
var ret = $(this).prop('checked');
|
||||
if (!ret) {
|
||||
$.notify('<strong>텔레그램 봇은 중단 할 수 없습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
$('#scheduler').bootstrapToggle('on')
|
||||
return
|
||||
}
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/scheduler',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {scheduler : ret},
|
||||
dataType: "json",
|
||||
success: function (list) {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("body").on('click', '#open_url1_btn', function(e){
|
||||
e.preventDefault();
|
||||
window.open("https://t.me/BotFather", "_blank");
|
||||
});
|
||||
|
||||
$("body").on('click', '#open_url2_btn', function(e){
|
||||
e.preventDefault();
|
||||
window.open("https://t.me/sjva_bot_channel", "_blank");
|
||||
});
|
||||
|
||||
$("body").on('click', '#open_url3_btn', function(e){
|
||||
e.preventDefault();
|
||||
window.open("https://t.me/sjva_admin_bot", "_blank");
|
||||
});
|
||||
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
112
lib/system/templates/system_setting_terminal.html
Normal file
112
lib/system/templates/system_setting_terminal.html
Normal file
@@ -0,0 +1,112 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
|
||||
{{ macros.m_button_group([['yaml_edit_btn', '편집'], ['terminal_open_btn', 'Terminal 실행'], ['all_append_files_show_btn', '모두 확장'], ['all_append_files_hide_btn', '모두 축소']])}}
|
||||
{{ macros.m_row_start('5') }}
|
||||
{{ macros.m_row_end() }}
|
||||
{{ macros.m_hr_head_bottom() }}
|
||||
<div id="list_div"></div>
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
var package_name = "{{arg['package_name']}}";
|
||||
var sub = "{{arg['sub']}}";
|
||||
var yaml_path = "{{arg['yaml_path']}}";
|
||||
var current_data = null;
|
||||
|
||||
$(document).ready(function(){
|
||||
reqeust_info();
|
||||
});
|
||||
|
||||
function reqeust_info() {
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/get_info',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data:{},
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
make_list(ret);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function make_list(data) {
|
||||
current_data = data;
|
||||
data = data.commands;
|
||||
str = '';
|
||||
str = '<table id="result_table" class="table table-sm tableRowHover " ><thead class="thead-dark"><tr> \
|
||||
<th style="width:10%; text-align:center;">INDEX</th> \
|
||||
<th style="width:80%; text-align:left;">제목</th> \
|
||||
<th style="width:10%; text-align:center;">실행</th> \
|
||||
</tr></thead><tbody id="list">';
|
||||
|
||||
if (data.length == 0) str += '<tr><td colspan="3"><h4>명령이 없습니다.</h4></td></tr>';
|
||||
|
||||
for(i in data) {
|
||||
console.log(data[i]);
|
||||
str += '<tr class="chover" style="cursor: pointer;" data-toggle="collapse" data-target="#collapse_' + i + '" aria-expanded="true" >';
|
||||
str += '<td scope="col" style="width:10%; text-align:center;">'+ (parseInt(i)+1) + '</td>';
|
||||
str += '<td scope="col" style="width:80%; text-align:left;">'+ data[i].title + '</td>';
|
||||
tmp = m_button('terminal_open_btn', '실행', [{'key':'index', 'value':i}]);
|
||||
str += '<td scope="col" style="width:10%; text-align:center;">'+ tmp + '</td>';
|
||||
|
||||
str += '</tr>';
|
||||
|
||||
str += '<tr class="collapse tableRowHoverOff" style="cursor: pointer;" id="collapse_' + i + '">';
|
||||
str += '<td></td><td colspan="2">';
|
||||
str += "<pre>"+data[i].command+"</pre>";
|
||||
|
||||
str += '</td>';
|
||||
str += '</tr>'
|
||||
|
||||
}
|
||||
str += '</table>';
|
||||
document.getElementById("list_div").innerHTML = str;
|
||||
|
||||
return
|
||||
|
||||
}
|
||||
|
||||
$("body").on('click', '#yaml_edit_btn', function(e){
|
||||
url = '/flaskcode' + yaml_path;
|
||||
window.open(url, '_blank')
|
||||
});
|
||||
|
||||
|
||||
|
||||
$("body").on('click', '#terminal_open_btn', function(e){
|
||||
e.preventDefault();
|
||||
index = $(this).data('index');
|
||||
console.log(index);
|
||||
if (index == null) {
|
||||
window.open("/terminal", "_blank");
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/' + sub + '/run',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {index:index},
|
||||
dataType: "json",
|
||||
success: function (data) {
|
||||
if (data.ret == 'success') {
|
||||
window.open("/terminal", "_blank");
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$("body").on('click', '#all_append_files_show_btn', function(e){
|
||||
e.preventDefault();
|
||||
$('.collapse').collapse('show');
|
||||
|
||||
});
|
||||
|
||||
$("body").on('click', '#all_append_files_hide_btn', function(e){
|
||||
e.preventDefault();
|
||||
$('.collapse').collapse('hide');
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
21
lib/system/templates/system_setting_web.html
Normal file
21
lib/system/templates/system_setting_web.html
Normal file
@@ -0,0 +1,21 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<div>
|
||||
{{ macros.m_button_group([['globalSettingSaveBtn', '설정 저장']])}}
|
||||
{{ macros.m_row_start('5') }}
|
||||
{{ macros.m_row_end() }}
|
||||
{{ macros.m_hr() }}
|
||||
|
||||
<form id='setting' name='setting'>
|
||||
{{ macros.setting_select('theme', '테마 선택', [['Default','Default'], ['Cerulean','Cerulean'], ['Cosmo','Cosmo'], ['Cyborg','Cyborg'], ['Darkly','Darkly'], ['Flatly','Flatly'], ['Journal','Journal'], ['Litera','Litera'], ['Lumen','Lumen'], ['Lux','Lux'], ['Materia','Materia'], ['Minty','Minty'], ['Morph','Morph'],['Pulse','Pulse'], ['Quartz','Quartz'], ['Sandstone','Sandstone'], ['Simplex','Simplex'], ['Sketchy','Sketchy'], ['Slate','Slate'], ['Solar','Solar'], ['Spacelab','Spacelab'], ['Superhero','Superhero'], ['United','United'], ['Vapor','Vapor'], ['Yeti','Yeti'], ['Zephyr','Zephyr']], value=arg['theme'], desc=None, col='6') }}
|
||||
{{ macros.info_text_go('', '테마 제공', 'https://bootswatch.com')}}
|
||||
{{ macros.setting_input_text('web_title', '웹 타이틀', value=arg['web_title']) }}
|
||||
|
||||
{{ macros.m_hr() }}
|
||||
</form>
|
||||
</div> <!--전체-->
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
135
lib/system/templates/system_telegram_setting.html
Normal file
135
lib/system/templates/system_telegram_setting.html
Normal file
@@ -0,0 +1,135 @@
|
||||
{% extends "base.html" %}
|
||||
{% block wide_menu %}
|
||||
<ul class="nav nav-pills bg-light shadow text-dark" >
|
||||
<li class="nav-item"><span class="nav-link">시스템</span></li>
|
||||
<li class="nav-item"><a class="nav-link " href="/system/setting">설정</a></li>
|
||||
<li class="nav-item"><a class="nav-link active" href="/system/telegram">텔레그램 봇</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="/system/plugin">저장된 TV</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="/system/common">로그 확인</a></li>
|
||||
</ul>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div>
|
||||
{{ macros.setting_scheduler_button(arg['is_include'], arg['is_running']) }}
|
||||
<form id='setting' name='setting'>
|
||||
{{ macros.setting_checkbox('telegram_auto_start', '시작시 자동실행', value=arg['auto_start'], desc='On : 시작시 자동으로 스케쥴러에 등록됩니다.') }}
|
||||
{{ macros.setting_checkbox('telegram_process_rss', '토렌트', value=arg['process_rss'], desc='On : 토렌트 데이터를 수신하여 저장') }}
|
||||
<div id="process_rss_div" class="collapse">
|
||||
{{ macros.setting_input_text('telegram_process_rss_type', '수신 타입', value=arg['process_rss_type'], desc=['all인 경우 모두 받음. 구분자 ,', 'TV : drama, ent, dacu, etc', '영화 : movie', 'AV : av_censored, av_uncensored, av_west', '기타 : music, user' ]) }}
|
||||
</div>
|
||||
{{ macros.setting_checkbox('telegram_send_notify', '수신정보 알림', value=arg['send_notify'], desc='On : On 상태인 데이터가 수신될 때 알림.') }}
|
||||
{{ macros.setting_checkbox('telegram_disable_notification', '알람 Disable', value=arg['disable_notification'], desc='On : 알람 소리 없이 메시지를 수신합니다.') }}
|
||||
{{ macros.m_hr() }}
|
||||
{{ macros.setting_input_text('telegram_bot_token', 'Bot Token', value=arg['bot_token']) }}
|
||||
{{ macros.setting_input_text_and_buttons('telegram_chat_id', 'My Chat ID', [['test_btn', '테스트']], value=arg['chat_id'], col='9', desc=['사용자가 먼저 봇과 대화를 시작하여야 합니다.', '(대화창이 있을 경우에만 알림 수신)']) }}
|
||||
{{ macros.setting_button([['globalSettingSaveBtn', '저장']]) }}
|
||||
</form>
|
||||
{{ macros.m_hr() }}
|
||||
{{ macros.setting_button([['open_url1_btn', 'BotFather'], ['open_url2_btn', 'SJVA Bot Channel'], ['open_url3_btn', 'SJVA Bot Channel 관리 봇']]) }}
|
||||
</div> <!--전체-->
|
||||
|
||||
<script type="text/javascript">
|
||||
var package_name = 'system';
|
||||
var current_data = null;
|
||||
|
||||
$(document).ready(function(){
|
||||
use_collapse("telegram_process_rss")
|
||||
});
|
||||
|
||||
|
||||
|
||||
$('#telegram_process_rss').change(function() {
|
||||
use_collapse('telegram_process_rss');
|
||||
});
|
||||
// 스케쥴링 on / off
|
||||
$('#scheduler').change(function() {
|
||||
var ret = $(this).prop('checked');
|
||||
if (!ret) {
|
||||
$.notify('<strong>텔레그램 봇은 중단 할 수 없습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
$('#scheduler').bootstrapToggle('on')
|
||||
return
|
||||
}
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/scheduler',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {scheduler : ret},
|
||||
dataType: "json",
|
||||
success: function (list) {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
// 서버 목록
|
||||
$("body").on('click', '#test_btn', function(e){
|
||||
e.preventDefault();
|
||||
bot_token = document.getElementById("bot_token").value;
|
||||
chat_id = document.getElementById("chat_id").value;
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/test',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data:{bot_token:bot_token, chat_id:chat_id},
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret == 'success') {
|
||||
$.notify('<strong>전송 하였습니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
$.notify('<strong>전송에 실패하였습니다.<br>'+ret+'</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//설정 저장
|
||||
$("#setting_save_btn").click(function(e) {
|
||||
e.preventDefault();
|
||||
var formData = get_formdata('#setting');
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/setting_save',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: formData,
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret) {
|
||||
$.notify('<strong>설정을 저장하였습니다.</strong>', {
|
||||
type: 'success'
|
||||
});
|
||||
} else {
|
||||
$.notify('<strong>설정 저장에 실패하였습니다.</strong>', {
|
||||
type: 'warning'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("body").on('click', '#open_url1_btn', function(e){
|
||||
e.preventDefault();
|
||||
window.open("https://t.me/BotFather", "_blank");
|
||||
});
|
||||
|
||||
$("body").on('click', '#open_url2_btn', function(e){
|
||||
e.preventDefault();
|
||||
window.open("{{arg['bot_channel_url']}}", "_blank");
|
||||
});
|
||||
|
||||
$("body").on('click', '#open_url3_btn', function(e){
|
||||
e.preventDefault();
|
||||
window.open("https://t.me/sjva_admin_bot", "_blank");
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
76
lib/system/templates/system_tool_crypt.html
Normal file
76
lib/system/templates/system_tool_crypt.html
Normal file
@@ -0,0 +1,76 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<div>
|
||||
{{ macros.m_button_group([['globalSettingSaveBtn', '설정 저장']])}}
|
||||
{{ macros.m_row_start('5') }}
|
||||
{{ macros.m_row_end() }}
|
||||
<nav>
|
||||
{{ macros.m_tab_head_start() }}
|
||||
{{ macros.m_tab_head2('normal', '일반', true) }}
|
||||
|
||||
{{ macros.m_tab_head_end() }}
|
||||
</nav>
|
||||
<form id='setting' name='setting'>
|
||||
<div class="tab-content" id="nav-tabContent">
|
||||
{{ macros.m_tab_content_start('normal', true) }}
|
||||
{{ macros.setting_checkbox('tool_crypt_use_user_key', '암호화 키 본인키 사용', value=arg['tool_crypt_use_user_key'], desc=['On : 본인 키 사용', 'Off : SJVA 고정 키 사용']) }}
|
||||
<div id="tool_crypt_use_user_key_div" class="collapse">
|
||||
{{ macros.setting_input_text('tool_crypt_user_key', '암호화 키', value=arg['tool_crypt_user_key'], desc=['16진수(숫자, a~e)로 이루어진 32글자. 미만시 앞을 0으로 채움. 초과시 뒤에 무시']) }}
|
||||
</div>
|
||||
|
||||
{{ macros.setting_input_text_and_buttons('tool_crypt_encrypt_word', '암호화', [['tool_crypt_encrypt_word_btn', '암호화']], value=arg['tool_crypt_encrypt_word']) }}
|
||||
{{ macros.setting_input_text('tool_crypt_encrypt_word_result', '', disabled=True) }}
|
||||
|
||||
{{ macros.setting_input_text_and_buttons('tool_crypt_decrypt_word', '평문화', [['tool_crypt_decrypt_word_btn', '평문화']], value=arg['tool_crypt_decrypt_word']) }}
|
||||
{{ macros.setting_input_text('tool_crypt_decrypt_word_result', '', disabled=True) }}
|
||||
{{ macros.m_tab_content_end() }}
|
||||
|
||||
</div><!--tab-content-->
|
||||
</form>
|
||||
</div> <!--전체-->
|
||||
|
||||
<script type="text/javascript">
|
||||
var package_name = "{{arg['package_name'] }}";
|
||||
var sub = "{{arg['sub'] }}";
|
||||
|
||||
$(document).ready(function(){
|
||||
use_collapse("tool_crypt_use_user_key");
|
||||
});
|
||||
|
||||
$("body").on('change', '#tool_crypt_use_user_key', function(e){
|
||||
use_collapse('tool_crypt_use_user_key');
|
||||
});
|
||||
|
||||
$("body").on('click', '#tool_crypt_encrypt_word_btn', function(e) {
|
||||
e.preventDefault();
|
||||
word = document.getElementById("tool_crypt_encrypt_word").value
|
||||
crypt_test('encrypt', word);
|
||||
});
|
||||
|
||||
$("body").on('click', '#tool_crypt_decrypt_word_btn', function(e) {
|
||||
e.preventDefault();
|
||||
word = document.getElementById("tool_crypt_decrypt_word").value
|
||||
crypt_test('decrypt', word);
|
||||
});
|
||||
|
||||
function crypt_test(mode, word) {
|
||||
$.ajax({
|
||||
url: '/' + package_name + '/ajax/'+sub+'/crypt_test',
|
||||
type: "POST",
|
||||
cache: false,
|
||||
data: {mode:mode, word:word},
|
||||
dataType: "json",
|
||||
success: function (ret) {
|
||||
if (ret.ret == 'success') {
|
||||
if (mode == "encrypt")
|
||||
document.getElementById("tool_crypt_encrypt_word_result").value = ret.data;
|
||||
else
|
||||
document.getElementById("tool_crypt_decrypt_word_result").value = ret.data;
|
||||
} else {
|
||||
notify(ret.log, 'warning');
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user