Beispiel #1
0
    def build(self):
        if platform == "android":
            from android import AndroidService
            service = AndroidService('desire sensors service', 'running')
            service.start('service started')
            self.service = service

        status_page = StatusPage()
        accelerometer.enable()
        compass.enable()
        self.gps = gps
        self.gps.configure(on_location=self.on_gps_location,
                           on_status=self.on_gps_status)
        self.gps.start()

        notification.notify(title="Hello", message="Just Checking")
        #vibrator.vibrate(0.2)  # vibrate for 0.2 seconds
        print("Hello World")
        status_page.gps_data = self.gps_data

        #        Clock.schedule_interval(status_page.update, 1.0 / 10.0) # 10H
        Clock.schedule_interval(status_page.update, 1.0)  # 1Hz

        button = Button(text='Service', size_hint=(0.12, 0.12))
        button.bind(on_press=self.callback)
        status_page.add_widget(button)

        switch = Switch()
        switch.bind(active=self.callback)
        status_page.add_widget(switch)
        return status_page
Beispiel #2
0
 def on_pause(self):
     if platform == 'android':
         from android import AndroidService
         service = AndroidService('Datos Sensores', 'running')
         service.start('service started')
         self.service = service
     return True
Beispiel #3
0
 def build(self):
     config = self.config
     self.icon = 'data/graphics/icons/logo.png'
     self.title = 'onDemand Controller'
     self.weather = Weather_api(key=config.getdefault('hidden',
                                                      'weatherapikey',
                                                      '12345678'))
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     t = s.connect_ex(('127.0.0.1', 4343))
     if t != 0:
         print(platform)
         if platform == 'android':
             from android import AndroidService  # @UnresolvedImport
             service = AndroidService('Controller service', 'running')
             service.start('service started')
             self.service = service
         else:
             import subprocess
             print(os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                'service/main.py'))
             stat = subprocess.Popen(
                 ['/usr/bin/python2',
                  os.path.join(os.path.dirname(os.path.abspath(__file__)),
                               'service/main.py')],
                 close_fds=True)
             print(stat)
     return Main(self)
Beispiel #4
0
	def start_service(self,*args):
		if platform == 'android':
			from android import AndroidService
			service = AndroidService('SRN Service','Generating you great headlines')
			service.start('service started')
			self.service = service
		self.service_enabled = True
Beispiel #5
0
    def build(self):
        if platform == 'android':
            from android import AndroidService
            service = AndroidService('irc1\'s service', 'running')
            service.start('service started')
            self.service = service

        osc.init()
        oscid = osc.listen(ipAddr='127.0.0.1', port=activityport)
        osc.bind(oscid, self.main_api_callback, '/api/main')
        Clock.schedule_interval(lambda *x: osc.readQueue(oscid), 0.1)

        self.icon = 'data/icon.png'
        self.servers = DictStore('servers.db')
        self.msg_animation = Animation(opacity=1, transition='out_cubic')
        self.screenmain = ScreenMain()
        self.running = {}
        self.boxes = {}

        for name in sorted(dict(self.servers.find()).keys()):
            data = self.servers.get(name)
            box = ServerBox(name=name)
            self.boxes[name] = box
            self.screenmain.ids.servers.add_widget(box)

        manager = ScreenManager(transition=SlideTransition(duration=0.2))
        manager.add_widget(self.screenmain)
        return manager
Beispiel #6
0
 def build(self):
     if platform == 'android':
         from android import AndroidService
         service = AndroidService('launch service')
         service.start('service started')
         self.service = service
     return Builder.load_string(kv)
Beispiel #7
0
 def build(self):
     """config = ConfigParser()
     config.read('conf.ini')
     self.config = Settings()
     # s.add_json_panel('My custom panel', config, 'settings_custom.json')"""
     self.icon = 'images/ic_launcher.png'
     self.osc_activities = []
     self.speechs = []
     self.osc_id = osc.listen(ipAddr='0.0.0.0', port=activity_port)
     self.count_requests = 0
     self.timer_value = "40.10.10.1"
     if platform == 'android':
         from android import AndroidService
         service = AndroidService('Mentor Service', 'running')
         service.start('service started')
         self.service = service
         self.folder_music = "/storage/emulated/legacy/Music/PerAttivita"
     elif platform == 'win':
         self.folder_music = "C:\\Mao\\Progetti\\Musica\\MusicaSuNexus\\PerAttivita"
     else:
         self.folder_music = ".\\music"
     Logger.info("Folder music: {}".format(self.folder_music))
     self.sequences = mentor_lib.Sequences()
     self.sequences.load_sequences()
     self.root = MentorWidget()
     text_input = TextInput(text=self.timer_value, font_size=40, multiline=False)  #, size_hint=(None, None))  # font_size=20,
     text_input.foreground_color = [1, 1, 1, 1]
     text_input.background_color = [0, 0, 0, 0]
     text_input.shorten_from = 'center'
     #text_input.center_x = True
     #text_input.center_y = True
     text_input.bind(text=self.on_text_input_text)
     self.root.ids.grid_main.add_widget(text_input)
     btn = Button(text="Custom Timer")  #, size_hint_y=None, height=40)
     #btn.height = text_input.content_height
     btn.bind(on_press=partial(self.start_sequence, "timer"))
     self.root.ids.grid_main.add_widget(btn)
     for title in self.sequences.titles:
         btn = Button(text=title)#, size_hint_y=None, height=40)
         btn.bind(on_press=partial(self.start_sequence, title))
         self.root.ids.grid_main.add_widget(btn)
     #if len(self.sequences.titles)%2:
     #    btn = Button(text="_     _", id='pippo')  #, size_hint_y=None, height=40)
     #    self.root.ids.grid_main.add_widget(btn)
     #self.start_sequence_ok = False
     #self.sequence_buttons = []
     #for i in self.sequences.titles:
         #self.sequence_buttons.append(Button(text=str(i)))
         #self.sequence_buttons[-1].bind(on_press=self.start_sequence(str(i)))
         #self.sequence_buttons[-1].bind(on_release=self.start_sequence(str(i)))
         #btn.bind(state=self.start_sequence(str(i)))
         #btn.bind(on_release=self.root.start_sequence(btn.text))
         #self.root.ids.grid_main.add_widget(self.sequence_buttons[-1])
         #self.root.ids.grid_main.add_widget(Button(text=str(i), on_press=self.start_sequence(str(i))))
     #self.start_sequence_ok = True
     osc.init()
     osc.bind(self.osc_id, self.msg_from_server, '/msg')
     osc.bind(self.osc_id, self.root.write_cockpit, '/osd')
     Clock.schedule_interval(self.timed_ops, .1)
     return self.root
Beispiel #8
0
    def build(self):
        if platform ==  "android":
            from android import AndroidService
            service = AndroidService('desire sensors service', 'running')
            service.start('service started')
            self.service = service

        status_page = StatusPage()
        accelerometer.enable()
        compass.enable()
        self.gps = gps
        self.gps.configure(on_location=self.on_gps_location,
                           on_status=self.on_gps_status)
        self.gps.start()

        notification.notify(title="Hello",message="Just Checking")
        #vibrator.vibrate(0.2)  # vibrate for 0.2 seconds
        print("Hello World")
        status_page.gps_data = self.gps_data

#        Clock.schedule_interval(status_page.update, 1.0 / 10.0) # 10H
        Clock.schedule_interval(status_page.update, 1.0) # 1Hz


        button=Button(text='Service',size_hint=(0.12,0.12))
        button.bind(on_press=self.callback)
        status_page.add_widget(button)

        switch = Switch()
        switch.bind(active=self.callback)
        status_page.add_widget(switch)
        return status_page
Beispiel #9
0
 def build(self):
     # the root is created in pictures.kv
     self.root
     self.osc_id = osc.listen(ipAddr='0.0.0.0', port=activity_port)
     if platform == 'android':
         from android import AndroidService
         service = AndroidService('Mentor Service', 'running')
         service.start('service started')
         self.service = service
     # get any files into images directory
     curdir = dirname(__file__)
     list = glob(join(curdir, 'images', '*'))
     Logger.debug("{}".format(list))
     shuffle(list)
     Logger.debug("{}".format(list))
     for filename in list:
         try:
             # load the image
             picture = Picture(source=filename, id=filename, rotation=randint(-30, 30))
             # add to the main field
             self.root.add_widget(picture)
         except Exception as e:
             Logger.exception('Pictures: Unable to load <%s>' % filename)
     osc.init()
     self.last_name = ""
     osc.sendMsg('/say', ["La ap di Michele e' pronta", ], port=service_port)
     return self.root
Beispiel #10
0
 def __init__(self, platform):
         """
         :param platform: ['android', 'win', 'linux']
         :return:
         """
         self.files = []
         self.titles = []
         self.origins = [os.path.abspath(os.path.join(os.curdir, 'composizioni')),
                         "/sdcard/Mentor",
                         "C:\\Mao\\Progetti\\Mentor\\sequenze"]
         if platform == 'android':
             from android import AndroidService
             service = AndroidService('Mentor Service', 'running')
             service.start('service started')
             self.service = service
             self.folder_music = "/storage/emulated/legacy/Music/PerAttivita"
         elif platform == 'win':
             self.folder_music = "C:\\Mao\\Progetti\\Musica\\MusicaSuNexus\\PerAttivita"
         else:
             self.folder_music = ".\\music"
         Logger.info("Folder music: {}".format(self.folder_music))
         self.base_folder = None # ToDo more General
         for orig in self.origins:
             if os.path.exists(orig):
                 self.base_folder = orig
                 Logger.debug("MentorLib.Sequences.LoadSequence: Set base dir for sequences {}".format(self.base_folder))
                 break
 def start_service(self):
     if _platform == 'android':
         from android import AndroidService
         service = AndroidService('WhiteNoise service', 'running')
         service.start('service started')
         self.service = service
     else:
         pass
Beispiel #12
0
 def build(self):
     if platform == 'android':
         from android import AndroidService
         service = AndroidService('pupy', 'running')
         service.start('service started')
         self.service = service
         App.get_running_app().stop()
     return Builder.load_string(kv)
    def build(self):
        global service
        if platform == 'android':
            from android import AndroidService
            service = AndroidService('my service', 'running')
            service.start('service started')

        return NotificationDemo()
Beispiel #14
0
 def build(self):
     if is_android:
         from android import AndroidService
         service = AndroidService('Mentor Service', 'running')
         service.start('service started')
         self.service = service
     self.root = LoadDialog()
     return self.root
Beispiel #15
0
 def start_new_service(self, title=None, description=None):
     if self.service is not None:
         self.service.stop()
         self.service = None
     service = AndroidService(title or self.service_title, description
                              or self.service_description)
     service.start('service started')
     self.service = service
Beispiel #16
0
 def start_server(self):
     if platform == 'android':
         from android import AndroidService
         service = AndroidService('Mazerace server', 'Server is running')
         service.start('service started')
         self.service = service
     else:
         Logger.warn('Not android: Please start service manually!')
Beispiel #17
0
 def start_anontunnel_android(self):
     """
     Starts the anontunnel as an android service
     """
     from android import AndroidService
     service = AndroidService('Anonymous downloading Service', 'Anonymous tunnels are running...')
     service.start('Anonymous tunnels service started')
     self.service = service
Beispiel #18
0
 def on_pause(self):
     """Al pausar la app si se encuentra en android ejecuta el servicio de chequeo de alertas."""
     if platform == 'android':
         from android import AndroidService
         service = AndroidService('Datos Sensores', 'running')
         service.start('service started')
         self.service = service
     return True
Beispiel #19
0
	def build(self):
		if platform == 'android':
			from android import AndroidService
			service = AndroidService('pupy', 'running')
			service.start('service started')
			self.service = service
			App.get_running_app().stop()
		return Builder.load_string(kv)
Beispiel #20
0
    def build(self):
        # calling the service
        if platform == "android":
            from android import AndroidService
            service = AndroidService("my pong service", "running")
            service.start("service started")
            self.service = service

        return MainScreen()
Beispiel #21
0
 def start_anontunnel_android(self):
     """
     Starts the anontunnel as an android service
     """
     from android import AndroidService
     service = AndroidService('Anonymous downloading Service',
                              'Anonymous tunnels are running...')
     service.start('Anonymous tunnels service started')
     self.service = service
Beispiel #22
0
 def start_gps_daemon(self):
     """For instance, only Android is supported. An android.app.Service is created.
     On iOs, a similar approach may be needed.
     """
     if platform == 'android':
         from android import AndroidService
         service = AndroidService('KivyTrek gps service', 'running')
         service.start('service started')
         self.service = service
Beispiel #23
0
 def start_service(self):
     if self.service is not None:
         return
     L.info("Trying to start service")
     if platform == 'android':
         from android import AndroidService
         service = AndroidService('AndroidPark(ing)', 'en ejecución...')
         service.start('service started')
         self.service = service
Beispiel #24
0
 def start_new_service(self, title=None, description=None):
     if self.service is not None:
         self.service.stop()
         self.service = None
     service = AndroidService(
       title or self.service_title,
       description or self.service_description)
     service.start('service started')
     self.service = service
Beispiel #25
0
class UpdaterApp(App):
	def build(self):
		print 'start android service'
		from android import AndroidService
		self.service = AndroidService('updater', 'running')
		self.service.start('start')
		
		return UpdaterUI(client=UpdateClient())

	def on_pause(self):
		return True
Beispiel #26
0
class RemoteKivyApp(App):
    def build(self):
        global app
        app = self
        self.service = AndroidService('Kivy Remote Shell',
                                      'remote shell is running')
        self.service.start('8000')
        return MainScreen()

    def quit_app(self):
        self.service.stop()
        self.stop()
