Skip to content

Commit

Permalink
Merge pull request #22 from ghostbsd/issue-20-21
Browse files Browse the repository at this point in the history
added offline mode to code issue #20
  • Loading branch information
ericbsd authored May 9, 2021
2 parents 6c60818 + 660d132 commit 8722a60
Show file tree
Hide file tree
Showing 3 changed files with 169 additions and 53 deletions.
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
# ,,python setup.py build_i18n -m''

# silence pyflakes, __VERSION__ is properly assigned below...
__VERSION__ = '1.1'
__VERSION__ = '1.2'

# for line in open('gbinstall', 'r').readlines():
# if (line.startswith('__VERSION__')):
Expand Down
167 changes: 120 additions & 47 deletions software-station
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,22 @@ import os
from time import sleep


from software_station_pkg import search_packages, available_package_origin
from software_station_pkg import available_package_dictionary, get_pkg_changes_data
from software_station_pkg import installed_package_origin
from software_station_pkg import installed_package_dictionary, delete_packages
from software_station_pkg import install_packages, fetch_packages
# from software_station_xpm import xpmPackageCategory
from software_station_pkg import (
search_packages,
available_package_origin,
available_package_dictionary,
get_pkg_changes_data,
installed_package_origin,
installed_package_dictionary,
delete_packages,
install_packages,
fetch_packages,
network_stat,
repo_online,
sync_with_repository
)

from software_station_xpm import xpmPackageCategory

global pkg_to_install
pkg_to_install = []
Expand Down Expand Up @@ -247,7 +257,9 @@ class TableWindow(Gtk.Window):
fraction += increment
msg = 'Updating data'
GLib.idle_add(self.update_progress, self.progress, fraction, msg)
self.sync_packages()
self.sync_available_packages()
sleep(1)
self.sync_installed_packages()
pkg_to_install = []
pkg_to_uninstall = []
self.apply_button.set_sensitive(False)
Expand All @@ -259,6 +271,7 @@ class TableWindow(Gtk.Window):
self.progress.hide()
GLib.idle_add(self.stop_apply_tread)
self.unlock_ui()
GLib.idle_add(self.unlock_ui)

def all_or_installed(self, widget, data):
if widget.get_active():
Expand All @@ -277,13 +290,13 @@ class TableWindow(Gtk.Window):
self.update_pkg_store()
print(data)

def sync_orgin(self):
self.pkg_origin = available_package_origin()
def sync_available_packages(self):
self.available_category = available_package_origin()
self.available_pkg = available_package_dictionary(self.available_category)

def sync_packages(self):
self.installed_origin = installed_package_origin()
self.installed_pkg = installed_package_dictionary(self.installed_origin)
self.available_pkg = available_package_dictionary(self.pkg_origin)
def sync_installed_packages(self):
self.installed_category = installed_package_origin()
self.installed_pkg = installed_package_dictionary(self.installed_category)

def update_progress(self, progress, fraction, msg):
progress.set_fraction(fraction)
Expand All @@ -292,32 +305,91 @@ class TableWindow(Gtk.Window):
def initial_sync(self):
self.pkg_statistic.set_text('<small>Syncing statistic</small>')
self.pkg_statistic.set_use_markup(True)
msg = 'syncing packages origins'
GLib.idle_add(self.update_progress, self.progress, 0.1, msg)
self.sync_orgin()
msg = 'syncing packages data'
self.network = network_stat()
if self.network == 'UP':
self.online = repo_online()
else:
self.online = False

