Best Python code snippet using localstack_python
obfuscators.py
Source:obfuscators.py  
1#! /usr/bin/env python23import logging4import sys5import os6from datetime import datetime7import subprocess as sub89import util as u10import exception as e1112import obfuscator_rebuild13import obfuscator_defunct14import obfuscator_renaming15import obfuscator_goto16import obfuscator_string17import obfuscator_indirections18import obfuscator_nop19import obfuscator_debug20import obfuscator_branch21import obfuscator_reordering22import obfuscator_reflection23import obfuscator_fields24import obfuscator_manifest25import obfuscator_resource26import obfuscator_raw27import obfuscator_restring28import obfuscator_asset29import obfuscator_intercept30import obfuscator_lib3132base_dir = os.path.abspath(os.path.dirname(__file__)) + '/'33#obfuscator_resource_dir = base_dir + 'obfuscators/'34obfuscator_resource_dir = base_dir + ''3536obfuscator_log_file = base_dir + 'obfuscators.log'3738debug = False39cleanup = True40enable_logging = True414243def popen(com_str):44    p = sub.Popen(com_str, shell=True, stdout=sub.PIPE, stderr=sub.PIPE)45    out, err = p.communicate()46    if enable_logging:47        u.logger(out)48        u.logger(err)49    if 'Exception' in out or 'Exception' in err:50        if 'method index is too large' in out or 'method index is too large' in err:51            raise e.AndroidLimitException('Unable run :' + com_str)52        elif 'java.lang.ArrayIndexOutOfBoundsException' in out or 'java.lang.ArrayIndexOutOfBoundsException' in err:53            raise e.AndroidRandomException('Unable run :' + com_str)54        else:55            raise e.RunningObfuscatorException('Unable run :' + com_str)565758def clean_temp(sample_tf_dir):  # Clear the temporary support directory59    try:60        if enable_logging:61            u.logger('Directory cleaned: ' + sample_tf_dir)62        popen('rm -rf ' + sample_tf_dir + '/app')63    except OSError as ex:64        raise e.OpenToolException(str(ex) + '\nUnable to clean ' + sample_tf_dir)656667def backsmali(sample_tf_dir, sample_file_name):  # Backsmali an apk file68    try:69        if enable_logging:70            u.logger('Backsmali: ' + sample_file_name + ' into ' + sample_tf_dir)71        #popen('apktool/apktool d --force --no-debug-info ' + sample_file_name + ' ' + sample_tf_dir + '/app')72        popen('apktool d --force --no-debug-info ' + sample_file_name + ' -o ' + sample_tf_dir + '/app')73        if os.path.isdir(u.base_dir()+'/smali/com'):74            u.main_exec_dir = 'com'75        elif os.path.isdir(u.base_dir()+'/smali/org'):76            u.main_exec_dir = 'org'77        else:78            u.main_exec_dir = ''79    except OSError as ex:80        raise e.OpenToolException(str(ex) + '\nUnable to backsmali ' + sample_file_name + ' into ' + sample_tf_dir)818283def smali(sample_tf_dir, sample_file_name):  # Smali an apk file84    try:85        if enable_logging:86            u.logger('Smali: ' + sample_file_name + ' from ' + sample_tf_dir)87        #print('apktool/apktool b --force-all ' + sample_tf_dir + '/app' + ' ' + sample_file_name)88        #popen('apktool/apktool b --force-all ' + sample_tf_dir + '/app' + ' ' + sample_file_name)89        popen('apktool b --force-all ' + sample_tf_dir + '/app' + '  -o ' + sample_file_name)90    except OSError as ex:91        raise e.OpenToolException(str(ex) + '\nUnable to smali ' + sample_file_name + ' from ' + sample_tf_dir)929394def sign_apk(sample_file_name):  # Sign an apk file with a SHA1 key95    try:96        if enable_logging:97            u.logger('Sign: ' + sample_file_name)98        popen('jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore ' + obfuscator_resource_dir + '/resignKey.keystore -storepass resignKey ' + sample_file_name + ' resignKey')99        #popen('/opt/jdk1.8.0_101/bin/jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore ' + obfuscator_resource_dir + '/resignKey.keystore -storepass resignKey ' + sample_file_name + ' resignKey')100    except OSError as ex:101        raise e.OpenToolException(str(ex) + '\nUnable to sign ' + sample_file_name)102103104def zip_align(sample_file_name):  # Align the file105    try:106        if enable_logging:107            u.logger('Zip: ' + sample_file_name)108        popen('cp ' + sample_file_name + ' ' + sample_file_name + '_old.apk')109        popen('zipalign -f 8 ' + sample_file_name + '_old.apk' + ' ' + sample_file_name)110        popen('rm -f ' + sample_file_name + '_old.apk')111    except OSError as ex:112        raise e.OpenToolException(str(ex) + '\nUnable to zipalign ' + sample_file_name)113114115def design_apk(sample_file_name):  # Remove a signature from an apk file116    try:117        if enable_logging:118            u.logger('DeSign: ' + sample_file_name)119        popen('zip -d ' + sample_file_name + ' /META-INF/*')  # Delete the META-INF folder from the apk root120    except OSError as ex:121        raise e.OpenToolException(str(ex) + '\nUnable to delete META-INF from ' + sample_file_name)122123124def init(sample_tf_dir):  # Initialize the obfuscator routine125    reload(sys)126    sys.setdefaultencoding('utf-8')127    u.obfuscator_dir = obfuscator_resource_dir128    u.global_dir = sample_tf_dir + '/app'129    logging.basicConfig(filename=obfuscator_log_file, level=logging.DEBUG)130    if enable_logging:131        u.logger('Obfuscators Initialize: ' + u.obfuscator_dir + ' ' + u.global_dir)132133134def apply_resign(sample_file_name):  # Resign an apk file135    try:136        design_apk(sample_file_name)137        sign_apk(sample_file_name)138    except e.OpenToolException as ex:139        raise e.RunningObfuscatorException(str(ex))140141142def apply_zip(sample_file_name):  # Zipaling an apk file143    try:144        zip_align(sample_file_name)145    except e.OpenToolException as ex:146        raise e.RunningObfuscatorException(str(ex))147148149def apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscatorPy):150    '''Apply an obfuscator'''151    try:152        if enable_logging:153            u.logger('Python Obfuscator!')154        #backsmali(sample_tf_dir, sample_file_name)155        obfuscatorPy.obfuscate()156        if debug:157            smali(sample_tf_dir, sample_file_name)158        #sign_apk(sample_file_name)159        #clean_temp(sample_tf_dir)160    except (e.OpenToolException, e.LoadFileException) as ex:161        raise e.RunningObfuscatorException(str(ex) + '\nUnable run python obfuscator')162163164def run_obfuscator_resigned(sample_file_name, sample_tf_dir):165    try:166        if enable_logging:167            u.logger('Obfuscator Resign')168        apply_resign(sample_file_name)169    except e.OpenToolException as ex:170        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Resign')171172173def run_obfuscator_zip(sample_file_name, sample_tf_dir):174    try:175        if enable_logging:176            u.logger('Obfuscator Align')177        apply_zip(sample_file_name)178    except e.RunningObfuscatorException as ex:179        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Align')180181182def run_obfuscator_rebuild(sample_file_name, sample_tf_dir):183    try:184        if enable_logging:185            u.logger('Obfuscator Rebuild')186        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_rebuild)187    except e.RunningObfuscatorException as ex:188        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Rebuild')189190191def run_obfuscator_defunct(sample_file_name, sample_tf_dir):192    try:193        if enable_logging:194            u.logger('Obfuscator Defunct')195        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_defunct)196    except e.RunningObfuscatorException as ex:197        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Defunct')198199200def run_obfuscator_renaming(sample_file_name, sample_tf_dir):201    try:202        if enable_logging:203            u.logger('Obfuscator Renaming')204        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_renaming)205    except e.RunningObfuscatorException as ex:206        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Renaming')207208209def run_obfuscator_goto(sample_file_name, sample_tf_dir):210    try:211        if enable_logging:212            u.logger('Obfuscator Goto')213        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_goto)214    except e.RunningObfuscatorException as ex:215        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Goto')216217218def run_obfuscator_string(sample_file_name, sample_tf_dir):219    try:220        if enable_logging:221            u.logger('Obfuscator String')222        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_string)223    except e.RunningObfuscatorException as ex:224        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply String')225226227def run_obfuscator_indirections(sample_file_name, sample_tf_dir):228    try:229        if enable_logging:230            u.logger('Obfuscator Indirections')231        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_indirections)232    except e.RunningObfuscatorException as ex:233        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Indirections')234235236def run_obfuscator_nop(sample_file_name, sample_tf_dir):237    try:238        if enable_logging:239            u.logger('Obfuscator Nop')240        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_nop)241    except e.RunningObfuscatorException as ex:242        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Nop')243244245def run_obfuscator_debug(sample_file_name, sample_tf_dir):246    try:247        if enable_logging:248            u.logger('Obfuscator Debug')249        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_debug)250    except e.RunningObfuscatorException as ex:251        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Debug')252253254def run_obfuscator_branch(sample_file_name, sample_tf_dir):255    try:256        if enable_logging:257            u.logger('Obfuscator Branch')258        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_branch)259    except e.RunningObfuscatorException as ex:260        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Branch')261262263def run_obfuscator_reordering(sample_file_name, sample_tf_dir):264    try:265        if enable_logging:266            u.logger('Obfuscator Reordering')267        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_reordering)268    except e.RunningObfuscatorException as ex:269        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Reordering')270271272def run_obfuscator_reflection(sample_file_name, sample_tf_dir):273    try:274        if enable_logging:275            u.logger('Obfuscator Reflection')276        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_reflection)277    except e.RunningObfuscatorException as ex:278        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Reflection')279280281def run_obfuscator_fields(sample_file_name, sample_tf_dir):282    try:283        if enable_logging:284            u.logger('Obfuscator Field')285        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_fields)286    except e.RunningObfuscatorException as ex:287        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Fields')288289290def run_obfuscator_manifest(sample_file_name, sample_tf_dir):291    try:292        if enable_logging:293            u.logger('Obfuscator Manifest')294        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_manifest)295    except e.RunningObfuscatorException as ex:296        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Manifest')297298299def run_obfuscator_resource(sample_file_name, sample_tf_dir):300    try:301        if enable_logging:302            u.logger('Obfuscator Resource')303        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_resource)304    except e.RunningObfuscatorException as ex:305        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Resource')306307308def run_obfuscator_raw(sample_file_name, sample_tf_dir):309    try:310        if enable_logging:311            u.logger('Obfuscator Raw')312        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_raw)313    except e.RunningObfuscatorException as ex:314        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Raw')315316317def run_obfuscator_restring(sample_file_name, sample_tf_dir):318    try:319        if enable_logging:320            u.logger('Obfuscator Restring')321        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_restring)322    except e.RunningObfuscatorException as ex:323        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Restring')324325326def run_obfuscator_asset(sample_file_name, sample_tf_dir):327    try:328        if enable_logging:329            u.logger('Obfuscator Asset')330        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_asset)331    except e.RunningObfuscatorException as ex:332        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Asset')333334335def run_obfuscator_intercept(sample_file_name, sample_tf_dir):336    try:337        if enable_logging:338            u.logger('Obfuscator Intercept')339        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_intercept)340    except e.RunningObfuscatorException as ex:341        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Intercept')342343344def run_obfuscator_lib(sample_file_name, sample_tf_dir):345    try:346        if enable_logging:347            u.logger('Obfuscator Lib')348        apply_py_obfuscator(sample_file_name, sample_tf_dir, obfuscator_lib)349    except e.RunningObfuscatorException as ex:350        raise e.RunningObfuscatorException(str(ex) + '\nUnable to apply Lib')351352353#The obfuscator DB Name to Method mapping354obfuscator_mapping = {355    'Resigned': run_obfuscator_resigned,356    'Alignment': run_obfuscator_zip,357    'Rebuild': run_obfuscator_rebuild,358    'Defunct': run_obfuscator_defunct,359    'Renaming': run_obfuscator_renaming,360    'Goto': run_obfuscator_goto,361    'StringEncrypt': run_obfuscator_string,362    'Indirections': run_obfuscator_indirections,363    'Nop': run_obfuscator_nop,364    'Debug': run_obfuscator_debug,365    'ArithmeticBranch': run_obfuscator_branch,366    'Reordering': run_obfuscator_reordering,367    'Reflection': run_obfuscator_reflection,368    'Fields': run_obfuscator_fields,369    'Manifest': run_obfuscator_manifest,370    'Resource': run_obfuscator_resource,371    'Raw': run_obfuscator_raw,372    'Restring': run_obfuscator_restring,373    'Asset': run_obfuscator_asset,374    'Intercept': run_obfuscator_intercept,375    'Lib': run_obfuscator_lib376}377378379def clean_apk(sample_file_name):  # Clear the temporary apk380    try:381        if enable_logging:382            u.logger('Apk cleaned: ' + sample_file_name)383        popen('rm -f ' + sample_file_name)384    except OSError as ex:385        raise e.OpenToolException(str(ex) + '\nUnable to clean ' + sample_file_name)386387388def obfuscate_sample(sample_file_name, obfuscator_list, sample_tf_dir):389    '''This function obfucate a sample with the obfuscators in the list using a temporary directory as support'''390    init(sample_tf_dir)391    if enable_logging:392        u.logger('Obfuscate Request: %s - %s - %s' % (sample_file_name, obfuscator_list, sample_tf_dir))393    else:394        u.logger('Obfuscate Request')395    if not debug:396        clean_temp(sample_tf_dir)397    backsmali(sample_tf_dir, sample_file_name)398    start_time = datetime.utcnow()399    if enable_logging:400        u.logger('Obfuscate Start: ' + str(start_time))401    try:402        for obfuscator_item in obfuscator_list:403            obfuscator_method = obfuscator_mapping[obfuscator_item]404            obfuscator_method(sample_file_name, sample_tf_dir)405    except KeyError as ex:406        raise e.RunningObfuscatorException('Invalid obfuscator id ' + str(ex))407    end_time = datetime.utcnow()408    if enable_logging:409        u.logger('Obfuscate Stop: ' + str(end_time))410    u.logger('Obfuscate Time: ' + str(end_time-start_time))411    if cleanup:412        sample_ob_file_name = sample_file_name + 'Ob'413    else:414        sample_ob_file_name = sample_file_name415    smali(sample_tf_dir, sample_ob_file_name)416    sign_apk(sample_ob_file_name)417    if not debug:418        clean_temp(sample_tf_dir)419        if cleanup:420            clean_apk(sample_file_name)421    u.logger('### SUCCESS ### {' + str(end_time-start_time) + '}')422423424def apply_dir(orgApkDir, obfuscator_to_apply, mode=0, retry=0):425    try:426        #obfuscate_sample(adam_base_dir + 'input/' + filename, obfuscator_to_apply, adam_base_dir + 'temp/' + filename[:-4])427        #sys.exit(0)428429        for apk in os.listdir(orgApkDir):430            if not apk.endswith('.apk'):431                continue432            #obfuscate_sample(adam_base_dir + 'input/' + filename, obfuscator_to_apply, adam_base_dir + 'temp/' + filename[:-4])433            obfuscate_sample(orgApkDir+'/'+apk, obfuscator_to_apply, base_dir + 'temp/' + apk[:-4])434        sys.exit(0)435    except e.AndroidLimitException as ex:436        u.logger('### ERROR ### ' + str(ex) + ' ### ERROR ###')437        u.logger('### WARNING ###')438        if mode == 0:439            apply_dir(filename, [o for o in obfuscator_to_apply if o != 'Reflection'], 1)440        elif mode == 1:441            apply_dir(filename, [o for o in obfuscator_to_apply if o != 'Indirections'], 2)442        else:443            sys.exit(1)444    except e.AndroidRandomException as ex:445        u.logger('### ERROR ### ' + str(ex) + ' ### ERROR ###')446        if retry == 0:447            u.logger('### WARNING ###')448            apply_dir(filename, obfuscator_to_apply, mode, retry + 1)449        else:450            u.logger('### FAILURE ###')451            sys.exit(2)452    except Exception as ex:453        u.logger('### ERROR ### ' + str(ex) + ' ### ERROR ###')454        u.logger('### FAILURE ###')455        sys.exit(2)456457458'''459obfuscator_to_apply = ['Resigned',460                       'Alignment',461                       'Rebuild',462                       'Fields',463                       'Debug',464                       'Indirections',465                       'Defunct',466                       'StringEncrypt',467                       'Renaming',468                       'Reordering',469                       'Goto',470                       'ArithmeticBranch',471                       'Nop',472                       'Asset',473                       'Intercept',474                       'Raw',475                       'Resource',476                       'Lib',477                       'Restring',478                       'Manifest',479                       'Reflection'480                       ]481'''482# the following obfuscators have been made working okay483obfuscator_to_apply = ['Lib',484                       'Manifest',485                       'Goto',486                       'Reflection',487                       'Reordering',488                       'Intercept',489                       'Nop',490                       'ArithmeticBranch',491                       'Renaming',492                       'Indirections',493                       'Debug',494                       'Rebuild',495                       'Alignment',496                       'Resigned'497                       ]498499def main():500    try:501        apply_dir(sys.argv[1], obfuscator_to_apply)502    except Exception, e:503        return 1504    return 0505506if __name__ == '__main__':
...rubrik-mosaic-datadog-metrics.py
Source:rubrik-mosaic-datadog-metrics.py  
1import os2from datadog import initialize, api3import rubrik_mosaic4import urllib35import logging6import datetime7import argparse8urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)9parser = argparse.ArgumentParser(description="Upload the following Rubrik Mosaic metrics to Datadog as custom metrics: protected_object_count, size_protected_MB, secondary_storage_consumed_MB, backup_count.")10parser.add_argument("-api","--dd_api_key", help="Datadog api key, if not defined will default to environment variable 'dd_api_key'")11parser.add_argument("-app","--dd_app_key", help="Datadog app key, if not defined will default to environment variable 'dd_app_key'")12parser.add_argument("-i","--rubrik_mosaic_node_ip", help="mosaic node ip address, if not defined will default to environment variable 'rubrik_mosaic_node_ip'")13parser.add_argument("-u","--rubrik_mosaic_username", help="mosaic username, if not defined will default to environment variable 'rubrik_mosaic_username'")14parser.add_argument("-p","--rubrik_mosaic_password", help="mosaic password, if not defined will default to environment variable 'rubrik_mosaic_password'")15parser.add_argument("-l","--logging_enabled", help="enable or disable debug logging", type=bool)16args = parser.parse_args()17##User Defined Variables##18#api/app keys used to connect to datadog api19#can also be specified via env vars dd_api_key and dd_app_key20dd_api_key = args.dd_api_key21dd_app_key = args.dd_app_key22#ip, username, and password used to connect to mosaic api23#can also be specified via env vars rubrik_mosaic_node_ip, rubrik_mosaic_username, and rubrik_mosaic_password24rubrik_mosaic_node_ip = args.rubrik_mosaic_node_ip25rubrik_mosaic_username = args.rubrik_mosaic_username26rubrik_mosaic_password = args.rubrik_mosaic_password27#debug logging28if args.logging_enabled:29    logging_enabled=args.logging_enabled30else:31    logging_enabled=False32if logging_enabled:33    #debug logging34    console_output_handler = logging.StreamHandler()35    logging.getLogger().setLevel(logging.DEBUG)36    formatter = logging.Formatter("[%(asctime)s] [%(levelname)s] -- %(message)s")37    console_output_handler.setFormatter(formatter)38    logger = logging.getLogger(__name__)39    logger.propagate = False40    logger.addHandler(console_output_handler)41    def log(log_message):42        logger.debug(log_message)43def connect_datadog(api_key=None, app_key=None):44    #If the api_key and app_key has not been provided check for the env variable45    if api_key is None:46        api_key = os.environ.get('dd_api_key')47        if api_key is None:48            raise ValueError("The Datadog api key has not been provided.")49    if app_key is None:50        app_key = os.environ.get('dd_app_key')51        if app_key is None:52                raise ValueError("The Datadog app key has not been provided.")53    #connect to datadog api54    options = {55        'api_key': api_key,56        'app_key': app_key57    }58    initialize(**options)59#connect to datadog60connect_datadog(dd_api_key, dd_app_key)61#connect to mosaic cluster62rubrik = rubrik_mosaic.Connect(node_ip=rubrik_mosaic_node_ip, username=rubrik_mosaic_username,password=rubrik_mosaic_password, enable_logging=logging_enabled)63def post_metrics(rubrik, enable_logging=False):64    #dict to iterate metrics 65    metrics = {}66    #get number of objects protected via mosaic67    if enable_logging:68        log('post_metrics - getting protected_object_count')69    metrics['protected_object_count'] = rubrik.get_protected_object_count()70    if enable_logging:71        log('post_metrics - protected_object_count: {}'.format(metrics['protected_object_count']))72    #get size under protection73    if enable_logging:74        log('post_metrics - getting size_protected')75    metrics['size_protected_MB'] = rubrik.get_size_under_protection()76    if enable_logging:77        log('post_metrics - size_protected_MB: {}'.format(metrics['size_protected_MB']))78    #get secondary storage consumed79    if enable_logging:80        log('post_metrics - getting secondary_storage_consumed')81    metrics['secondary_storage_consumed_MB'] = rubrik.get_secondary_storage_consumed()82    if enable_logging:83        log('post_metrics - secondary_storage_consumed_MB: {}'.format(metrics['secondary_storage_consumed_MB']))84    #get total number of backups85    if enable_logging:86        log('post_metrics - getting backup_count')87    metrics['backup_count'] = rubrik.get_backup_count()88    if enable_logging:89        log('post_metrics - backup_count: {}'.format(metrics['backup_count']))90    for metric, value in metrics.items():91        if enable_logging:92            log('post_metrics - posting {} to datadog api for mosaic cluster {}'.format(metric, rubrik.node_ip))93        response = api.Metric.send(metric="mosaic.{}.{}".format(rubrik.node_ip, metric), points=value)94        if enable_logging:95            log('post metrics - {}'.format(response))...backtester.py
Source:backtester.py  
1import Strategies.strategies as t_strategy2import Backtesting.TBTLib.tbt_engine as t_engine3# Interface4# Debugging5data = ""6enable_logging = False7plot = True8debugging = False9strategy = t_strategy.PNLTrailNew()10def start():11    strategy.enable_logging = enable_logging12    engine = t_engine.BacktestEngine(strategy)13    engine.debugging = debugging14    engine.enable_logging = enable_logging15    engine.plot = plot16    engine.start()...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