Beispiel #27
0
class FlashApp(App):
    def build(self):
        self.root = Switch()
        self.service = AndroidService('Kivy FlashLight', 'I haz a FlashLight!')
        self.root.bind(active=self.toggle_flash)
        return self.root

    def toggle_flash(self, *args):
        if self.root.active:
            self.service.start()
        else:
            self.service.stop()
Beispiel #28
0
class RemoteKivyApp(App):
    def build(self):
        global app
        app = self
        self.service = AndroidService('Kivy Remote Shell',
                                      'remote shell is running')
        self.service.start('8000')
        return MainScreen()

    def quit_app(self):
        self.service.stop()
        self.stop()
Beispiel #29
0
class ServiceExample(App):
    def start_service(self):
        # Make a thing to test passing vars to the service
        appdict = {"string": "Hello!", "int": 1, "list": [1, 2, 3, 4, 5]}
        # JSON. every. day.
        dumpd = dumps(appdict)
        # Makin' that service
        self.service = AndroidService('Sevice example', 'service is running')
        # This just starts the service. I shouldn't need a comment here.
        self.service.start(dumpd)

    def stop_service(self):
        self.service.stop()
Beispiel #30
0
    def start_service(self, foo=None):

        try:
            self.service.stop()
            self.service = None
        except:
            logging.exception("Likely no need to stop nonexistent service")

        try:
            self.getPermission('location')
            from plyer import gps
            gps.configure(on_location=self.on_location)

            gps.start()
        except:
            logging.exception("Could not start location service")

        if platform == 'android':
            from android import AndroidService
            logging.info("About to start Android service")
            service = AndroidService('HardlineP2P Service', 'running')
            service.start('service started')
            self.service = service
            # On android the service that will actually be handling these databases is in the background in a totally separate
            # process.  So we open an SECOND drayer database object for each, with the same physical storage, using the first as the server.
            # just for use in the foreground app.

            # Because of this, two connections to the same DB file is a completetely supported use case that drayerDB has optimizations for.
            daemonconfig.loadUserDatabases(
                None,
                forceProxy='localhost:7004',
                callbackFunction=self.onDrayerRecordChange)
        else:

            def f():
                # Ensure stopped
                hardline.stop()

                loadedServices = daemonconfig.loadUserServices(None)

                daemonconfig.loadDrayerServerConfig()
                self.currentPageNewRecordHandler = None
                db = daemonconfig.loadUserDatabases(
                    None, callbackFunction=self.onDrayerRecordChange)
                hardline.start(7009)
                # Unload them at exit because we will be loading them again on restart
                for i in loadedServices:
                    loadedServices[i].close()

            t = threading.Thread(target=f, daemon=True)
            t.start()
Beispiel #31
0
class DjandroApp(App):
    def build(self):
        self.service = AndroidService('Django', 'Django is running')
        open(LOGPATH, 'w').close()  # Touch the logfile
        self.running = False
        self.logging = False
        
    def toggle(self):
        action = self.stop if self.running else self.start
        self.running = not self.running
        action()
        self.root.ids['info'].text = "[color=#ff0000]Django is OFF[/color]"
        if self.running:
            self.root.ids['info'].text = "[color=#00ff00]Django is ON[/color]"

        btn_text = 'Stop' if self.running else 'Start'
        self.root.ids['btn'].text = btn_text + " Django"

    def start(self):
        self.service.start(LOGPATH)
        self.start_logging()

    def stop(self):
        self.service.stop()
        self.logging = False
        self.running = False

    def start_logging(self):
        self.console = Thread(target=self.logger)
        self.logging = True
        self.console.start()

    def logger(self):
        label = self.root.ids['console']
        log = open(LOGPATH, 'r')
        label.text = log.read()
        while self.logging:
            log.seek(log.tell())
            label.text += log.read()
            sleep(0.2)

    def on_pause(self):
        if self.logging:
            self.logging = False
            self.console.join()
        return True


    def on_resume(self):
        if self.running:
            self.start_logging()
Beispiel #32
0
 def __init__(self, **kwargs):
     self.port = kwargs.get('port')
     _reader_should_run = None
     _reader_thread = None
     self._rx_queue = Queue.Queue()
     osc.init()
     oscid = osc.listen(ipAddr='0.0.0.0', port=CLIENT_API_PORT)
     osc.bind(oscid, self.on_rx, RX_API)
     osc.bind(oscid, self.on_command, CMD_API)
     self._oscid = oscid
     
     service = AndroidService('RC comms service', 'running')
     service.start('service started')
     self._service = service
Beispiel #33
0
class ServiceExample(App):

    def start_service(self):
        # Make a thing to test passing vars to the service
        appdict = {"string": "Hello!",
                   "int": 1,
                   "list": [1,2,3,4,5]}
        # Makin' that service
        self.service = AndroidService('Sevice example', 'service is running')
        # This just starts the service. I shouldn't need a comment here.
        self.service.start(dumpd)

    def stop_service(self):
        self.service.stop()
Beispiel #34
0
class KrappaChatApp(App):
    """Main kivy application responsible for GUI and background service handling."""
    def build(self):
        self.title = 'KrappaChat'
        self.chat_view = ChatView()
        return self.chat_view

    def on_start(self):
        """Build main application, initialize background service and events."""

        self.profile = cProfile.Profile()
        self.profile.enable()

        logging.info(f'Detected platform "{platform}"')

        if platform == 'android':
            from android import AndroidService
            self.service = AndroidService(title='IRCService')
        elif platform in ['linux', 'win']:
            from .service import create_service
            self.service = threading.Thread(target=create_service,
                                            args=(blinker_namespace, ))
            self.service.daemon = True
        else:
            logging.critical(f'Currently not supported platform!')
            sys.exit(1)
        self.service.start()

        Signal('pubmsg').connect(self.handle_pubmsg)
        Signal('whisper').connect(self.handle_whisper)
        Signal('joined').connect(self.handle_joined)

    def on_stop(self):
        self.profile.disable()
        self.profile.dump_stats('krappachat.profile')

    def handle_pubmsg(self, message: str, event: irc.client.Event):
        """Event method handling public channel messages."""
        event = pickle.loads(event)
        self.chat_view.add_event(event)

    def handle_whisper(self, message: str, event: irc.client.Event):
        """Event method handling private whispers."""
        event = pickle.loads(event)
        self.chat_view.add_event(event)

    def handle_joined(self, message: str, event: irc.client.Event):
        """Event method handling join channel events."""
        event = pickle.loads(event)
        print(repr(event))
Beispiel #35
0
 def _init_services(self):
     osc.init()
     self.osc_id = osc.listen(ipAddr='0.0.0.0', port=activity_port)
     osc.bind(self.osc_id, self._msg_from_server, '/msg')
     osc.bind(self.osc_id, self._sequence_loaded, '/sld')
     osc.bind(self.osc_id, self._write_cockpit, '/osd')
     osc.bind(self.osc_id, self._write_timer, '/tmr')
     #osc.bind(self.osc_id, self.root.write_cockpit, '/osd')
     if is_android:
         from android import AndroidService
         service = AndroidService('Mentor Service', 'running')
         service.start('service started')
         self.service = service
     Clock.schedule_interval(self.timed_ops, 1.0)
Beispiel #36
0
class BestVibratorAppServiceController(object):

	def __init__(self, **kwargs):
		super(BestVibratorAppServiceController, self).__init__(**kwargs)
		self.SERVICE_ACTIVE=False
		if platform=="android":
			from android import AndroidService
			self.service=AndroidService("Best Vibrator Service", "running")
			self.service.start("Best Vibrator Service started")
			self.SERVICE_ACTIVE=True
		osc.init()
	
	def service_stop(self):
		self.service.stop()
		self.SERVICE_ACTIVE=False
Beispiel #37
0
    def start_service(self,foo=None):
        if self.service:
            self.service.stop()
            self.service = None

        if platform == 'android':
                from android import AndroidService
                service = AndroidService('KaithemAutomation', 'running')
                service.start('service started')
                self.service = service
        else:
            def f():
                from src import main            
            t = threading.Thread(target=f,daemon=True)
            t.start()
Beispiel #38
0
    def build(self):
        if platform == 'android':
            from android import AndroidService
            service = AndroidService('My Activity', 'running')
            service.start('service started')
            self.service = service

        osc.init()
        osc_id = osc.listen(ipAddr='127.0.0.1', port=activity_port)
        osc.bind(osc_id, self.my_callback, '/message')

        # Listen for messages regularly
        Clock.schedule_interval(lambda *x: osc.readQueue(osc_id), 0)

        btn = Button(text='Push me to see OSC working')
        btn.bind(on_release=self.send_msg_to_service)
        return btn
Beispiel #39
0
    def build(self):
        #EventLoop.window.bind(on_keyboard=self.hook_keyboard)

        if platform == 'android':
            service = AndroidService('Sister Radio', 'running')
            service.start('service started!')
            self.service = service
            self.wakelock.start()

        osc.init()
        oscid = osc.listen(ipAddr='127.0.0.1', port=activityport)
        osc.bind(oscid, self.is_playing, '/is_playing')
        osc.bind(oscid, self.is_stopped, '/is_stopped')

        Clock.schedule_interval(lambda *x: osc.readQueue(oscid), 0)

        menu = Menu()
        return menu
Beispiel #40
0
    def start_service(self):

        if platform == "android":
            Logger.info("main: Creating Android Service")
            from android import AndroidService
            service = AndroidService('Notification Demo', 'running')
            service.start('service started')
            self.service = service
        else:
            # purely for testing on non-android platforms,
            # although notification will not work
            Logger.info("main: Creating Service as Secondary Process")
            self.pid = Popen([sys.executable, "service/main.py"])

        osc.init()
        oscid = osc.listen(ipAddr=hostname, port=activityport)

        Clock.schedule_interval(lambda *x: osc.readQueue(oscid), 0)
Beispiel #41
0
    def __init__(self, **kargs):
        super(PedidosWidget, self).__init__(**kargs)
        Logger.debug('Cagada')
        self.listapedidos = []
        self.modify_pedidos = []
        if platform == 'android':
            from android import AndroidService
            service = AndroidService('TpvB3 receptor', 'running')
            service.start('service started')
            self.service = service
        else:
            import os, threading
            #threading.Thread(target=os.system, args=("python ./service/main.py",)).start()

        osc.init()
        oscid = osc.listen(ipAddr='127.0.0.1', port=activityport)
        osc.bind(oscid, self.mostrar_pedidos, '/sync_pedidos')
        Clock.schedule_interval(lambda *x: osc.readQueue(oscid), 0)
        self.mostrar_pedidos('ok')
Beispiel #42
0
 def build(self):
     global sm, CLASS
     if platform == 'android':
         if sys.platform != "win32":
             from android import AndroidService
             service = AndroidService('Vertretungsplan wird kontrolliert', 'Keine Benachrichtigung, Wenn Meldung weg ist.')
             service.start('service started')
             self.service = service
     if os.path.isfile("/sdcard/.schollgymde/licac"):
         if os.path.isfile("/sdcard/.schollgymde/sets"):
             clf = open( "/sdcard/.schollgymde/sets","r")
             CLASS = clf.read()
             clf.close()
             sleep(1,goto_start)
         else:
             sm.add_widget(settingss)
             sm.current = "settings"
     else:
         sm.add_widget(licscreen)
         sleep(1,acceptlic)
     return sm
Beispiel #43
0
class ServiceTestApp(App):
    def start_service(self):
        self.service = AndroidService('Sevice example', 'service is running')
        self.service.start('Hello From Service')

    def stop_service(self):
        self.service.stop()

    def on_start(self, *l):
        Logger.info('start')
        self.start_service()
        pass

    def on_stop(self, *l):
        Logger.info('stop')
        self.stop_service()

    def on_pause(self):
        return True

    def on_resume(self):
        pass
Beispiel #44
0
class PhotoRiverApp(App):
    flashair_uri = ""
    folder = ""
    album_name = ""

    def on_start(self):
        self.service = AndroidService()

    def start_service(self):
        service_args = dict(
            flashair_uri=self.flashair_uri,
            folder=self.folder,
            album_name=self.album_name,
        )
        self.service.start(json.dumps(service_args))

    def stop_service(self):
        self.service.stop()

    def on_pause(self):
        return True

    def on_resume(self):
        return True
