def run(event, context): load_dependencies('syncer,requests,pyppeteer,websocket-client') from osbot_browser.browser.Browser_Lamdba_Helper import Browser_Lamdba_Helper channel = event.get('channel') try: wait = 3 aws = Web_AWS().setup() slack_message(':one: Logging in to AWS', [], channel) aws.login() slack_message( f':two: Opening Billing page and waiting {wait} seconds for data to load', [], channel) aws.page_billing() aws.page.wait(wait) png_data = aws.screenshot(width=1200) if channel: slack_message( f':three: sending screenshot of size {len(png_data)} to Slack channel {channel}', [], channel) Browser_Lamdba_Helper().send_png_data_to_slack( None, channel, 'AWS Billing', png_data) return png_data except Exception as error: message = f'Error in aws_web lambda: {error}' slack_message(message, [], channel) return message
def graph_tasks(team_id=None, channel=None, params=None): load_dependencies('syncer,requests,pyppeteer,websocket-client') graph_name = params.pop(0) table_width = "1200px" headers = [ 'Key', 'Summary', 'Latest_Information', 'Status', 'Issue Type' ] # without issue links columns_defs = [ { "targets": [1], "width": "70px" }, # Key { "targets": [1], "width": "300px" }, # Summary { "targets": [2], "width": "300px" }, # Latest_Information #{"targets": [3], "width": "100px"}, # Status #{"targets": [5], "width": "100px"}, # Rating ] return DataTable_Js_Views._create_table_with_headers( team_id, channel, graph_name, headers, columns_defs, table_width)
def setup(event): from osbot_aws.Dependencies import load_dependencies load_dependencies('syncer,requests,pyppeteer,websocket-client,jira') from osbot_browser.view_helpers.Sow_Views import Sow headless = event.get('headless') is None return Sow(headless=headless)
def _get_graph_data(params, layout=None, headless=True): load_dependencies('syncer,requests,pyppeteer,websocket-client') from osbot_browser.view_helpers.Go_Js import Go_Js graph_name = params.pop(0) go_js = Go_Js(headless=headless, layout=layout) graph_data = go_js.get_graph_data(graph_name) return go_js, graph_data
def _get_graph_data(params,layout=None, headless=True): load_dependencies('syncer,requests,pyppeteer,websocket-client'); from osbot_browser.view_helpers.Am_Charts import Am_Charts am_charts = Am_Charts(headless=headless,layout=layout) graph_name = Misc.array_pop(params,0) if graph_name: graph_data = am_charts.get_graph_data(graph_name) return am_charts, graph_data return am_charts,None
def run(event, context): try: load_dependencies( 'elastic,slack,requests' ) # load dependency (download and unzip if first run) from osbot_jira.api.graph.Lambda_Graph import Lambda_Graph # import Lambda_Graph class return Lambda_Graph().handle_lambda_event( event) # invoke lambda handler from Lambda_Graph class except Exception as error: return ":red_circle: error in `osbot_jira.lambdas.graph`: {0}".format( error)
def test_data(team_id=None, channel=None, params=None): load_dependencies('syncer,requests,pyppeteer,websocket-client') from osbot_browser.view_helpers.DataTable_Js import DataTable_Js headers = ['Header AAA', 'Header BBB'] rows = [['value 1', 'value 2'], ['value 3', 'value 4'], ['value 5'], [], ['value 6', 'value 7'], [None], [None, 'value 8', 'AB'], ['value 9', 'value 10']] return DataTable_Js().create_table(headers, rows).send_screenshot_to_slack( team_id, channel)
def run(event, context): try: from osbot_aws.Dependencies import load_dependencies load_dependencies('syncer,requests,pyppeteer,websocket-client') from osbot_browser.view_helpers.gw.Xml_Report import Xml_Report headless = event.get('headless') file_name = event.get('file_name') json_data = event.get('json_data') png_data = Xml_Report(headless=headless).gw_exec_summary(file_name, json_data) return {'png_data': png_data } except Exception as error: return {'error': f'{error}'}
def run(event, context): load_dependencies('syncer,requests,pyppeteer,websocket-client') from osbot_browser.view_helpers.Google_Charts_Js import Google_Charts_Js google_charts = Google_Charts_Js() google_charts.load_page(True) chart_type = event.get('chart_type') options = event.get('options') width = event.get('width') height = event.get('height') data = event.get('data') clip = event.get('clip') png_data = google_charts.create_chart(chart_type, options, width, height, data, clip) return png_data
def run(event, context=None): load_dependencies('syncer,requests,pyppeteer2,websocket-client') from osbot_browser.browser.API_Browser import API_Browser url = event.get('url') #return url # error in this line: Read-only file system: '/home/sbx_user1051 api_browser = API_Browser().sync__setup_browser() # we don't get here if url: api_browser.sync__open(url) return api_browser.sync__screenshot_base64()
def run(event, context): try: load_dependencies('requests,syncer,pyppeteer,websocket-client') from osbot_jupyter.osbot.Jupyter_Commands import Jupyter_Commands params = Misc.get_value(event, 'params', []) if not params: params = [''] data = event.get('data') channel = Misc.get_value(data, 'channel') team_id = Misc.get_value(data, 'team_id') params.append({"data": data}) return Slack_Commands_Helper(Jupyter_Commands).invoke( team_id, channel, params) except Exception as error: message = "[lambda_osbot] Error: {0}".format(error) #log_to_elk(message, level='error') return message
def go_js(team_id=None, channel=None, params=None): load_dependencies('syncer,requests,pyppeteer,websocket-client') if len(params) < 2: text = ':red_circle: Hi, for the `go_js` command, you need to provide 2 parameters: ' attachment_text = '*graph name* - the nodes and edges you want to view\n' \ '*view name* - the view to render' return text, [{'text': attachment_text}] from osbot_browser.view_helpers.Go_Js_Views import Go_Js_Views params[0], params[1] = params[1], params[0] (text, attachments ) = Slack_Commands_Helper(Go_Js_Views).show_duration(True).invoke( team_id, channel, params) if team_id is None: return text
def graph(team_id=None, channel=None, params=None): load_dependencies('syncer,requests,pyppeteer,websocket-client') graph_name = params.pop(0) headers = [ 'Issue Type', 'Summary', 'Description', 'Status', 'Rating', 'Key' ] # without issue links table_width = "1500px" columns_defs = [ { "targets": [1], "width": "60px" }, # Key { "targets": [2], "width": "600px" }, # Summary ] return DataTable_Js_Views._create_table_with_headers( team_id, channel, graph_name, headers, columns_defs, table_width)
def graph_all_fields(team_id=None, channel=None, params=None): load_dependencies('syncer,requests,pyppeteer,websocket-client') graph_data = DataTable_Js_Views._get_data(params.pop(0)) if graph_data: nodes = graph_data.get('nodes') headers = sorted(list(set(list(nodes.values()).pop()))) rows = [] for index, node in enumerate(nodes.values()): row = [index + 1] for header in headers: value = node.get(header) if type(value).__name__ == 'dict': value = json.dumps(value) row.append(value) rows.append(row) headers.insert(0, '#') return DataTable_Js_Views._create_table(headers, rows, team_id, channel)
def run(event, context): load_dependencies('syncer,requests,pyppeteer,websocket-client') from osbot_aws.helpers.Lambda_Helpers import slack_message from osbot_browser.browser.sites.Web_Slack import Web_Slack from osbot_browser.browser.Browser_Lamdba_Helper import Browser_Lamdba_Helper target = event.get('target') channel = event.get('channel') team_id = event.get('team_id') width = event.get('width') height = event.get('height') scroll_by = event.get('scroll_by') delay = event.get('delay') try: if width is None: width = 1200 if height is None: height = 1000 web_slack = Web_Slack(team_id=team_id).setup() web_slack.login() web_slack.page.width(width, height) if target: web_slack.open(target) if scroll_by: web_slack.scroll_messages_by(scroll_by) if delay: web_slack.wait(delay) web_slack.fix_ui_for_screenshot() png_data = web_slack.screenshot() slack_message( ':information_source: got screenshot with size `{0}` | :point_right: sending screeenshot to slack channel `{1}`' .format(len(png_data), channel), [], channel=channel, team_id=team_id) browser_helper = Browser_Lamdba_Helper() return browser_helper.send_png_data_to_slack(team_id, channel, target, png_data) except Exception as error: return slack_message( ':red_circle: Error in `slack_web` lambda: {0}'.format(error), [], channel=channel, team_id=team_id)
def default(team_id=None, channel=None, params=None, no_render=False, take_screenshot=True, headless=True): load_dependencies('syncer,requests,pyppeteer,websocket-client') from osbot_browser.view_helpers.Vis_Js import Vis_Js graph_name = params.pop(0) vis_js = Vis_Js(headless=headless) # will start browser graph_data = vis_js.get_graph_data(graph_name) nodes = [] edges = [] vis_js.load_page(False) if graph_data: graph_name = graph_data.get('graph_name') for key, issue in graph_data.get('nodes').items(): nodes.append({'id': key, 'label': key}) for edge in graph_data.get('edges'): from_node = edge[0] link_type = edge[1] to_node = edge[2] edges.append({ 'from': from_node, 'to': to_node, 'label': link_type }) if no_render is False: vis_js.create_graph(nodes, edges, {}, graph_name) if no_render is True: return (graph_name, nodes, edges, graph_data, vis_js) if take_screenshot: return vis_js.send_screenshot_to_slack(team_id, channel) else: return vis_js
def issue(team_id=None, channel=None, params=None): load_dependencies('syncer,requests,pyppeteer,websocket-client') graph_data = DataTable_Js_Views._get_data(params.pop(0)) if graph_data: nodes = graph_data.get('nodes') node = list(nodes.values()).pop() fields = sorted(list(set(node))) rows = [] for field in fields: row = ['<b>{0}</b>'.format(field)] value = node.get(field) if value: if type(value).__name__ == 'dict': value = json.dumps(value) row.append(value) rows.append(row) return DataTable_Js_Views._create_table(['name', 'value'], rows, team_id, channel)
def graph(team_id=None, channel=None, params=None): load_dependencies( 'syncer,requests,pyppeteer,websocket-client' ) # todo: remove this from here (should already not be needed) if len(params) < 2: text = ':red_circle: Hi, for the `graph` command, you need to provide 2 parameters: ' attachment_text = '*graph name* - the nodes and edges you want to view\n' \ '*view name* - the view to render' return text, [{'text': attachment_text}] from osbot_browser.view_helpers.Vis_Js_Views import Vis_Js_Views params[0], params[1] = params[1], params[ 0] # swap items (since it is more user friendly to add the graph name first) (text, attachments ) = Slack_Commands_Helper(Vis_Js_Views).show_duration(False).invoke( team_id, channel, params) if team_id is None: return text
def run(event, context=None): try: load_dependencies('requests,syncer,pyppeteer,websocket-client') channel = event.get('channel') team_id = event.get('team_id') params = event.get('params') if params and len(params) == 1: params = [ ] # todo: fix this case (when the last param is the events data), needs to be handled by Jupyter_Web_Commands from osbot_jupyter.osbot.Jupyter_Web_Commands import Jupyter_Web_Commands result = Slack_Commands_Helper(Jupyter_Web_Commands).invoke( team_id, channel, params) if channel is None: return result except Exception as error: message = "[jupyter_web] Error: {0}".format(error) return message
def chord(team_id=None, channel=None, params=None, headless=True): load_dependencies('syncer,requests,pyppeteer,websocket-client'); (am_charts, graph_data) = Am_Charts_Views._get_graph_data(params, headless=headless) Dev.pprint(graph_data) am_charts.load_page(True) js_code= """ var chart = am4core.create("chartdiv", am4charts.ChordDiagram); chart.hiddenState.properties.opacity = 0; chart.dataFields.fromName = "from"; chart.dataFields.toName = "to"; chart.dataFields.value = "value"; // make nodes draggable var nodeTemplate = chart.nodes.template; nodeTemplate.readerTitle = "Click to show/hide or drag to rearrange"; nodeTemplate.showSystemTooltip = true; nodeTemplate.cursorOverStyle = am4core.MouseCursorStyle.pointer """ am_charts.exec_js(js_code) data = [{ "from": "A", "to": "D", "value": 1 }, { "from": "B", "to": "D", "value": 1 }, { "from": "B", "to": "E", "value": 1 }, { "from": "B", "to": "C", "value": 1 }, { "from": "C", "to": "E", "value": 1 }, { "from": "E", "to": "D", "value": 1 }, { "from": "C", "to": "A", "value": 1 }, { "from": "G", "to": "A", "value": 1 }, { "from": "D", "to": "B", "value": 1 }]; data = [] for edge in graph_data.get('edges'): data.append({ "from": edge[0], "to": edge[2], "value": 1 }) am_charts.assign_variable_js('window.chart.data',data) return am_charts.send_screenshot_to_slack(team_id, channel)
def run(event, context): load_dependencies('requests,elastic') from osbot_aws.helpers.Lambda_Helpers import log_to_elk from osbot_jira.api.jira_server.API_Jira_To_Elastic import API_Jira_To_Elastic try: data = json.loads(event.get('body')) event_type = data.get('webhookEvent') user_id = event.get('queryStringParameters').get('user_id') message = API_Jira_To_Elastic().handle_event(event_type, user_id, data) status_code = 200 except Exception as error: message = f'error in on_jira_change: {error}' log_to_elk(message, f"{event.get('body')}", index='elastic_logs', level='error') status_code = 200 # don't return error 500 or Jira will keep sending it return { "isBase64Encoded": False , "statusCode" : status_code, "headers" : {} , "body" : f'{message}' }
def render(team_id, channel, params): load_dependencies('syncer,requests,pyppeteer,websocket-client') if params: target = params.pop(0) delay = Misc.to_int(Misc.array_pop(params, 0)) if len(params) == 4: clip = { 'x': int(params[0]), 'y': int(params[1]), 'width': int(params[2]), 'height': int(params[3]) } else: clip = None else: return None slack_message(":point_right: rendering file `{0}`".format(target), [], channel, team_id) return Browser_Lamdba_Helper().setup().render_file(team_id, channel, target, clip=clip, delay=delay)
def _get_gcalendar(): load_dependencies('syncer', 'requests', 'gmail') return GCalendar(gsuite_secret_id=gsuite_secret_id)
def timeline(team_id=None, channel=None, params=None, headless=True): load_dependencies('syncer,requests,pyppeteer,websocket-client'); from osbot_browser.view_helpers.Am_Charts import Am_Charts am_charts = Am_Charts(headless=headless) Misc.array_pop(params,0) # remove the graph name (which is not used) width = Misc.to_int(Misc.array_pop(params, 0)) height = Misc.to_int(Misc.array_pop(params, 0)) clip = {'x': 0, 'y': 50, 'width': width, 'height': height-100} #clip = None am_charts.browser().sync__browser_width(width, height) try: data = json.loads(" ".join(params)) am_charts.load_page(True) js_code = """ // Create chart instance var chart = am4core.create("chartdiv", am4charts.XYChart); // Create axes var xAxis = chart.xAxes.push(new am4charts.CategoryAxis()); xAxis.dataFields.category = "x"; xAxis.renderer.grid.template.disabled = true; xAxis.renderer.labels.template.disabled = true; xAxis.tooltip.disabled = true; var yAxis = chart.yAxes.push(new am4charts.ValueAxis()); yAxis.min = 0; yAxis.max = 1.99; yAxis.renderer.grid.template.disabled = true; yAxis.renderer.labels.template.disabled = true; yAxis.renderer.baseGrid.disabled = true; yAxis.tooltip.disabled = true; // Create series var series = chart.series.push(new am4charts.LineSeries()); series.dataFields.categoryX = "x"; series.dataFields.valueY = "y"; series.strokeWidth = 4; series.sequencedInterpolation = true; var bullet = series.bullets.push(new am4charts.CircleBullet()); bullet.setStateOnChildren = true; bullet.states.create("hover"); bullet.circle.radius = 10; bullet.circle.states.create("hover").properties.radius = 15; var labelBullet = series.bullets.push(new am4charts.LabelBullet()); labelBullet.setStateOnChildren = true; labelBullet.states.create("hover").properties.scale = 1.2; labelBullet.label.text = "{text}"; labelBullet.label.maxWidth = 150; labelBullet.label.wrap = true; labelBullet.label.truncate = false; labelBullet.label.textAlign = "middle"; labelBullet.label.paddingTop = 20; labelBullet.label.paddingBottom = 20; labelBullet.label.fill = am4core.color("#999"); labelBullet.label.states.create("hover").properties.fill = am4core.color("#000"); labelBullet.label.propertyFields.verticalCenter = "center"; chart.cursor = new am4charts.XYCursor(); chart.cursor.lineX.disabled = true; chart.cursor.lineY.disabled = true; """ # data = [{"x": "1","y": 1,"text": "[bold]2018 Q1[/]\nAAAA There seems to be some furry animal living in the neighborhood.", "center": "bottom"}, { # "x": "2", # "y": 1, # "text": "[bold]2018 Q2[/]\nWe're now mostly certain it's a fox.", # "center": "top" # }, { # "x": "3", # "y": 1, # "text": "[bold]2018 Q3[/]\nOur dog does not seem to mind the newcomer at all.", # "center": "bottom" # }, { # "x": "4", # "y": 1, # "text": "[bold]2018 Q4[/]\nThe quick brown fox jumps over the lazy dog.", # "center": "top" # }]; am_charts.exec_js(js_code) am_charts.assign_variable_js('window.chart.data', data) return am_charts.send_screenshot_to_slack(team_id, channel,clip=clip) #return "ok {0}".format(data) except Exception as error: return "error: {0}".format(error)
def load_browser_dependencies(self): load_dependencies('syncer,requests,pyppeteer2,websocket-client')