# Init import os import re for i_data in os.listdir("route"): f_src = re.search(r"(.+)\.py$", i_data) if f_src: exec("from route." + f_src.group(1) + " import *") # Init-Version version_list = json.loads(open('version.json', encoding = 'utf8').read()) # Init-DB if os.path.exists(os.path.join('data', 'set.json')): db_set_list = ['db', 'db_type'] set_data = json.loads(open( os.path.join('data', 'set.json'), encoding = 'utf8' ).read()) for i in db_set_list: if not i in set_data: print('Please delete set.json') print('----') raise print('DB name : ' + set_data['db']) print('DB type : ' + set_data['db_type']) elif os.getenv('NAMU_DB') or os.getenv('NAMU_DB_TYPE'): set_data = {} if os.getenv('NAMU_DB'): set_data['db'] = os.getenv('NAMU_DB') else: set_data['db'] = 'data' if os.getenv('NAMU_DB_TYPE'): set_data['db'] = os.getenv('NAMU_DB_TYPE') else: set_data['db'] = 'sqlite' print('DB name : ' + set_data['db']) print('DB type : ' + set_data['db_type']) else: set_data = {} normal_db_type = ['sqlite', 'mysql'] print('DB type (' + normal_db_type[0] + ') [' + ', '.join(normal_db_type) + '] : ', end = '') data_get = str(input()) if data_get == '' or not data_get in normal_db_type: set_data['db_type'] = 'sqlite' else: set_data['db_type'] = data_get all_src = [] if set_data['db_type'] == 'sqlite': for i_data in os.listdir("."): f_src = re.search(r"(.+)\.db$", i_data) if f_src: all_src += [f_src.group(1)] print('DB name (data) [' + ', '.join(all_src) + '] : ', end = '') data_get = str(input()) if data_get == '': set_data['db'] = 'data' else: set_data['db'] = data_get with open(os.path.join('data', 'set.json'), 'w', encoding = 'utf8') as f: f.write(json.dumps(set_data)) data_db_set = {} data_db_set['name'] = set_data['db'] data_db_set['type'] = set_data['db_type'] if data_db_set['type'] == 'mysql': if not os.path.exists(os.path.join('data', 'mysql.json')): db_set_list = ['user', 'password', 'host', 'port'] set_data = json.loads( open( os.path.join('data', 'mysql.json'), encoding = 'utf8' ).read() ) for i in db_set_list: if not i in set_data: print('Please delete mysql.json') print('----') raise print('DB user ID : ', end = '') set_data_mysql['user'] = str(input()) print('DB password : ', end = '') set_data_mysql['password'] = str(input()) print('DB host (localhost) : ', end = '') set_data_mysql['host'] = str(input()) if set_data_mysql['host'] == '': set_data_mysql['host'] = 'localhost' print('DB port (3306) : ', end = '') set_data_mysql['port'] = str(input()) if set_data_mysql['port'] == '': set_data_mysql['port'] = '3306' with open( os.path.join('data', 'mysql.json'), 'w', encoding = 'utf8' ) as f: f.write(json.dumps(set_data_mysql)) data_db_set['mysql_user'] = set_data_mysql['user'] data_db_set['mysql_pw'] = set_data_mysql['password'] if 'host' in set_data_mysql: data_db_set['mysql_host'] = set_data_mysql['host'] else: data_db_set['mysql_host'] = 'localhost' if 'port' in set_data_mysql: data_db_set['mysql_port'] = set_data_mysql['port'] else: data_db_set['mysql_port'] = '3306' db_data_get(data_db_set['type']) conn = get_conn(data_db_set) curs = conn.cursor() # Init-Create_DB create_data = {} # 폐지 예정 (data_set으로 통합) create_data['data'] = ['title', 'data', 'type'] create_data['history'] = ['id', 'title', 'data', 'date', 'ip', 'send', 'leng', 'hide', 'type'] create_data['rc'] = ['id', 'title', 'date', 'type'] create_data['acl'] = ['title', 'data', 'type'] # 개편 예정 (data_link로 변경) create_data['back'] = ['title', 'link', 'type'] # 폐지 예정 (topic_set으로 통합) [가장 시급] create_data['rd'] = ['title', 'sub', 'code', 'date', 'band', 'stop', 'agree', 'acl'] create_data['topic'] = ['id', 'data', 'date', 'ip', 'block', 'top', 'code'] # 폐지 예정 (user_set으로 통합) create_data['rb'] = ['block', 'end', 'today', 'blocker', 'why', 'band', 'login', 'ongoing'] create_data['scan'] = ['user', 'title', 'type'] # 개편 예정 (wiki_set과 wiki_filter과 wiki_vote으로 변경) create_data['other'] = ['name', 'data', 'coverage'] create_data['html_filter'] = ['html', 'kind', 'plus', 'plus_t'] create_data['vote'] = ['name', 'id', 'subject', 'data', 'user', 'type', 'acl'] # 개편 예정 (auth_list와 auth_log로 변경) create_data['alist'] = ['name', 'acl'] create_data['re_admin'] = ['who', 'what', 'time'] # 개편 예정 (user_notice와 user_agent로 변경) create_data['alarm'] = ['name', 'data', 'date'] create_data['ua_d'] = ['name', 'ip', 'ua', 'today', 'sub'] create_data['user_set'] = ['name', 'id', 'data'] for create_table in create_data: try: curs.execute(db_change('select test from ' + create_table + ' limit 1')) except: try: curs.execute(db_change('create table ' + create_table + '(test longtext)')) except: curs.execute(db_change("alter table " + create_table + " add test longtext")) for create in create_data[create_table]: try: curs.execute(db_change( 'select ' + create + ' from ' + create_table + ' limit 1' )) except: try: curs.execute(db_change( "alter table " + create_table + " add " + create + " longtext default ''" )) except: curs.execute(db_change( "alter table " + create_table + " add " + create + " longtext" )) curs.execute(db_change('select data from other where name = "ver"')) ver_set_data = curs.fetchall() if ver_set_data: if int(version_list['beta']['c_ver']) > int(ver_set_data[0][0]): setup_tool = 'update' else: setup_tool = 'normal' else: setup_tool = 'init' if setup_tool != 'normal': if setup_tool == 'update': update(int(ver_set_data[0][0]), set_data) else: set_init() set_init_always(version_list['beta']['c_ver']) # Init-Route class EverythingConverter(werkzeug.routing.PathConverter): regex = '.*?' class RegexConverter(werkzeug.routing.BaseConverter): def __init__(self, url_map, *items): super(RegexConverter, self).__init__(url_map) self.regex = items[0] app = flask.Flask(__name__, template_folder = './') app.config['JSON_AS_ASCII'] = False app.logger.setLevel(logging.ERROR) app.jinja_env.filters['md5_replace'] = md5_replace app.jinja_env.filters['load_lang'] = load_lang app.jinja_env.filters['cut_100'] = cut_100 app.url_map.converters['everything'] = EverythingConverter app.url_map.converters['regex'] = RegexConverter curs.execute(db_change('select data from other where name = "key"')) sql_data = curs.fetchall() app.secret_key = sql_data[0][0] print('----') # Init-DB_Data server_set = {} server_set_var = { 'host' : { 'display' : 'Host', 'require' : 'conv', 'default' : '0.0.0.0' }, 'port' : { 'display' : 'Port', 'require' : 'conv', 'default' : '3000' }, 'language' : { 'display' : 'Language', 'require' : 'select', 'default' : 'ko-KR', 'list' : ['ko-KR', 'en-US'] }, 'markup' : { 'display' : 'Markup', 'require' : 'select', 'default' : 'namumark', 'list' : ['namumark', 'custom', 'raw'] }, 'encode' : { 'display' : 'Encryption method', 'require' : 'select', 'default' : 'sha3', 'list' : ['sha3', 'sha256'] } } server_set_env = { 'host' : os.getenv('NAMU_HOST'), 'port' : os.getenv('NAMU_PORT'), 'language' : os.getenv('NAMU_LANG'), 'markup' : os.getenv('NAMU_MARKUP'), 'encode' : os.getenv('NAMU_ENCRYPT') } for i in server_set_var: curs.execute(db_change('select data from other where name = ?'), [i]) server_set_val = curs.fetchall() if server_set_val: server_set_val = server_set_val[0][0] elif server_set_env[i] != None: server_set_val = server_set_env[i] else: if 'list' in server_set_var[i]: print(server_set_var[i]['display'] + ' (' + server_set_var[i]['default'] + ') [' + ', '.join(server_set_var[i]['list']) + ']' + ' : ', end = '') else: print(server_set_var[i]['display'] + ' (' + server_set_var[i]['default'] + ') : ', end = '') server_set_val = input() if server_set_val == '': server_set_val = server_set_var[i]['default'] elif server_set_var[i]['require'] == 'select': if not server_set_val in server_set_var[i]['list']: server_set_val = server_set_var[i]['default'] curs.execute(db_change('insert into other (name, data) values (?, ?)'), [i, server_set_val]) print(server_set_var[i]['display'] + ' : ' + server_set_val) server_set[i] = server_set_val print('----') # Init-DB_care if set_data['db_type'] == 'sqlite': def back_up(back_time, back_up_where): print('----') try: shutil.copyfile( set_data['db'] + '.db', back_up_where ) print('Back up : OK') except: print('Back up : Error') threading.Timer( 60 * 60 * back_time, back_up, [back_time, back_up_where] ).start() curs.execute(db_change('select data from other where name = "back_up"')) back_time = curs.fetchall() back_time = int(number_check(back_time[0][0])) if back_time else 0 if back_time != 0: curs.execute(db_change('select data from other where name = "backup_where"')) back_up_where = curs.fetchall() if back_up_where and back_up_where[0][0] != '': back_up_where = back_up_where[0][0] else: back_up_where = 'back_' + set_data['db'] + '.db' print('Back up state : ' + str(back_time) + ' hours') back_up(back_time, back_up_where) else: print('Back up state : Turn off') else: def mysql_dont_off(port): try: urllib.request.urlopen('http://localhost:' + port + '/') except: pass threading.Timer( 60 * 60 * 3, mysql_dont_off, [port] ).start() mysql_dont_off(server_set['port']) print('Now running... http://localhost:' + server_set['port']) conn.commit() conn.close() conn = get_conn() if os.path.exists('custom.py'): from custom import custom_run custom_run(conn, app) # Func # Func-inter_wiki # 개편 필요(각각 분리 예정) @app.route('/') @app.route('/') @app.route('/') @app.route('/') @app.route('/') @app.route('/') @app.route('/') @app.route('/') def inter_wiki(tools = None): return inter_wiki_2(conn, tools) @app.route('/') @app.route('/') @app.route('/') @app.route('/') @app.route('/') @app.route('/') @app.route('/') @app.route('/') def inter_wiki_del(tools = None, name = None): return inter_wiki_del_2(conn, tools, name) @app.route('/', methods = ['POST', 'GET']) @app.route('//', methods = ['POST', 'GET']) def inter_wiki_plus(tools = None, name = None): return inter_wiki_plus_2(conn, tools, name) # Func-list # /list/topic/open @app.route('/not_close_topic') def list_not_close_topic(): return list_not_close_topic_2(conn) # /list/document/old @app.route('/old_page') def list_old_page(): return list_old_page_2(conn) # /list/document/acl @app.route('/acl_list') def list_acl(): return list_acl_2(conn) # /list/document/acl/add @app.route('/acl/', methods = ['POST', 'GET']) def give_acl(name = None): return give_acl_2(conn, name) # /list/document/need @app.route('/please') def list_please(): return list_please_2(conn) # /list/document/all @app.route('/title_index') def list_title_index(): return list_title_index_2(conn) # /list/document/long @app.route('/long_page') def list_long_page(): return list_long_page_2(conn, 'long_page') # /list/document/short @app.route('/short_page') def list_short_page(): return list_long_page_2(conn, 'short_page') # /list/file @app.route('/image_file_list') def list_image_file(): return list_image_file_2(conn) # /list/admin # /list/admin/list @app.route('/admin_list') def list_admin(): return list_admin_2(conn) # /list/admin/auth_use @app.route('/admin_log', methods = ['POST', 'GET']) def list_admin_use(): return list_admin_use_2(conn) # /list/user @app.route('/user_log') def list_user(): return list_user_2(conn) # /list/user/check @app.route('/check/') def give_user_check(name = None): return give_user_check_2(conn, name) # /list/user/check/delete @app.route('/check_delete', methods = ['POST', 'GET']) def give_user_check_delete(): return give_user_check_delete_2(conn) # Func-auth # /auth/give # /auth/give/ @app.route('/admin/', methods = ['POST', 'GET']) def give_admin(name = None): return give_admin_2(conn, name) # /auth/give # /auth/give/ @app.route('/ban', methods = ['POST', 'GET']) @app.route('/ban/', methods = ['POST', 'GET']) def give_user_ban(name = None): return give_user_ban_2(conn, name) # /auth/list @app.route('/admin_group') def list_admin_group(): return list_admin_group_2(conn) # /auth/list/add/ @app.route('/admin_plus/', methods = ['POST', 'GET']) def give_admin_groups(name = None): return give_admin_groups_2(conn, name) # /auth/list/delete/ @app.route('/delete_admin_group/', methods = ['POST', 'GET']) def give_delete_admin_group(name = None): return give_delete_admin_group_2(conn, name) # /auth/history # ongoing 반영 필요 @app.route('/block_log') @app.route('/block_log//') @app.route('/block_log//') def recent_block(name = 'Test', tool = 'all'): return recent_block_2(conn, name, tool) # Func-view @app.route('/xref/') def view_xref(name = None): return view_xref_2(conn, name) @app.route('/raw/') @app.route('/thread//raw/') def view_raw(name = None, topic_num = None, num = None): return view_raw_2(conn, name, topic_num, num) @app.route('/diff/') def view_diff_data(name = None): return view_diff_data_2(conn, name) @app.route('/down/') def view_down(name = None): return view_down_2(conn, name) @app.route('/w/') def view_read(name = None): return view_read_2(conn, name) # Func-history @app.route('/recent_change') @app.route('/recent_changes') def recent_change(name = None): return recent_change_2(conn, name, '') @app.route('/record/') def recent_record(name = None): return recent_change_2(conn, name, 'record') @app.route('/history/', methods = ['POST', 'GET']) def recent_history(name = None): return recent_change_2(conn, name, 'history') @app.route('/history/tool//') def recent_history_tool(name = 'Test', rev = 1): return recent_history_tool_2(conn, name, rev) @app.route('/history/delete//', methods = ['POST', 'GET']) def recent_history_delete(name = 'Test', rev = 1): return recent_history_delete_2(conn, name, rev) @app.route('/history/hidden//') def recent_history_hidden(name = 'Test', rev = 1): return recent_history_hidden_2(conn, name, rev) @app.route('/history/send//', methods = ['POST', 'GET']) def recent_history_send(name = 'Test', rev = 1): return recent_history_send_2(conn, name, rev) @app.route('/history/reset/', methods = ['POST', 'GET']) def recent_history_reset(name = 'Test'): return recent_history_reset_2(conn, name) @app.route('/history/add/', methods = ['POST', 'GET']) def recent_history_add(name = 'Test'): return recent_history_add_2(conn, name) @app.route('/record/reset/', methods = ['POST', 'GET']) def recent_record_reset(name = 'Test'): return recent_record_reset_2(conn, name) @app.route('/record/topic/') def recent_record_topic(name = 'Test'): return recent_record_topic_2(conn, name) # 거처를 고심중 @app.route('/app_submit', methods = ['POST', 'GET']) def recent_app_submit(): return recent_app_submit_2(conn) # Func-search @app.route('/search', methods=['POST']) def search(): return search_2(conn) @app.route('/goto', methods=['POST']) @app.route('/goto/', methods=['POST']) def search_goto(name = 'test'): return search_goto_2(conn, name) @app.route('/search/') def search_deep(name = 'test'): return search_deep_2(conn, name) # Func-edit @app.route('/revert/', methods = ['POST', 'GET']) def edit_revert(name = None): return edit_revert_2(conn, name) @app.route('/edit/', methods = ['POST', 'GET']) def edit(name = 'Test'): return edit_2(conn, name) @app.route('/backlink_reset/') def edit_backlink_reset(name = 'Test'): return edit_backlink_reset_2(conn, name) @app.route('/delete/', methods = ['POST', 'GET']) def edit_delete(name = None): return edit_delete_2(conn, name) # 개편 예정 @app.route('/many_delete', methods = ['POST', 'GET']) def edit_delete_many(): return edit_delete_many_2(conn) @app.route('/move/', methods = ['POST', 'GET']) def edit_move(name = None): return edit_move_2(conn, name) # Func-topic @app.route('/recent_discuss') def recent_discuss(): return recent_discuss_2(conn) @app.route('/thread//b/') def topic_block(topic_num = 1, num = 1): return topic_block_2(conn, topic_num, num) @app.route('/thread//notice/') def topic_top(topic_num = 1, num = 1): return topic_top_2(conn, topic_num, num) @app.route('/thread//setting', methods = ['POST', 'GET']) def topic_stop(topic_num = 1): return topic_stop_2(conn, topic_num) @app.route('/thread//acl', methods = ['POST', 'GET']) def topic_acl(topic_num = 1): return topic_acl_2(conn, topic_num) @app.route('/thread//delete', methods = ['POST', 'GET']) def topic_delete(topic_num = 1): return topic_delete_2(conn, topic_num) @app.route('/thread//tool') def topic_tool(topic_num = 1): return topic_tool_2(conn, topic_num) @app.route('/thread//change', methods = ['POST', 'GET']) def topic_change(topic_num = 1): return topic_change_2(conn, topic_num) @app.route('/thread//admin/') def topic_admin(topic_num = 1, num = 1): return topic_admin_2(conn, topic_num, num) @app.route('/thread/', methods = ['POST', 'GET']) def topic(topic_num = 1): return topic_2(conn, topic_num) @app.route('/topic/', methods = ['POST', 'GET']) def topic_close_list(name = 'test'): return topic_close_list_2(conn, name) # Func-user @app.route('/tool/') def user_tool(name = None): return user_tool_2(conn, name) @app.route('/change', methods = ['POST', 'GET']) def user_setting(): return user_setting_2(conn, server_set_var) @app.route('/change/email', methods = ['POST', 'GET']) def user_setting_email(): return user_setting_email_2(conn) @app.route('/change/email/check', methods = ['POST', 'GET']) def user_setting_email_check(): return user_setting_email_check_2(conn) @app.route('/change/pw', methods = ['POST', 'GET']) def user_setting_pw_change(): return user_setting_pw_change_2(conn) @app.route('/user') def user_info(): return user_info_2(conn) @app.route('/custom_head', methods=['GET', 'POST']) def user_custom_head_view(): return user_custom_head_view_2(conn) @app.route('/count') @app.route('/count/') def user_count_edit(name = None): return user_count_edit_2(conn, name) @app.route('/alarm') def user_alarm(): return user_alarm_2(conn) @app.route('/alarm/delete') def user_alarm_del(): return user_alarm_del_2(conn) @app.route('/watch_list') def user_watch_list(): return user_watch_list_2(conn, 'watch_list') @app.route('/watch_list/') def user_watch_list_name(name = 'Test'): return user_watch_list_name_2(conn, 'watch_list', name) @app.route('/star_doc') def user_star_doc(): return user_watch_list_2(conn, 'star_doc') @app.route('/star_doc/') def user_star_doc_name(name = 'Test'): return user_watch_list_name_2(conn, 'star_doc', name) # Func-login # 개편 예정 # login -> login/2fa -> login/2fa/email with login_id # register -> register/email -> regiter/email/check with reg_id # pass_find -> passfind/email with find_id @app.route('/login', methods = ['POST', 'GET']) def login_login(): return login_login_2(conn) @app.route('/login/2fa', methods = ['POST', 'GET']) def login_login_2fa(): return login_login_2fa_2(conn) ''' @app.route('/login/2fa/email', methods = ['POST', 'GET']) def login_2fa_email(): return login_login_2fa_email_2(conn) ''' @app.route('/register', methods = ['POST', 'GET']) def login_register(): return login_register_2(conn) @app.route('/register/email', methods = ['POST', 'GET']) def login_register_email(): return login_register_email_2(conn) @app.route('/register/email/check', methods = ['POST', 'GET']) def login_register_email_check(): return login_register_email_check_2(conn) @app.route('/register/submit', methods = ['POST', 'GET']) def login_register_submit(): return login_register_submit_2(conn) @app.route('/', methods = ['POST', 'GET']) @app.route('/', methods = ['POST', 'GET']) def login_need_email(tool = 'pass_find'): return login_need_email_2(conn, tool) @app.route('/', methods = ['POST', 'GET']) @app.route('/', methods = ['POST', 'GET']) def login_check_key(tool = 'check_pass_key'): return login_check_key_2(conn, tool) @app.route('/logout') def login_logout(): return login_logout_2(conn) # Func-vote @app.route('/vote/', methods = ['POST', 'GET']) def vote_select(num = 1): return vote_select_2(conn, str(num)) @app.route('/vote/end/') def vote_end(num = 1): return vote_end_2(conn, str(num)) @app.route('/vote/close/') def vote_close(num = 1): return vote_close_2(conn, str(num)) @app.route('/vote') @app.route('/vote/list') @app.route('/vote/list/') def vote_list(num = 1): return vote_list_2(conn, 'normal', num) @app.route('/vote/list/close') @app.route('/vote/list/close/') def vote_list_close(num = 1): return vote_list_2(conn, 'close', num) @app.route('/vote/add', methods = ['POST', 'GET']) def vote_add(): return vote_add_2(conn) # Func-api @app.route('/api/w/', methods = ['POST', 'GET']) def api_w(name = ''): return api_w_2(conn, name) @app.route('/api/raw/') def api_raw(name = ''): return api_raw_2(conn, name) @app.route('/api/version') def api_version(): return api_version_2( conn, version_list['beta']['r_ver'], version_list['beta']['c_ver'] ) @app.route('/api/skin_info') @app.route('/api/skin_info/') def api_skin_info(name = ''): return api_skin_info_2(conn, name) @app.route('/api/markup') def api_markup(): return api_markup_2(conn) @app.route('/api/user_info/') def api_user_info(name = ''): return api_user_info_2(conn, name) @app.route('/api/thread/') def api_topic_sub(name = '', topic_num = 1): return api_topic_sub_2(conn, topic_num) @app.route('/api/search/') def api_search(name = ''): return api_search_2(conn, name) @app.route('/api/recent_changes') def api_recent_change(): return api_recent_change_2(conn) @app.route('/api/sha224/', methods = ['POST', 'GET']) def api_sha224(name = 'test'): return api_sha224_2(conn, name) @app.route('/api/title_index') def api_title_index(): return api_title_index_2(conn) @app.route('/api/image/', methods = ['POST', 'GET']) def api_image_view(name = ''): return api_image_view_2(conn, name) @app.route('/api/sitemap.xml') def api_sitemap(): return api_sitemap_2(conn) # Func-main # 여기도 전반적인 조정 시행 예정 @app.route('/restart', methods = ['POST', 'GET']) def main_restart(): return main_restart_2(conn) @app.route('/update', methods=['GET', 'POST']) def main_update(): return main_update_2(conn, version_list['beta']['r_ver']) @app.route('/random') def main_title_random(): return main_title_random_2(conn) @app.route('/upload', methods=['GET', 'POST']) def main_upload(): return main_upload_2(conn) @app.route('/setting') @app.route('/setting/', methods = ['POST', 'GET']) def setting(num = 0): return main_setting_2(conn, num, set_data['db_type']) @app.route('/other') def main_other(): return main_other_2(conn) @app.route('/manager', methods = ['POST', 'GET']) @app.route('/manager/', methods = ['POST', 'GET']) def main_manager(num = 1): return main_manager_2( conn, num, version_list['beta']['r_ver'] ) @app.route('/image/') def main_image_view(name = None): return main_image_view_2(conn, name) @app.route('/skin_set') @app.route('/main_skin_set') def main_skin_set(): return main_skin_set_2(conn) @app.route('/views/') def main_views(name = None): return main_views_2(conn, name) @app.route('/test_func') def main_test_func(): return main_test_func_2(conn) @app.route('/shutdown', methods = ['POST', 'GET']) def main_shutdown(): return main_shutdown_2(conn) @app.route('/easter_egg.xml') def main_easter_egg(): return main_easter_egg_2(conn) @app.route('/') def main_file(data = ''): return main_file_2(conn, data) @app.errorhandler(404) def main_error_404(e): return main_error_404_2(conn) if __name__ == "__main__": WSGIServer(( server_set['host'], int(server_set['port']) ), app, log = app.logger).serve_forever()