if self.online is True:
msg = 'syncing with the repository'
GLib.idle_add(self.update_progress, self.progress, 0.1, msg)
sync_with_repository()
sleep(1)
msg = 'syncing available packages'
GLib.idle_add(self.update_progress, self.progress, 0.2, msg)
self.sync_available_packages()
sleep(1)
msg = 'syncing installed packages'
GLib.idle_add(self.update_progress, self.progress, 0.4, msg)
self.sync_packages()
msg = 'store packages origin'
self.sync_installed_packages()
sleep(1)
if self.online is True:
avail = self.available_pkg['avail']
msg = "Packages available:"
self.pkg_statistic.set_text(f'<small>{msg} {avail}</small>')
self.pkg_statistic.set_use_markup(True)
else:
self.installed_toggle.set_active(True)
msg = 'store packages categories'
GLib.idle_add(self.update_progress, self.progress, 0.8, msg)
self.category_store_sync()
avail = self.available_pkg['avail']
msg = "Packages available:"
self.pkg_statistic.set_text(f'<small>{msg} {avail}</small>')
self.pkg_statistic.set_use_markup(True)
sleep(0.5)
GLib.idle_add(self.category_store_sync)
# self.category_store_sync()
sleep(1)
msg = 'Completed'
GLib.idle_add(self.update_progress, self.progress, 1.0, msg)
sleep(1)
self.progress.hide()
GLib.idle_add(self.stop_tread)
self.unlock_ui()
GLib.idle_add(self.unlock_ui)
if self.online is False:
GLib.idle_add(self.confirm_offline)

def hide_window(self, button, window):
window.hide()

def confirm_offline(self):
window = Gtk.Window()
window.set_title("Software Station")
window.connect("delete-event", Gtk.main_quit)
window.set_size_request(200, 80)
box1 = Gtk.VBox(homogeneous=False, spacing=0)
window.add(box1)
box1.show()
if self.network == 'Down':
msg = 'Network device is offline'
elif self.online is False:
msg = "Can't reach software repository"
label = Gtk.Label(label=msg)
box1.pack_start(label, True, True, 0)
hBox = Gtk.HBox(homogeneous=False, spacing=0)
hBox.show()
box1.pack_end(hBox, False, False, 5)
offline_button = Gtk.Button()
offline_button.set_label("Use Offline")
apply_img = Gtk.Image()
apply_img.set_from_icon_name('gtk-ok', 1)
offline_button.set_image(apply_img)
offline_button.connect("clicked", self.hide_window, window)
hBox.pack_end(offline_button, False, False, 5)
close_button = Gtk.Button()
close_button.set_label("Close")
apply_img = Gtk.Image()
apply_img.set_from_icon_name('gtk-close', 1)
close_button.set_image(apply_img)
close_button.connect("clicked", Gtk.main_quit)
hBox.pack_end(close_button, False, False, 5)
window.show_all()

def unlock_ui(self):
self.origin_treeview.set_sensitive(True)
self.pkgtreeview.set_sensitive(True)
self.available_toggle.set_sensitive(True)
if self.online is True:
self.available_toggle.set_sensitive(True)
self.installed_toggle.set_sensitive(True)
self.search_entry.set_sensitive(True)
if self.online is True:
self.search_entry.set_sensitive(True)

def lock_ui(self):
self.search_entry.set_sensitive(False)
Expand Down Expand Up @@ -366,32 +438,35 @@ class TableWindow(Gtk.Window):
def category_store_sync(self):
self.store.clear()
self.search_entry.set_text('')
for category in self.pkg_origin:
# xmp_data = xpmPackageCategory()[category]
# xmp = GdkPixbuf.Pixbuf.new_from_xpm_data(xmp_data)
# self.store.append([xmp, category])
self.store.append([category])
if self.online is True:
categories = self.available_category
else:
categories = self.installed_category
for category in categories:
xmp_data = xpmPackageCategory()[category]
xmp = GdkPixbuf.Pixbuf.new_from_xpm_data(xmp_data)
self.store.append([xmp, category])
# self.store.append([category])
self.origin_treeview.set_cursor(0)

def selection_category(self, tree_selection):
(model, pathlist) = tree_selection.get_selected_rows()
if pathlist:
path = pathlist[0]
tree_iter = model.get_iter(path)
self.categori = model.get_value(tree_iter, 0)
self.category = model.get_value(tree_iter, 1)
self.search_entry.set_text('')
self.update_pkg_store()

