예제 #1
0
 def __init__(self):
     object.__init__(self)
     builder = gtk.Builder()
     glade_file = os.path.abspath(__file__).replace("PppoeDi.py", "ui/pppoedi.glade")
     builder.add_from_file(glade_file)
     self.window = builder.get_object("main_window")
     self.entry_login = builder.get_object("entry_login")
     self.entry_password = builder.get_object("entry_password")
     self.status = builder.get_object("status")
     self.checkbutton_savepass = builder.get_object("checkbutton_savepass")
     self.checkbutton_lockscreen = builder.get_object("checkbutton_lockscreen")
     self.button_conn_disconn = builder.get_object("button_conn_disconn")
     self.window.show()
     builder.connect_signals(
         {
             "gtk_main_quit": self.quit_pppoe,
             "on_entry_login_activate": self.conn_disconn,
             "on_entry_password_activate": self.conn_disconn,
             "on_button_conn_disconn_clicked": self.conn_disconn,
         }
     )
     self.pap_secrets_file = "/etc/ppp/pap-secrets"
     self.set_distro()
     self.checkbutton_lockscreen.set_active(True)
     self.settings = Settings()
     self.check_conn = CheckConnection(self.status, self.settings, self)
     self.check_conn.start()
     self.initialize_dbus_session()
     self.initialize_pppoedi_bus()
     self.verify_saved_password()
