@Qc@s)ddlZddlZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z ddl m Z mZmZddlmZmZmZmZddlmZmZmZddlmZmZddlZddlZddlZddlm Z m!Z!m"Z"m#Z#m$Z$m%Z%ej&j'e(Z)d Z*d Z+d e,fd YZ-d e,fdYZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6de3fde4fde5fde6fgZ7dZ8dZ9e:dZ;dZ<de,fd YZ=d!Z>e?d"kr%d#Z@eAd$d#d%d&e:k rd'Ge@Gd(GHn d'Ge@Gd)GHe@d&7Z@eAd%d&d%d&e:krd'Ge@Gd(GHn d'Ge@Gd)GHe@d&7Z@ddlBZBeBjBd*ZCeAd%d&eCd&e:kr#d'Ge@Gd(GHn d'Ge@Gd)GHe@d&7Z@eAd+d&eCd&d#krfd'Ge@Gd(GHn d'Ge@Gd)GHe@d&7Z@eAd,d&eCd&d&krd'Ge@Gd(GHn d'Ge@Gd)GHe@d&7Z@eAd-d#e:ZDeDd&d#koeDd#jEd.d/kr d'Ge@Gd(GHn d'Ge@Gd)GHe@d&7Z@ndS(0iN(tserver_version_str2tuple(tSSHDownException(tMySQLConnectiont MySQLErrort QueryError(tOperationCancelledErrortUserstPermissionDeniedErrortInvalidPasswordError(tPasswordHandlertServerControlShelltServerControlWMI(tServerManagementHelpertSSH(tlog_infot log_errort log_warningt log_debugt log_debug2t log_debug3iit EventManagercBsDeZdddgZdZdZdZdZdZRS(tserver_started_eventtserver_stopped_eventtshutdown_eventcCsi|_t|_g|_dS(N(teventstFalsetdefertdeferred_events(tself((s..\modules\wb_admin_control.pyt__init__7s  cCs|d7}t||rd}||jkr>|j|}ng}||j|<|j|ttd|jjd|dn3dG|jGdG|GHtt|jjd|ddS(Nt_eventsAdded s for event s sError! s does not have methods does not have method ( thasattrtNoneRtappendRt _this_filet __class__t__name__R(Rt event_namethandlert handlers_list((s..\modules\wb_admin_control.pytadd_event_handler<s   &cCs t|_dS(N(tTrueR(R((s..\modules\wb_admin_control.pyt defer_eventsMscCs7t|_x|jD]}|j|qWg|_dS(N(RRRtevent(Rtev_name((s..\modules\wb_admin_control.pytcontinue_eventsPs cCs|jr|jj|dS|d7}||jkrWdG|GHttd|dn||jkrttd|ddxv|j|D]K}t||rttd|d|j j dt ||qqWnttd |dddS( NRsEventManager: invalid eventsEventManager: invalid event: s s Found event s in listsPassing event s to s"Found valid but unrequested event ( RRR!t valid_eventsRR"RRRR#R$tgetattr(Rtnametobj((s..\modules\wb_admin_control.pyR+Vs   #(R$t __module__R.RR(R*R-R+(((s..\modules\wb_admin_control.pyR4s     tSQLQueryExecutorcBsAeZdZdZdZdZdZdZdZ RS(cCs7ttdt|dtj|_||_dS(Ns'Constructing SQL query runner, dbconn (s) (RR"treprt threadingtLocktmtxtdbconn(RR8((s..\modules\wb_admin_control.pyRnscCs|jdk o|jjS(N(R8R t is_connected(R((s..\modules\wb_admin_control.pyR9sscCsW|jrJ|jjz|jr5|jjnWd|jjXnd|_dS(N(R9R7tacquireR8t disconnecttreleaseR (R((s..\modules\wb_admin_control.pytclosevs   cCs^d}|jjz6|jrHttd||jj|}nWd|jjX|S(NsExecuting query %s ( R R7R:R9RR"R8t executeQueryR<(Rtquerytresult((s..\modules\wb_admin_control.pyt exec_querys  cCs^d}|jjz6|jrHttd||jj|}nWd|jjX|S(NsExecuting query %s ( R R7R:R9RR"R8texecuteR<(RR?R@((s..\modules\wb_admin_control.pyRBs  N( R$R2R R8R7RR9R=RARB(((s..\modules\wb_admin_control.pyR3js   cCs|}yt|jd}t|}|dkrR|dkr||:}qnK|dkrk||9}n2|dkr||7}n|dkr||8}nWntk r}|}nXt|dfS(Ns ,.:t/it*t+t-(tfloattstript ValueErrortstr(tlinenrtlinetoptvaluetfvte((s..\modules\wb_admin_control.pyt wba_arithms          c Csg|j|D]}t|dkr|^q}d}t|}x@|D]8}| |kok|knrM||||7}qMqMW|j|ddfS(Nitt,(tsplittlenRH( RKRLtseptnrsttokenttokenstouttltnr((s..\modules\wb_admin_control.pyt wba_tokens4  cCs||kr|dfSdS(NiRRi(RRi((RKRLtpattern((s..\modules\wb_admin_control.pyt wba_filters  cCs||kr|dfSdS(NiRRi(RRi((RKRLtexpected_linenr((s..\modules\wb_admin_control.pytwba_lines  cCsd}|djdjd}yUg|dD]}t|^q0}t|djdjdt|ff}Wn;tk r}dG|Gd GHttd |d d}nX|S( Ni s | ()RSiit t'sWrong filter format: sR. Required format is wba_token('pattern_symbol', # of token, optional # of tokens)s&parse_wba_token: Wrong filter format: sS. Required format is wba_token('pattern_symbol', # of token, optional # of tokens) ( R RHRTtintR]ttupleRIRR"(ttexttftptxtargsRP((s..\modules\wb_admin_control.pytparse_wba_tokens#2  cCsEd}t|dkrA|jddd }t|ff}n|S(Ni s | i(R RURHR_(RfRgRh((s..\modules\wb_admin_control.pytparse_wba_filters cCsd}yAt|dkrFt|djd}t|ff}nWnItk r}t|GdG|GHttdt||fd}nX|S(Nis | ()s in filter line s;parse_wba_line: Exception caught: "%s" in filter line "%s" ( R RURdRHRaRIRJRR"(RfRgRhRP((s..\modules\wb_admin_control.pytparse_wba_lines cCsMd}t|dkrI|djdjd}tt|f}n|S(Ni s | ()RS(R RURHRTRQRe(RfRgRh((s..\modules\wb_admin_control.pytparse_wba_arithms R]R_RaRQc Cs g}|}t}|dkr(||fSx|st}|jd}|dkr||jd}xqtD]i\}}|j|dkrl||} | dk r|jd| t}Pq|}g}t}PqlqlW|r|| }qt}q+t}q+W||fS(Nt|is |(RR trfindRHtfilter_parserstfindtinsertR)( tscripttfiltersRftleavetfilter_was_parsedtidxt raw_filterR^tparsert parsed_filter((s..\modules\wb_admin_control.pyt build_filterss4         cCsdS(N((Ri((s..\modules\wb_admin_control.pyt empty_dbgsc Cs|dkrt}n|dkr%dSd}d}|jd}xS|D]K}d}g}||djdt|ddxt|D]\} } | jd} | } |d| | |d\} } |dt| d| d | d t| dt| dkr&|j| n| dkrd}qqW|}|dkrZ|}n|dkro|}n||djd t|d qGW|d x?|D]7} t| dkr|| d7}|| dqqW|dt|d||fS(NiRRs iRbs s s 's' -> 's'. cur_code = s exec code = s ------------- sFiltered text: sFilters execution code = s =================== (Ni( R R}RTR$RJt enumerateRHRUR!( traw_textRutdbgRZtcodetlinesRgtfilter_status_codet new_linestiRLt orig_linetcur_code((s..\modules\wb_admin_control.pyt apply_filters!sB    ' 6      '  cCstj||ttdS(N(twb_admin_utilstrun_filter_debuggerR|R(t loginInfot serverInfo((s..\modules\wb_admin_control.pyRLstWbAdminControlcBsOeZdZdZdZdZdZdZe dZ dZ dZ dZ dedZdZdZd Zd Zd Zd Zd ZdZdZdZdZdZdZdZdZdZe dZ e dZ!dZ"ddZ#dZ$dZ%dZ&e'j(eddZ)RS( tunknowncCsd|_t|_|j||_d|_tjd|_||_ t ||_ t |_ t|_|jd||jd|i|_tj||_dS(Nitserver_startedtserver_stopped(R tserver_controlRRR*tserver_profiletserver_control_output_handlertQueuet task_queuet sql_enabledR tpassword_handlertsettserver_active_pluginsR)trunningtadd_me_for_eventt server_statust wb_variablest WBAVariablestvariables_pool(RRt connect_sql((s..\modules\wb_admin_control.pyR\s         cCs|jS(N(R(R((s..\modules\wb_admin_control.pytget_variables_poolwscCsN|jjryt|j|j|_Wqtk r}d|_|js[tdqtj j dddddtj krtdqqt k r }d|_|jrtj j dddddtj kr tdq qtj j dd d ddqXn d|_t |j|j|_|jr_|jjj|jj|j_n|jjswd|_n|jjrt|j|j|j|_|jjttn{|jjs|jjrt|j|j|j|_|jjttn/ttd |jj|jjftd x|jrIy|jPWq5t k rE}|j!t"krtj j#d |j$d|ddd}|tj krq5qB|tj%krtdqBt&|_qF|j!t'krddl(}|j)j*j+|jj,sBtdqBqFt&|_|jjsFtdqFq5Xq5WdS(NsSSH connection cancelleds[Would you like to continue with a database connection only? Some features will be disabled.tContinuetCancelRRsSSH connection failedsuCheck if the SSH server is up on the remote side. You may continue anyway, but some functionality will be unavailablesCould not connect to SSH servers1Check if the SSH server is up on the remote side.tOKsfUnknown management method selected. Server Profile is possibly inconsistent uses_ssh: %i uses_wmi: %i sKUnknown management method selected. Server Profile is possibly inconsistents'Could not connect to MySQL Server at %sstCould not connect to MySQL server: %s Click Continue to proceed without functionality that requires a DB connection.tRetrysConnection cancelledisGCould not connect to MySQL Server and no management method is available(-Rtuses_sshR RtsshRR Rtmformst Utilitiest show_warningtResultOkRR t server_helpertshelltexpand_path_variablestconfig_file_pathtexpanded_config_file_patht admin_enabledRtuses_wmiR tset_filter_functionsR|Rtis_localR RR"t ExceptionRRRtMYSQL_ERR_ACCESS_DENIEDt show_errortlocationt ResultCancelRtMYSQL_ERR_PASSWORD_EXPIREDtgrttmodulestWbAdminthandleExpiredPasswordtdb_connection_params(RRPterrtrR((s..\modules\wb_admin_control.pytinitzsp          $          cCs@|jjdt|_|j|jr<|jjndS(Ntshutdown(RR+RRtdisconnect_sqlRR=(R((s..\modules\wb_admin_control.pyRs    ic Csd}t}|js$t}t}n|stj}|jjj}|dk r|jj |tdf\}}||dkr|rd}t}qqn|r|jj d|}n|S(NRiiRtverbose( R)RRttimeRRthostIdentifierR Rtgett get_status( RRtforce_process_checktrettuse_process_checkttstconnidtstatuststime((s..\modules\wb_admin_control.pytis_server_runnings     !cGs|jj||fdS(N(Rtput(RttaskRj((s..\modules\wb_admin_control.pytuitaskscCsFx?|jjsA|jj\}}|||jjqWdS(N(RtemptyRt task_done(RtfuncRj((s..\modules\wb_admin_control.pytprocess_ui_task_queues cCs|jj||dS(N(RR((RR+R1((s..\modules\wb_admin_control.pyRscCs|jj|dS(N(RR+(RR0((s..\modules\wb_admin_control.pyR+scCs|j|j|dS(N(RR+(RR%((s..\modules\wb_admin_control.pytevent_from_main scCs|jjdS(N(RR*(R((s..\modules\wb_admin_control.pyR*scCs|jjdS(N(RR-(R((s..\modules\wb_admin_control.pyR-scCs1|}|jr-|jjj|jj}n|S(N(RRRRR(RtpathR((s..\modules\wb_admin_control.pyRs cCs|j|jdS(N(RR(R((s..\modules\wb_admin_control.pyR%scCs|j|jdS(N(RR(R((s..\modules\wb_admin_control.pyR*scCsd}y&t|jj|j}|jWnLtk rz}d|GHd}|rvtjj dd|dddndSX|S(Ns0Error creating SQL connection for monitoring: %rsConnection Errors@Error connecting to MySQL: %s MySQL stat graphs may be disabled.RRR( R RRRtsql_status_callbacktconnectRRRR(Rt interactivet connectionR((s..\modules\wb_admin_control.pytget_new_sql_connection/s #cCs|j}i|_tj}|dk rO|dkrt|f|j| s(%s) s,script='%s', cret,fret='%i,%s', output='%s' i s ( R|Rtexecute_commandR"toutputRRR"RJR Rdtreplace( RRtRRRRut output_textR<tretcodet filtered_textt filters_code((s..\modules\wb_admin_control.pytexecute_filtered_command]s $-   9N(*R$R2R RRRRRRR)RRRRRRRRRR+RR*R-RRRRRRRRR-RAR1R.RRR:R;RtCURRENTRE(((s..\modules\wb_admin_control.pyRRsF   L                    cCsdG|jGHdS(Ns is running((t is_running(tsettingstctrl_be((s..\modules\wb_admin_control.pyt unit_tests{st__main__is echo 'Test'RRitTests - Oks - FailsEnter password: s echo Tests /bin/falsesecho 'Test\ message's s Test message(FR!treRR5RRRRtworkbench.utilsRt wb_admin_sshRtworkbench.db_utilsRRRt wb_commonRRRRtwb_server_controlR R R twb_server_managementR R Rtwb_admin_config_file_beRRRRRRRRRtbasenamet__file__R"RRtobjectRR3RQR]R_RaRkRlRmRnRqR|R}R RRRRJR$ttest_nrtrun_cmdtgetpassRR@RH(((s..\modules\wb_admin_control.pyts        "   .60      * %  + +             )