# encoding: utf-8 class Admin::RegisteredSitesController < OrbitAdminController before_action ->(module_app = @app_title) { set_variables module_app } def index @registeredsites = RegisteredSite.all.order_by(sort) .with_categories(filters("category")) .with_tags(filters("tag")).desc(:created_at) @table_fields = table_fields @tags = @module_app.tags @categories = @module_app.categories.enabled @filter_fields = filter_fields_without_status(@categories, @tags) @registeredsites = search_data(@registeredsites,[:title,:site_domain]).page(params[:page]).per(10) if request.xhr? render :partial => "index" end end def get_watch_list site_annc = SiteAnnc.find(params['data']) lists = site_annc.watch_list.group_by{|v| v[0]}.map{|k,v| [k,v.collect{|v1| v1[1]}]} res = lists.collect do |v| site = RegisteredSite.find(v[0]) rescue nil par1 = site.nil? ? ['not found',''] : [site.show_name,site.site_domain] par2 = v[1].join(', ') [par1,par2] end render :json => res end def show end def announcement @site_anncs = SiteAnnc.all.desc(:craete_at).page(params[:page]).per(10) end def edit_annc @site_annc = SiteAnnc.find(params['site_annc_id']) rescue SiteAnnc.new end def update_annc site_annc = SiteAnnc.find(params['site_annc_id']) rescue SiteAnnc.create site_annc.update_attributes(title: params['title'], see_more_link: params['see_more_link'], content: params['content'], recieve_sites: params['recieve_sites'], visible: params['visible']=='true', send_all: params['send_all']=='true') redirect_to '/admin/registered_sites/announcement' end def get_select_box tags = @module_app.tags.map{|v| v} categories = @module_app.categories.enabled.map{|v| v} sites = RegisteredSite.all.collect{|v1| [v1,v1.tags,v1.category]} @sites_order_by_tags = tags.map{|v| {v=>sites.select{|v1| v1[1].include? v}.map{|v2| v2[0]}}} @sites_order_by_tags << {'no_tag'=>sites.select{|v1| v1[1]== []}.map{|v2| v2[0]}} @sites_order_by_cats = categories.map{|v| {v=>sites.select{|v1| v1[2]== v}.map{|v2| v2[0]}}} @sites_order_by_cats << {'no_category'=>sites.select{|v1| v1[2].nil?}.map{|v2| v2[0]}} end def delete_annc site_annc = SiteAnnc.find(params['site_annc_id']) rescue nil if !site_annc.nil? site_annc.destroy end redirect_to '/admin/registered_sites/announcement' end def update_status(site) tp1 = site.site_statuses.first tp1 = site.site_statuses.create if tp1.nil? if site.site_domain.to_s.blank? urls = nil else urls = site.self_test end if urls.nil? tp1.status = 'domain is blank' tp1.can_login = false elsif urls == [nil,nil] tp1.status = 'domain not found' tp1.href = 'http://'+site.site_domain tp1.can_login = false elsif !urls[0].to_s.empty? || !urls[1].to_s.empty? tp1.status = 'ok' if !urls[0].empty? root_url = urls[0] else root_url = urls[1] end tp1.href = root_url uri = URI(root_url) Net::HTTP.start(uri.host, uri.port,:use_ssl => uri.scheme == 'https',open_timeout: 30,read_timeout: 30,verify_mode: OpenSSL::SSL::VERIFY_NONE) do |http| r3 = login_reomote(http,root_url) if r3.code != '200' tp1.can_login = true else tp1.can_login = false end r4 = get_website(uri,http,r3) uri2 = URI ("#{root_url}/admin/playground") r5 = get_website(uri2,http,r4) if r5.code.to_s == '200' uri3 = URI ("#{root_url}/admin/playground/command") doc = Nokogiri::HTML(r5.body) rescue nil csrf_data = doc.search("meta[name='csrf-token']")[0].attributes['content'].value rescue nil r6 = post_website(uri3,http,r5,{'command' => "ip addr | grep \"inet \" | grep -v 127.0.0.1 | awk '{print $2}'| xargs | awk '{print $1}'"},csrf_data) res = JSON.parse(r6.body) rescue '' if (res == {"success"=>true} || r6.code.to_s != '200') uri4 = URI ("#{root_url}/admin/playground/console_output") count = 0 while count < 5 r7 = get_website(uri4,http,r6,{'count' => '0'},csrf_data) if (r7.code.to_s == '200' rescue false) r6 = r7 response = JSON.parse(r6.body)['response'] rescue nil end if Array(response).count != 0 real_ip = Array(response)[0].to_s.split(/\//)[0].scan(/\d+.\d+.\d+.\d+/)[0] tp1.status = tp1.status + " ,ip: #{real_ip}" if !real_ip.to_s.empty? site.real_ip = real_ip site.save end break end count = count + 1 sleep 1 end end end end else tp1.href = 'http://'+site.site_domain tp1.status = 'bad gateway' tp1.can_login = false end tp1.save! end def get_check_log tp = CheckSiteTemp.first tp_all_ids = tp.all_ids count = tp_all_ids.index(params['data']) count = count.nil? ? 0 : (count+1) all_ids = tp_all_ids[count..-1] item = RegisteredSite.find(all_ids).collect do |v| site_status = v.site_statuses.first site_name = v.title.nil? ? v.site_domain : v.title { id: v.id.to_s, can_login: site_status.can_login, href: site_status.href, site_name: site_name, status: site_status.status} end render :json =>{status: tp.status,item:item,now_id:params['data']}.to_json end def check_site site = RegisteredSite.find(params['item_id']) update_status(site) render :text => "ip: #{site.real_ip}" end def check_all_site tp = CheckSiteTemp.first tp = CheckSiteTemp.create() if tp.nil? tp.all_ids = [] tp.status = 'running' tp.save Thread.new do count = RegisteredSite.where(:is_hidden.ne=>true).count batch_l = (count/50.0).ceil (1..batch_l).each do |v| sites = RegisteredSite.where(:is_hidden.ne=>true).sort_by{|v| v.id}[(v-1)*50..(v*50)] sites.each do |site| begin update_status(site) system('sleep 0.5') tp.all_ids << site.id.to_s tp.save rescue => e puts e.inspect end end end tp.status = 'finish' tp.save end render :text => '' end def request_website(type,uri,http,pre_req,data,csrf_data) req = (type =='get' ? Net::HTTP::Get.new(uri) : Net::HTTP::Post.new(uri)) req.set_form_data(data) req['Cookie'] = pre_req['set-cookie'].to_s.gsub(' path=/; HttpOnly','') rescue '' req['X-CSRF-Token'] = csrf_data req['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36' http.request req end def get_website(uri,http,pre_req=nil,data={},csrf_data=nil) request_website('get',uri,http,pre_req,data,csrf_data) end def post_website(uri,http,pre_req=nil,data={},csrf_data=nil) request_website('post',uri,http,pre_req,data,csrf_data) end def login_reomote(http,root_url) uri = URI(root_url) r1 = get_website(uri,http) r2 = get_website(uri,http,r1) doc = Nokogiri::HTML(r2.body) checkvalue = doc.css('.login-body').css('input[name=authenticity_token]')[0].attr('value') rescue nil if checkvalue.nil? puts [root_url,r2,doc.css('.login-body').css('input[name=authenticity_token]')] end uri1 = URI("#{root_url}/sessions") data = {'authenticity_token' => checkvalue,'user_name' => 'rulingcom', 'password' =>'orbit_is_great_1','referer_url'=>root_url} r3 = post_website(uri1,http,r2,data) end def bundle_update_remote(site) root_url,log = site.fetch_web_url_and_log tp = BundleUpdateTemp.first tp.now_id = site.id.to_s tp.save timeout_flag = false sel_flag = false not_login_flag = false not_accept_flag = false timeout_count = 0 if !root_url.nil? uri = URI(root_url) puts 'starting' begin Net::HTTP.start(uri.host, uri.port,:use_ssl => uri.scheme == 'https',open_timeout: 30,read_timeout: 30,verify_mode: OpenSSL::SSL::VERIFY_NONE) do |http| r3 = login_reomote(http,root_url) r4 = get_website(uri,http,r3) uri2 = URI ("#{root_url}/admin/playground") r5 = get_website(uri2,http,r4) if r5.code.to_s != '200' not_login_flag = true end if !not_login_flag not_accept_flag = true uri3 = URI ("#{root_url}/admin/playground/command") doc = Nokogiri::HTML(r5.body) rescue nil csrf_data = doc.search("meta[name='csrf-token']")[0].attributes['content'].value rescue nil r6 = post_website(uri3,http,r5,{'command' => 'bundle'},csrf_data) count = 0 flag = false res = JSON.parse(r6.body) rescue '' if (res == {"success"=>true} || r6.code.to_s != '200') not_accept_flag = false last_length = 0 while 1 uri4 = URI ("#{root_url}/admin/playground/console_output") r7 = get_website(uri4,http,r6,{'count' => '0'},csrf_data) message = log.message timeout_count = timeout_count + 1 if timeout_count > 30 timeout_flag = true end if (r7.code.to_s == '200' rescue false) r6 = r7 response = JSON.parse(r6.body)['response'] rescue nil last_message = nil else response = '' message << "code:#{r7.code.to_s}" last_message = "code:#{r7.code.to_s}" if flag count = count + 1 end end array_res = Array(response).clone res = array_res[-1] if !res.blank? flag = true end if array_res.length > last_length message << array_res[last_length..-1] elsif array_res.length < last_length message << array_res end message = message.flatten 1 if res.blank? && flag message << res.inspect count = count + 1 elsif res.blank? count = count + 0.3 else count = 0 last_message = last_message || res if last_message != log.last_message timeout_count = 0 end end last_length = array_res.length log.message = message log.last_message = last_message log.save! if message.length >= 5 message[-5..-1].each do |v| if v.to_s.downcase.scan(/bundle.*update|run `bundle clean --force`|bundle.*complete!/).length>0 || v.to_s=='finish' sel_flag = true end end end if count>30 timeout_flag = true end if sel_flag || timeout_flag break end system('sleep 1') end else log.status = 'failed' log.message << r6.body rescue 'no response' log.last_message = r6.body rescue 'no response' log.save end end #r6 = post_website(uri3,http,r6,{'command' => 'restart_server'},csrf_data) #if (JSON.parse(r6.body) == {"success"=>true} rescue false) # log.last_message += "
restart success" #else # log.last_message += "
restart failed" #end #log.message[-1] = log.last_message #log.save! end rescue => e timeout_flag = true puts e end if not_accept_flag || not_login_flag log.status = 'failed' log.last_message = "can't login to admin" elsif !timeout_flag system('sleep 5') if sel_flag || site.is_alive? log.status = 'finish' else log.status = 'failed' end else system('sleep 10') if site.is_alive? log.status = 'finish' else log.status = 'failed' #update_flags = UpdateFlags.first #update_flags.bundle_update_flag = false #update_flags.save! end end log.last_time = Time.now log.save! end end def stop_bundle_update update_flags = UpdateFlags.first update_flags.bundle_update_flag = false update_flags.save render :text => '' end def get_detail site = RegisteredSite.find(params['item_id']) rescue nil message = '' if !site.nil? message = site.bundle_update_logs.first.message.join('
') rescue '' end render :text => message end def destroy_bundle_temp render :text => (BundleUpdateTemp.first.destroy.inspect rescue '') end def bundle_update update_flags = UpdateFlags.first.nil? ? UpdateFlags.new() : UpdateFlags.first update_flags.bundle_update_flag = true update_flags.save if BundleUpdateTemp.first.nil? if params['item_ids'][0] == 'all' item_ids = RegisteredSite.all.collect(&:id).map{|v| v.to_s}.reverse else item_ids = params['item_ids'] end BundleUpdateTemp.create(all_ids: item_ids,now_id: nil) Thread.new do clone_item_ids = item_ids.clone clone_item_ids.each do |site_id| if !UpdateFlags.first.bundle_update_flag tp = BundleUpdateTemp.first tp.now_id = 'terminated' tp.save Thread.current.terminate! end site = RegisteredSite.find(site_id) rescue nil if !site.nil? && (site.site_statuses.first.can_login rescue true) bundle_update_remote(site) system('sleep 5') elsif !site.nil? if site.bundle_update_logs.first.nil? log = site.bundle_update_logs.create() else log = site.bundle_update_logs.first end log.status = 'failed' log.last_message = "can't login" log.save end end tp = BundleUpdateTemp.first tp.now_id = 'finish' tp.save end render :json => {status: 'success'} elsif BundleUpdateTemp.first.all_ids == params['item_ids'] render :json => {status: 'success'} else render :json => {status: 'failed'} end end def get_message tp = BundleUpdateTemp.first.now_id if tp.nil? render :json => {status: 'initializing'} elsif tp=='terminated' BundleUpdateTemp.first.destroy render :json => {status: tp} else site_id = (tp=='finish' ? BundleUpdateTemp.first.all_ids.last : tp) if tp=='finish' BundleUpdateTemp.first.destroy end site = RegisteredSite.find(site_id) rescue nil if !site.nil? status = tp=='finish' ? 'finish' : 'running' log = site.bundle_update_logs.first render :json => {status: status, item: {item_id: site_id, status: log.status, last_time: log.last_time, last_message: log.last_message}} else render :json => {status: 'not found', item: {item_id: site_id, status: 'not found', last_time: 'not found', last_message: 'not found'}} end end end def bundle_update_remote_show @registeredsites = RegisteredSite.all.order_by(sort) .with_categories(filters("category")) .with_tags(filters("tag")).desc(:created_at) @table_fields = table_fields_for_bundle_update @tags = @module_app.tags @categories = @module_app.categories.enabled @filter_fields = filter_fields_without_status(@categories, @tags) @registeredsites = search_data(@registeredsites,[:title,:site_domain]).page(params[:page]).per(RegisteredSite.all.count)#.per(10) if request.xhr? render :partial => "bundle_update_remote_show" end end def edit @registered_site = RegisteredSite.find(params[:id]) if can_edit_or_delete?(@registered_site) else render_401 end end def progress end def update uid = params[:id].split('-').last registered_site = RegisteredSite.find_by(:uid => uid) registered_site.update_attributes(registered_site_params) registered_site.save redirect_to params['referer_url'] end def change_access_status if !request.xhr? redirect_to admin_registered_sites_path(:page => params[:page], :keywords => params[:keywords]) return end status = params[:status] site = RegisteredSite.find_by(:uid => params[:uid]) case status when "revoke" site.access_granted = false site.save when "grant" site.access_granted = true site.save end @table_fields = table_fields @registeredsites = RegisteredSite.all.order_by(sort) .with_categories(filters("category")) .with_tags(filters("tag")).desc(:created_at) @registeredsites = search_data(@registeredsites,[:title,:site_domain]).page(params[:page]).per(10) # render :partial => "index" end def destroy registeredsite = RegisteredSite.find(params[:id]) rescue nil if !registeredsite.nil? registeredsite.destroy end @table_fields = table_fields @registeredsites = RegisteredSite.all.order_by(sort) .with_categories(filters("category")) .with_tags(filters("tag")).desc(:created_at) @registeredsites = search_data(@registeredsites,[:title,:site_domain]).page(params[:page]).per(10) end private def table_fields [:domain, :admin_email, :status, :category, :tags, :permission] end def table_fields_for_bundle_update [:domain, 'registered_sites.bundle_update', 'registered_sites.bundle_update_status', :category, 'registered_sites.last_message'] end def registered_site_params params.require(:registered_site).permit! end end