Skip to content
This repository has been archived by the owner on Apr 7, 2024. It is now read-only.

Commit

Permalink
bug fixes and misc changes
Browse files Browse the repository at this point in the history
  • Loading branch information
gaining committed Apr 5, 2017
1 parent bf38d84 commit 6d52a0c
Show file tree
Hide file tree
Showing 15 changed files with 227 additions and 66 deletions.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
17 changes: 16 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Resetter
![alt tag](https://github.com/gaining/Resetter/blob/master/Resetter/resetter-screenshot.png)

It is an application built with python and pyqt that will help to reset an Ubuntu or Linux-Mint system to stock, as if it's been just installed without having to manually re-install by using a live cd/dvd image. It will detect packages that have been installed after the initial system install.
It is an application built with python and pyqt that will help to reset an Ubuntu or Linux-Mint system to stock, as if it's been just installed without having to manually re-install by using a live cd/dvd image. It will detect packages that have been installed after the initial system install.

# Status

Expand All @@ -18,3 +18,18 @@ Install via deb file. PPA will be created later.
- Ubuntu 16.10
- Ubuntu 16.04
- Ubuntu 14.04

# Upcoming changes in the near future
- New Logo and improved logo
- command line options
- different install options
- pick from backup list to install or remove
- option to install missing pre-installed packages

# distant future plans
- migrate to python3 and pyqt5
- more reset options
- support more debian based distro
- stabilize resetter


4 changes: 2 additions & 2 deletions Resetter/DEBIAN/control
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Package: resetter
Version: 0.0.4-beta
Installed-Size: 1004
Version: 0.0.5-beta
Installed-Size: 1000
Maintainer: gaining <gaining7@outlook.com>
Section: python
Homepage: https://github.com/gaining/resetter
Expand Down
14 changes: 7 additions & 7 deletions Resetter/DEBIAN/md5sums
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
1c10d1af87689b242e07da65d715cfdf usr/bin/resetter
26629ddf3450a3093e26050df4346118 usr/lib/resetter/singleton.py
2cd22761abf10d4f5e8e573c58be0bb3 usr/lib/resetter/Resetter.py
fb140764b378fc18119cac25006e208f usr/lib/resetter/CustomApplyDialog.py
8cb3e2f6f2420ea19f63eca71eba483f usr/lib/resetter/Account.py
bb8b198b92579c2051bcf29c2938300f usr/lib/resetter/Resetter.py
fdc52df8347aa30852b461fd1c781a02 usr/lib/resetter/CustomApplyDialog.py
ceb16cc61d248499125a9a3acf59b0fc usr/lib/resetter/Account.py
008379f632be2389cfc04aee152ebc82 usr/lib/resetter/PackageView.py
7055beb358e870f7cf368a6775da7784 usr/lib/resetter/CustomReset.py
07e7dfd9db837405db4974fb2ab7956b usr/lib/resetter/AboutPage.py
62f491a5f37cbaeb29354731a46d2976 usr/lib/resetter/AboutPage.py
9772f66393d2aef25b7094fd4c64ece9 usr/lib/resetter/LicenceDialog.py
990f24f2babe3ad46987ea2af647f7ad usr/lib/resetter/AptProgress.py
59f4476bfe483e7564f3a7e52c66f818 usr/lib/resetter/ApplyDialog.py
33efadaae37cb7255b8bb4d73d11d3f2 usr/lib/resetter/Installed.py
9605ad80e32beed327f2114f91bddd38 usr/lib/resetter/ApplyDialog.py
2d4e80f6eff50c865f45d5f0fa9a73fd usr/lib/resetter/data/icons/resetter-48x48.png
2628dbbab4fed8f1e4f65d01d26899ee usr/lib/resetter/data/icons/custom-reset-icon.png
7821f54c708de3f36001b288349c390c usr/lib/resetter/data/icons/resetter.png
Expand All @@ -30,5 +30,5 @@ af4af7e39fcc8907259228c0781e18e3 usr/lib/resetter/data/scripts/fix-broken.sh
7dad20c85851cce4a97fd90b81e26fa2 usr/lib/resetter/data/manifests/mint-18.1-cinnamon.manifest
343ad895e19fc427e6838d58c0929e49 usr/share/applications/Resetter.desktop
79ba3652a6290aea1a33017aa4c7f735 usr/share/polkit-1/actions/org.freedesktop.pkexec.resetter.policy
2a19ae2987f984b420c9fb7faea6a331 usr/share/doc/resetter/changelog.gz
b2b7331d1c13de7b425560393ce7d78f usr/share/doc/resetter/changelog.gz
ff8b2c5b3b785bdccba43c0d5c4d7ad4 usr/share/doc/resetter/copyright
2 changes: 1 addition & 1 deletion Resetter/usr/lib/resetter/AboutPage.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def __init__(self, parent=None):
cr_text = "Copyright (c) 2017 all rights reserved"
desc_text = "Built With PyQt\n\n " \
"This is a great utility software that will help you reset your linux installation its stock state"
version_text = "Version: 0.0.4-beta"
version_text = "Version: 0.0.5-beta"
donate_text = 'If you liked my project, please ' \
'<a href="https://github.com/gaining/Resetter/blob/master/DONATE.md">Donate </a>'
more_text = 'To find out more about this project, please visit my github:' \
Expand Down
2 changes: 1 addition & 1 deletion Resetter/usr/lib/resetter/Account.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ def __init__(self, parent=None):
self.buttonOk.clicked.connect(self.custom_user)
self.buttonCancel.clicked.connect(self.close)
self.user = 'default'
self.password = 'NewLife!3'
self.password = 'NewLife3!'

def salt(self):
saltchars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
Expand Down
4 changes: 3 additions & 1 deletion Resetter/usr/lib/resetter/ApplyDialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@ def __init__(self, file_in, parent=None):
self.labels[(2, 2)].setText("Removing Apps")
self.labels[(3, 2)].setText("Deleting Users")
self.labels[(4, 2)].setText("Cleaning Up")
self.labels[(5,2)].setText("Installing packages")

verticalLayout.addWidget(self.lbl1)
verticalLayout.addWidget(self.progress)
verticalLayout.addSpacing(20)
Expand Down Expand Up @@ -203,7 +205,7 @@ def fixBroken(self):
self.prcs = QtCore.QProcess()
self.prcs.finished.connect(self.onFinished)
self.prcs.start('bash', ['/usr/lib/resetter/data/scripts/fix-broken.sh'])
self.prcs.waitForFinished(-1)
#self.prcs.waitForFinished(-1)

def onFinished(self, exit_code, exit_status):
if exit_code or exit_status != 0:
Expand Down
138 changes: 90 additions & 48 deletions Resetter/usr/lib/resetter/CustomApplyDialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import logging
import os
import subprocess
import threading
import sys
import time
from PyQt4 import QtCore, QtGui
Expand All @@ -13,7 +14,7 @@


class ProgressThread(QtCore.QThread):
def __init__(self, file_in):
def __init__(self, file_in, install):
QtCore.QThread.__init__(self)
self.op_progress = None
self._cache = apt.Cache(self.op_progress)
Expand All @@ -29,6 +30,7 @@ def __init__(self, file_in):
self.logger.addHandler(handler)
QtGui.qApp.processEvents()
apt_pkg.init()
self.install = install

def file_len(self):
try:
Expand All @@ -40,34 +42,33 @@ def file_len(self):
pass

def run(self):
print self.file_len()
if self.file_len() != 0:
print("removing packages")
loading = 0
x = float(100) / self.file_len()
with open(self.file_in) as packages:
for pkg_name in packages:
try:
loading += x
self.pkg = self._cache[pkg_name.strip()]
for pkg_name in packages:
try:
loading += x
self.pkg = self._cache[pkg_name.strip()]
if not self.install:
self.pkg.mark_delete(True, purge=True)
print "{} will be removed".format(self.pkg)
self.emit(QtCore.SIGNAL('updateProgressBar(int, bool)'), loading, self.isDone)
except KeyError as error:
self.logger.error("{}".format(error))
continue
print "Done reading"
self.isDone = True
self.emit(QtCore.SIGNAL('updateProgressBar(int, bool)'), 100, self.isDone)
else:
self.pkg.mark_install()
print "{} will be installed ".format(self.pkg)
self.emit(QtCore.SIGNAL('updateProgressBar(int, bool)'), loading, self.isDone)
except KeyError as error:
self.logger.error("{}".format(error))
continue
self.isDone = True
self.emit(QtCore.SIGNAL('updateProgressBar(int, bool)'), 100, self.isDone)
else:
self.isDone = True
print "All removable packages are already removed"
self.emit(QtCore.SIGNAL('updateProgressBar(int, bool)'), 100, self.isDone)



class Apply(QtGui.QDialog):

def __init__(self, file_in, response, parent=None):
super(Apply, self).__init__(parent)
self.setMinimumSize(400, 250)
Expand Down Expand Up @@ -98,12 +99,16 @@ def __init__(self, file_in, response, parent=None):
self.labels[(i, j)].setMinimumHeight(20)
gridLayout.addWidget(self.labels[(i, j)], i, j)
gridLayout.setAlignment(QtCore.Qt.AlignCenter)
self.labels[(1,2)].setText("Loading Apps")
self.labels[(2,2)].setText("Removing Apps")
self.labels[(3,2)].setText("Deleting Users")
self.labels[(4,2)].setText("Cleaning Up")
self.labels[(1, 2)].setText("Loading packages")
self.labels[(2, 2)].setText("Removing packages")
self.labels[(3, 2)].setText("Cleaning Up")
# self.labels[(4,2)].setText("Installing packages")
if self.response:
self.labels[(5,2)].setText("Removing old kernels")
self.labels[(4, 2)].setText("Removing old kernels")
self.labels[(5, 2)].setText("Deleting Users")
else:
self.labels[(4, 2)].setText("Deleting Users")

verticalLayout.addSpacing(20)
verticalLayout.addLayout(gridLayout)
verticalLayout.addWidget(self.buttonCancel, 0, QtCore.Qt.AlignRight)
Expand All @@ -114,7 +119,10 @@ def __init__(self, file_in, response, parent=None):
formatter = logging.Formatter('%(asctime)s - %(name)s - %(funcName)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
self.logger.addHandler(handler)
self.progressView = ProgressThread(self.file_in)
self.progressView = ProgressThread(self.file_in, False)
self.installProgress = ProgressThread("apps-to-install", True)
self.connect(self.installProgress, QtCore.SIGNAL("updateProgressBar(int, bool)"), self.updateProgressBar)
self.install_cache = self.installProgress._cache
self.account = AccountDialog(self)
self.connect(self.progressView, QtCore.SIGNAL("updateProgressBar(int, bool)"), self.updateProgressBar)
self._cache = self.progressView._cache
Expand All @@ -125,22 +133,21 @@ def __init__(self, file_in, response, parent=None):
def updateProgressBar(self, percent, isdone):
self.lbl1.setText("Loading Package List")
self.progress.setValue(percent)
self.labels[(1,1)].setMovie(self.movie)

self.labels[(1, 1)].setMovie(self.movie)
self.movie.start()
if isdone:
self.labels[(1, 1)].setPixmap(self.pixmap2)
self.movie.stop()
self.labels[(2, 1)].setMovie(self.movie)
self.movie.start()
self.remove()
self.removePackages()

def cancel(self):
self.logger.warning("Progress thread was cancelled")
self.progressView.terminate()
self.close()

def remove(self):
def removePackages(self):
print "removing"
self.logger.info("Removing Programs")
try:
Expand All @@ -157,7 +164,6 @@ def remove(self):
self.movie.stop()
self.labels[(2, 1)].setPixmap(self.pixmap2)
self.progress.setValue(int(100))
self.removeUsers()
self.fixBroken()
except Exception as arg:
self.movie.stop()
Expand All @@ -168,8 +174,8 @@ def remove(self):

def fixBroken(self):
self.lbl1.setText("Cleaning up...")
self.logger.info("Cleaning up..." )
self.labels[(4,1)].setMovie(self.movie)
self.logger.info("Cleaning up...")
self.labels[(3, 1)].setMovie(self.movie)

self.movie.start()
self.setCursor(QtCore.Qt.BusyCursor)
Expand All @@ -184,54 +190,88 @@ def onFinished(self, exit_code, exit_status):
else:
self.logger.debug("Cleanup finished with exit code: {} and exit_status {}.".format(exit_code, exit_status))
self.movie.stop()
self.labels[(4, 1)].setPixmap(self.pixmap2)
self.labels[(3, 1)].setPixmap(self.pixmap2)
self.unsetCursor()
self.lbl1.setText("Done fixing")
# self.installPackages()
self.removeOldKernels(self.response)

# experimental way of installing missing pre-installed packages n
def installPackages(self):
try:
self.progressView.terminate()
self.logger.info("Starting kernel removal")
self.labels[(4, 1)].setMovie(self.movie)
self.movie.start()
self.setCursor(QtCore.Qt.BusyCursor)
self.inst.commit(self.aprogress, self.iprogress)
self.progress.setValue(100)
self.labels[(4, 1)].setPixmap(self.pixmap2)
self.unsetCursor()
except Exception as arg:
self.logger.error("package install failed [{}]".format(str(arg)))
print "Sorry, package install failed [{}]".format(str(arg))

def removeOldKernels(self, response):
if response:
self.logger.info("Starting kernel removal...")
self.labels[(5, 1)].setMovie(self.movie)
self.labels[(4, 1)].setMovie(self.movie)
self.movie.start()
self.setCursor(QtCore.Qt.BusyCursor)
self._cache.clear()
self.progress.setValue(0)
try:
with open("Kernels","r") as kernels:
with open("Kernels", "r") as kernels:
for kernel in kernels:
pkg = self._cache[kernel.strip()]
if pkg.is_installed:
pkg.mark_delete(True, purge=True)
pkg.mark_delete(True, True)
self.logger.info("Removing old kernels...")
self._cache.commit(self.aprogress, self.iprogress)
self.progress.setValue(100)
self.labels[(5, 1)].setPixmap(self.pixmap2)
self.labels[(4, 1)].setPixmap(self.pixmap2)
self.unsetCursor()
self.lbl1.setText("Finished")
except Exception, arg:
self.logger.error("Kernel removal failed [{}]".format(str(arg)))
print "Sorry, kernel removal failed [{}]".format(str(arg))
self.removeUsers(response)
self.showUserInfo()
else:
self.lbl1.setText("Finished")
self.removeUsers(response)
self.showUserInfo()
self.logger.info("Old kernel removal option not chosen")

def start(self):
self.progressView.start()
#self.installProgress.start()

def removeUsers(self):
self.logger.info("Starting user removal")
self.labels[(3, 1)].setMovie(self.movie)
self.movie.start()
try:
subprocess.Popen(['bash', 'custom-users-to-delete.sh'], stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
self.logger.debug("user removal completed successfully: [{}]".format(subprocess.STDOUT))
except subprocess.CalledProcessError, e:
self.logger.error("unable removing user [{}]".format(e.output))
self.movie.stop()
self.labels[(3, 1)].setPixmap(self.pixmap2)
def removeUsers(self, response):
if response:
self.logger.info("Starting user removal")
self.labels[(5, 1)].setMovie(self.movie)
self.movie.start()
try:
subprocess.Popen(['bash', 'custom-users-to-delete.sh'], stderr=subprocess.STDOUT,
stdout=subprocess.PIPE)
self.logger.debug("user removal completed successfully: [{}]".format(subprocess.STDOUT))
except subprocess.CalledProcessError, e:
self.logger.error("unable removing user [{}]".format(e.output))
self.movie.stop()
self.labels[(5, 1)].setPixmap(self.pixmap2)
else:
self.logger.info("Starting user removal")
self.labels[(4, 1)].setMovie(self.movie)
self.movie.start()
try:
subprocess.Popen(['bash', 'custom-users-to-delete.sh'], stderr=subprocess.STDOUT,
stdout=subprocess.PIPE)
self.logger.debug("user removal completed successfully: [{}]".format(subprocess.STDOUT))
except subprocess.CalledProcessError, e:
self.logger.error("unable removing user [{}]".format(e.output))
self.movie.stop()
self.labels[(4, 1)].setPixmap(self.pixmap2)

def getDependencies(self):
try:
Expand All @@ -255,7 +295,7 @@ def getDependencies(self):
self.logger.error("getting Dependencies failed: {}".format(e.output))

def addUser(self):
choice = QtGui.QMessageBox.question\
choice = QtGui.QMessageBox.question \
(self, 'Would you like set your new account?',
"Set your own account? Click 'No' so that I can create a default account for you instead",
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
Expand All @@ -269,7 +309,8 @@ def addUser(self):
if choice == QtGui.QMessageBox.No:
print "Adding default user"
try:
p = subprocess.Popen(['bash', '/usr/lib/resetter/data/scripts/new-user.sh'], stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
p = subprocess.Popen(['bash', '/usr/lib/resetter/data/scripts/new-user.sh'], stderr=subprocess.STDOUT,
stdout=subprocess.PIPE)
self.logger.info("Default user added")
p.wait()
self.start()
Expand All @@ -293,7 +334,8 @@ def showUserInfo(self):
msg.setWindowTitle("User Credentials")
msg.setIcon(QtGui.QMessageBox.Information)
msg.setText("Please use these credentials the next time you log-in")
msg.setInformativeText("USERNAME: <b>{}</b><br/> PASSWORD: <b>{}</b>".format(self.account.getUser(), self.account.getPassword()))
msg.setInformativeText(
"USERNAME: <b>{}</b><br/> PASSWORD: <b>{}</b>".format(self.account.getUser(), self.account.getPassword()))
msg.setDetailedText("If you deleted your old user account, "
"this account will be the only local user on your system")
msg.exec_()
Expand Down

0 comments on commit 6d52a0c

Please sign in to comment.