a ”ˆ«h‰iã@sxddlZddlmZddlTddlZddlmZddlm Z ddl Z ddl Z ddl Z ej  ¡ZdZGdd „d ejƒZdS) éNé)Úhotplug)Ú*)Úethcard)ÚcommandsZpumbagsdcs¦eZdZdZ‡fdd„Z‡fdd„Zdd„Zdd „Zd d „Zd d „Z ‡fdd„Z ‡fdd„Z ‡fdd„Z dd„Z dd„Zdd„Zdd„Zdd„Z‡fdd„Zd d!„Z‡fd"d#„Zd$d%„Zd&d'„Zed(d)„ƒZed*d+„ƒZed,d-„ƒZed.d/„ƒZed0d1„ƒZd2d3„Zd4d5„Zd6d7„Zd8d9„Z d:d;„Z!dd?„Z#ed@dA„ƒZ$e%dBdCdDdEdF„ƒZ&e'dBƒddHdI„ƒZ(e%dJƒdKdL„ƒZ)e'dJƒdMdN„ƒZ*gfdOdP„Z+d‚dRdS„Z,e%dTdCdDdUdV„ƒZ-dWdX„Z.e'dTƒdƒdYdZ„ƒZ/e%d[dCdDd\d]„ƒZ0e'd[ƒd„d^d_„ƒZ1d`da„Z2dbdc„Z3ddde„Z4dfdg„Z5dhdi„Z6djdk„Z7dldm„Z8d…dndo„Z9dpdq„Z:e;drdCdDdsdt„ƒZe;d{dCdDd|d}„ƒZ?e;d~dCdDdd€„ƒZ@‡ZAS)†ÚNetTuningPluginaO Configures network driver, hardware and Netfilter settings. Dynamic change of the interface speed according to the interface utilization is also supported. The dynamic tuning is controlled by the [option]`dynamic` and the global [option]`dynamic_tuning` option in `tuned-main.conf`. `wake_on_lan`::: The [option]`wake_on_lan` option sets wake-on-lan to the specified value as when using the `ethtool` utility. + .Set Wake-on-LAN for device eth0 on MagicPacket(TM) ==== ---- [net] devices=eth0 wake_on_lan=g ---- ==== `coalesce`::: The [option]`coalesce` option allows changing coalescing settings for the specified network devices. The syntax is: + [subs="quotes"] ---- coalesce=__param1__ __value1__ __param2__ __value2__ ... __paramN__ __valueN__ ---- + Note that not all the coalescing parameters are supported by all network cards. For the list of coalescing parameters of your network device, use `ethtool -c device`. + .Setting coalescing parameters rx/tx-usecs for all network devices ==== ---- [net] coalesce=rx-usecs 3 tx-usecs 16 ---- ==== `features`::: The [option]`features` option allows changing the offload parameters and other features for the specified network devices. To query the features of your network device, use `ethtool -k device`. The syntax of the option is the same as the [option]`coalesce` option. + .Turn off TX checksumming, generic segmentation and receive offload ==== ---- [net] features=tx off gso off gro off ---- ==== `pause`::: The [option]`pause` option allows changing the pause parameters for the specified network devices. To query the pause parameters of your network device, use `ethtool -a device`. The syntax of the option is the same as the [option]`coalesce` option. + .Disable autonegotiation ==== ---- [net] pause=autoneg off ---- ==== `ring`::: The [option]`ring` option allows changing the rx/tx ring parameters for the specified network devices. To query the ring parameters of your network device, use `ethtool -g device`. The syntax of the option is the same as the [option]`coalesce` option. + .Change the number of ring entries for the Rx/Tx rings to 1024/512 respectively ===== ----- [net] ring=rx 1024 tx 512 ----- ===== `channels`::: The [option]`channels` option allows changing the numbers of channels for the specified network device. A channel is an IRQ and the set of queues that can trigger that IRQ. To query the channels parameters of your network device, use `ethtool -l device`. The syntax of the option is the same as the [option]`coalesce` option. + .Set the number of multi-purpose channels to 16 ===== ----- [net] channels=combined 16 ----- ===== + A network device either supports rx/tx or combined queue mode. The [option]`channels` option automatically adjusts the parameters based on the mode supported by the device as long as a valid configuration is requested. `nf_conntrack_hashsize`::: The [option]`nf_conntrack_hashsize` option sets the size of the hash table which stores lists of conntrack entries by writing to `/sys/module/nf_conntrack/parameters/hashsize`. + .Adjust the size of the conntrack hash table ==== ---- [net] nf_conntrack_hashsize=131072 ---- ==== `txqueuelen`::: The [option]`txqueuelen` option allows changing txqueuelen (the length of the transmit queue). It uses `ip` utility that is in package iproute recommended for TuneD, so the package needs to be installed for its correct functionality. To query the txqueuelen parameters of your network device use `ip link show` and the current value is shown after the qlen column. + .Adjust the length of the transmit queue ==== ---- [net] txqueuelen=5000 ---- ==== `mtu`::: The [option]`mtu` option allows changing MTU (Maximum Transmission Unit). It uses `ip` utility that is in package iproute recommended for TuneD, so the package needs to be installed for its correct functionality. To query the MTU parameters of your network device use `ip link show` and the current value is shown after the MTU column. + .Adjust the size of the MTU ==== ---- [net] mtu=9000 ---- ==== csdtt|ƒj|i|¤Žd|_d|_tƒ|_i|_d|_t   d¡|_ t t jdƒrX|j|_n|j|_dS)Ngš™™™™™©?éTz(?!.*/virtual/.*)Ú properties)ÚsuperrÚ__init__Ú_load_smallestÚ _level_stepsrÚ_cmdÚ_re_ip_link_showÚ_use_ipÚreÚcompileÚre_not_virtualÚhasattrÚpyudevZDeviceÚ_get_device_property_1Ú_get_device_propertyÚ_get_device_property_2)ÚselfÚargsÚkwargs©Ú __class__©ú¿óz7NetTuningPlugin._get_device_objects..r)rÚdevicesrr/rÚ_get_device_objects¾sz#NetTuningPlugin._get_device_objectscCs|j |j¡S©N)rÚmatchZ device_pathr)rrrr$Ász$NetTuningPlugin._device_is_supportedcCs|j |d|j¡dS©Nr )r#Z subscribeÚ_hardware_events_callbackr/rrrÚ_hardware_events_initÄsz%NetTuningPlugin._hardware_events_initcCs|j |¡dSr4)r#Z unsubscriber/rrrÚ_hardware_events_cleanupÇsz(NetTuningPlugin._hardware_events_cleanupcs | |¡rtt|ƒ ||¡dSr4)r$r rr7)rZeventr*rrrr7Ês z)NetTuningPlugin._hardware_events_callbackcs,|jdur|j |¡tt|ƒ ||¡dSr4)Ú _load_monitorZ add_devicer rÚ_added_device_apply_tuning©rÚinstanceÚ device_namerrrr;Îs  z*NetTuningPlugin._added_device_apply_tuningcs,|jdur|j |¡tt|ƒ ||¡dSr4)r:Z remove_devicer rÚ_removed_device_unapply_tuningr<rrrr?Ós  z.NetTuningPlugin._removed_device_unapply_tuningcCs |j |¡Sr4)r Úget)rÚ pyudev_devÚproprrrrÙsz&NetTuningPlugin._get_device_property_1cCs*z| |¡}Wnty$d}Yn0|Sr4)Ú __getitem__ÚKeyError)rrArBÚprrrrÝs   z&NetTuningPlugin._get_device_property_2cCsp|j d|¡}|rl| |d¡}|rlt|j ¡ƒD]:\}}|j |¡}|r0t  d|||f¡||j |<qlq0dS)Nr ÚIFINDEXz?Rename device, ifindex: '%s', original name '%s', new name '%s') r#r+rÚlistZ _instancesÚitemsÚ _ifmap_origr@r&r'Ú _ifnamemap)rr>ÚdÚiZ instance_namer=Zdevice_name_oldrrrÚ _move_deviceås  ÿ zNetTuningPlugin._move_devicecs‡fdd„}|S)Ncsˆj |¡}|r|S|Sr4)rJr@)r*rK©r=rrÚ_get_curr_deviceôs zBNetTuningPlugin._get_curr_device_wrapper.._get_curr_devicer)rr=rOrrNrÚ_get_curr_device_wrapperòs z(NetTuningPlugin._get_curr_device_wrappercCs@d|_d|_d|_d|_i|_| |¡|_| |jd¡|_ dS)NTÚdynamic) Z_has_static_tuningr:Ú_idleÚ_statsrJrPrOZ _option_boolÚoptionsZ_has_dynamic_tuning©rr=rrrÚ_instance_initús zNetTuningPlugin._instance_initcsVtt|ƒ |¡i|_|j}|D]0}|j d|¡}|r | |d¡}|r ||j|<q dS)Nr rF)r rÚassign_free_devicesrIÚassigned_devicesr#r+r)rr=r2r*rKrLrrrrWs z#NetTuningPlugin.assign_free_devicescCs"|jdur|j |j¡d|_dSr4)r:Ú_monitors_repositoryÚdeleterUrrrÚ_instance_cleanups z!NetTuningPlugin._instance_cleanupcs@tt|ƒ |¡i|_i|_|j d|j¡|_|j  |j ¡dSr6) r rÚ_instance_init_dynamicrRrSrYZcreaterXr:Z _set_dev_maprOrUrrrr\s z&NetTuningPlugin._instance_init_dynamiccCs| ||¡dSr4)Ú_instance_update_dynamic©rr=r*rrrÚ_instance_apply_dynamicsz'NetTuningPlugin._instance_apply_dynamiccCs<dd„|j |¡Dƒ}|dur"dS||jvr8| ||¡| |||¡| ||¡|j|}|j|}|ddkr´|d|jkr´|d|jkr´d|d<t  d|¡t |ƒ  d ¡nF|ddkrú|ddksØ|ddkrúd|d<t  d |¡t |ƒ  ¡t  d ||d|df¡t  d ||d|d|df¡dS) NcSsg|] }t|ƒ‘qSr©Úint)r-Úvaluerrrr0r1z.ÚlevelrÚreadÚwriterz%s: setting 100Mbpsédú%s: setting max speedz %s load: read %0.2f, write %0.2fz$%s idle: read %d, write %d, level %d)r:Zget_device_loadrSÚ_init_stats_and_idleÚ _update_statsÚ _update_idlerRr r&ÚinforZ set_speedÚ set_max_speedr')rr=r*ÚloadZstatsZidlerrrr]s&     ($ z(NetTuningPlugin._instance_update_dynamiccCs4ddddddddddddddddddddddddœS)N)z adaptive-rxz adaptive-txz cqe-mode-rxzrx-usecsz rx-framesz rx-usecs-irqz rx-frames-irqztx-usecsz tx-framesz tx-usecs-irqz tx-frames-irqzstats-block-usecsz pkt-rate-lowz rx-usecs-lowz rx-frames-lowz tx-usecs-lowz tx-frames-lowz pkt-rate-highz rx-usecs-highzrx-frames-highz tx-usecs-highztx-frames-highzsample-intervalr©ÚclsrrrÚ_get_config_options_coalesce6s0éz,NetTuningPlugin._get_config_options_coalescecCs ddddœS)N)ÚautonegÚrxÚtxrrnrrrÚ_get_config_options_pauseRsþz)NetTuningPlugin._get_config_options_pausecCsdddddœS)N)rrúrx-miniúrx-jumborsrrnrrrÚ_get_config_options_ringXs ýz(NetTuningPlugin._get_config_options_ringcCsdddddœS)N)rrrsÚotherÚcombinedrrnrrrÚ_get_config_options_channels_s ýz,NetTuningPlugin._get_config_options_channelsc Csdddddddddddœ S)NT) rQÚ wake_on_lanÚnf_conntrack_hashsizeÚfeaturesÚcoalesceÚpauseÚringÚchannelsÚ txqueuelenÚmturrnrrrÚ_get_config_optionsfsöz#NetTuningPlugin._get_config_optionscCsL| t| |¡ƒ ¡¡}ddgd|dgdœ|j|<ddddœ|j|<dS)Nérér)ÚnewÚmax)rcrdre)Ú _calc_speedrrOZ get_max_speedrSrR)rr=r*Z max_speedrrrrhusz$NetTuningPlugin._init_stats_and_idlecCsÄ|j|d|j|d<}||j|d<dd„t||ƒDƒ}||j|d<|j|d}dd„t||ƒDƒ}||j|d<t|dƒt|dƒ|j|d <t|d ƒt|d ƒ|j|d <dS) Nr‡ÚoldcSsg|]}|d|d‘qS)rrr)r-Znew_oldrrrr0€r1z1NetTuningPlugin._update_stats..ÚdiffrˆcSsg|] }t|ƒ‘qSr)rˆ)r-Zpairrrrr0…r1rrdr†re)rSÚzipÚfloat)rr=r*Znew_loadZold_loadr‹Z old_max_loadZmax_loadrrrrizs"zNetTuningPlugin._update_statscCsHdD]>}|j|||jkr4|j||d7<qd|j||<qdS)N)rdrerr)rSr rR)rr=r*Z operationrrrrjŒszNetTuningPlugin._update_idlecCsN||jvrJ|j|ddkrJd|j|d<t d|¡t| |¡ƒ ¡dS)Nrcrrg)rRr&rkrrOrlr^rrrÚ_instance_unapply_dynamic”sz)NetTuningPlugin._instance_unapply_dynamiccCstd|dƒS)Ng333333#Aér`)rZspeedrrrr‰šszNetTuningPlugin._calc_speedcCs„|j |¡}tt dd|¡ƒ ¡}t|ƒ}|ddkrPt d|t|ƒf¡dS|dkr^t ƒSt t t |ddd…|ddd…ƒƒƒS)Nz (:\s*)|(\s+)|(\s*;\s*)|(\s*,\s*)ú r†rzinvalid %s parameter: '%s'r) Z _variablesÚexpandr(rÚsubÚsplitÚlenr&ÚerrorÚdictrGrŒ)rrbÚcontextÚvÚlvrrrÚ_parse_config_parameters£s  z(NetTuningPlugin._parse_config_parameterscCs~|j ddddddddd d d d d dddddddœ|¡}dd„| d¡Dƒ}t|ƒdkrZdStdd„dd„|dd…DƒDƒƒS)Nz adaptive-rx:z adaptive-tx:z cqe-mode-rx:zrx-frames-low:zrx-frames-high:ztx-frames-low:ztx-frames-high:zlro:zrx:ztx:zsg:ztso:zufo:zgso:zgro:zrxvlan:ztxvlan:zntuple:zrxhash:)z Adaptive RX:z\s+TX:z CQE mode RX:z rx-frame-low:zrx-frame-high:z tx-frame-low:ztx-frame-high:zlarge-receive-offload:zrx-checksumming:ztx-checksumming:zscatter-gather:ztcp-segmentation-offload:zudp-fragmentation-offload:zgeneric-segmentation-offload:zgeneric-receive-offload:zrx-vlan-offload:ztx-vlan-offload:zntuple-filters:zreceive-hashing:cSs0g|](}tt|ƒƒdkrt dt|ƒ¡s|‘qS)rz \[fixed\]$)r”r(rÚsearch©r-r˜rrrr0Ìr1z.Ú r†cSsg|]}t|ƒdkr|‘qS©r†©r”)r-Úurrrr0Ñr1cSsg|]}t dt|ƒ¡‘qS©z:\s*)rr“r(rœrrrr0Ñr1r)rÚmultiple_re_replacer“r”r–)rrbZvlrrrÚ_parse_device_parameters²s6íì z(NetTuningPlugin._parse_device_parameterscCsdS)Nz,/sys/module/nf_conntrack/parameters/hashsizerr/rrrÚ_nf_conntrack_hashsize_pathÓsz+NetTuningPlugin._nf_conntrack_hashsize_pathr{T)Z per_devicecCsd|dur dSt ddt|ƒ¡}t dtd|¡s@t d¡dS|s`|j dd|  |¡d|g¡|S) NÚ0rKz^[z]+$zIncorrect 'wake_on_lan' value.Úethtoolz-sZwol) rr’r(r5Ú WOL_VALUESr&ÚwarningrÚexecuterO)rrbr*r=ÚsimÚremoverrrÚ_set_wake_on_lan×s z NetTuningPlugin._set_wake_on_lanFc Cs\d}z@t dtd|j d| |¡g¡dtj¡}|rB| d¡}WntyVYn0|S)Nz.*Wake-on:\s*([z]+).*r¦r) rr5r§rr©rOÚSÚgroupÚIOError)rr*r=Úignore_missingrbÚmrrrÚ_get_wake_on_lanæsÿ z NetTuningPlugin._get_wake_on_lanr|cCsN|dur dSt|ƒ}|dkrF|sB|jj| ¡||r:tjgndd|SdSdS)NrF)Zno_error)rarZ write_to_filer¤ÚerrnoÚENOENT)rrbr=rªr«ZhashsizerrrÚ_set_nf_conntrack_hashsizeòsÿz*NetTuningPlugin._set_nf_conntrack_hashsizecCs(|j | ¡¡}t|ƒdkr$t|ƒSdS)Nr)rZ read_filer¤r”ra)rr=rbrrrÚ_get_nf_conntrack_hashsizes z*NetTuningPlugin._get_nf_conntrack_hashsizecCsz|js dSddg|}|jj|tjgdd\}}}|tj krRt d¡d|_dS|rvt d¡t d||f¡dS|S) NÚipÚlinkT)Ú no_errorsZ return_errz0ip command not found, ignoring for other devicesFzProblem calling ip commandz(rc: %s, msg: '%s')) rrr©r³r´r&r¨rkr')rrÚrcÚoutÚerr_msgrrrÚ _call_ip_links    zNetTuningPlugin._call_ip_linkNcCsdg}|r| |¡| |¡S)NZshow)Úappendr½)rr*rrrrÚ _ip_link_shows zNetTuningPlugin._ip_link_showr‚cCs~|dur dSz t|ƒWn"ty:t d|¡YdS0|sz| dd| |¡d|g¡}|durzt d| |¡¡dS|S)Nz$txqueuelen value '%s' is not integerr"Údevr‚z%Cannot set txqueuelen for device '%s'©raÚ ValueErrorr&r¨r½rO©rrbr*r=rªr«ÚresrrrÚ_set_txqueuelens  zNetTuningPlugin._set_txqueuelencCs(||jvrt d|¡|j|<|j|S)z@ Return regex for int arg value from "ip link show" command z.*\s+%s\s+(\d+))rrr)rÚargrrrÚ_get_re_ip_link_show-s z$NetTuningPlugin._get_re_ip_link_showcCsr| | |¡¡}|dur4|s0t d| |¡¡dS| d¡ |¡}|durh|sdt d| |¡¡dS| d¡S)NzECannot get 'ip link show' result for txqueuelen value for device '%s'ZqlenzFCannot get txqueuelen value from 'ip link show' result for device '%s'r©r¿rOr&rkrÇr›r®©rr*r=r°r»rÄrrrÚ_get_txqueuelen5sÿÿzNetTuningPlugin._get_txqueuelenrƒcCs~|dur dSz t|ƒWn"ty:t d|¡YdS0|sz| dd| |¡d|g¡}|durzt d| |¡¡dS|S)Nzmtu value '%s' is not integerr"rÀrƒzCannot set mtu for device '%s'rÁrÃrrrÚ_set_mtuFs  zNetTuningPlugin._set_mtucCsr| | |¡¡}|dur4|s0t d| |¡¡dS| d¡ |¡}|durh|sdt d| |¡¡dS| d¡S)Nz>Cannot get 'ip link show' result for mtu value for device '%s'rƒz?Cannot get mtu value from 'ip link show' result for device '%s'rrÈrÉrrrÚ_get_mtuVsÿÿzNetTuningPlugin._get_mtucCsl|dkr dSt| ¡ƒ}|j|j|j|jdœ}t||ƒ ¡ƒ}| |¡sht d|t ||ƒf¡dSdS)Nr}T)r~rr€rzunknown %s parameter(s): %sF) r"ÚkeysrprtrwrzÚissubsetr&r•r()rr—rKÚparamsZsupported_getterZ supportedrrrÚ_check_parametershs ý z!NetTuningPlugin._check_parameterscCsR|j ddddœ|¡}| d¡dd…}dd„|Dƒ}td d„d d„|DƒDƒƒS) Nrqrrrs)Z AutonegotiateÚRXÚTXrrcSs$g|]}|dkrt d|¡s|‘qS)Úz \[fixed\])rr›r,rrrr0}r1z;NetTuningPlugin._parse_pause_parameters..cSsg|]}t|ƒdkr|‘qSržrŸr,rrrr0~r1cSsg|]}t d|¡‘qSr¡©rr“r,rrrr0~r1)rr¢r“r–)rÚsÚlrrrÚ_parse_pause_parameterswsþýz'NetTuningPlugin._parse_pause_parameterscCsjtjd|tjd}|d}|j dddddœ|¡}| d ¡}d d „|Dƒ}d d „d d „|DƒDƒ}t|ƒS)Nú^Current hardware settings:$©Úflagsrrrrurvrs)rÑzRX MinizRX JumborÒrcSsg|]}|dkr|‘qS©rÓrr,rrrr0Šr1z:NetTuningPlugin._parse_ring_parameters..cSsg|]}t|ƒdkr|‘qSržrŸr,rrrr0‹r1cSsg|]}t d|¡‘qSr¡rÔr,rrrr0‹r1©rr“Ú MULTILINErr¢r–©rrÕÚarÖrrrÚ_parse_ring_parameterssýü z&NetTuningPlugin._parse_ring_parameterscCsjtjd|tjd}|d}|j dddddœ|¡}| d ¡}d d „|Dƒ}d d „d d „|DƒDƒ}t|ƒS)NrØrÙrrrrsrxry)rÑrÒZOtherZCombinedrcSsg|]}|dkr|‘qSrÛrr,rrrr0˜r1z>NetTuningPlugin._parse_channels_parameters..cSsg|]}t|ƒdkr|‘qSržrŸr,rrrr0™r1cSsg|]}t d|¡‘qSr¡rÔr,rrrr0™r1rÜrÞrrrÚ_parse_channels_parameterssýü z*NetTuningPlugin._parse_channels_parameterscCszg}d|vr(| d|dd|dg¡n,ttt|dƒt|dƒƒƒ}| d|g¡ttt|ddd…|ddd…ƒƒƒS)Nryrrrrsér†)Úextendr(rˆrar–rGrŒ)rr—Z params_listÚ dev_paramsZmod_params_listZcntrrrÚ_replace_channels_parametersœs z,NetTuningPlugin._replace_channels_parametersc CsTt| ¡ƒ}t| ¡ƒ}||}|D]*} t d|| | |¡f¡| | d¡q$dS)a:Filter unsupported parameters and log warnings about it Positional parameters: instance -- instance calling it context -- context of change parameters -- parameters to change device -- name of device on which should be parameters set dev_params -- dictionary of currently known parameters of device z-%s parameter %s is not supported by device %sN)r"rÍr&r¨rOÚpop) rr=r—Ú parametersr*räZsupported_parametersZparameters_to_changeZunsupported_parametersÚparamrrrÚ_check_device_support¥s  ÿýz%NetTuningPlugin._check_device_supportc Cs’ddddddœ}||}|j d|| |¡g¡\}}|dksHt|ƒdkrLdS|j|j|j|j|jdœ}||} | |ƒ} |d krŽ| || ¡sŽdS| S) Nz-cz-kz-az-gz-l©r~r}rr€rr¦rr~) rr©rOr”r£r×ràrárÐ) rr=r—r*Ú context2optÚoptÚretrbZcontext2parserÚparserrKrrrÚ_get_device_parameters½s$ÿüz&NetTuningPlugin._get_device_parametersc Csô|dust|ƒdkrdS| ||¡}|dus8| ||¡srF)räcs g|]\}}|ˆvr||f‘qSrr)r-rèrb©Z params_setrrr0ös þz6NetTuningPlugin._custom_parameters..)r*r)Z _storage_keyrïr”rôrHr–rróZ_log_verification_resultrOZ_storager"Újoinr@) rr—Ústartrbr*Úverifyr=Z storage_keyZparams_currentZrelevant_params_currentrÄÚoriginal_valuerrõrÚ_custom_parametersçsDþþ ÿ  ÿý  ÿ z"NetTuningPlugin._custom_parametersr}cCs| d|||||¡S)Nr}©rú©rr÷rbr*rør°r=rrrÚ _features szNetTuningPlugin._featuresr~cCs| d|||||¡S)Nr~rûrürrrÚ _coalesceszNetTuningPlugin._coalescercCs| d|||||¡S)NrrûrürrrÚ_pauseszNetTuningPlugin._pauser€cCs| d|||||¡S)Nr€rûrürrrÚ_ringszNetTuningPlugin._ringrcCs| d|||||¡S)NrrûrürrrÚ _channelsszNetTuningPlugin._channels)F)N)F)F)N)BÚ__name__Ú __module__Ú __qualname__Ú__doc__r r!r3r$r8r9r7r;r?rrrMrPrVrWr[r\r_r]Ú classmethodrprtrwrzr„rhrirjrŽr‰ršr£r¤Z command_setr¬Z command_getr²rµr¶r½r¿rÅrÇrÊrËrÌrÐr×ràrárårérïrôrúZcommand_customrýrþrÿrrÚ __classcell__rrrrrsž              !                 ÿ %         r)r³rÓrZ decoratorsZ tuned.logsZtunedZtuned.utils.nettoolrZtuned.utils.commandsrÚosrrZlogsr@r&r§ZPluginrrrrrÚs