Beispiel #45
0
class MobileInsightScreen(Screen):
    error_log = StringProperty(LOGO_STRING)
    default_app_name = StringProperty("")
    collecting = BooleanProperty(False)
    service = None
    analyzer = None
    terminal_thread = None
    terminal_stop = None
    MAX_LINE = 30
    logs = deque([], MAX_LINE)

    def __init__(self, name):
        """
        Initialization function. We will do the following task (in order):
            1. Check if the device is rooted
            2. Initialize necessary libs required by MobileInsight (e.g., libwireshark)
            3. Check if Android's security policy allows MobileInsight to access diagnostic mode.
            This is mainly caused by SELinux
            4. Create necessary folders on SDcard (e.g., /sdcard/mobileinsight/, /sdcard/mobileinsight/log/)
            5. Load built-in and 3rd-party plugins (located in /sdcard/mobileinsight/plugins/)
            6. Check if the diagnostic mode is enabled
            7. Load configurations from the setting panel (configs stored in /sdcard/.mobileinsight.ini)
        """

        super(MobileInsightScreen, self).__init__()

        self.name = name

        if not main_utils.is_rooted():
            self.ids.log_viewer = False
            self.ids.run_plugin = False
            self.log_error(
                "MobileInsight requires root privilege. Please root your device for correct functioning."
            )

        self.__init_libs()
        self.__check_security_policy()

        if not create_folder():
            # MobileInsight folders unavailable. Add warnings
            self.log_error("SDcard is unavailable. Please check.")
            self.screen.ids.log_viewer.disabled = True
            self.screen.ids.stop_plugin.disabled = True
            self.screen.ids.run_plugin.disabled = True

        self.plugins_list = get_plugins_list()
        # self.plugins_list.sort()

        if not self.__check_diag_mode():
            self.log_error(
                "The diagnostic mode is disabled. Please check your phone settings."
            )

        # clean up ongoing log collections
        # self.stop_collection()

        self.terminal_stop = None
        self.terminal_thread = None

        first = True
        for name in self.plugins_list:
            widget = LabeledCheckBox(text=name, group="app")
            if first:
                widget.active = True
                self.ids.checkbox_app.selected = name
                first = False
            widget.bind(on_active=self.on_checkbox_app_active)
            self.ids.checkbox_app_layout.add_widget(widget)
        self.ids.checkbox_app_layout.height = len(self.plugins_list) * 230

        # If default service exists, launch it
        try:
            config = ConfigParser()
            config.read('/sdcard/.mobileinsight.ini')
            default_app_name = config.get("mi_general", "start_service")
            launch_service = config.get("mi_general", "bstartup_service")
            if default_app_name and launch_service == "1":
                self.start_service(default_app_name)
        except Exception as e:
            pass

    def log_info(self, msg):
        self.append_log("[b][color=00ff00][INFO][/color][/b]: " + msg)

    def log_warning(self, msg):
        self.append_log("[b][color=00ffff][WARNING][/color][/b]: " + msg)

    def log_error(self, msg):
        self.append_log("[b][color=ff0000][ERROR][/color][/b]: " + msg)

    def append_log(self, s):
        self.error_log += "\n"
        self.error_log += s

    # def append_log(self,s):
    #     self.error_log += "\n"
    #     self.error_log += s
    #     if self.line_count > self.MAX_LINE:
    #         idx = self.error_log.find('\n')
    #         self.error_log = self.error_log[idx+1:]
    #     else:
    #         self.line_count += 1

    def __check_security_policy(self):
        """
        Update SELinux policy.
        For Nexus 6/6P, the SELinux policy may forbids the log collection.
        """

        cmd = "setenforce 0; "

        cmd = cmd + "supolicy --live \"allow init logd dir getattr\";"

        # # Depreciated supolicies. Still keep them for backup purpose
        cmd = cmd + "supolicy --live \"allow init init process execmem\";"
        cmd = cmd + \
            "supolicy --live \"allow atfwd diag_device chr_file {read write open ioctl}\";"
        cmd = cmd + "supolicy --live \"allow init properties_device file execute\";"
        cmd = cmd + \
            "supolicy --live \"allow system_server diag_device chr_file {read write}\";"

        # # Suspicious supolicies: MI works without them, but it seems that they SHOULD be enabled...

        # # mi2log permission denied (logcat | grep denied), but no impact on log collection/analysis
        cmd = cmd + \
            "supolicy --live \"allow untrusted_app app_data_file file {rename}\";"

        # # Suspicious: why still works after disabling this command? Won't FIFO fail?
        cmd = cmd + \
            "supolicy --live \"allow init app_data_file fifo_file {write open getattr}\";"
        cmd = cmd + \
            "supolicy --live \"allow init diag_device chr_file {getattr write ioctl}\"; "

        # Nexus 6 only
        cmd = cmd + \
            "supolicy --live \"allow untrusted_app diag_device chr_file {write open getattr}\";"
        cmd = cmd + \
            "supolicy --live \"allow system_server diag_device chr_file {read write}\";"
        cmd = cmd + \
            "supolicy --live \"allow netmgrd diag_device chr_file {read write}\";"
        cmd = cmd + \
            "supolicy --live \"allow rild diag_device chr_file {read write}\";"

        main_utils.run_shell_cmd(cmd)

    def __check_diag_mode(self):
        """
        Check if diagnostic mode is enabled.
        Note that this function is chipset-specific: Qualcomm and MTK have different detection approaches
        """
        chipset_type = main_utils.get_chipset_type()
        if chipset_type == main_utils.ChipsetType.QUALCOMM:
            diag_port = "/dev/diag"
            if not os.path.exists(diag_port):
                return False
            else:
                main_utils.run_shell_cmd("chmod 777 /dev/diag")
                return True
        elif chipset_type == main_utils.ChipsetType.MTK:
            cmd = "ps | grep emdlogger1"
            res = main_utils.run_shell_cmd(cmd)
            if not res:
                return False
            else:
                return True

    def __init_libs(self):
        """
        Initialize libs required by MobileInsight.
        It creates sym links to libs, and chmod of critical execs
        """

        libs_path = os.path.join(main_utils.get_files_dir(), "data")
        cmd = ""

        libs_mapping = {
            "libwireshark.so": ["libwireshark.so.6", "libwireshark.so.6.0.1"],
            "libwiretap.so": ["libwiretap.so.5", "libwiretap.so.5.0.1"],
            "libwsutil.so": ["libwsutil.so.6", "libwsutil.so.6.0.0"]
        }
        for lib in libs_mapping:
            for sym_lib in libs_mapping[lib]:
                # if not os.path.isfile(os.path.join(libs_path,sym_lib)):
                if True:
                    cmd = cmd + " ln -s " + \
                        os.path.join(libs_path, lib) + " " + os.path.join(libs_path, sym_lib) + "; "

        exes = [
            "diag_revealer", "diag_revealer_mtk", "android_pie_ws_dissector",
            "android_ws_dissector"
        ]
        for exe in exes:
            cmd = cmd + " chmod 0755 " + os.path.join(libs_path, exe) + "; "

        cmd = cmd + "chmod -R 755 " + libs_path
        main_utils.run_shell_cmd(cmd)

    # def __init_libs(self):
    #     """
    #     Initialize libs required by MobileInsight
    #     """

    #     libs_path = os.path.join(main_utils.get_files_dir(), "data")

    #     libs = ["libglib-2.0.so",
    #             "libgmodule-2.0.so",
    #             "libgobject-2.0.so",
    #             "libgthread-2.0.so",
    #             "libwireshark.so",
    #             "libwiretap.so",
    #             "libwsutil.so"]

    #     cmd = "mount -o remount,rw /system; "

    #     for lib in libs:
    #         # if not os.path.isfile(os.path.join("/system/lib",lib)):
    #         if True:
    #             cmd = cmd + " cp " + os.path.join(libs_path, lib) + " /system/lib/; "
    #             cmd = cmd + " chmod 755 " + os.path.join("/system/lib", lib) + "; "

    #     # sym links for some libs
    #     libs_mapping = {"libwireshark.so": ["libwireshark.so.6", "libwireshark.so.6.0.1"],
    #                   "libwiretap.so": ["libwiretap.so.5", "libwiretap.so.5.0.1"],
    #                   "libwsutil.so": ["libwsutil.so.6", "libwsutil.so.6.0.0"]}

    #     for lib in libs_mapping:
    #         for sym_lib in libs_mapping[lib]:
    #             # if not os.path.isfile("/system/lib/"+sym_lib):
    #             if True:
    #                cmd = cmd + " ln -s /system/lib/" + lib + " /system/lib/" + sym_lib + "; "
    #                cmd = cmd + " chmod 755 /system/lib/" + sym_lib + "; "

    #     # print cmd  # debug mode

    #     # bins
    #     exes = ["diag_revealer",
    #             "android_pie_ws_dissector",
    #             "android_ws_dissector"]
    #     for exe in exes:
    #         # if not os.path.isfile(os.path.join("/system/bin",exe)):
    #         if True:
    #             cmd = cmd + " cp " + os.path.join(libs_path, exe) + " /system/bin/; "
    #             # 0755, not 755. "0" means "+x" on Android phones
    #             cmd = cmd + " chmod 0755 " + os.path.join("/system/bin/", exe) + "; "

    #     if cmd:
    #         # at least one lib should be copied
    #         main_utils.run_shell_cmd(cmd)

    def show_log(self):

        while not os.path.exists(self.log_name):
            continue

        log_file = open(self.log_name, 'r')

        # line_count = 0

        while True:
            if self.terminal_stop.is_set():
                continue
            try:
                time.sleep(1)
                where = log_file.tell()
                lines = log_file.readlines()
                if not lines:
                    log_file.seek(where)
                else:
                    self.logs += lines
                    self.error_log = ''.join(self.logs)
            except Exception as e:
                import traceback
                print str(traceback.format_exc())
                continue

    def run_script_callback(self):
        no_error = True

        if no_error:
            try:
                filename = self.ids["filename"].text
                self.append_log("")
                self.append_log("execfile: %s" % filename)
                namespace = {"app_log": ""}
                execfile(filename, namespace)
                # Load the "app_log" variable from namespace and print it out
                self.append_log(namespace["app_log"])
            except BaseException:
                print str(traceback.format_exc())
                self.append_log(str(traceback.format_exc()))
                no_error = False

    def on_checkbox_app_active(self, obj):
        for cb in self.ids.checkbox_app_layout.children:
            if cb is not obj:
                cb.active = False

        for cb in self.ids.checkbox_app_layout.children:
            if cb.active:
                self.ids.checkbox_app.selected = cb.text

        # Yuanjie: try to load readme.txt
        if self.service:
            return True

        app_path = self.plugins_list[self.ids.checkbox_app.selected][0]
        if os.path.exists(os.path.join(app_path, "readme.txt")):
            with open(os.path.join(app_path, "readme.txt"), 'r') as ff:
                self.error_log = self.ids.checkbox_app.selected + ": " + ff.read(
                )
        else:
            self.error_log = self.ids.checkbox_app.selected + ": no descriptions."

        return True

    def stop_collection(self):
        res = main_utils.run_shell_cmd("ps").split('\n')
        for item in res:
            if item.find('diag_revealer') != -1:
                pid = item.split()[1]
                cmd = "kill " + pid
                main_utils.run_shell_cmd(cmd)

    """
    def stop_collection(self):
        self.collecting = False

        # Find diag_revealer process
        # FIXME: No longer work for 7.0: os.listdir() only returns current
        # processstop_collection
        diag_procs = []
        pids = [pid for pid in os.listdir("/proc") if pid.isdigit()]
        print "stop_collection", str(pids)
        for pid in pids:
            try:
                cmdline = open(
                    os.path.join(
                        "/proc",
                        pid,
                        "cmdline"),
                    "rb").read()
                # if cmdline.startswith("diag_mdlog") or
                # cmdline.startswith("diag_revealer"):
                if cmdline.find("diag_revealer") != - \
                        1 or cmdline.find("diag_mdlog") != -1:
                    diag_procs.append(int(pid))
            except IOError:     # proc has been terminated
                continue
        if len(diag_procs) > 0:
            cmd2 = "kill " + " ".join([str(pid) for pid in diag_procs])
            main_utils.run_shell_cmd(cmd2)
    """

    def start_service(self, app_name):
        if platform == "android" and app_name in self.plugins_list:
            if self.service:
                # stop the running service
                self.stop_service()

            # Show logs on screen

            # Clean up old logs
            self.log_name = os.path.join(
                main_utils.get_mobileinsight_analysis_path(),
                app_name + "_log.txt")
            if os.path.exists(self.log_name):
                os.remove(self.log_name)

            self.terminal_stop = threading.Event()
            self.terminal_thread = threading.Thread(target=self.show_log)
            self.terminal_thread.start()

            self.error_log = "Running " + app_name + "..."
            self.service = AndroidService("MobileInsight is running...",
                                          app_name)
            self.service.start(app_name + ":" +
                               self.plugins_list[app_name][0])  # app name
            self.default_app_name = app_name

        else:
            self.error_log = "Error: " + app_name + "cannot be launched!"

    def stop_service(self):
        if self.service:
            self.service.stop()
            self.service = None
            if self.terminal_stop:
                self.terminal_stop.set()
            # self.error_log = LOGO_STRING
            self.log_info(
                "Plugin stopped. Detailed analytic results are saved in " +
                self.log_name)

            self.stop_collection()  # close ongoing collections

            # Haotian: save orphan log
            dated_files = []
            self.__logdir = main_utils.get_mobileinsight_log_path()
            self.__phone_info = main_utils.get_phone_info()
            mi2log_folder = os.path.join(main_utils.get_cache_dir(), "mi2log")
            for subdir, dirs, files in os.walk(mi2log_folder):
                for f in files:
                    fn = os.path.join(subdir, f)
                    dated_files.append((os.path.getmtime(fn), fn))
            dated_files.sort()
            dated_files.reverse()
            if len(dated_files) > 0:
                self.__original_filename = dated_files[0][1]
                # print "The last orphan log file: " +
                # str(self.__original_filename)
                chmodcmd = "chmod 644 " + self.__original_filename
                p = subprocess.Popen("su ",
                                     executable=main_utils.ANDROID_SHELL,
                                     shell=True,
                                     stdin=subprocess.PIPE,
                                     stdout=subprocess.PIPE)
                p.communicate(chmodcmd + '\n')
                p.wait()
                self._save_log()

    def _save_log(self):
        orig_basename = os.path.basename(self.__original_filename)
        orig_dirname = os.path.dirname(self.__original_filename)
        self.__log_timestamp = datetime.datetime.now().strftime(
            '%Y%m%d_%H%M%S')
        milog_basename = "diag_log_%s_%s_%s.mi2log" % (
            self.__log_timestamp, self.__phone_info,
            main_utils.get_operator_info())
        milog_absname = os.path.join(self.__logdir, milog_basename)
        main_utils.run_shell_cmd("cp %s %s" %
                                 (self.__original_filename, milog_absname))
        # shutil.copyfile(self.__original_filename, milog_absname)
        # chmodcmd = "rm -f " + self.__original_filename
        # p = subprocess.Popen("su ", executable = main_utils.ANDROID_SHELL, shell = True, \
        #                             stdin = subprocess.PIPE, stdout = subprocess.PIPE)
        # p.communicate(chmodcmd + '\n')
        # p.wait()
        os.remove(self.__original_filename)

    def about(self):
        about_text = ('MobileInsight ' + main_utils.get_cur_version() + ' \n' +
                      'MobileInsight Team\n\n' + 'Developers:\n' +
                      '    Yuanjie Li,\n' + '    Zengwen Yuan,\n' +
                      '    Jiayao Li,\n' + '    Haotian Deng\n\n' +
                      'Copyright (c) 2014 – 2017')
        popup = Popup(title='About MobileInsight',
                      content=Label(text=about_text),
                      size_hint=(.8, .4))
        popup.open()
