#!/usr/bin/env python3

"""Disk-wiping utility for GNU/Linux, written in Python 2 & 3.
"""

from __future__ import print_function

import os
import re
import sys

try:
    input = raw_input
except NameError:
    pass

def posix_os_check():
    """Check if OS is 'posix'
    """

    if 'posix' not in os.name:
        print("This program was designed for GNU/Linux. Exiting.")
        sys.exit()

def root_user_check():
    """Check if current UID is 0.
    """

    if os.getuid() != 0:
        print("This program requires ROOT privileges. Exiting.")
        sys.exit()

def list_mounted_devices():
    """List mounted device(s) / partition(s).
    """

    print(22 * "-", "DEVICES & PARTITIONS", 22 * "-")

    return os.system('lsblk /dev/sd* --nodeps --output NAME,MODEL,VENDOR,SIZE,TYPE,STATE')

def define_device_to_wipe():
    """Prompt user to define device or partition to wipe.
    """

    while True:
        try:
            device = input(
                "Enter letter [number] of device/partition to wipe,"
                "\ne.g. to wipe '/dev/sdb1' enter 'b1': ")

            if not re.match("^[a-z][0-9]?$", device):
                raise ValueError()
            return device

        except ValueError:
            print("Sorry, that's not a valid device or partition. Try again.")

def append_device_to_wipe():
    """Append user-defined device/partition to /dev/sd.
    """

    letter = define_device_to_wipe()

    return '/dev/sd' + letter

def number_of_wipes():
    """Prompt user for number of wipes to perform.
    """

    while True:
        try:
            wipes = int(input("How many times do you want to wipe the device or partition?: "))

            if wipes <= 0:
                raise ValueError()
            return wipes

        except ValueError:
            print("Sorry, that's not a valid number. Try again: ")

def confirm_wipe():
    """Prompt user to confirm disk erasure.
    """

    print("WARNING!!! WRITING CHANGES TO DISK WILL RESULT IN IRRECOVERABLE DATA LOSS.")

    while True:
        try:
            reply = input("Do you want to proceed? (Yes/No): ").lower().strip()

            if reply == 'yes':
                return True
            if reply == 'no':
                print("Exiting pyWype.")
                sys.exit()

        except ValueError:
            print("Sorry, that's not a valid entry. Try again: ")

def write_zeros_to_device():
    """Write zeros to device/partition.
    """

    append = append_device_to_wipe()
    num = number_of_wipes()
    confirm_wipe()

    for i in range(num):
        print("Processing pass count {} of {} ... ".format(i + 1, num))
        os.system(('dd if=/dev/zero |pv --progress --time --rate --bytes|'
                   'dd of={} bs=1024'.format(append)))

def write_random_to_device():
    """Write random zeros and ones to device/partition.
    """

    append = append_device_to_wipe()
    num = number_of_wipes()
    confirm_wipe()

    for i in range(num):
        print("Processing pass count {} of {} ... ".format(i + 1, num))
        os.system(('dd if=/dev/urandom |pv --progress --time --rate --bytes|'
                   'dd of={} bs=1024'.format(append)))

def menu():
    """Menu prompt for use to select program option.
    """

    list_mounted_devices()

    while True:
        try:
            print(30 * "-", "MENU", 30 * "-")
            print("1. Overwrite device or partition with 0's \n(faster, less secure).")
            print("2. Overwrite device or partition with random 0\'s & 1\'s"
                  "\n(slower, more secure).")
            print("3. Quit.")

            choice = input("Select an option (1, 2 or 3): ")

            if choice not in ('1', '2', '3'):
                raise ValueError()
            return choice

        except ValueError:
            print("Sorry, that's not a valid number. Try again: ")

def interactive_mode():
    """Display menu-driven options and run function based on selection.
    """

    while True:
        choice = menu()

        if choice == '3':
            sys.exit()
        elif choice == '1':
            write_zeros_to_device()
        elif choice == '2':
            write_random_to_device()

def wipe_device():
    """Program to wipe drive.
    """

    posix_os_check()
    root_user_check()
    interactive_mode()

if __name__ == '__main__':
    print(28 * '-', " pyWype ", 28 * '-')
    print("PYTHON DISK & PARTITION WIPING UTILITY FOR GNU/LINUX."
          "\nTHIS UTILITY WILL IRRECOVERABLY WIPE DATA FROM DRIVE.\nPROCEED WITH CAUTION.")

    wipe_device()

@@ -134,16 +134,32 @@
 port os%0A
+import platform%0A
 import r
@@ -231,30 +231,24 @@
 ss%0A%0Adef 
-posix_os_check
+is_linux
 ():%0A    
@@ -263,19 +263,23 @@
  if 
-OS
+system
  is '
-posi
+Linu
 x'%0A 
@@ -298,29 +298,36 @@
 if '
-posi
+Linu
 x' not 
-in os.name
+platform.system()
 :%0A  

replace posix_os_check with is_linux check