import sys
#import uos as os
import os
import machine

RC = "./boot.py"
CONFIG = "./webrepl_cfg.py"

def input_choice(prompt, choices):
    while 1:
        resp = input(prompt)
        if resp in choices:
            return resp

def getpass(prompt):
    return input(prompt)

def input_pass():
    while 1:
        passwd1 = getpass("New password (4-9 chars): ")
        if len(passwd1) < 4 or len(passwd1) > 9:
            print("Invalid password length")
            continue
        passwd2 = getpass("Confirm password: ")
        if passwd1 == passwd2:
            return passwd1
        print("Passwords do not match")


def exists(fname):
    try:
        with open(fname):
            pass
        return True
    except OSError:
        return False

def copy_stream(s_in, s_out):
    buf = bytearray(64)
    while 1:
        sz = s_in.readinto(buf)
        s_out.write(buf, sz)


def get_daemon_status():
    with open(RC) as f:
        for l in f:
            if "webrepl" in l:
                if l.startswith("#"):
                    return False
                return True
        return None

def add_daemon():
    with open(RC) as old_f, open(RC + ".tmp", "w") as new_f:
        new_f.write("import webrepl\nwebrepl.start()\n")
        copy_stream(old_f, new_f)

def change_daemon(action):
    LINES = ("import webrepl", "webrepl.start()")
    with open(RC) as old_f, open(RC + ".tmp", "w") as new_f:
        for l in old_f:
            for patt in LINES:
                if patt in l:
                    if action and l.startswith("#"):
                        l = l[1:]
                    elif not action and not l.startswith("#"):
                        l = "#" + l
            new_f.write(l)
    # FatFs rename() is not POSIX compliant, will raise OSError if
    # dest file exists.
    os.remove(RC)
    os.rename(RC + ".tmp", RC)


def main():
    status = get_daemon_status()

    print("WebREPL daemon auto-start status:", "enabled" if status else "disabled")
    print("\nWould you like to (E)nable or (D)isable it running on boot?")
    print("(Empty line to quit)")
    resp = input("> ").upper()

    if resp == "E":
        if exists(CONFIG):
            resp2 = input_choice("Would you like to change WebREPL password? (y/n) ", ("y", "n", ""))
        else:
            print("To enable WebREPL, you must set password for it")
            resp2 = "y"

        if resp2 == "y":
            passwd = input_pass()
            with open(CONFIG, "w") as f:
                f.write("PASS = %r\n" % passwd)


    if resp not in ("D", "E") or (resp == "D" and not status) or (resp == "E" and status):
        print("No further action required")
        sys.exit()

    change_daemon(resp == "E")

    print("Changes will be activated after reboot")
    resp = input_choice("Would you like to reboot now? (y/n) ", ("y", "n", ""))
    if resp == "y":
        machine.reset()

main()

@@ -758,137 +758,8 @@
 se%0A%0A
-def copy_stream(s_in, s_out):%0A    buf = bytearray(64)%0A    while 1:%0A        sz = s_in.readinto(buf)%0A        s_out.write(buf, sz)%0A%0A
 %0Adef
@@ -979,178 +979,8 @@
 ne%0A%0A
-def add_daemon():%0A    with open(RC) as old_f, open(RC + %22.tmp%22, %22w%22) as new_f:%0A        new_f.write(%22import webrepl%5Cnwebrepl.start()%5Cn%22)%0A        copy_stream(old_f, new_f)%0A
 %0Adef
@@ -1110,24 +1110,46 @@
 ) as new_f:%0A
+        found = False%0A
         for 
@@ -1217,24 +1217,57 @@
  patt in l:%0A
+                    found = True%0A
             
@@ -1440,16 +1440,16 @@
 %22#%22 + l%0A
-
         
@@ -1467,16 +1467,99 @@
 rite(l)%0A
+        if not found:%0A            new_f.write(%22import webrepl%5Cnwebrepl.start()%5Cn%22)%0A
     # Fa

Fix first-time enable of WebREPL.