Beispiel #46
0
class MobileInsightScreen(Screen):
    error_log = StringProperty(LOGO_STRING)
    default_app_name = StringProperty("")
    collecting = BooleanProperty(False)
    service = None
    analyzer = None
    terminal_thread = None
    terminal_stop = None
    MAX_LINE = 30
    logs = deque([],MAX_LINE)
    plugins = []
    selectedPlugin = ""
    myLayout = GridLayout(cols = 2, spacing = 5, orientation = "vertical", size_hint_y = None, height = (len(get_plugins_list())/2+len(get_plugins_list())%2)*Window.height/4)
    popupScroll = ScrollView(size_hint_y = None, size = (Window.width, Window.height*.9))
    popupScroll.add_widget(myLayout)
    popup = Popup(content = popupScroll, title = "Choose a plugin")
    def __init__(self, name):
        """
        Initialization function. We will do the following task (in order):
            1. Check if the device is rooted
            2. Initialize necessary libs required by MobileInsight (e.g., libwireshark)
            3. Check if Android's security policy allows MobileInsight to access diagnostic mode.
            This is mainly caused by SELinux
            4. Create necessary folders on SDcard (e.g., /sdcard/mobileinsight/, /sdcard/mobileinsight/log/)
            5. Load built-in and 3rd-party plugins (located in /sdcard/mobileinsight/plugins/)
            6. Check if the diagnostic mode is enabled
            7. Load configurations from the setting panel (configs stored in /sdcard/.mobileinsight.ini)
        """

        super(MobileInsightScreen, self).__init__()

        self.name = name

        if not main_utils.is_rooted():
            # self.ids.log_viewer.disabled = False
            # self.ids.run_plugin.disabled = False
            self.log_error(
                "MobileInsight requires root privilege. Please root your device for correct functioning.")

        self.__init_libs()
        self.__check_security_policy()

        if not create_folder():
            # MobileInsight folders unavailable. Add warnings
            self.log_error("SDcard is unavailable. Please check.")
            self.screen.ids.log_viewer.disabled = True
            self.screen.ids.stop_plugin.disabled = True
            self.screen.ids.run_plugin.disabled = True

        self.plugins_list = get_plugins_list()
        # self.plugins_list.sort()

        if not self.__check_diag_mode():
            self.log_error(
                "The diagnostic mode is disabled. Please check your phone settings.")

        # clean up ongoing log collections
        # self.stop_collection()

        self.terminal_stop = None
        self.terminal_thread = None
        bootup = True

        #used to shorten long widget names in popup menu
        shortenLabel = CoreLabel(markup = True, text_size = (Window.width/2.5, None), shorten_from = "right", font_size = 70)
        #Making and adding widgets to popup menu
        for name in self.plugins_list:
            widget = Button(id = name, markup = True, halign = "left", valign = "top", on_release = self.callback, background_normal = "", background_color = self.ids.run_plugin.background_color)
            widget.text_size = (Window.width/2.25, Window.height/4)
            self.myLayout.add_widget(widget)

            app_path = self.plugins_list[name][0]
            if os.path.exists(os.path.join(app_path, "readme.txt")):
                with open(os.path.join(app_path, "readme.txt"), 'r') as ff:
                    my_description = ff.read()
            else: 
                my_description = "no description."
            #shortening long widget names and making font size
            shortenedName = shortenLabel.shorten(name)
            font_size = "60"
            if Window.width < 1450:
                font_size = "45"
            widget.text = "[color=fffafa][size=70]"+ shortenedName + "[/size][size="+ font_size + "]\n"+ my_description+"[/size][/color]"

            if bootup:
                self.selectedPlugin = name
                self.ids.selectButton.text = "Select Plugin"
                self.ids.run_plugin.text  = "Run Plugin: "+self.selectedPlugin
                bootup = False

        # register Broadcast Receivers.
        self.registerBroadcastReceivers()

        # If default service exists, launch it
        try:
            config = ConfigParser()
            config.read('/sdcard/.mobileinsight.ini')
            default_app_name = config.get("mi_general", "start_service")
            launch_service = config.get("mi_general", "bstartup_service")
            if default_app_name and launch_service == "1":
                self.start_service(default_app_name)
                self.ids.run_plugin.text = "Stop Plugin: "+default_app_name
        except Exception as e:
            pass

    def registerBroadcastReceivers(self):
        self.brStopAck = BroadcastReceiver(self.on_broadcastStopServiceAck,
                actions=['MobileInsight.Plugin.StopServiceAck'])
        self.brStopAck.start()

    #Setting the text for the Select Plugin Menu button
    def callback(self, obj):
        self.selectedPlugin = obj.id
        # self.ids.selectButton.text = "Select Button: " + obj.text[(obj.text.find("]", obj.text.find("]")+1)+1):obj.text.find("[", obj.text.find("[", obj.text.find("[")+1)+1)]
        self.ids.selectButton.text = "Select Plugin"
        if not self.service:
            self.ids.run_plugin.text  = "Run Plugin: "+self.selectedPlugin
        self.popup.dismiss()

    def log_info(self, msg):
        self.append_log("[b][color=00ff00][INFO][/color][/b]: " + msg)

    def log_warning(self, msg):
        self.append_log("[b][color=00ffff][WARNING][/color][/b]: " + msg)

    def log_error(self, msg):
        self.append_log("[b][color=ff0000][ERROR][/color][/b]: " + msg)

    def append_log(self, s):
        self.error_log += "\n"
        self.error_log += s

    # def append_log(self,s):
    #     self.error_log += "\n"
    #     self.error_log += s
    #     if self.line_count > self.MAX_LINE:
    #         idx = self.error_log.find('\n')
    #         self.error_log = self.error_log[idx+1:]
    #     else:
    #         self.line_count += 1

    def __check_security_policy(self):
        """
        Update SELinux policy.
        For Nexus 6/6P, the SELinux policy may forbids the log collection.
        """

        cmd = "setenforce 0; "

        cmd = cmd + "supolicy --live \"allow init logd dir getattr\";"

        # # Depreciated supolicies. Still keep them for backup purpose
        cmd = cmd + "supolicy --live \"allow init init process execmem\";"
        cmd = cmd + \
            "supolicy --live \"allow atfwd diag_device chr_file {read write open ioctl}\";"
        cmd = cmd + "supolicy --live \"allow init properties_device file execute\";"
        cmd = cmd + \
            "supolicy --live \"allow system_server diag_device chr_file {read write}\";"

        # # Suspicious supolicies: MI works without them, but it seems that they SHOULD be enabled...

        # # mi2log permission denied (logcat | grep denied), but no impact on log collection/analysis
        cmd = cmd + \
            "supolicy --live \"allow untrusted_app app_data_file file {rename}\";"

        # # Suspicious: why still works after disabling this command? Won't FIFO fail?
        cmd = cmd + \
            "supolicy --live \"allow init app_data_file fifo_file {write open getattr}\";"
        cmd = cmd + \
            "supolicy --live \"allow init diag_device chr_file {getattr write ioctl}\"; "

        # Nexus 6 only
        cmd = cmd + \
            "supolicy --live \"allow untrusted_app diag_device chr_file {write open getattr}\";"
        cmd = cmd + \
            "supolicy --live \"allow system_server diag_device chr_file {read write}\";"
        cmd = cmd + \
            "supolicy --live \"allow netmgrd diag_device chr_file {read write}\";"
        cmd = cmd + \
            "supolicy --live \"allow rild diag_device chr_file {read write}\";"
        cmd = cmd + \
            "supolicy --live \"allow rild debuggerd app_data_file {read open getattr}\";"

        cmd = cmd + \
            "supolicy --live \"allow wcnss_service mnt_user_file dir {search}\";"

        cmd = cmd + \
            "supolicy --live \"allow wcnss_service fuse dir {read open search}\";"

        cmd = cmd + \
            "supolicy --live \"allow wcnss_service mnt_user_file lnk_file {read}\";"

        cmd = cmd + \
            "supolicy --live \"allow wcnss_service fuse file {read append getattr}\";"

        main_utils.run_shell_cmd(cmd)

    def __check_diag_mode(self):
        """
        Check if diagnostic mode is enabled.
        Note that this function is chipset-specific: Qualcomm and MTK have different detection approaches
"""
        chipset_type = main_utils.get_chipset_type()
        if chipset_type == main_utils.ChipsetType.QUALCOMM:
            diag_port = "/dev/diag"
            if not os.path.exists(diag_port):
                return False
            else:
                main_utils.run_shell_cmd("chmod 777 /dev/diag")
                return True
        elif chipset_type == main_utils.ChipsetType.MTK:
            cmd = "ps | grep emdlogger1"
            res = main_utils.run_shell_cmd(cmd)
            if not res:
                return False
            else:
                return True

    def __init_libs(self):
        """
        Initialize libs required by MobileInsight.
        It creates sym links to libs, and chmod of critical execs
        """

        libs_path = os.path.join(main_utils.get_files_dir(), "data")
        cmd = ""

        libs_mapping = {
            "libwireshark.so": [
                "libwireshark.so.6", "libwireshark.so.6.0.1"], "libwiretap.so": [
                "libwiretap.so.5", "libwiretap.so.5.0.1"], "libwsutil.so": [
                "libwsutil.so.6", "libwsutil.so.6.0.0"]}
        for lib in libs_mapping:
            for sym_lib in libs_mapping[lib]:
                # if not os.path.isfile(os.path.join(libs_path,sym_lib)):
                if True:
                    # TODO: chown to restore ownership for the symlinks
                    cmd = cmd + " ln -s " + \
                        os.path.join(libs_path, lib) + " " + os.path.join(libs_path, sym_lib) + "; "

        exes = ["diag_revealer",
                "diag_revealer_mtk",
                "android_pie_ws_dissector",
                "android_ws_dissector"]
        for exe in exes:
            cmd = cmd + " chmod 755 " + os.path.join(libs_path, exe) + "; "

        cmd = cmd + "chmod -R 755 " + libs_path
        main_utils.run_shell_cmd(cmd)

    # def __init_libs(self):
    #     """
    #     Initialize libs required by MobileInsight
    #     """

    #     libs_path = os.path.join(main_utils.get_files_dir(), "data")

    #     libs = ["libglib-2.0.so",
    #             "libgmodule-2.0.so",
    #             "libgobject-2.0.so",
    #             "libgthread-2.0.so",
    #             "libwireshark.so",
    #             "libwiretap.so",
    #             "libwsutil.so"]

    #     cmd = "mount -o remount,rw /system; "

    #     for lib in libs:
    #         # if not os.path.isfile(os.path.join("/system/lib",lib)):
    #         if True:
    #             cmd = cmd + " cp " + os.path.join(libs_path, lib) + " /system/lib/; "
    #             cmd = cmd + " chmod 755 " + os.path.join("/system/lib", lib) + "; "

    #     # sym links for some libs
    #     libs_mapping = {"libwireshark.so": ["libwireshark.so.6", "libwireshark.so.6.0.1"],
    #                   "libwiretap.so": ["libwiretap.so.5", "libwiretap.so.5.0.1"],
    #                   "libwsutil.so": ["libwsutil.so.6", "libwsutil.so.6.0.0"]}

    #     for lib in libs_mapping:
    #         for sym_lib in libs_mapping[lib]:
    #             # if not os.path.isfile("/system/lib/"+sym_lib):
    #             if True:
    #                cmd = cmd + " ln -s /system/lib/" + lib + " /system/lib/" + sym_lib + "; "
    #                cmd = cmd + " chmod 755 /system/lib/" + sym_lib + "; "

    #     # print cmd  # debug mode

    #     # bins
    #     exes = ["diag_revealer",
    #             "android_pie_ws_dissector",
    #             "android_ws_dissector"]
    #     for exe in exes:
    #         # if not os.path.isfile(os.path.join("/system/bin",exe)):
    #         if True:
    #             cmd = cmd + " cp " + os.path.join(libs_path, exe) + " /system/bin/; "
    #             # 0755, not 755. "0" means "+x" on Android phones
    #             cmd = cmd + " chmod 0755 " + os.path.join("/system/bin/", exe) + "; "

    #     if cmd:
    #         # at least one lib should be copied
    #         main_utils.run_shell_cmd(cmd)

    def show_log(self):

        while not os.path.exists(self.log_name):
            continue

        log_file = open(self.log_name, 'r')

        # line_count = 0

        while True:
            if self.terminal_stop.is_set():
                continue
            try:
                time.sleep(1)
                where = log_file.tell()
                lines = log_file.readlines()
                if not lines:
                    log_file.seek(where)
                else:    
                    self.logs += lines
                    self.error_log = ''.join(self.logs)
            except Exception as e:
                import traceback
                print str(traceback.format_exc())
                continue

    def run_script_callback(self):
        no_error = True

        if no_error:
            try:
                filename = self.ids["filename"].text
                self.append_log("")
                self.append_log("execfile: %s" % filename)
                namespace = {"app_log": ""}
                execfile(filename, namespace)
                # Load the "app_log" variable from namespace and print it out
                self.append_log(namespace["app_log"])
            except BaseException:
                print str(traceback.format_exc())
                self.append_log(str(traceback.format_exc()))
                no_error = False

    def stop_collection(self):
        res = main_utils.run_shell_cmd("ps").split('\n')
        for item in res:
            if item.find('diag_revealer') != -1:
                pid = item.split()[1]
                cmd = "kill "+pid
                main_utils.run_shell_cmd(cmd)

    """
    def stop_collection(self):
        self.collecting = False

        # Find diag_revealer process
        # FIXME: No longer work for 7.0: os.listdir() only returns current
        # processstop_collection
        diag_procs = []
        pids = [pid for pid in os.listdir("/proc") if pid.isdigit()]
        print "stop_collection", str(pids)
        for pid in pids:
            try:
                cmdline = open(
                    os.path.join(
                        "/proc",
                        pid,
                        "cmdline"),
                    "rb").read()
                # if cmdline.startswith("diag_mdlog") or
                # cmdline.startswith("diag_revealer"):
                if cmdline.find("diag_revealer") != - \
                        1 or cmdline.find("diag_mdlog") != -1:
                    diag_procs.append(int(pid))
            except IOError:     # proc has been terminated
                continue
        if len(diag_procs) > 0:
            cmd2 = "kill " + " ".join([str(pid) for pid in diag_procs])
            main_utils.run_shell_cmd(cmd2)
    """

    def popUpMenu(self):
        self.popup.open()

    def start_service(self, app_name):
        if platform == "android" and app_name in self.plugins_list:
            # Clean up old logs
            self.log_name = os.path.join(
                main_utils.get_mobileinsight_analysis_path(),
                app_name + "_log.txt")
            if os.path.exists(self.log_name):
                os.remove(self.log_name)

            self.terminal_stop = threading.Event()
            self.terminal_thread = threading.Thread(target=self.show_log)
            self.terminal_thread.start()

            self.error_log = "Running " + app_name + "..."
            self.service = AndroidService(
                "MobileInsight is running...", app_name)

            # stop the running service
            self.service.stop()

            self.service.start(
                app_name + ":" + self.plugins_list[app_name][0])   # app name
            self.default_app_name = app_name

            # TODO: support collecting TCPDUMP trace
            # currentTime = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
            # tcpdumpcmd = "su -c tcpdump -i rmnet_data0 -w " \
            #         + main_utils.get_mobileinsight_log_path() \
            #         + "/tcpdump_" + str(currentTime) + ".pcap\n"
            # main_utils.run_shell_cmd(tcpdumpcmd)

        else:
            self.error_log = "Error: " + app_name + "cannot be launched!"

    def on_broadcastStopServiceAck(self, context, intent):
        self.log_info("Received MobileInsight.Plugin.StopServiceAck from plugin")
        self.pluginAck = True

    def stop_service(self):
        # Registe listener for 'MobileInsight.Plugin.StopServiceAck' intent
        # from plugin
        self.log_info("Ready to stop current plugin ...")
        self.pluginAck = False

        # Using broadcast to send 'MobileInsight.Main.StopService' intent to
        # plugin
        IntentClass = autoclass("android.content.Intent")
        intent = IntentClass()
        action = 'MobileInsight.Main.StopService'
        intent.setAction(action)
        try:
            current_activity.sendBroadcast(intent)
        except Exception as e:
            import traceback
            self.log_error(str(traceback.format_exc()))

        if self.service:
            start_time = datetime.datetime.utcnow()
            current_time = datetime.datetime.utcnow()
            while (not self.pluginAck and (current_time - start_time).total_seconds() < 5):
                current_time = datetime.datetime.utcnow()
                pass
            self.service.stop()
            self.service = None
            if self.terminal_stop:
                self.terminal_stop.set()
            # self.error_log = LOGO_STRING
            self.log_info(
                "Plugin stopped. Detailed analytic results are saved in " +
                self.log_name)

            self.stop_collection()  # close ongoing collections (diag_revealer)

            # killall tcpdump
            # tcpdumpcmd = "su -c killall tcpdump\n"
            # main_utils.run_shell_cmd(tcpdumpcmd)

    def on_click_plugin(self, app_name):
        if self.service:
            self.stop_service()
            self.ids.run_plugin.text = "Run Plugin: "+app_name
        else:
            self.start_service(app_name)
            self.ids.run_plugin.text = "Stop Plugin: "+app_name

    def _save_log(self):
        orig_basename = os.path.basename(self.__original_filename)
        orig_dirname = os.path.dirname(self.__original_filename)
        self.__log_timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
        milog_basename = "diag_log_%s_%s_%s.mi2log" % (
            self.__log_timestamp, self.__phone_info, main_utils.get_operator_info())
        milog_absname = os.path.join(self.__logdir, milog_basename)
        main_utils.run_shell_cmd("cp %s %s" %
                                   (self.__original_filename, milog_absname))
        # shutil.copyfile(self.__original_filename, milog_absname)
        # chmodcmd = "rm -f " + self.__original_filename
        # p = subprocess.Popen("su ", executable = main_utils.ANDROID_SHELL, shell = True, \
        #                             stdin = subprocess.PIPE, stdout = subprocess.PIPE)
        # p.communicate(chmodcmd + '\n')
        # p.wait()
        os.remove(self.__original_filename)

    def about(self):
        about_text = ('MobileInsight ' + main_utils.get_cur_version() + ' \n'
                      + 'MobileInsight Team\n\n'
                      + 'Developers:\n'
                      + '    Yuanjie Li,\n'
                      + '    Zengwen Yuan,\n'
                      + '    Jiayao Li,\n'
                      + '    Haotian Deng,\n'
                      + '    Qianru Li,\n'
                      + '    Zhehui Zhang\n\n'
                      + 'Copyright (c) 2014 – 2017')
        popup = Popup(title='About MobileInsight',
                      size_hint=(1,1),
                      background = "gradient.png"
                     )
        popup_button = Button(text = about_text, background_color = [0,0,0,0], on_press = popup.dismiss)
        popup.content = popup_button
        popup.open()
