class TabHostname(object): def __init__(self, main_loop): self.main_loop = main_loop self.name = u"Hosts Config" self.hosts_file = "/etc/hosts" self.w_entries = self.load_entries() self.widget = SimplePopupLauncher(self.get_entry_widget()) def load_entries(self): widget_lines = [] with open(self.hosts_file) as f: for line in f.readlines(): items = line.split() widget_items = [urwid.Edit("IP: ", items[0]), urwid.Edit("Hostname: ", items[1])] widget_items.append(urwid.Button("Delete", on_press=self.delete_line, user_data=widget_items)) widget_lines.append(widget_items) return widget_lines def delete_line(self, button, line): # button参数没有用到 self.w_entries.remove(line) self.widget.original_widget = self.get_entry_widget() self.widget.original_widget.focus_position = max(0, len(self.w_entries)-1) def get_entry_widget(self): pile = urwid.Pile([ urwid.Columns(entry) for entry in self.w_entries ]) pile.contents.append((urwid.Button("New", on_press=self.new), ('pack', None))) pile.contents.append((urwid.Button("Save", on_press=self.save), ('pack', None))) return pile def new(self, button): # button参数没有用到 widget_items = [urwid.Edit("IP: ", ""), urwid.Edit("Hostname: ", "")] widget_items.append(urwid.Button("Delete", on_press=self.delete_line, user_data=widget_items)) self.w_entries.append(widget_items) self.widget.original_widget = self.get_entry_widget() self.widget.original_widget.focus_position = len(self.w_entries) def save(self, button): # button参数没有用到 f = open(self.hosts_file, "w") # 可以用with语句,下面就不用f.close了 for entry in self.w_entries: if entry[0].edit_text.strip() and entry[1].edit_text.strip(): f.write("%s %s\n" % (entry[0].edit_text, entry[1].edit_text)) f.close() self.widget.set_popup_text("Save success.") self.widget.open_pop_up()
def __init__(self, main_loop): self.main_loop = main_loop self.name = u"NetWork" self.widget_list = [] self.hostname = urwid.Edit(u"Hostname: ", socket.gethostname()) self.hostname_popup = SimplePopupLauncher( urwid.Columns(([self.hostname, urwid.Button(u"Save", on_press=self.save_hostname)]))) self.widget_list.extend([ urwid.Divider("-"), self.hostname_popup, ]) ifs_widgets = self.get_ifs_widgets() bridge_widgets = self.get_bridge_widgets() if ifs_widgets: self.widget_list.extend(ifs_widgets) if bridge_widgets: self.widget_list.extend(bridge_widgets) #上面两个判断多余,直接self.widget_list.extend,只要保证ifs_widgets和bridge_widgets类型始终上list self.widget = WidgetWithSaveNicPopup(urwid.Pile(self.widget_list))
class TabNetwork(object): def __init__(self, main_loop): self.main_loop = main_loop self.name = u"NetWork" self.widget_list = [] self.hostname = urwid.Edit(u"Hostname: ", socket.gethostname()) self.hostname_popup = SimplePopupLauncher( urwid.Columns(([self.hostname, urwid.Button(u"Save", on_press=self.save_hostname)])), "Save success.") self.widget_list.extend([ urwid.Divider("-"), self.hostname_popup, ]) ifs_widgets = self.get_ifs_widgets() bridge_widgets = self.get_bridge_widgets() if ifs_widgets: self.widget_list.extend(ifs_widgets) if bridge_widgets: self.widget_list.extend(bridge_widgets) #上面两个判断多余,直接self.widget_list.extend,只要保证ifs_widgets和bridge_widgets类型始终上list self.widget = WidgetWithSaveNicPopup(urwid.Pile(self.widget_list)) def save_hostname(self, button): os.system("hostname %s" % self.hostname.edit_text) os.system("echo 'hostname %s' > /etc/sysconfig/network" % self.hostname.edit_text) self.hostname_popup.open_pop_up() def get_bridge_widgets(self): bridge_info_widgets = [] for bridge in ifconfig.iterifs(bridge=True): try: if_name = subprocess.check_output( "brctl show %s|grep %s" % (bridge.name, bridge.name), shell=True).split("\t")[-1].strip() bridge_info_widgets.append(urwid.Pile([ urwid.Divider("-"), urwid.Columns([ ("weight", 1, urwid.Pile([ urwid.Text(u"Name: %s" % if_name), urwid.Text(u"Status: %s" % ("up" if ifconfig.Interface(if_name).is_up() else "down")), ])), ("weight", 2, urwid.Pile([ urwid.Text(u"Bridge: %s" % bridge.name), urwid.Text(u"Address: %s" % bridge.get_ip()), urwid.Text(u"Netmask: %s" % bridge.get_netmask()), urwid.Text(u"Gateway: %s" % self.config_gateway(bridge.name)), ])), ]) ])) except subprocess.CalledProcessError: continue return bridge_info_widgets def get_ifs_widgets(self): ifs_info_widget = [] for interface in ifconfig.iterifs(physical=True): try: subprocess.check_output("brctl show|grep %s" % interface.name, shell=True) continue except subprocess.CalledProcessError: pass address_edit = urwid.Edit(u"Adress: ", str(interface.get_ip())) netmask_edit = urwid.Edit(u"Netmask: ", str(interface.get_netmask())) gateway_edit = urwid.Edit(u"Gateway: ", self.config_gateway(interface.name)) apply_button = urwid.Button(u"Apply") ifs_info_widget.append(urwid.Pile([ urwid.Divider("-"), urwid.Text(u"Name: " + interface.name), address_edit, netmask_edit, gateway_edit, urwid.Text(u"Status: " + ("up" if interface.is_up() else "down")), apply_button, ])) urwid.connect_signal( apply_button, "click", self.on_if_apply, user_arg=(interface.name, address_edit, netmask_edit, gateway_edit)) return ifs_info_widget def config_gateway(self, name): try: gateway = subprocess.check_output( "cat /etc/sysconfig/network-scripts/ifcfg-%s|grep -i gateway" % name, shell=True) gateway = gateway.split("=")[1].replace("\"", "").replace("'", "").strip() except subprocess.CalledProcessError: gateway = "" return gateway def on_if_apply(self, button, if_info): self.widget.set_if_info(if_info) self.widget.open_pop_up() thread.start_new_thread(self.post_on_if_apply, (if_info,)) def post_on_if_apply(self, if_info): interface = ifconfig.findif(if_info[0]) with open('/etc/sysconfig/network-scripts/ifcfg-' + if_info[0], 'w') as out: out.write('HWADDR={}\n'.format(interface.get_mac()) + 'BOOTPROTO=static\n' + 'IPADDR={}\n'.format(if_info[1].get_edit_text()) + 'PREFIX={}\n'.format(int(if_info[2].get_edit_text())) + 'GATEWAY={}\n'.format(if_info[3].get_edit_text()) + 'ONBOOT=yes\n' ) os.system('/etc/init.d/network restart &>/dev/null') self.widget.if_update_finish() self.main_loop.draw_screen()
def __init__(self, main_loop): self.main_loop = main_loop self.name = u"Hosts Config" self.hosts_file = "/etc/hosts" self.w_entries = self.load_entries() self.widget = SimplePopupLauncher(self.get_entry_widget())