예제 #2
0
class PppoeDi(object):
    def __init__(self):
        object.__init__(self)
        builder = gtk.Builder()
        glade_file = os.path.abspath(__file__).replace("PppoeDi.py", "ui/pppoedi.glade")
        builder.add_from_file(glade_file)
        self.window = builder.get_object("main_window")
        self.entry_login = builder.get_object("entry_login")
        self.entry_password = builder.get_object("entry_password")
        self.status = builder.get_object("status")
        self.checkbutton_savepass = builder.get_object("checkbutton_savepass")
        self.checkbutton_lockscreen = builder.get_object("checkbutton_lockscreen")
        self.button_conn_disconn = builder.get_object("button_conn_disconn")
        self.window.show()
        builder.connect_signals(
            {
                "gtk_main_quit": self.quit_pppoe,
                "on_entry_login_activate": self.conn_disconn,
                "on_entry_password_activate": self.conn_disconn,
                "on_button_conn_disconn_clicked": self.conn_disconn,
            }
        )
        self.pap_secrets_file = "/etc/ppp/pap-secrets"
        self.set_distro()
        self.checkbutton_lockscreen.set_active(True)
        self.settings = Settings()
        self.check_conn = CheckConnection(self.status, self.settings, self)
        self.check_conn.start()
        self.initialize_dbus_session()
        self.initialize_pppoedi_bus()
        self.verify_saved_password()

    def initialize_pppoedi_bus(self):
        system_bus = dbus.SystemBus()
        try:
            self.pppoedi_bus = system_bus.get_object("com.lar.PppoeDi", "/PppoeDiService")
            self.pppoedi_bus_interface = dbus.Interface(self.pppoedi_bus, "com.lar.PppoeDi")
        except dbus.DBusException:
            # TODO: add pop-up
            sys.exit(1)

    def initialize_dbus_session(self):
        DBusGMainLoop(set_as_default=True)
        session_bus = dbus.SessionBus()
        session_bus2 = dbus.SessionBus()
        self.current_desktop = os.getenv("XDG_CURRENT_DESKTOP")
        if self.current_desktop == "Unity":
            session_bus.add_match_string("type='signal',interface='com.ubuntu.Upstart0_6'")
            session_bus2.add_match_string("type='signal',interface='org.gnome.SessionManager.ClientPrivate'")
        elif self.current_desktop == "MATE":
            session_bus.add_match_string("type='signal',interface='org.mate.ScreenSaver'")
            session_bus2.add_match_string("type='signal',interface='org.mate.SessionManager.ClientPrivate'")
        elif self.current_desktop == "GNOME":
            session_bus.add_match_string("type='signal',interface='org.gnome.ScreenSaver'")
            session_bus2.add_match_string("type='signal',interface='org.gnome.SessionManager.ClientPrivate'")
        elif self.current_desktop == "X-Cinnamon":
            session_bus.add_match_string("type='signal',interface='org.cinnamon.ScreenSaver'")
            session_bus2.add_match_string("type='signal',interface='org.gnome.SessionManager.ClientPrivate'")
        elif self.current_desktop == "LXDE":
            return
        elif self.current_desktop == "XFCE":
            return
        else:
            # TODO: add pop-up
            sys.exit(1)
        signal.signal(signal.SIGTERM, self.dbus_quit)
        session_bus.call_on_disconnection(self.dbus_quit)
        session_bus.add_message_filter(self.filter_cb)
        session_bus2.add_message_filter(self.filter_cb)

    def verify_saved_password(self):
        self.pppoe_file = os.getenv("HOME") + "/.pppoedi.conf"
        # Define a localizacao do arquivo de configuraçao do PPPoE

        login_pass = ""
        if os.path.isfile(self.pppoe_file):
            with open(self.pppoe_file) as login_pass_file:
                login_pass = login_pass_file.readline()

        # login_pass = self.pppoedi_bus_interface.ReadFromFile(self.pppoe_file)
        login_pass = login_pass.split(",")

        if len(login_pass) > 1:
            login = login_pass[0]
            password = login_pass[1]
            password = password.encode()
            password = base64.b64decode(password)
            password = password.decode()
            self.entry_login.set_text(login)
            self.entry_password.set_text(password)
            self.checkbutton_savepass.set_active(True)

    def set_distro(self):
        distro_name = ""  # Inicializa a variavel que armazena o nome da
        # distribuicao em uso

        # Le o nome da distribuicao em uso no arquivo '/etc/os-release' e
        # armazena na variavel 'distro_name'
        with open("/etc/os-release", "r") as f:
            while "NAME" not in distro_name:
                distro_name = f.readline()

        # Lista com as distribuicoes mais populares baseadas em Debian
        debian_like_distro = (
            "Ubuntu",
            "Ubuntu Studio",
            "Ubuntu MATE",
            "Kubuntu",
            "Xubuntu",
            "Lubuntu",
            "Linux Mint",
            "Kali Linux",
            "Zorin OS",
            "deepin",
            "LXLE",
            "elementary OS",
            "Bodhi Linux",
            "Peppermint OS",
            "siduction",
            "Raspbian",
            "Debian",
        )

        # Lista com as distribuicoes mais populares baseadas em Fedora
        fedora_like_distro = ("Fedora", "Red Hat Enterprise Linux", "CentOS", "ClearOS", "Pidora")

        # Inicializa a variavel que armazena o tipo da distribuicao em uso
        # Assume o valor '1' se for baseada em Debian
        # Assume o valor '2' se for baseada em RHEL/Fedora
        self.linux_distro_type = 0

        # Procura cada item da lista de distros baseadas em Debian como
        # substring do nome da distro em uso
        if any(distro in distro_name for distro in debian_like_distro):
            self.linux_distro_type = 1
        # Procura cada item da lista de distros baseadas em RHEL/Fedora como
        # substring do nome da distro em uso
        elif any(distro in distro_name for distro in fedora_like_distro):
            self.linux_distro_type = 2
        else:
            # TODO: add pop-up
            sys.exit(1)

    def quit_pppoe(self, widget):
        self.settings.quit_pppoedi = True

        if self.settings.connect_active:
            self.disconnect()

        self.pppoedi_bus_interface.Exit()
        # self.check_conn.terminate()
        gtk.main_quit()

    def save_pass(self):
        login = self.entry_login.get_text()
        password = self.entry_password.get_text()
        password = password.encode()
        password = base64.b64encode(password)
        password = password.decode()
        message = login + "," + password
        with open(self.pppoe_file, "w") as f:
            f.write(message)
            f.close()

    def conn_disconn(self, widget):
        if self.settings.connect_active == True:
            self.disconnect()
        else:
            self.connect()

    def connect(self):
        login = self.entry_login.get_text()
        password = self.entry_password.get_text()

        self.entry_login.set_editable(False)
        self.entry_login.set_has_frame(False)
        self.entry_login.set_can_focus(False)
        self.entry_password.set_editable(False)
        self.entry_password.set_has_frame(False)
        self.entry_password.set_can_focus(False)
        self.button_conn_disconn.set_label("Disconnect")

        route = getoutput("route -n")

        gw = route.split("\n")[2].split(" ")[9]
        net = "200.137.66.0/24"
        sl = "10.9.10.0/24"
        if self.linux_distro_type == 1:  # Se a distro e baseada em Debian
            self.pppoedi_bus_interface.RouteAddNetGw(net, gw)
            self.pppoedi_bus_interface.RouteAddNetSl(sl, gw)
        elif self.linux_distro_type == 2:  # Se a distro e baseada em
            self.pppoedi_bus_interface.RouteAddNetGwF(net, gw)
            self.pppoedi_bus_interface.RouteAddNetGwSlF(sl, gw)
        else:
            # TODO: add pop-up
            sys.exit(1)

        line = '"' + login + '" * "' + password + '"'
        self.pppoedi_bus_interface.PrintToFile(line, self.pap_secrets_file)

        interface = route.split("\n")[2].split(" ")[-1]

        if self.linux_distro_type == 1:  # Se a distro e baseada em Debian
            peer_lar = "/etc/ppp/peers/lar"
            config_peer = (
                "noipdefault\ndefaultroute\nreplacedefaultroute\n"
                + "hide-password\nnoauth\npersist\nplugin rp-pppoe."
                + "so "
                + interface
                + '\nuser "'
                + login
                + '"\nusepeerdns'
            )
            self.pppoedi_bus_interface.PrintToFile(config_peer, peer_lar)
            interface = "lar"
            self.pppoedi_bus_interface.Pon(interface)
            release = getoutput("lsb_release -r")
            if self.current_desktop == "MATE" or (self.current_desktop == "Unity" and release.find("15.10") != -1):
                time.sleep(3.5)
                interface = "ppp0"
                self.pppoedi_bus_interface.RouteAddDefault(interface)
        elif self.linux_distro_type == 2:  # Se a distro e baseada em
            # RHEL/Fedora
            peer_lar = "/etc/sysconfig/network-scripts/ifcfg-ppp"
            config_peer = (
                "USERCTL=yes\nBOOTPROTO=dialup\nNAME=DSLppp0\nDEV"
                + "ICE=ppp0\nTYPE=xDSL\nONBOOT=no\nPIDFILE=/var/run"
                + "/pppoe-adsl.pid\nFIREWALL=NONE\nPING=.\nPPPOE_TI"
                + "MEOUT=80\nLCP_FAILURE=3\nLCP_INTERVAL=20\nCLAMPM"
                + "SS=1412\nCONNECT_POLL=6\nCONNECT_TIMEOUT=60\nDEF"
                + "ROUTE=yes\nSYNCHRONOUS=no\nETH="
                + interface
                + "\nPR"
                + "OVIDER=DSLppp0\nUSER="******"\nPEERDNS=no\nDEMAND=no"
            )
            self.pppoedi_bus_interface.PrintToFile(config_peer, peer_lar)
            interface = "ppp0"
            self.pppoedi_bus_interface.Ifup(interface)
            self.pppoedi_bus_interface.RouteAddDefaultF(interface)
        else:
            # TODO: add pop-up
            sys.exit(1)

        self.status.set_from_icon_name("network-error", gtk.IconSize.BUTTON)

        self.settings.time_start = time.time()
        self.settings.active_status = False
        self.settings.time_sleep = 3
        self.settings.connect_active = True

        if self.checkbutton_savepass.get_active():
            self.save_pass()

    def disconnect(self):
        self.entry_login.set_editable(True)
        self.entry_login.set_has_frame(True)
        self.entry_login.set_can_focus(True)
        self.entry_password.set_editable(True)
        self.entry_password.set_has_frame(True)
        self.entry_password.set_can_focus(True)
        self.button_conn_disconn.set_label("Connect")
        self.pppoedi_bus_interface.FileBlank(self.pap_secrets_file)

        if self.linux_distro_type == 1:
            interface = "lar"
            self.pppoedi_bus_interface.Poff(interface)
        elif self.linux_distro_type == 2:
            interface = "ppp0"
            self.pppoedi_bus_interface.Ifdown(interface)

        self.status.set_from_icon_name("network-offline", gtk.IconSize.BUTTON)

        self.settings.connect_active = False

    def main(self):
        gtk.main()

    def filter_cb(self, bus, message):
        if self.checkbutton_lockscreen.get_active():
            if message.get_member() == "EndSession" or message.get_member() == "Disconnected":
                self.quit_pppoe(None)
            elif message.get_member() == "EventEmitted" or message.get_member() == "ActiveChanged":
                args = message.get_args_list()
                if args[0] == "desktop-lock" or args[0] == True:
                    self.disconnect()
                elif args[0] == "session-end":
                    self.quit_pppoe(None)

    def dbus_quit(self, conn):
        self.disconnect()