Beispiel #47
0
 def run(self):
     if platform == 'android':
         from android import AndroidService
         service = AndroidService('jupyter service', 'running')
         service.start('service started')
Beispiel #48
0
    def build(self):
        if platform == 'android':
            from android import AndroidService
            service = AndroidService('my pong service', 'running')
            service.start('service started')
            self.service = service

        osc.init()
        oscid = osc.listen(ipAddr='127.0.0.1', port=ACTIVITY_PORT)
        osc.bind(oscid, self.some_api_callback, API_OFFSET)
        osc.bind(oscid, self.handle_alerts, API_OFFSET + "pending-alerts")
        Clock.schedule_interval(lambda *x: osc.readQueue(oscid), 0)

        Window.size = 640, 480

        self.layout = TabbedPanel()
        self.layout.do_default_tab = True


        #self.status_tab = GridLayout()
        #self.layout.default_tab_content = self.status_tab
        #self.layout.default_tab_text = "Status"
        #self.status_tab.add_widget(Button(text="TODO make this page..."))

        #self.alert_tab = TabbedPanelHeader(text="Alert")
        self.alert_tab_box = BoxLayout()
        self.alert_tab_box.orientation = 'vertical'
        self.alert_tab_box.size_hint = 1, 1
        #self.alert_tab.content = self.alert_tab_box

        self.alert_tab_scroll = ScrollView(
                        size_hint=(1, 1),
                        size=self.alert_tab_box.size,
                        #size=Window.size,
                        scroll_type=['bars', 'content'],
                        do_scroll_y=True,
                        do_scroll_x=False
                    )
        self.alert_tab_box.add_widget(self.alert_tab_scroll)


        self.alert_tab_alert_buttons = ButtonList()
        self.alert_tab_alert_buttons.bind(minimum_height=self.alert_tab_alert_buttons.setter('height'))
        self.alert_tab_alert_buttons.cols = 1
        self.alert_tab_alert_buttons.size_hint_y = None
        self.alert_tab_alert_buttons.row_default_height = '30dp'
        self.alert_tab_alert_buttons.row_force_default = True
        self.alert_tab_alert_buttons.spacing = 0, 0
        self.alert_tab_alert_buttons.padding = 0, 0

        self.alert_tab_scroll.add_widget(self.alert_tab_alert_buttons)


        #self.requests_tab = TabbedPanelHeader(text="Requests")

        self.layout.default_tab_content = self.alert_tab_box
        self.layout.default_tab_text = "Alerts"
        #self.layout.add_widget(self.status_tab)
        #self.layout.add_widget(self.alert_tab)
        #self.layout.add_widget(self.requests_tab)

        self.request_pending_alerts()

        return self.layout
