Advertisement
cmiN

rms-cli

Feb 13th, 2014
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.41 KB | None | 0 0
  1. #! /usr/bin/env python
  2. #
  3. # rms-cli: Release Management System - client
  4. #
  5. # Author: cmin764@yahoo/gmail.com
  6.  
  7.  
  8. import os
  9. import shutil
  10. import socket
  11. import struct
  12. import argparse
  13. from binascii import hexlify, unhexlify
  14.  
  15.  
  16. HOST = "127.0.0.1"
  17. PORT = 51337
  18.  
  19.  
  20. class RMS(object):
  21.  
  22.     SEARCH = 0
  23.     DOWNLOAD = 1
  24.     ISIZE = 4
  25.     PEXT = "tar.gz"
  26.  
  27.     def __init__(self, host=HOST, port=PORT):
  28.         self.host = host
  29.         self.port = port
  30.  
  31.     def connect(self):
  32.         self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  33.         self.sock.connect((self.host, self.port))
  34.  
  35.     def close(self):
  36.         self.sock.close()
  37.  
  38.     def __enter__(self):
  39.         self.connect()
  40.         return self
  41.  
  42.     def __exit__(self, *args):
  43.         self.close()
  44.  
  45.     def _send_package(self, package):
  46.         self.sock.send(struct.pack("!i", len(package)))
  47.         self.sock.send(package)
  48.  
  49.     def search(self, package):
  50.         self.sock.send(struct.pack("!i", RMS.SEARCH))
  51.         self._send_package(package or "")
  52.         packcnt = struct.unpack("!i", self.sock.recv(RMS.ISIZE))[0]
  53.         packvec = list()
  54.         for _ in range(packcnt):
  55.             packlen = struct.unpack("!i", self.sock.recv(RMS.ISIZE))[0]
  56.             packvec.append(self.sock.recv(packlen))
  57.         return packvec
  58.  
  59.     def download(self, package):
  60.         self.sock.send(struct.pack("!i", RMS.DOWNLOAD))
  61.         self._send_package(package)
  62.         fsize = struct.unpack("!i", self.sock.recv(RMS.ISIZE))[0]
  63.         data = self.sock.recv(fsize)
  64.         return data
  65.  
  66.  
  67. def search_func(args):
  68.     rms = RMS(host=args.server, port=args.port)
  69.     with rms:
  70.         packages = rms.search(args.package)
  71.     if not packages:
  72.         if args.verbose:
  73.             print("No packages found")
  74.         return
  75.     if args.verbose:
  76.         print("Found {} package(s):".format(len(packages)))
  77.     for package in packages:
  78.         print(package)
  79.  
  80.  
  81. def download_func(args):
  82.     rms = RMS(host=args.server, port=args.port)
  83.     with rms:
  84.         packages = rms.search(args.package)
  85.     if not packages:
  86.         if args.verbose:
  87.             print("No packages found")
  88.         return
  89.     package = None
  90.     if len(packages) > 1:
  91.         for _package in packages:
  92.             if _package == args.package:
  93.                 package = _package
  94.                 break
  95.         if package is None:
  96.             if args.verbose:
  97.                 print("Multiple packages found, please select one of them:")
  98.                 for package in packages:
  99.                     print(package)
  100.             return
  101.     if package is None:
  102.         package = packages[0]
  103.     if args.verbose:
  104.         print("Downloading package {}...".format(package))
  105.     with rms:
  106.         data = rms.download(package)
  107.     fpath = os.path.join(
  108.         args.output,
  109.         "{}.{}".format(package, RMS.PEXT)
  110.     )
  111.     with open(fpath, "wb") as fout:
  112.         fout.write(data)
  113.     print("Downloaded: {}".format(fpath))
  114.     return package, fpath
  115.  
  116.  
  117. def install_func(args):
  118.     ret = download_func(args)
  119.     if ret is None:
  120.         if args.verbose:
  121.             print("Nothing to install")
  122.         return
  123.     package, fpath = ret
  124.     if args.verbose:
  125.         print("Installing package {} from {}..."
  126.               .format(package, fpath))
  127.     os.chdir(args.output)
  128.     os.system("tar -xzvf {}".format(os.path.basename(fpath)))
  129.     os.chdir(package)
  130.     os.system("python setup.py install")
  131.     os.chdir("..")
  132.     os.remove(fpath)
  133.     shutil.rmtree(package)
  134.     print("Installed: {}".format(package))
  135.  
  136.  
  137. def main():
  138.     parser = argparse.ArgumentParser(
  139.         description="Release Management System - client"
  140.     )
  141.     parser.add_argument(
  142.         "-v",
  143.         "--verbose",
  144.         action="store_true",
  145.         help="show debugging messages"
  146.     )
  147.     parser.add_argument(
  148.         "-s",
  149.         "--server",
  150.         metavar="SERVER",
  151.         default=HOST,
  152.         help="server address"
  153.     )
  154.     parser.add_argument(
  155.         "-p",
  156.         "--port",
  157.         metavar="PORT",
  158.         default=PORT,
  159.         type=int,
  160.         help="server port"
  161.     )
  162.  
  163.     subparsers = parser.add_subparsers(title="commands")
  164.     commonp = argparse.ArgumentParser(add_help=False)
  165.     commonp.add_argument(
  166.         "package",
  167.         metavar="PACKAGE",
  168.         help="package name"
  169.     )
  170.     commono = argparse.ArgumentParser(add_help=False)
  171.     commono.add_argument(
  172.         "-o",
  173.         "--output",
  174.         metavar="OUTPUT",
  175.         default=os.getcwd(),
  176.         help="output directory for downloaded packages"
  177.     )
  178.  
  179.     spsearch = subparsers.add_parser(
  180.         "search",
  181.         help="search for packages"
  182.     )
  183.     spsearch.add_argument(
  184.         "package",
  185.         metavar="PACKAGE",
  186.         nargs="?",
  187.         help="package name"
  188.     )
  189.     spsearch.set_defaults(func=search_func)
  190.  
  191.     spdownload = subparsers.add_parser(
  192.         "download",
  193.         parents=[commonp, commono],
  194.         help="download a specific package"
  195.     )
  196.     spdownload.set_defaults(func=download_func)
  197.  
  198.     spinstall = subparsers.add_parser(
  199.         "install",
  200.         parents=[commonp, commono],
  201.         help="download and install a specific package"
  202.     )
  203.     spinstall.set_defaults(func=install_func)
  204.  
  205.     args = parser.parse_args()
  206.     if hasattr(args, "output"):
  207.         args.output = os.path.abspath(args.output)
  208.     args.func(args)
  209.  
  210.  
  211. if __name__ == "__main__":
  212.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement