buzz twice to give users more time
[saartuer.git] / tyshell
diff --git a/tyshell b/tyshell
index 13a551330f03bb2ee8ec85074afc4aec19fc796e..b535f2b9eef3d47b4938aa964c8e0041b8528ebb 100755 (executable)
--- a/tyshell
+++ b/tyshell
@@ -7,6 +7,7 @@ import subprocess
 import socket
 import pwd
 import grp
 import socket
 import pwd
 import grp
+import traceback
 from collections import namedtuple
 
 tuerSock = "/run/tuer.sock"
 from collections import namedtuple
 
 tuerSock = "/run/tuer.sock"
@@ -42,9 +43,11 @@ def sendcmd(addr, cmd):
                s.connect(addr)
                s.settimeout(60.0)
                s.send(cmd.encode())
                s.connect(addr)
                s.settimeout(60.0)
                s.send(cmd.encode())
-               data = s.recv(256)
+               while True:
+                       data = s.recv(256)
+                       if not len(data): break
+                       print(data.decode('utf-8'))
                s.close()
                s.close()
-               print(data.decode('utf-8'))
        return run
 
 def exitcmd(c):
        return run
 
 def exitcmd(c):
@@ -61,17 +64,32 @@ def alias (cmds, aliases):
                cmds[newname] = cmds[oldname]
        return cmds
 
                cmds[newname] = cmds[oldname]
        return cmds
 
+def prompt_sure(f,msg):
+       def run(c):
+               try:
+                       command = input("%s Are you sure? (yes/no) > " % msg)
+               except EOFError:
+                       print()
+                       return
+               if command[0] == 'y':
+                       return f(c)
+       return run
+
 CmdEntry = namedtuple('CmdEntry','function helpstring')
 
 commands = alias({
        'exit': CmdEntry(exitcmd, 'Quits this shell'),
        'help': CmdEntry(helpcmd, 'Helps you getting to know the available commands'),
 CmdEntry = namedtuple('CmdEntry','function helpstring')
 
 commands = alias({
        'exit': CmdEntry(exitcmd, 'Quits this shell'),
        'help': CmdEntry(helpcmd, 'Helps you getting to know the available commands'),
-       'open': CmdEntry(sendcmd(tuerSock, 'unlock'), 'Will try to unlock the apartment door'),
+       'unlock': CmdEntry(sendcmd(tuerSock, 'unlock'), 'Will try to unlock the apartment door'),
+       'lock': CmdEntry(sendcmd(tuerSock, 'lock'), 'If in fallback mode, try to lock the apartment door. If not in fallback mode, you must use the switch near the door.'),
        'buzz': CmdEntry(sendcmd(tuerSock, 'buzz'), 'Will buzz the buzzer for the street door'),
        'who': CmdEntry(whocmd, 'Shows the list of people, who are allowed to control this system'),
        'buzz': CmdEntry(sendcmd(tuerSock, 'buzz'), 'Will buzz the buzzer for the street door'),
        'who': CmdEntry(whocmd, 'Shows the list of people, who are allowed to control this system'),
+       'fallback_mode_on': CmdEntry(prompt_sure(sendcmd(tuerSock, 'fallback_mode_on'),'WARNING: This action will be reported to the admins. Use this only in case of Sphinx hardware failure when you need to ignore erroneous sensor input!'), 'Sets the system in a state where it is less dependent on sensoric input. Use it only when sensors are broken.'),
+       'fallback_mode_off': CmdEntry(prompt_sure(sendcmd(tuerSock, 'fallback_mode_off'),'WARNING: This action will be reported to the admins. Use this only if you have fixed the sensors of the Sphinx or activated fallback mode by accident!'), 'Resets the system to the default state. Use this when you have just repaired the sensors of the Sphinx.'),
+       'status': CmdEntry(sendcmd(tuerSock, 'status'), 'Shows internal state and sensor information.'),
 },{
        # aliases
 },{
        # aliases
-       'unlock': 'open',
+       'open': 'unlock',
 })
 
 def complete_command(cmd):
 })
 
 def complete_command(cmd):
@@ -104,6 +122,7 @@ while True:
                        if res: break
                except Exception as e:
                        print("Error while executing %s: %s" % (command[0], str(e)))
                        if res: break
                except Exception as e:
                        print("Error while executing %s: %s" % (command[0], str(e)))
+                       #print(traceback.format_exc())
        else: # multiple commands fit the prefix
                print("Ambiguous command prefix, please choose one of the following:")
                print("\t", " ".join(cmdoptions))
        else: # multiple commands fit the prefix
                print("Ambiguous command prefix, please choose one of the following:")
                print("\t", " ".join(cmdoptions))