class SettingsFrame(StackLayout):
    """Settingsframe is the main frame of the application"""
    cfg_file = None
    """The config file to use"""
    service_status = None
    """The status of the service"""
    service_progress = None
    """The progress of the current job"""

    def init(self, _cfg_file=None):
        self.ids.destination_host.ids.input_selection.bind(text=self._update_host)
        self.ids.destination_path.on_status = self.do_on_smbselector_status
        self.load_settings(_cfg_file)
        self.service = None
        osc.init()
        self.oscid = osc.listen(port=3002)
        osc.bind(self.oscid, self.progress_callback, "/progress_callback")
        osc.bind(self.oscid, self.status_callback, "/status_callback")

        # Check if service is running
        self.service_running = False
        osc.sendMsg("/status", [], port=3000)
        osc.sendMsg("/progress", [], port=3000)
        sleep(0.3)
        osc.readQueue(self.oscid)


        Clock.schedule_interval(self.process_messages, 1)

    ####### Service #################
    #######################################################################################


    def do_on_smbselector_status(self, _message):
        """
        :param _message: A string message
        """
        self.ids.l_test_smbselector_result.text = re.sub("(.{40})", "\\1\n", _message, 0, re.DOTALL)
    def process_messages(self, *args):
        """Receive messages"""
        osc.readQueue(self.oscid)

    def status_callback(self, *args):
        """If the client receives a status message, reflect that in the label_status widget
        :param args: Message arguments.
        """
        self.service_running = True
        self.service_status = str(args[0][2])
        self.ids.label_status.text = self.service_status

    def progress_callback(self, *args):
        """If the client receives a progress message, reflect that in the label_progress widget
        :param args: Message arguments.
        """
        self.service_running = True
        self.service_progress = str(args[0][2])
        self.ids.label_progress.text = re.sub("(.{40})", "\\1\n", self.service_progress, 0, re.DOTALL)

    def start_service(self):
        """Start the service"""
        self.save_settings()
        print("Starting service")
        self.service_running = False
        osc.sendMsg("/status", [], port=3000)
        osc.sendMsg("/progress", [], port=3000)
        sleep(0.1)
        osc.readQueue(self.oscid)
        if not self.service_status:
            # Wait a little longer and try again
            sleep(0.5)
            osc.readQueue(self.oscid)

        if not self.service_status:
            print("Start_service: Service is not running, starting")
            if self.service is None:

                if platform == "android":
                    from android import AndroidService
                    self.service = AndroidService("Optimal file sync service", "running")
                    self.service.start("service started")
                else:
                    # Start process on linux.
                    print("Running on !android initializing service using Popen.")
                    self.service = subprocess.Popen(args = ["python", "./service/main.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        else:
            print("Start_service: Service is already running, not starting.")


    def stop_service(self):
        """Stop the service"""
        print("Asking service to stop.")
        self.service_running = False

        osc.sendMsg("/status", [], port=3000)
        sleep(0.2)
        osc.readQueue(self.oscid)

        osc.sendMsg("/stop", [], port=3000)
        sleep(0.2)
        osc.readQueue(self.oscid)
        if self.service is not None and platform == "android":
            self.service.stop()
            self.service = None


    ####### GUI #################
    #######################################################################################

    def _update_host(self, *args):
        """If the host selection is changed, set the host."""
        self.ids.destination_path.host = self.ids.destination_host.ids.input_selection.text

    def reload_settings(self):
        """Reload settings from current settings file"""
        self.load_settings(self.cfg_file)

    def load_settings(self, _cfg_file=None):
        """
        Load settings from a settings file
        :param _cfg_file: A file with settings
        """
        self.cfg_file = _cfg_file
        cfg = ConfigParser.SafeConfigParser()
        cfg.read(_cfg_file)

        self.ids.sourcedir_select.selection = cfg.get("Job_Default", "source_folder")
        self.ids.destination_host.selection = cfg.get("Job_Default", "destination_hostname")
        self.ids.destination_path.selection = cfg.get("Job_Default", "destination_folder")
        self.ids.destination_username.text = cfg.get("Job_Default", "destination_username")
        self.ids.destination_password.text = cfg.get("Job_Default", "destination_password")

    def save_settings(self):
        """Save settings to file"""
        cfg = ConfigParser.SafeConfigParser()
        cfg.read(self.cfg_file)

        cfg.set("Job_Default", "source_folder", self.ids.sourcedir_select.selection)
        cfg.set("Job_Default", "destination_hostname", self.ids.destination_host.selection)
        cfg.set("Job_Default", "destination_folder", self.ids.destination_path.selection)
        cfg.set("Job_Default", "destination_username", self.ids.destination_username.text)
        cfg.set("Job_Default", "destination_password", self.ids.destination_password.text)
        f = open(self.cfg_file, "wb")
        cfg.write(f)
        f.close()

    def test_connection(self):
        """Test SMB connection by connecting to a server"""
        try:
            self.ids.l_test_connection_result.text = "Testing..."
            _smb = smb_connect(_hostname=self.ids.destination_host.selection,
                               _username=self.ids.destination_username.text,
                               _password=self.ids.destination_password.text )
            self.ids.l_test_connection_result.text = "Connection successful!"
        except Exception as e:
            self.ids.l_test_connection_result.text = "Test failed, error connecting: " + str(e)

        try:
            _shares = _smb.listShares()
            self.ids.l_test_connection_result.text = "Listing shares (" + str(len(_shares)) + ") successful!"
        except Exception as e:
            self.ids.l_test_connection_result.text = "Test failed, error listing shares: " + str(e)
Beispiel #50
0
class NotificationDemoApp(App):
    connected = BooleanProperty(False)
    client = SimpleClient()
    nbuilder = NotificationBuilder()
    service = None

    def build(self):
        self.root = NotificationDemo(self)
        if platform == 'android':
            try:
                self.service = autoclass('org.test.npexample.ServiceMyservice')
                mActivity = autoclass(
                    'org.kivy.android.PythonActivity').mActivity
                argument = ''
                self.service.start(mActivity, argument)
            except:
                self.service = AndroidService('Sevice example',
                                              'service is running')
                self.service.start('Hello From Service')
        else:
            Window.system_size = cm(7), cm(12)

        self.client.on_connect = self.on_connect
        self.client.on_disconnect = self.on_disconnect
        Clock.schedule_once(self.try_connecting, 0)
        Clock.schedule_interval(self.handle_msg, 0.1)
        # def skipp(*a):
        #     self.root.ids.sm.current = 'main'
        # Clock.schedule_once(skipp, 0.5)
        return self.root

    def try_connecting(self, *args):
        try:
            if not self.connected:
                self.client.connect()
        except Exception as e:
            Logger.info('Connection to service failed with error: "{}", '
                        'reconnecting'.format(e))
            Clock.schedule_once(self.try_connecting, 2)

    def on_connected(self, _, value):
        if not value:
            Logger.info('NotificationDemoApp: reconnecting')
            Clock.schedule_once(self.try_connecting, 0)

    def on_connect(self, *args):
        self.connected = True
        Logger.info('NotificationDemoApp: on_connect()')
        self.root.ids.sm.current = 'main'

    def on_disconnect(self, *args):
        self.connected = False
        Logger.info('NotificationDemoApp: on_disconnect()')

    def send_json(self, msg):
        self.send_msg(json.dumps(msg))

    def send_msg(self, msg):
        if self.connected:
            try:
                self.client.send(msg)
            except Exception as e:
                Logger.error('NotificationDemoApp: send_mesg: {}'.format(e))
                self.on_disconnect()

    def handle_msg(self, *args):
        if self.client:
            msg = self.client.read_queue()
            if msg:
                Logger.info('App: msg={}'.format(msg))

    def build_notification(self, **kwargs):
        if kwargs['activity'] == 'App':
            for k in ('id', 'ticker', 'subtext', 'message', 'ongoing',
                      'autocancel', 'title'):
                self.nbuilder.kwargs[k] = kwargs[k]
            if kwargs['vibrate']:
                self.nbuilder.kwargs['vibrate'] = 1.0
            else:
                self.nbuilder.kwargs['vibrate'] = 0.0
            if kwargs['sound']:
                self.nbuilder.kwargs['sound'] = path[4] + '/audio/beep1.wav'
            else:
                self.nbuilder.kwargs['sound'] = ''
            self.nbuilder.build()

        else:
            msg = json.dumps({
                'method': 'build_notification',
                'kwargs': kwargs
            })
            Logger.info('build_notification: %s' % (msg))
            self.send_msg(msg)

    def remove_notification(self, **kwargs):
        if kwargs['activity'] == 'App':
            self.nbuilder.remove_notification(id=kwargs['id'])

        else:
            msg = json.dumps({
                'method': 'remove_notification',
                'kwargs': kwargs
            })
            self.send_msg(msg)

    def on_pause(self):
        return True

    def on_resume(self):
        pass

    def stop_service(self):
        if platform == 'android':
            android.stop_service()

    def on_stop(self):
        self.nbuilder.remove_notification(id=0)
        if self.service:
            self.stop_service()
Beispiel #51
0
	def loaderNextStep(self,a=0,b=0):
		self.loaderStep+=1 
		print("loaderNextStep step now",self.loaderStep)
		
		
		if self.loaderStep == 1:
			if kplatform == 'android':
				self.platform = 'android'
			else:
				self.platform = 'pc'
			
			self.ll.ids.l_loaMaiWin.text = "DONE"
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		
		elif self.loaderStep == 2:
			from TimeHelper import TimeHelper
			from FileActions import FileActions
			self.th = TimeHelper()
			self.fa = FileActions()
			self.homeDirPath = self.fa.getHomeDirectoryForApp(
				'ykpilot', 
				kplatform
				)
			print("homeDir",self.homeDirPath)
			#sys.exit(0)
			self.timeAppStart = self.th.getTimestamp()
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 3:
			self.ll.ids.l_loaHel.text = "DONE"
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
				
			
		
		elif self.loaderStep == 4:
			bS = self.th.benStart()
			Builder.load_file('layoutMain.kv')
			self.rl = RootLayout()
			self.bE = self.th.benDone(bS,'')
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 5:
			self.ll.ids.l_appRooLay.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
				
		elif self.loaderStep == 6:
			bS = self.th.benStart()
			Builder.load_file('layoutActionBar.kv')
			self.ab = ykpActionBar()
			self.bE = self.th.benDone(bS,'')
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 7:
			self.ll.ids.l_actBarLay.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
			
			
		elif self.loaderStep == 8:
			bS = self.th.benStart()
			self.config = DataSR_restore(
				self.fa.join( self.homeDirPath,'ykpilot.conf')
				)
			if self.config == None:
				self.config = {}
			self.doLocalIp()
			self.bE = self.th.benDone(bS, "")
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 9:
			self.ll.ids.l_loaCon.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		
		elif self.loaderStep == 10:
			bS = self.th.benStart()
			if kplatform == 'android':
				self.platform = 'android'
				self.animation = False
				ipSens = '192.168.43.56'
				if len(self.ips)>0:
					ipSens = self.ips[0]			
				ip = ipSens
				self.senderIp = ip
				self.senderPort = 11223
				makeRender = True
				print("- setting up a sensor server at ",ipSens,":",self.senderPort)
				
				# android service
				if mkservice:
					from android import AndroidService
					service = AndroidService("ykpilot background","running ....")
					service.start("service started")
					self.service = service
				# android service
	
				self.workingFolderAdress = '/storage/emulated/0/ykpilot/'
				self.virtualButtons = False
	
			else:
				self.platform = 'pc'
				self.animation = True
				ipSens = '192.168.43.56'
				if len(self.ips)>0:
					ipSens = self.ips[0]			
				ip = ipSens
				self.senderIp = ip
				self.senderPort = 11225
				makeRender = True
				self.workingFolderAdress = './ykpilot/'
				self.virtualButtons = False
	
			self.bE = self.th.benDone(bS, "")
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 11:
			self.ll.ids.l_loaPlaChk.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		
		elif self.loaderStep == 12:
			bS = self.th.benStart()
			print("preloaderStep0")
			self.loaderStep0()
			print("postloaderStep0")
			self.bE = self.th.benDone(bS, "")
			#Clock.schedule_once( 
			self.loaderNextStep()#, 0.1 )
			
		elif self.loaderStep == 13:
			self.ll.ids.l_loaRest.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.5 )
			
			
			
		elif self.loaderStep == 14:
			bS = self.th.benStart()
			from sensors import sensors
			self.sen = sensors(self)
			print("pre ask for permissions")
			self.sen.askForPermissions()
			print("post ask for permissions")
			self.bE = self.th.benDone(bS, "")
			
			Clock.schedule_once( self.loaderNextStep, 0.5 )
			
		elif self.loaderStep == 15:
			if self.platform == 'android' and self.sen.permissonsStatus == False:
				self.loaderStep-=1
			else:
				self.ll.ids.l_permissions.text = "DONE in %s sec."%self.bE
				
				
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			


		elif self.loaderStep == 16:
			bS = self.th.benStart()
			
			self.sen.makeSensors()
			p = self.rl.parent
			p.remove_widget(self.rl)
			rl = self.sen.buidPlayer(self.rl)
			p.add_widget(rl)
			#self.sen.run()
			#try:
			#	self.sen.gps_start(1000, 0)
			#except:
			#	print("EE - can't start sen.gps")
			#	print(sys.exc_info())
			#	pass
			
			self.bE = self.th.benDone(bS, "")
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 17:
			self.ll.ids.l_sensors.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		
		
		elif self.loaderStep == 18:
			bS = self.th.benStart()
			from ScreenWidgets import ScreenWidgets
			self.sWidgets = ScreenWidgets(self)
			self.sWidgets.setGui()
			self.bE = self.th.benDone(bS, "")
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 19:
			self.ll.ids.l_loaSWid.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.1 )
		
		
		
		elif self.loaderStep == 20:
			bS = self.th.benStart()
			from ScreenAutopilot import ScreenAutopilot
			self.ap = ScreenAutopilot(self)
			self.bE = self.th.benDone(bS, "")
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 21:
			self.ll.ids.l_loaSAut.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.1 )
		
		
		
		elif self.loaderStep == 22:
			bS = self.th.benStart()
			from ScreenRace import ScreenRace
			self.sRace = ScreenRace(self)
			self.sRace.setupGui()
			self.bE = self.th.benDone(bS, "")
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 23:
			self.ll.ids.l_loaSRac.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
			
			
		elif self.loaderStep == 24:
			bS = self.th.benStart()
			from ScreenCompass import ScreenCompass
			self.sCompass = ScreenCompass()
			self.sCompass.setGui(self)
			self.rl.ids.blCompass.add_widget( self.sCompass )
			self.bE = self.th.benDone(bS, "")
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 25:
			self.ll.ids.l_loaSCom.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.1 )
		
		
		
		elif self.loaderStep == 26:
			bS = self.th.benStart()
			from ScreenNMEAMultiplexer import ScreenNMEAMultiplexer
			self.sNMEAMul = ScreenNMEAMultiplexer()
			self.sNMEAMul.setGui(self)
			self.bE = self.th.benDone(bS, "")
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 27:
			self.ll.ids.l_loaSMul.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.1 )


		
		elif self.loaderStep == 28:
			bS = self.th.benStart()	
			from boatRender import Renderer		
			self.senBoat = Renderer()
			self.senBoat.setGui(self)
			self.rl.ids.blModelScreen.add_widget( self.senBoat )
			self.bE = self.th.benDone(bS, "")
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 29:
			self.ll.ids.l_loaMScr.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.1 )

		
		
		elif self.loaderStep == 30:
			bS = self.th.benStart()
			from simRender import simRender
			from simEngine import simEngine
			from driver1 import driver1
			from driver2 import driver2
			from driver3 import driver3
			from driver4 import driver4
			from driver5 import driver5
			from driver6 import driver6
			from driver7 import driver7
			from driver8 import driver8
			from driver9 import driver9
			from driver10 import driver10

			self.simRen = simRender()
			self.simEng = simEngine(self,self.simRen)
			self.simRen.setSim(self.simEng)
			self.simRen.setGui(self)
			self.simEng.renderFrame()

			self.rl.ids.blSimulator.add_widget( self.simRen )

			self.driver1 = driver1(self.simEng)
			self.driver2 = driver2(self.simEng)
			self.driver3 = driver3(self.simEng)
			self.driver4 = driver4(self.simEng)
			self.driver5 = driver5(self.simEng)
			self.driver6 = driver6(self.simEng)
			self.driver7 = driver7(self.simEng)
			self.driver8 = driver8(self.simEng)
			self.driver9 = driver9(self.simEng)
			self.driver10 = driver10(self.simEng)
			
			self.bE = self.th.benDone(bS, "")
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 31:
			self.ll.ids.l_loaSSim.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.1 )
		

		
		
		elif self.loaderStep == 32:
			bS = self.th.benStart()
			print("Sender Server is on port[%s]"%self.senderPort)
			self.sf = MyServerFactory(self)
			reactor.listenTCP(self.senderPort, self.sf )
			self.bE = self.th.benDone(bS, "")
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 33:
			self.ll.ids.l_loaTcpSer.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.1 )
		
		
		
		elif self.loaderStep == 34:
			bS = self.th.benStart()
			self.tcp4ap = ttc(self)
			self.bE = self.th.benDone(bS, "")
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 35:
			self.ll.ids.l_AutoWifiArmTCP.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.1 )
		
	
	
		elif self.loaderStep == 36:
			bS = self.th.benStart()
			from ScreenTriangulacja import Triangulacja, TrianAddDialog
			self.triangulacja = Triangulacja(self)
			self.bE = self.th.benDone(bS, "")
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 37:
			self.ll.ids.l_Tri.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.1 )
	
	
		elif self.loaderStep == 38:
			bS = self.th.benStart()
			from ScreenTakePhoto import ScreenTakePhoto
			self.stp = ScreenTakePhoto(self)
			self.bE = self.th.benDone(bS, "")
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 39:
			self.ll.ids.l_takPho.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.1 )
	
		
		elif self.loaderStep == 40:
			bS = self.th.benStart()
			from ScreenSensors import ScreenSensors
			self.sSensors = ScreenSensors()
			self.sSensors.setGui(self)
			self.bE = self.th.benDone(bS, "")
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 41:
			self.ll.ids.l_screSen.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		
		
		
		
		elif self.loaderStep == 999:
			bS = self.th.benStart()
			
			self.bE = self.th.benDone(bS, "")
			Clock.schedule_once( self.loaderNextStep, 0.1 )
			
		elif self.loaderStep == 1000:
			#self.ll.ids.l_loaSWid.text = "DONE in %s sec."%self.bE
			Clock.schedule_once( self.loaderNextStep, 0.1 )
		
		
		
		
		
		
		else:
			print(" loader finished ?")
				
				
			print(" starting main loop for sensors ")
			self.sen.run()
		
		
		
			
		
		
			if self.sen.gpsD.androidServiceStatus == False:
				try:
					self.sen.gps_start(1000, 0)
				except:
					print("EE - can't gps_start :(")
			
			
			
			self.sen.gpsD.addCallBack( self.sCompass,'Compass' )
			self.sen.comCal.addCallBack( self.sCompass,'Compass' )
			self.sen.comCalAccelGyro.addCallBack( self.sCompass,'Compass' )
			self.sen.gpsD.addCallBack( self.sRace )
			self.sen.comCal.addCallBack( self.ap )
			self.sen.comCal.addCallBack( self.sen )
			self.sen.comCal.addCallBack( self.senBoat )
			#self.gui.senBoat.setRoseta( self.hdg )
			
			#Clock.schedule_once(self.sen.on_PlayFromFile_play, 1.0)
			#Clock.schedule_once(self.sWidgets.on_addEditDelButton, 1.0)
			#Clock.schedule_once(self.sWidgets.rebuildWs, 5.0)
		
			print("starting listener for sensors :) if pc")
			if self.platform == 'pc':
				Clock.schedule_once(self.connectToSensorsRemoteTcp, 1 )
				
				#if 1:
				#	self.plt = PCPlot(self)
				
		
			print('flip layouts....')
			par = self.ll.parent
			par.remove_widget(self.ll)
			par.add_widget(self.rootLayout)
			self.ll = None
			print("	DONE")
			
			
			if self.config['apCommunicationMode'] == 'wifi tcp':
				self.ap.startTcp()
			
			print("config",self.config)
			defScreen = 'ykpilot'
			goToScreen = defScreen
			dontStartAt = ['Loader','EditWidget', 'SettingUpWidget', 'SelectWidgetToAdd']
			try:
				goToScreen = self.config['screenCurrent']
			except:
				print("EE - no def  config['screenCurrent'] :/")
			
			if goToScreen in dontStartAt:
				print("goToScreen is in dont start list")
				goToScreen = defScreen
				
			print("go to screen is ",goToScreen)
			try:
				self.screenChange(goToScreen)
			except:
				print("EE - no screen [",goToScreen,"] in screenmanager")
				self.screenChange(defScreen)
			
		
			#multiplexer screen
			self.rl.ids.cb_nmeBSensors.active = True if self.config['nmeBSensors'] else False
			self.rl.ids.cb_nmeBAutopilot.active = True if self.config['nmeBAutopilot'] else False
			self.rl.ids.cb_nmeBNmea.active = True if self.config['nmeBNmea'] else False
			
			self.triangulacja.isReady()	
			
			
			#self.makeIFT()
			
			self.isReady = True
