diff --git a/CHANGELOG b/CHANGELOG index 4863f3db..cf0c197a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,7 +1,13 @@ +Version 1.8.4 +10-09-2014 + +[Feature] - Added MD5SUM check file. + - Added build time. + Version 1.8.3 08-09-2014 -[Updated] - FIx messages +[Updated] - Fix messages Version 1.8.2 08-09-2014 diff --git a/PKG-INFO b/PKG-INFO index d4038b17..63fa45a2 100644 --- a/PKG-INFO +++ b/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: slpkg -Version: 1.8.3 +Version: 1.8.4 Author: dslackw Author-email: d zlatanidis at gmail com Maintainer: dslackw diff --git a/README.rst b/README.rst index 4419e34e..2e741901 100644 --- a/README.rst +++ b/README.rst @@ -9,9 +9,9 @@ Latest Release: -- Version: 1.8.3 +- Version: 1.8.4 - `Package `_ -- `Source `_ +- `Source `_ - `CHANGELOG `_ `Slpkg `_ is a terminal multitool in order to easy use `Slackware `_ @@ -68,10 +68,12 @@ Features - Build and install all in a command - Checking for updated packages - List all installed packages +- Support MD5SUM file check - Find installed package - Read SlackBuilds files - Ī¤racking dependencies -- No dependencies +- Build log file +- Sum build time It's a quick and easy way to manage your packages in `Slackware `_ to a command. @@ -89,8 +91,8 @@ Untar the archive and run install.sh script: .. code-block:: bash - $ tar xvf slpkg-1.8.3.tar.gz - $ cd slpkg-1.8.3 + $ tar xvf slpkg-1.8.4.tar.gz + $ cd slpkg-1.8.4 $ ./install.sh Using `pip `_ : @@ -384,6 +386,8 @@ Auto tool to build package: Slackware package /tmp/termcolor-1.1.0-x86_64-1_SBo.tgz created. + Total build time for package termcolor : 1 Sec + Upgrade, install package: .. code-block:: bash diff --git a/install.sh b/install.sh index 8e0c20cb..883edbfe 100755 --- a/install.sh +++ b/install.sh @@ -21,7 +21,7 @@ # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PRGNAM=slpkg -VERSION=${VERSION:-1.8.3} +VERSION=${VERSION:-1.8.4} TAG=${TAG:-_dsw} cd .. diff --git a/slackbuild/README b/slackbuild/README index 58bdf279..97b73924 100644 --- a/slackbuild/README +++ b/slackbuild/README @@ -1,12 +1,10 @@ -Slpkg is a terminal multitool in order to easy use Slackware -packages. - -Features: +Features +======== - Build third party packages from source with all dependencies - Install packages through from official Slackware mirrors -- Find and Download packages from slackbuilds.org - Grabs packages from slackbuilds.org in real time +- Find and Download packages from slackbuilds.org - Automatic tool build and install packages - Check if your distribution is up to date - Remove packages with all dependencies @@ -15,10 +13,12 @@ Features: - Build and install all in a command - Checking for updated packages - List all installed packages +- Support MD5SUM file check - Find installed package - Read SlackBuilds files - Ī¤racking dependencies -- No dependencies +- Build log file +- Sum build time It's a quick and easy way to manage your packages in Slackware to a command. diff --git a/slackbuild/slack-desc b/slackbuild/slack-desc index fe8cda8c..0ef4cef2 100644 --- a/slackbuild/slack-desc +++ b/slackbuild/slack-desc @@ -6,7 +6,7 @@ # customary to leave one space after the ':' except on otherwise blank lines. |-----handy-ruler------------------------------------------------------| -slpkg: slpkg (Slackware tool in Python) +slpkg: slpkg (Slackware packaging tool) slpkg: slpkg: Slpkg is a terminal multitool in order to easy use Slackware slpkg: packages. It's a quick and easy way to manage your packages in diff --git a/slackbuild/slpkg.SlackBuild b/slackbuild/slpkg.SlackBuild index 84401f01..83b76f32 100755 --- a/slackbuild/slpkg.SlackBuild +++ b/slackbuild/slpkg.SlackBuild @@ -23,7 +23,7 @@ # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PRGNAM=slpkg -VERSION=${VERSION:-1.8.3} +VERSION=${VERSION:-1.8.4} BUILD=${BUILD:-1} TAG=${TAG:-_dsw} diff --git a/slackbuild/slpkg.info b/slackbuild/slpkg.info index f75ceb9d..a8adc4aa 100644 --- a/slackbuild/slpkg.info +++ b/slackbuild/slpkg.info @@ -1,7 +1,7 @@ PRGNAM="slpkg" -VERSION="1.8.3" +VERSION="1.8.4" HOMEPAGE="https://github.com/dslackw/slpkg" -DOWNLOAD="https://github.com/dslackw/slpkg/archive/v1.8.3.tar.gz" +DOWNLOAD="https://github.com/dslackw/slpkg/archive/v1.8.4.tar.gz" MD5SUM="" DOWNLOAD_x86_64="" MD5SUM_x86_64="" diff --git a/slpkg/__metadata__.py b/slpkg/__metadata__.py index 77c560e5..62d127cc 100644 --- a/slpkg/__metadata__.py +++ b/slpkg/__metadata__.py @@ -26,7 +26,7 @@ import subprocess __all__ = "slpkg" __author__ = "dslackw" -__version_info__ = (1, 8, 3) +__version_info__ = (1, 8, 4) __version__ = "{0}.{1}.{2}".format(*__version_info__) __license__ = "GNU General Public License v3 (GPLv3)" __email__ = "d.zlatanidis@gmail.com" diff --git a/slpkg/checksum.py b/slpkg/checksum.py new file mode 100755 index 00000000..c3c5fe48 --- /dev/null +++ b/slpkg/checksum.py @@ -0,0 +1,32 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# checksum.py file is part of slpkg. + +# Copyright 2014 Dimitris Zlatanidis +# All rights reserved. + +# Utility for easy management packages in Slackware + +# https://github.com/dslackw/slpkg + +# Slpkg is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import hashlib + +def md5sum(source): + ''' + Calculate the md5 checksum + ''' + with open(source) as file_to_check: + data = file_to_check.read() + return hashlib.md5(data).hexdigest() diff --git a/slpkg/messages.py b/slpkg/messages.py index 31d7f47c..2b3ffb73 100755 --- a/slpkg/messages.py +++ b/slpkg/messages.py @@ -75,9 +75,14 @@ def s_user(user): sys.exit() def build_FAILED(sbo_url, prgnam): - print("\n{0}<-- FAILED{1} to build the package {2}".format(colors.RED, colors.ENDC, prgnam)) - print("See log file in /var/log/slpkg/logs directory or read README file:") - print("{0}{1}\n".format(sbo_url, "README")) + template(78) + print("| Build package {0} [ {1}FAILED{2} ]".format(prgnam, colors.RED, colors.ENDC)) + template(78) + print("| See log file in {0}/var/log/slpkg/sbo/build_logs{1} directory or read README file:".format( + colors.CYAN, colors.ENDC)) + print("| {0}{1}".format(sbo_url, "README")) + template(78) + print # new line at end def template(max): ''' diff --git a/slpkg/pkg/build.py b/slpkg/pkg/build.py index 174fcd14..1174ec5c 100755 --- a/slpkg/pkg/build.py +++ b/slpkg/pkg/build.py @@ -28,8 +28,12 @@ import shutil import tarfile import subprocess -from slpkg.messages import pkg_not_found +from slpkg.colors import colors +from slpkg.checksum import md5sum from slpkg.__metadata__ import log_path +from slpkg.messages import pkg_not_found, template + +from slpkg.sbo.greps import sbo_checksum_pkg def build_package(script, sources, path): ''' @@ -38,38 +42,79 @@ def build_package(script, sources, path): ''' prgnam = script.replace(".tar.gz", "") log_file = ("build_{0}_log".format(prgnam)) - logs = log_path + "logs/" + sbo_logs = log_path + "sbo/" + build_logs = sbo_logs + "build_logs/" if not os.path.exists(log_path): os.mkdir(log_path) - if not os.path.exists(logs): - os.mkdir(logs) - log_date = time.strftime("%c") - template = ("#" * 79 + "\n\n") + if not os.path.exists(sbo_logs): + os.mkdir(sbo_logs) + if not os.path.exists(build_logs): + os.mkdir(build_logs) + log_date = time.strftime("%d/%m/%Y") + start_log_time = time.strftime("%H:%M:%S") + log_line = ("#" * 79 + "\n\n") try: - if os.path.isfile(logs + log_file): - os.remove(logs + log_file) + if os.path.isfile(build_logs + log_file): + os.remove(build_logs + log_file) tar = tarfile.open(script) tar.extractall() tar.close() for src in sources: + sbo_md5 = sbo_checksum_pkg(prgnam) + md5 = md5sum(src) + if sbo_md5 != md5: + template(78) + print("| MD5SUM check for {0} [ {1}FAILED{2} ]".format( + src, colors.RED, colors.ENDC)) + template(78) + print("| Expected: {0}".format(md5)) + print("| Found: {0}".format(sbo_md5)) + template(78) + read = raw_input("\nDo you want to continue [Y/n]? ") + if read == "Y" or read == "y": + pass + else: + sys.exit() + else: + template(78) + print("| MD5SUM check for {0} [ {1}PASSED{2} ]".format( + src, colors.GREEN, colors.ENDC)) + template(78) + print # new line after pass checksum shutil.copy2(src, prgnam) os.chdir(path + prgnam) subprocess.call("chmod +x {0}.SlackBuild".format(prgnam), shell=True) - with open(logs + log_file, "w") as log: # write headers to log file - log.write(template) + with open(build_logs + log_file, "w") as log: # write headers to log file + log.write(log_line) log.write("File : " + log_file + "\n") - log.write("Path : " + logs + "\n") - log.write("Date : " + log_date + "\n\n") - log.write(template) + log.write("Path : " + build_logs + "\n") + log.write("Date : " + log_date + "\n") + log.write("Time : " + start_log_time + "\n\n") + log.write(log_line) log.close() - with open(logs + log_file, "a") as log: # append END tag to a log file - log.write(template) - log.write(" " * 38 + "E N D\n\n") - log.write(template) subprocess.Popen("./{0}.SlackBuild 2>&1 | tee -a {1}{2}".format( - prgnam, logs, log_file), shell=True, stdout=sys.stdout).communicate() + prgnam, build_logs, log_file), shell=True, stdout=sys.stdout).communicate() + end_log_time = time.strftime("%H:%M:%S") + start_time = start_log_time.replace(":", "") + end_time = end_log_time.replace(":", "") + rmv_time = int(end_time) - int(start_time) + # calculate build time + if rmv_time <= 60: + sum_time = str(rmv_time) + " Sec" + elif rmv_time > 60: + div_time = round(float(rmv_time) / 60, 2) + rest_time = str(div_time).replace(".", " ").split() + sum_time = rest_time[0] + " Min " + rest_time[1] + " Sec" + with open(build_logs + log_file, "a") as log: # append END tag to a log file + log.seek(2) # EOF + log.write(log_line) + log.write("Time : " + end_log_time + "\n") + log.write("Total build time : " + sum_time + "\n") + log.write(" " * 38 + "E N D\n\n") + log.write(log_line) log.close() os.chdir(path) + print("Total build time for package {0} : {1}\n".format(prgnam, sum_time)) except (OSError, IOError): message = "Wrong file" pkg_not_found("\n", prgnam, message, "\n") diff --git a/slpkg/sbo/greps.py b/slpkg/sbo/greps.py index 5aac0c61..7ed68b1f 100755 --- a/slpkg/sbo/greps.py +++ b/slpkg/sbo/greps.py @@ -25,6 +25,7 @@ import os from slpkg.url_read import url_read from slpkg.__metadata__ import arch, lib_path + from search import sbo_search_pkg def sbo_source_dwn(name): @@ -78,5 +79,21 @@ def sbo_version_pkg(name): sbo_name = line[17:].strip() if line.startswith("SLACKBUILD VERSION: "): if sbo_name == name: - sbo_url = sbo_search_pkg(name) return line[20:].strip() + +def sbo_checksum_pkg(name): + if arch == "x86_64": + for line in open(lib_path + "sbo_repo/SLACKBUILDS.TXT", "r"): + if arch == "x86_64": + if line.startswith("SLACKBUILD NAME: "): + sbo_name = line[17:].strip() + if line.startswith("SLACKBUILD MD5SUM_x86_64: "): + if sbo_name == name: + if line[26:].strip(): + return line[26:].strip() + for line in open(lib_path + "sbo_repo/SLACKBUILDS.TXT", "r"): + if line.startswith("SLACKBUILD NAME: "): + sbo_name = line[17:].strip() + if line.startswith("SLACKBUILD MD5SUM: "): + if sbo_name == name: + return line[19:].strip() diff --git a/slpkg/sbo/init.py b/slpkg/sbo/init.py index 5c0fd67a..59143e43 100755 --- a/slpkg/sbo/init.py +++ b/slpkg/sbo/init.py @@ -37,54 +37,58 @@ def initialization(): /var/lib/slpkg/sbo_repo/ and ChangeLog.txt in /var/log/slpkg/ from slackbuilds.org ''' - lib = lib_path + "sbo_repo/" + sbo_log = log_path + "sbo/" + sbo_lib = lib_path + "sbo_repo/" if not os.path.exists(log_path): os.mkdir(log_path) - if not os.path.exists(lib): + if not os.path.exists(lib_path): os.mkdir(lib_path) - os.mkdir(lib) + if not os.path.exists(sbo_log): + os.mkdir(sbo_log) + if not os.path.exists(sbo_lib): + os.mkdir(sbo_lib) sbo_url = ("http://slackbuilds.org/slackbuilds/{0}/".format(slack_ver())) ''' Read SLACKBUILDS.TXT from slackbuilds.org and write in /var/lib/slpkg/sbo_repo/ directory if not exist ''' - if not os.path.isfile(lib + "SLACKBUILDS.TXT"): + if not os.path.isfile(sbo_lib + "SLACKBUILDS.TXT"): print("\nslpkg ...initialization") sys.stdout.write("SLACKBUILDS.TXT read ...") sys.stdout.flush() SLACKBUILDS_TXT = url_read(( "http://slackbuilds.org/slackbuilds/{0}/SLACKBUILDS.TXT".format(slack_ver()))) sys.stdout.write("Done\n") - sbo = open("{0}SLACKBUILDS.TXT".format(lib), "w") + sbo = open("{0}SLACKBUILDS.TXT".format(sbo_lib), "w") sbo.write(SLACKBUILDS_TXT) sbo.close() - print("File SLACKBUILDS.TXT created in {0}".format(lib)) + print("File SLACKBUILDS.TXT created in {0}".format(sbo_lib)) ''' - Read ChangeLog.txt from slackbuilds.org and write in /var/log/slpkg/ + Read ChangeLog.txt from slackbuilds.org and write in /var/log/slpkg/sbo/ directory if not exist ''' - if not os.path.isfile(log_path + "ChangeLog.txt"): + if not os.path.isfile(sbo_log + "ChangeLog.txt"): print("\nslpkg initialization") sys.stdout.write("ChangeLog.txt read ...") sys.stdout.flush() ChangeLog_txt = url_read(( "http://slackbuilds.org/slackbuilds/{0}/ChangeLog.txt".format(slack_ver()))) sys.stdout.write("Done\n") - log = open("{0}ChangeLog.txt".format(log_path), "w") + log = open("{0}ChangeLog.txt".format(sbo_log), "w") log.write(ChangeLog_txt) log.close() - print("File ChangeLog.txt created in {0}".format(log_path)) + print("File ChangeLog.txt created in {0}".format(sbo_log)) ''' We take the size of ChangeLog.txt from the server and locally ''' server = int(''.join(server_file_size(sbo_url + "ChangeLog.txt"))) - local = int(local_file_size(log_path + "ChangeLog.txt")) + local = int(local_file_size(sbo_log + "ChangeLog.txt")) ''' If the two files differ in size delete and replaced with new ''' if server != local: - os.remove("{0}sbo_repo/{1}".format(lib_path, "SLACKBUILDS.TXT")) - os.remove("{0}{1}".format(log_path, "ChangeLog.txt")) + os.remove("{0}{1}".format(sbo_lib, "SLACKBUILDS.TXT")) + os.remove("{0}{1}".format(sbo_log, "ChangeLog.txt")) print("\nNEWS in ChangeLog.txt") print("slpkg ...initialization") sys.stdout.write("Files re-created ...") @@ -93,10 +97,10 @@ def initialization(): "http://slackbuilds.org/slackbuilds/{0}/SLACKBUILDS.TXT".format(slack_ver()))) ChangeLog_txt = url_read(( "http://slackbuilds.org/slackbuilds/{0}/ChangeLog.txt".format(slack_ver()))) - sbo = open("{0}sbo_repo/SLACKBUILDS.TXT".format(lib_path), "w") + sbo = open("{0}SLACKBUILDS.TXT".format(sbo_lib), "w") sbo.write(SLACKBUILDS_TXT) sbo.close() - log = open("{0}ChangeLog.txt".format(log_path), "w") + log = open("{0}ChangeLog.txt".format(sbo_log), "w") log.write(ChangeLog_txt) log.close() sys.stdout.write("Done\n") diff --git a/slpkg/sbo/read.py b/slpkg/sbo/read.py index 4334ab63..93699e6c 100755 --- a/slpkg/sbo/read.py +++ b/slpkg/sbo/read.py @@ -26,12 +26,12 @@ import os from slpkg.url_read import url_read from slpkg.__metadata__ import slpkg_tmp -# create tmp directory if not exist +# create directories if not exist rdm_path = slpkg_tmp + "readme/" +if not os.path.exists(slpkg_tmp): + os.mkdir(slpkg_tmp) if not os.path.exists(rdm_path): - if not os.path.exists(slpkg_tmp): - os.mkdir(slpkg_tmp) - os.mkdir(rdm_path) + os.mkdir(rdm_path) def read_readme(sbo_url, name, site): ''' diff --git a/slpkg/sbo/slackbuild.py b/slpkg/sbo/slackbuild.py index 585bc3cb..2661a7a1 100755 --- a/slpkg/sbo/slackbuild.py +++ b/slpkg/sbo/slackbuild.py @@ -26,6 +26,7 @@ import sys import subprocess from slpkg.colors import colors +from slpkg.checksum import md5sum from slpkg.functions import get_file from slpkg.__metadata__ import tmp, pkg_path, build_path, log_path, sp from slpkg.messages import pkg_not_found, pkg_found, template, build_FAILED @@ -162,9 +163,9 @@ def sbo_build(name): print("Total {0} {1}.".format(len(dependencies), msg_ins)) print("{0} {1} will be installed, {2} allready installed and {3} {4}".format( count_installed, msg_ins, pkg_sum, count_upgraded, msg_upg)) - print("will be upgraded.") + print("will be upgraded.\n") ''' - Check if package supported by arch + Check if package supported or tested by arch before proceed to install ''' UNST = ["UNSUPPORTED", "UNTESTED"] @@ -173,7 +174,10 @@ def sbo_build(name): if item == un: print("\n{0}The package {1}{2}\n".format(colors.RED, item, ENDC)) sys.exit() - read = raw_input("\nDo you want to continue [Y/n]? ") + # exit if all packages already installed + if pkg_sum == len(dependencies): + sys.exit() + read = raw_input("Do you want to continue [Y/n]? ") if read == "Y" or read == "y": if not os.path.exists(build_path): os.mkdir(build_path) diff --git a/slpkg/slack/install.py b/slpkg/slack/install.py index 68230381..206d275b 100755 --- a/slpkg/slack/install.py +++ b/slpkg/slack/install.py @@ -43,12 +43,13 @@ def install(slack_pkg): comp_sum, uncomp_sum = [], [] dwn_list, comp_size, uncomp_size = [], [], [] install_all, package_name, package_location = [], [], [] - tmp_path = slpkg_tmp + "packages/" pkg_sum, arch, COLOR, ENDC = 0, "", "", colors.ENDC + # create directories if not exist + tmp_path = slpkg_tmp + "packages/" + if not os.path.exists(slpkg_tmp): + os.mkdir(slpkg_tmp) if not os.path.exists(tmp_path): - if not os.path.exists(slpkg_tmp): - os.mkdir(slpkg_tmp) - os.mkdir(tmp_path) + os.mkdir(tmp_path) print("\nPackages with name matching [ {0}{1}{2} ]\n".format( colors.CYAN, slack_pkg, ENDC)) sys.stdout.write ("Reading package lists ...") diff --git a/slpkg/slack/mirrors.py b/slpkg/slack/mirrors.py index b0f0356e..678dd7e5 100755 --- a/slpkg/slack/mirrors.py +++ b/slpkg/slack/mirrors.py @@ -26,7 +26,7 @@ from slack_version import slack_ver def mirrors(name, location): ''' - Select Slackware mirror packages + Select Slackware official mirror packages based architecture ''' if arch == "x86_64": diff --git a/slpkg/slack/patches.py b/slpkg/slack/patches.py index f596fb84..83c1f4f1 100755 --- a/slpkg/slack/patches.py +++ b/slpkg/slack/patches.py @@ -29,8 +29,7 @@ import subprocess from slpkg.colors import colors from slpkg.url_read import url_read from slpkg.messages import template -from slpkg.__metadata__ import (pkg_path, slpkg_tmp, - slack_archs) +from slpkg.__metadata__ import pkg_path, slpkg_tmp, slack_archs from slpkg.pkg.manager import pkg_upgrade @@ -48,10 +47,10 @@ def patches(): GREEN, RED, ENDC = colors.GREEN, colors.RED, colors.ENDC patch_path = slpkg_tmp + "patches/" slack_arch = "" + if not os.path.exists(slpkg_tmp): + os.mkdir(slpkg_tmp) if not os.path.exists(patch_path): - if not os.path.exists(slpkg_tmp): - os.mkdir(slpkg_tmp) - os.mkdir(patch_path) + os.mkdir(patch_path) sys.stdout.write ("Reading package lists ...") sys.stdout.flush() PACKAGE_TXT = url_read(mirrors(name="PACKAGES.TXT", location="patches/"))