def update_pkg_store(self):
self.pkg_store.clear()
pixbuf = Gtk.IconTheme.get_default().load_icon('emblem-package', 42, 0)
# xmp = GdkPixbuf.Pixbuf.new_from_xpm_data(softwareXpm())
if self.available_or_installed == 'available':
pkg_d = self.available_pkg[self.categori]
pkg_d = self.available_pkg[self.category]
else:
try:
pkg_d = self.installed_pkg[self.categori]
except KeyError:
pkg_d = self.installed_pkg[self.category]
except (KeyError, AttributeError):
pkg_d = {}
pkg_list = list(pkg_d.keys())
for pkg in pkg_list:
Expand Down Expand Up @@ -435,18 +510,17 @@ class TableWindow(Gtk.Window):
category_sw.set_shadow_type(Gtk.ShadowType.ETCHED_IN)
category_sw.set_policy(Gtk.PolicyType.AUTOMATIC,
Gtk.PolicyType.AUTOMATIC)
# self.store = Gtk.ListStore(GdkPixbuf.Pixbuf, str)
self.store = Gtk.ListStore(str)
self.store = Gtk.ListStore(GdkPixbuf.Pixbuf, str)
# self.store = Gtk.ListStore(str)
self.origin_treeview = Gtk.TreeView()
self.origin_treeview.set_model(self.store)
self.origin_treeview.set_rules_hint(True)
# cell = Gtk.CellRendererPixbuf()
# column = Gtk.TreeViewColumn("Pixbuf", cell)
# column.add_attribute(cell, "pixbuf", 0)
# self.origin_treeview.append_column(column)
cell = Gtk.CellRendererPixbuf()
column = Gtk.TreeViewColumn("Pixbuf", cell)
column.add_attribute(cell, "pixbuf", 0)
self.origin_treeview.append_column(column)
cell2 = Gtk.CellRendererText()
column2 = Gtk.TreeViewColumn(None, cell2, text=0)
column2.set_attributes(cell2, text=0)
column2 = Gtk.TreeViewColumn(None, cell2, text=1)
column2.set_attributes(cell2, text=1)
self.origin_treeview.append_column(column2)
self.origin_treeview.set_reorderable(True)
self.origin_treeview.set_headers_visible(False)
Expand All @@ -463,7 +537,6 @@ class TableWindow(Gtk.Window):
self.pkg_store = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str, str, str, bool)
self.pkgtreeview = Gtk.TreeView()
self.pkgtreeview.set_model(self.pkg_store)
# self.pkgtreeview.set_rules_hint(True)
# self.pkgtreeview.connect_after("button_press_event",
# self.selected_software)
self.pkgtreeview.connect_after("button_press_event", self.selected_software)
Expand Down
53 changes: 48 additions & 5 deletions software_station_pkg.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,41 @@
#!/usr/local/bin/python3

from subprocess import Popen, PIPE
from subprocess import Popen, PIPE, run
import socket


def network_stat():
cmd = "netstat -rn | grep default"
netstat = run(cmd, shell=True)
return "UP" if netstat.returncode == 0 else 'DOWN'


def repo_online():
cmd = "pkg -vv | grep -B 1 'enabled.*yes' | grep url"
raw_url = Popen(
cmd,
shell=True,
stdout=PIPE,
close_fds=True,
universal_newlines=True,
encoding='utf-8'
)
server = list(filter(None, raw_url.stdout.read().split('/')))[1]
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(5)
s.connect((server, 80))
except OSError:
return False
else:
s.close()
return True


def sync_with_repository():
cmd = "pkg update -f"
pkg_out = run(cmd, shell=True)
return True if pkg_out.returncode == 0 else False


def available_package_origin():
Expand Down Expand Up @@ -143,10 +178,18 @@ def get_pkg_to_remove_output(packages):


def get_pkg_changes_data(remove_list, install_list):
install_pkg = get_pkg_to_install_output(' '.join(install_list))
install_pkg_list = install_pkg.splitlines()
remove_pkg = get_pkg_to_remove_output(' '.join(remove_list))
remove_pkg_list = remove_pkg.splitlines()
if install_list:
install_pkg = get_pkg_to_install_output(' '.join(install_list))
install_pkg_list = install_pkg.splitlines()
else:
install_pkg = 'None'
install_pkg_list = []
if remove_list:
remove_pkg = get_pkg_to_remove_output(' '.join(remove_list))
remove_pkg_list = remove_pkg.splitlines()
else:
remove_pkg = 'None'
remove_pkg_list = []
pkg_to_remove = []
pkg_to_upgrade = []
pkg_to_install = []
Expand Down

0 comments on commit 8722a60

Please sign in to comment.