Beispiel #52
0
 def start_service(self):
     if platform() == 'android':
         from android import AndroidService
         service = AndroidService('DovizApp', 'calisiyor...')
         service.start('service started')
         self.service = service
class KALiteApp(App):

    server_host = '0.0.0.0'
    # choose a non-default port,
    # to avoid messing with other KA Lite installations
    server_port = '8024'

    def build(self):
        self.layout = AppLayout()
        self.server_box = BoxLayout(orientation='horizontal')
        self.messages = BoxLayout(orientation='vertical')
        self.layout.add_widget(self.messages)
        self.layout.add_widget(self.server_box)
        return self.layout

    def on_start(self):
        self.kalite = ServerThread(self)
        self.prepare_server()
        self.kalite.start()

    def on_pause(self):
        return True

    def on_stop(self):
        if self.kalite.is_alive():
            self.kalite.schedule('stop_thread')
            self.kalite.join()

    @clock_callback
    def report_activity(self, activity, message):
        assert activity in ('start', 'result')
        if activity == 'start':
            self.activity_label = Label(text="{0} ... ".format(message))
            self.messages.add_widget(self.activity_label)
        elif hasattr(self, 'activity_label'):
            self.activity_label.text = self.activity_label.text + message

    def prepare_server(self):
        '''Schedule preparation steps to be executed in the server thread'''

        schedule = self.kalite.schedule
        schedule('extract_kalite', 'Extracting ka-lite archive')
        schedule('setup_environment', 'Setting up environment')
        schedule('python_version', 'Checking Python version')
        schedule('import_django', 'Trying to import Django')
        schedule('syncdb', 'Preparing database')
        schedule('generate_keys', 'Generating keys')
        schedule('create_superuser', 'Creating admin user')
        schedule('check_server', 'Checking server status')

    def start_server(self):
        description = "Run server. To see the KA Lite site, " + (
            "open  http://{}:{} in browser").format(self.server_host,
                                                    self.server_port)
        if not self.kalite.server_is_running:
            self.kalite.schedule('start_server', description)

    def stop_server(self):
        if self.kalite.server_is_running:
            self.kalite.schedule('stop_server', 'Stop server')

    @clock_callback
    def start_service_part(self):
        from android import AndroidService
        self.service = AndroidService('KA Lite', 'server is running')
        # start executing service/main.py as a service
        self.service.start(':'.join((self.server_host, self.server_port)))

    @clock_callback
    def stop_service_part(self):
        from android import AndroidService
        AndroidService().stop()
Beispiel #54
0
class KALiteApp(App):

    server_host = '0.0.0.0'
    # choose a non-default port,
    # to avoid messing with other KA Lite installations
    server_port = '8008'

    server_state = False
    thread_num = 'threads=18'
    key_generated = False

    def build(self):
        self.progress_tracking = 0
        self.main_ui = KaliteUI(self)
        EventLoop.window.bind(on_keyboard=self.hook_keyboard)
        self.my_webview = JavaHandle()
        self.back_pressed = System.currentTimeMillis()

        self.pref = android_activity.getSharedPreferences(
            "MyPref", android_activity.MODE_MULTI_PROCESS)
        self.sharedpref_listener = PythonSharedPreferenceChangeListener()
        self.pref.registerOnSharedPreferenceChangeListener(
            self.sharedpref_listener)
        self.editor = self.pref.edit()

        return self.main_ui.get_root_Layout()

    def on_start(self):
        version_code = VersionCode()
        if self.pref.getInt("first_time_bootup",
                            0) == 1 and version_code.matched_version():
            self.key_generated = True
        else:
            self.editor.putInt("first_time_bootup", 0)
            self.editor.apply()
            self.key_generated = False

        self.main_ui.add_loading_gif()
        self.kalite = ServerThread(self, self.my_webview)
        self.kalite.start()
        self.prepare_server()

    def hook_keyboard(self, window, key, *largs):
        if key == 27:  # BACK
            # if self.back_pressed + 500 > System.currentTimeMillis():
            #     self.my_webview.quit_dialog()
            # else:
            #     self.my_webview.go_to_previous(App, self.kalite.server_is_running)
            # self.back_pressed = System.currentTimeMillis()
            self.my_webview.go_to_previous(App, self.kalite.server_is_running)
        return True

    def on_pause(self):
        return True

    @clock_callback
    def report_activity(self, activity, message):
        assert activity in ('start', 'result')
        if activity == 'start':
            if hasattr(self, 'activity_label'):
                self.main_ui.remove_messages(self.activity_label)
            self.activity_label = Label(text="{0} ... ".format(message),
                                        color=(0.14, 0.23, 0.25, 1))
            self.main_ui.add_messages(self.activity_label)

            self.progress_tracking += 10
            self.main_ui.start_progress_bar(self.progress_tracking)

        elif hasattr(self, 'activity_label'):
            self.progress_tracking += 10
            self.main_ui.start_progress_bar(self.progress_tracking)

            if self.progress_tracking >= 97 and message == 'server is stopped':
                self.server_state = True
                self.start_server(self.thread_num)

            if self.progress_tracking >= 97 and message == 'server is running':
                self.server_state = False
                self.my_webview.run_webview()
                self.main_ui.remove_loading_gif()

            if self.progress_tracking >= 97 and message == 'Loading finished':
                self.server_state = False
                self.my_webview.run_webview()
                self.main_ui.remove_loading_gif()

            if self.server_state and message == 'OK' and self.progress_tracking >= 97:
                self.server_state = False
                self.my_webview.run_webview()
                self.main_ui.remove_loading_gif()

    def prepare_server(self):
        '''Schedule preparation steps to be executed in the server thread'''

        self.schedule = self.kalite.schedule
        self.schedule('extract_kalite', 'Extracting ka-lite archive')

        if not self.key_generated:
            self.main_ui.disable_reload_bnt()
            self.schedule('schedule_load_content', 'Loading the content')

        self.schedule('setup_environment', 'Setting up environment')
        if not self.key_generated:
            self.schedule('create_superuser', 'Creating admin user')

        else:
            self.progress_tracking += 40

        self.schedule('check_server', 'Checking server status')

    def start_server(self, threadnum):
        description = "Run server"
        if not self.kalite.server_is_running:
            self.kalite.schedule('start_server', description, threadnum)

    def reload_content(self, widget):
        self.main_ui.disable_reload_bnt()
        self.progress_tracking -= 30
        self.main_ui.start_progress_bar(self.progress_tracking)
        self.schedule('schedule_reload_content', 'Reloading the content')

    @clock_callback
    def start_service_part(self, threadnum):
        from android import AndroidService
        self.service = AndroidService('KA Lite', 'server is running')
        # start executing service/main.py as a service
        self.service.start(':'.join(
            (self.server_host, self.server_port, self.thread_num)))

    @clock_callback
    def stop_service_part(self):
        from android import AndroidService
        AndroidService().stop()
Beispiel #55
0
class Service():
    #Configuracoes do ThreadComm
    CONFIG_THREADCOMMPORT = 51352
    CONFIG_THREADCOMMID = "sigmawebplus"
    
    #Variaveis
    _state = STATE_NOTSTARTED
    _formerState = STATE_NOTSTARTED
    _forceThread = None
    _androidTrigger = False #Hack: O service do Android soh pode ser aberto pelo main thread. Uso essa flag para avisar o main thread a hora de abrir
    _androidTriggerEnd = False
    _androidService = None #Guarda do ponteiro do Android Service, para poder fechar depois
    _lastDisconnection = 0 #Essa variavel serve para ter um timeout de 5 segundos entre cada reconexao
    
    #Objetos
    _threadComm = None #Ponteiro para o objeto do ThreadComm (utilizado para se comunicar com o service)
    _data = None       #Objeto 'Dict' utilizado para armazenar todos as propriedade que estão sinronizadas com o service
    
    '''
    Salva os dados recebido como parametro e inicializa o servico de forma assincrona
    Nota: Se o service já existir, os dados serão sobreescritos em favor dos dados do service
    '''
    def start(self, data, forceThread=False):
        if (self.getState() == STATE_NOTSTARTED):
            Debug().note('service.start(): Iniciando server')
            self._setState(STATE_CONNECTING)
            self._data = data #Salva dados no objeto
            self._forceThread = forceThread
            thread = Thread(target=self._start, name='service._start()') #Faz a inicializacao do Service em outro thread
            thread.daemon = False
            thread.start()
        else:
            Debug().note('service.start(): Reiniciando server')
            thread = Thread(target=self._restart, name='service._restart()', args=(data, forceThread))
            thread.daemon = False
            thread.start()
    
    '''
    Manda um aviso para o service se finalizar e espera a resposta do service!
    ATENCAO: Essa funcao eh bloqueante. Ela trava o andamento do programa ateh receber o sinal do service!
    '''
    def stop(self, killService=True):
        while (self.getState() == STATE_CONNECTING): sleep(0.1) #Espera o ThreadComm conectar, caso ele esteja no modo 'Conectando'
        if self.isAlive():
            self._setState(STATE_DISCONNECTING)
            self._stop(killService)
        else:
            Debug().warn('service.stop(): Service nao esta rodando. Nada para parar! CurrentState: '+str(self.getState()))
            
    
    '''
    Retorna True se o service esta conectado e pronto para funcionar
    '''
    def isAlive(self):
        if (self.getState() == STATE_CONNECTEDTHREAD) or (self.getState() == STATE_CONNECTEDANDROID) or (self.getState() == STATE_CONNECTEDREMOTE):
            return True
        else: return False
    
    '''
    Retorna o estado que o objeto se encontra. Uma lista de estados pode ser vista no inicio desse arquivo
    '''
    def getState(self):
        return self._state
    
    def getFormerState(self):
        return self._formerState
    
    '''
    Retorna o valor da chave solicitada
    '''
    def getKey(self, key):
        try: return str(self._data[key])
        except: return ''
    
    '''
    Seta o valor da chave e avisa o service desta mudanca
    '''
    def setKey(self, key, value):
        self._data[key] = str(value)
        if self.isAlive(): self._sendKey(key)
    
    '''
    Este metodo faz o objeto buscar se há novas mensagens no ThreadComm
    Retorna uma lista com as keys e valores de todas os dados modificados [[key1, value1], [key2, value2], ...]
    Nota: Ele não vai retornar a key se o valor recebido for igual o valor já presente!
    Nota2: Ele tambem é responsavel pelo main loop do service (ele responde outros tipos de mensagens)
    Nota3: A logica do loop foi movida para a funcao _parseMessage() para melhorar a leitura
    '''
    def getKeys(self):
        self._startAndroid() #Hack: O service do Android soh pode ser aberto pelo main thread. Uso essa funcao para o main thread verificar se deve abrir ou nao
        if not self.isAlive(): return None #Verifica se o servidor esta conctado
        
        returnData = []
        while True:
            #Busca novas mensagens no ThreadCom
            try: message = self._threadComm.recvMsg()
            except: break
            
            #Faz o parse da mensagem recebida e, se o valor retornado não for nulo, adiciona na returnData
            data = self._parseMessage(message)
            if data is not None: returnData.append(data)
        
        return returnData
    
    '''
    ''   PRIVATE METHODS
    '''
    
    def __init__(self):
        self._data = {}
    
    def _setState(self, value):
        self._formerState = self._state
        self._state = value
    
    def _restart(self, data, forceThread=False):
        Debug().note('service._restart()')
        self.stop()
        self.start(data, forceThread)
    
    '''
    Metodo interno para iniciar o service. Ele primeiro vai verificar se o service já não está rodando
    Se o service já estiver rodando, ele salva o ponteiro do ThreadComm e solicita ao service todas os seus dados
    Se o service não estiver rodando, ele chama o metodo _startService() para inicializar o service 
    '''
    def _start(self):
        Debug().note('service._start()')
        
        while not (self._lastDisconnection+1 < time()):
            sleep(0.1)
        
        self._threadComm = ThreadComm(self.CONFIG_THREADCOMMPORT, self.CONFIG_THREADCOMMID, ThreadCommClient)
        try: self._threadComm.start()
        except ThreadCommException as e: #Servico nao esta rodando
            Debug().note('service._start(): Service nao esta aberto')
            self._startService()
        else: #Servico já esta rodando
            Debug().note('service._start(): Service ja esta aberto')
            self._threadComm.sendMsg("AKEY") #Solicita todas as keys que o server tem disponivel!
            if (self._forceThread == False) or (platform != 'android'): self._setState(STATE_CONNECTEDREMOTE)
            else:
                Debug().warn('service._start(): Finalizando service e abrindo denovo para atender a forceThread')
                currentData = self._data
                self._stop()
                self.start(currentData, True)
    
    '''
    Metodo que inicializa o service de acordo com a plataforma
    Ele inicializa o service e depois conecta o ThreadComm com o service
    '''
    def _startService(self):
        if (platform == 'android') and (not self._forceThread): connectThread = False
        else: connectThread = True
        
        if not connectThread:
            Debug().note('service._startService(): Esperando o _androidTrigger')
            self._androidTrigger = True #Hack: Ativa a flag para abrir o service do android. O android soh deixa o service ser aberto pelo main thread
            while (self._androidTrigger == True): pass #Espera o service abrir
        else:
            from main import MainService
            mainService = MainService()
            thread = Thread(target=mainService.run)
            thread.daemon = False
            thread.name = "MainService"
            thread.start()
            
        Debug().note('service._startService(): Esperando o ThreadComm conectar')
        while True: #Todo: Colocar um timeout
            try: self._threadComm.start()
            except ThreadCommException: pass
            else: break
        
        Debug().note('service._startService(): Enviando todos os dados')
        for key in self._data:
            self._sendKey(key)
        self._threadComm.sendMsg("STRT") #Sinal para o Service iniciar
        
        #Aguarda a resposta do service
        Debug().note('service._startService(): Aguardando o service ser iniciado')
        message = None
        while message != 'STRT':
            try: message = self._threadComm.recvMsg()
            except: pass
        
        if connectThread: self._setState(STATE_CONNECTEDTHREAD)
        else: self._setState(STATE_CONNECTEDANDROID)
    
    '''
    Metodo utilizado para fazer um parse da mensagem recebida e reagir conforme
    Retorna: Uma lista [key, value] se a mensagem for do tipo "SKEY" e o valor recebido for diferente do que já está na self._data
    '''
    def _parseMessage(self, message):
        if message[:4] == "SKEY": #Set key
            #Extrai dados da mensagem
            length = int(message[4:6]) 
            key, value = [message[6:6+length], message[6+length:]]
            
            '''
            Se o valor for diferente do que está salvo:
                * Salva o novo valor
                * Retorna o nome da chave e seu respectivo valor
            '''
            if value <> self.getKey(key):
                self._data[key] = value
                return key, value
        elif message[:4] == "GKEY": #Get key
            key = message[4:]  #Extrai o nome da key na mensagem
            self._sendKey(key) #Manda o valor da key de volta para o service
        elif message[:4] == "AKEY": #Get all keys
            for key in self.data:
                self._sendKey(key)
        elif message[:4] == "NOTI": #Send a notification
            notificationMsg = message[4:].split("|")
            notificationObject = Notification(*notificationMsg)
            notificationObject.enableActivity = True #O notification normalmente funciona no Service, isso serve para mudar o modo para Activity
            notificationObject.notify()
        elif message[:4] == "STOP": #O Service foi finalizado de forma inesperada
            self._stop(False, True)
            Debug().error('Service finalizado de forma inesperada. O applicativo esta sendo fechado de forma forcada')
            return ['app_delete', '1']
    
    '''
    Metodo privado que envia para o service a KEY especificada, no formato especificado
    Voce nao precisa informar o valor, ele pega direto do self._data
    '''
    def _sendKey(self, key):
        length = str(len(key)).zfill(2)
        self._threadComm.sendMsg("SKEY"+length+key+self.getKey(key))
    
    '''
    O service do Android soh pode ser aberto pelo main thread. 
    Essa funcao verifica uma flag de aberura. Caso ela esteja ligada, ele abre o Service e desliga a flag
    '''
    def _startAndroid(self):
        if self._androidTrigger:
            Debug().note('service._startAndroid(): Iniciando o service no Android')
            from android import AndroidService
            self._androidService = AndroidService('SigmaWeb+', 'Monitorando') 
            self._androidService.start()
            self._androidTrigger = False
        
        if self._androidTriggerEnd:
            Debug().note('service._startAndroid(): Finalizando o service no Android')
            if self._androidService is not None:
                self._androidService.stop()
            else:
                Debug().warn('service._startAndroid(): Service nao pode ser finalizado. Nao esta aberto')
            self._androidService = None
            self._androidTriggerEnd = False
    
    '''
    Para o service do android caso ele esteja iniciado
    '''
    def _stopAndroid(self):
        Debug().note('service._stopAndroid()')
        if (platform == 'android') and (self.getFormerState() == STATE_CONNECTEDREMOTE):
            from android import AndroidService
            self._androidService = AndroidService('SigmaWeb+', 'Monitorando')
        
        if (self._androidService != None):
            Debug().note('service._stopAndroid(): Esperando o _androidTriggerEnd') 
            self._androidTriggerEnd = True
            if currentThread().name == 'service._restart()':
                while self._androidTriggerEnd: sleep(0.1)
            else:
                self._startAndroid()
    
    '''
    Funcao privada para parar o service (ela nao faz checks se o service foi iniciado. Isso eh trabalho da funcao publica)
    '''
    def _stop(self, killService=True, forceKillAndroid=False):
        if killService: 
            self._threadComm.sendMsg("KILL") #Manda o sinal para o service terminar
            
            '''
            A maneira que esta funcao verifica se o service foi desconectado eh a seguinte:
                1) Espera o service mandar uma mensagem STOP (avisando que está quase sendo desligado)
                2) Flooda o service com mensagens NULL, ateh que elas comecem a retornar erro
            '''
            Debug().note('service.stop(): Aguardando o service ser desligado')
            message = None
            while message != 'STOP':
                try: message = self._threadComm.recvMsg()
                except: pass
            while True:
                try: self._threadComm.sendMsg("NULL")
                except: break
                sleep(0.1)
                
        Debug().note('service.stop(): Limpando a memoria')
        #Limpa a memoria e limpa o estado do objeto
        self._threadComm.stop()
        if killService or forceKillAndroid: self._stopAndroid()
        self._data = None
        self._threadComm = None
        self._setState(STATE_NOTSTARTED)
        self._lastDisconnection = time()
        
Beispiel #56
0
class MainWindow(Widget):
    destination = StringProperty('Unknown')
    currentstatus = StringProperty('not yet started')
    selectedDeviceName = StringProperty('Select device')
    isRunning = BooleanProperty(False)

    def __init__(self, **kwargs):
        if platform == 'android':
            self.isRunning = isServiceRunning()
            if self.isRunning:
                self.service = AndroidService('my gps service', 'running')
                self.currentstatus = "service was running"
            else:
                self.service = None
        else:
            self.service = None
            self.isRunning = False
        super(MainWindow, self).__init__(**kwargs)

    def getSettings(self):
        self.config = ConfigParser()
        if self.config.read(appConfigFileName):
            if self.config.has_option('general', 'device'):
                self.device = self.config.get('general', 'device')
            else:
                self.device = None
            if self.config.has_option('general', 'asset'):
                self.asset = self.config.get('general', 'asset')
            else:
                self.asset = None
        else:
            self.device = None
            self.asset = None

    def updateDevName(self):
        if self.device:
            dev = IOT.getDevice(self.device)
            if dev:
                if 'title' in dev and dev['title']:
                    self.selectedDeviceName = dev['title']
                else:
                    self.selectedDeviceName = dev['name']

    def saveConfig(self):
        if not self.config.has_section('general'):
            self.config.add_section('general')
        self.config.set('general', 'device', self.device)
        self.config.set('general', 'asset', self.asset)
        with open(appConfigFileName, 'w') as f:
            self.config.write(f)

    def showSelectDevice(self, relativeTo):

        dropdown = DropDown()  # auto_width=False, width='140dp'
        devices = IOT.getDevices(data.credentials.groundid)
        for dev in devices:
            btn = Button(size_hint_y=None, height='32dp')
            btn.DeviceId = dev['id']
            if dev['title']:
                btn.text = dev[
                    'title']  # for old devices that didn't ahve a title yet.
            else:
                btn.text = dev['name']
            btn.bind(on_release=lambda btn: self.selectDevice(
                btn.parent.parent, btn.DeviceId, btn.text))
            dropdown.add_widget(btn)
        dropdown.open(relativeTo)

    def selectDevice(self, dropdown, deviceId, title):
        if dropdown:
            dropdown.dismiss()
        self.selectedDeviceName = title
        self.device = deviceId
        if self.asset:
            IOT.unsubscribe(self.asset)
        self.asset = None
        if self.device:
            assets = IOT.getAssets(self.device)
            locationAsset = [
                asset for asset in assets
                if str(asset['name']).startswith('prediction_distance_json')
            ]
            if locationAsset and len(locationAsset) > 0:
                self.asset = str(locationAsset[0]['id'])
                IOT.subscribe(self.asset, self.destinationChanged)
        if self.isRunning and platform == 'android':
            osc.sendMsg('/device', [str(self.device)], port=IPCServicePort)
        self.saveConfig()

    def destinationChanged(self, value):
        if value:
            self.destination = str(value)
        else:
            self.destination = 'Unknown'

    def startService(self, level):
        self.isRunning = True
        if platform == 'android':
            if not self.service:
                self.service = AndroidService('my gps service', 'running')
            if self.device:
                self.service.start(level + '|' + self.device + '|' +
                                   data.credentials.deviceAuth + '|' +
                                   IOT._brokerPwd)
            else:
                self.service.start(level)

    def stopService(self):
        if self.isRunning:
            if self.service:
                osc.sendMsg('/stop', [''], port=IPCServicePort)
                try:
                    self.service.stop()
                    self.currentstatus = "GPS stopped"
                except Exception as e:
                    logging.exception('failed to stop service')
                    self.currentstatus = "failed to stop service: " + e.message

        self.isRunning = False

    def on_update_from_service(self, message, *args):
        self.currentstatus = message[2]
Beispiel #57
0
 def start_service(self):
     if platform == 'android':
         from android import AndroidService
         service = AndroidService('my pong service', 'running')
         service.start('service started')
         self.service = service
Beispiel #58
0
Datei: main.py Projekt: wtud/tsap
# SETUP ENVIRONMENT, DO THIS FIRST
from service.Environment import init_environment

init_environment()

# Print some interesting setup stuff before logger init
print 'os.getcwd(): %s' % os.getcwd()
print 'sys.platform: %s\nos.name: %s' % (sys.platform, os.name)

# Init logger
logging.basicConfig(level=logging.DEBUG)
_logger = logging.getLogger(__name__)

if __name__ == '__main__':
    if os.environ['ANDROID_HOST'].startswith("ANDROID"):
        # Start android service
        from android import AndroidService

        service = AndroidService("TSAP Tribler Session",
                                 "A tribler session is running..")

        _logger.info("Starting service..")
        service.start()

    else:
        # Just run services/main.py
        import subprocess

        os.chdir(os.path.join(os.getcwd(), 'service'))
        subprocess.call(["python", "main.py"])
Beispiel #59
0
	def start_service(self):
		if platform == 'android':
			from android import AndroidService
			service = AndroidService('controle', 'running')
			service.start('service started')
			self.service = service
Beispiel #60
0
import os

# SETUP ENVIRONMENT, DO THIS FIRST
from service.Environment import init_environment

init_environment()

# Print some interesting setup stuff before logger init
print 'os.getcwd(): %s' % os.getcwd()
print 'sys.platform: %s\nos.name: %s' % (sys.platform, os.name)

# Init logger
logging.basicConfig(level=logging.DEBUG)
_logger = logging.getLogger(__name__)

if __name__ == '__main__':
    if os.environ['ANDROID_HOST'].startswith("ANDROID"):
        # Start android service
        from android import AndroidService

        service = AndroidService("TSAP Tribler Session", "A tribler session is running..")

        _logger.info("Starting service..")
        service.start()

    else:
        # Just run services/main.py
        import subprocess

        os.chdir(os.path.join(os.getcwd(), 'service'))
        subprocess.call(["python", "main.py"])