saltstack/salt

View on GitHub
salt/utils/kickstart.py

Summary

Maintainability
F
1 mo
Test Coverage
# -*- coding: utf-8 -*-
'''
Utilities for managing kickstart

.. versionadded:: Beryllium
'''
from __future__ import absolute_import, unicode_literals
import shlex
import argparse  # pylint: disable=minimum-python-version
import salt.utils.files
import salt.utils.yaml
from salt.ext.six.moves import range


def clean_args(args):
    '''
    Cleans up the args that weren't passed in
    '''
    for arg in args:
        if not args[arg]:
            del args[arg]
    return args


def parse_auth(rule):
    '''
    Parses the auth/authconfig line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    noargs = ('back', 'test', 'nostart', 'kickstart', 'probe', 'enablecache',
              'disablecache', 'disablenis', 'enableshadow', 'disableshadow',
              'enablemd5', 'disablemd5', 'enableldap', 'enableldapauth',
              'enableldaptls', 'disableldap', 'disableldapauth',
              'enablekrb5kdcdns', 'disablekrb5kdcdns', 'enablekrb5realmdns',
              'disablekrb5realmdns', 'disablekrb5', 'disablehe-siod',
              'enablesmbauth', 'disablesmbauth', 'enablewinbind',
              'enablewinbindauth', 'disablewinbind', 'disablewinbindauth',
              'enablewinbindusedefaultdomain', 'disablewinbindusedefaultdomain',
              'enablewins', 'disablewins')
    for arg in noargs:
        parser.add_argument('--{0}'.format(arg), dest=arg, action='store_true')

    parser.add_argument('--enablenis', dest='enablenis', action='store')
    parser.add_argument('--hesiodrhs', dest='hesiodrhs', action='store')
    parser.add_argument('--krb5adminserver', dest='krb5adminserver',
                        action='append')
    parser.add_argument('--krb5kdc', dest='krb5kdc', action='append')
    parser.add_argument('--ldapbasedn', dest='ldapbasedn', action='store')
    parser.add_argument('--ldapserver', dest='ldapserver', action='append')
    parser.add_argument('--nisserver', dest='nisserver', action='append')
    parser.add_argument('--passalgo', dest='passalgo', action='store')
    parser.add_argument('--smbidmapgid', dest='smbidmapgid', action='store')
    parser.add_argument('--smbidmapuid', dest='smbidmapuid', action='store')
    parser.add_argument('--smbrealm', dest='smbrealm', action='store')
    parser.add_argument('--smbsecurity', dest='smbsecurity', action='store',
                        choices=['user', 'server', 'domain', 'dns'])
    parser.add_argument('--smbservers', dest='smbservers', action='store')
    parser.add_argument('--smbworkgroup', dest='smbworkgroup', action='store')
    parser.add_argument('--winbindjoin', dest='winbindjoin', action='store')
    parser.add_argument('--winbindseparator', dest='winbindseparator',
                        action='store')
    parser.add_argument('--winbindtemplatehomedir',
                        dest='winbindtemplatehomedir', action='store')
    parser.add_argument('--winbindtemplateprimarygroup',
                        dest='winbindtemplateprimarygroup', action='store')
    parser.add_argument('--winbindtemplateshell', dest='winbindtemplateshell',
                        action='store')

    parser.add_argument('--enablekrb5', dest='enablekrb5', action='store_true')
    if '--enablekrb5' in rules:
        parser.add_argument('--krb5realm', dest='krb5realm', action='store',
                            required=True)
    parser.add_argument('--enablehesiod', dest='enablehesiod',
                        action='store_true')
    if '--enablehesiod' in rules:
        parser.add_argument('--hesiodlhs', dest='hesiodlhs', action='store',
                            required=True)

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_autopart(rule):
    '''
    Parse the autopart line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--type', dest='type', action='store')
    parser.add_argument('--encrypted', dest='encrypted', action='store_true')
    parser.add_argument('--passphrase', dest='passphrase', action='store')
    parser.add_argument('--escrowcert', dest='escrowcert', action='store')
    parser.add_argument('--backuppassphrase', dest='backuppassphrase',
                        action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_autostep(rule):
    '''
    Parse the autostep line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--autoscreenshot', dest='autoscreenshot',
                        action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_bootloader(rule):
    '''
    Parse the bootloader line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--append', dest='append', action='store')
    parser.add_argument('--driveorder', dest='driveorder', action='store')
    parser.add_argument('--location', dest='location', action='store')
    parser.add_argument('--password', dest='password', action='store')
    parser.add_argument('--md5pass', dest='md5pass', action='store')
    parser.add_argument('--upgrade', dest='upgrade', action='store_true')
    parser.add_argument('--timeout', dest='timeout', action='store')
    parser.add_argument('--boot-drive', dest='bootdrive', action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_btrfs(rule):
    '''
    Parse the btrfs line

    TODO: finish up the weird parsing on this one
    http://fedoraproject.org/wiki/Anaconda/Kickstart#btrfs
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--name', dest='name', action='store')
    parser.add_argument('--data', dest='data', action='store')
    parser.add_argument('--metadata', dest='metadata', action='store')
    parser.add_argument('--label', dest='label', action='store')
    parser.add_argument('--noformat', dest='noformat', action='store_true')
    parser.add_argument('--useexisting', dest='useexisting',
                        action='store_true')
    parser.add_argument('--subvol', dest='subvol', action='store_true')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_clearpart(rule):
    '''
    Parse the clearpart line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--all', dest='all', action='store_true')
    parser.add_argument('--drives', dest='drives', action='store')
    parser.add_argument('--init_label', dest='init_label', action='store_true')
    parser.add_argument('--linux', dest='linux', action='store_true')
    parser.add_argument('--none', dest='none', action='store_true')
    parser.add_argument('--initlabel', dest='init_label', action='store_true')
    parser.add_argument('--list', dest='list', action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_device(rule):
    '''
    Parse the device line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    modulename = rules.pop(0)
    parser.add_argument('--opts', dest='opts', action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    args['modulename'] = modulename
    parser = None
    return args


def parse_dmraid(rule):
    '''
    Parse the dmraid line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--name', dest='name', action='store')
    parser.add_argument('--dev', dest='dev', action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_driverdisk(rule):
    '''
    Parse the driverdisk line
    '''
    if '--' not in rule:
        return {'partition': rule}

    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--source', dest='source', action='store')
    parser.add_argument('--biospart', dest='biospart', action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_firewall(rule):
    '''
    Parse the firewall line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--enable', '--enabled', dest='enable',
                        action='store_true')
    parser.add_argument('--disable', '--disabled', dest='disable',
                        action='store_true')
    parser.add_argument('--port', dest='port', action='store')
    parser.add_argument('--service', dest='service', action='store')
    parser.add_argument('--ssh', dest='ssh', action='store_true')
    parser.add_argument('--smtp', dest='smtp', action='store_true')
    parser.add_argument('--http', dest='http', action='store_true')
    parser.add_argument('--ftp', dest='ftp', action='store_true')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_firstboot(rule):
    '''
    Parse the firstboot line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--enable', '--enabled', dest='enable',
                        action='store_true')
    parser.add_argument('--disable', '--disabled', dest='disable',
                        action='store_true')
    parser.add_argument('--reconfig', dest='reconfig', action='store_true')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_group(rule):
    '''
    Parse the group line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--name', dest='name', action='store')
    parser.add_argument('--gid', dest='gid', action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_harddrive(rule):
    '''
    Parse the harddrive line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--biospart', dest='biospart', action='store')
    parser.add_argument('--partition', dest='partition', action='store')
    parser.add_argument('--dir', dest='dir', action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_ignoredisk(rule):
    '''
    Parse the ignoredisk line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--drives', dest='drives', action='store')
    parser.add_argument('--only-use', dest='only-use', action='store')
    parser.add_argument('--interactive', dest='interactive',
                        action='store_true')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_iscsi(rule):
    '''
    Parse the iscsi line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--ipaddr', dest='ipaddr', action='store')
    parser.add_argument('--port', dest='port', action='store')
    parser.add_argument('--target', dest='target', action='store')
    parser.add_argument('--iface', dest='iface', action='store')
    parser.add_argument('--user', dest='user', action='store')
    parser.add_argument('--password', dest='password', action='store')
    parser.add_argument('--reverse-user', dest='reverse-user', action='store')
    parser.add_argument('--reverse-password', dest='reverse-password',
                        action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_iscsiname(rule):
    '''
    Parse the iscsiname line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    #parser.add_argument('iqn')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_keyboard(rule):
    '''
    Parse the keyboard line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--vckeymap', dest='vckeymap', action='store')
    parser.add_argument('--xlayouts', dest='xlayouts', action='store')
    parser.add_argument('--switch', dest='switch', action='store')
    parser.add_argument('keyboard')

    args = clean_args(vars(parser.parse_args(rules)))

    if 'keyboard' in args and 'xlayouts' not in args:
        args['xlayouts'] = args['keyboard']

    parser = None
    return args


def parse_lang(rule):
    '''
    Parse the lang line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('lang')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_logvol(rule):
    '''
    Parse the logvol line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('mntpoint')
    parser.add_argument('--noformat', dest='noformat', action='store_true')
    parser.add_argument('--useexisting', dest='useexisting',
                        action='store_true')
    parser.add_argument('--fstype', dest='fstype', action='store')
    parser.add_argument('--fsoptions', dest='fsoptions', action='store')
    parser.add_argument('--grow', dest='grow', action='store_true')
    parser.add_argument('--maxsize', dest='maxsize', action='store')
    parser.add_argument('--recommended', dest='recommended',
                        action='store_true')
    parser.add_argument('--percent', dest='percent', action='store_true')
    parser.add_argument('--encrypted', dest='encrypted', action='store_true')
    parser.add_argument('--passphrase', dest='passphrase', action='store')
    parser.add_argument('--escrowcert', dest='escrowcert', action='store')
    parser.add_argument('--backuppassphrase', dest='backuppassphrase',
                        action='store_true')
    parser.add_argument('--name', dest='name', action='store')
    parser.add_argument('--vgname', dest='vgname', action='store')
    parser.add_argument('--size', dest='size', action='store')
    parser.add_argument('--label', dest='label', action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_logging(rule):
    '''
    Parse the logging line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--host', dest='host', action='store')
    parser.add_argument('--port', dest='port', action='store')
    parser.add_argument('--level', dest='level', action='store',
                        choices=['debug', 'info', 'warning', 'error',
                                 'critical'])

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_monitor(rule):
    '''
    Parse the monitor line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--hsync', dest='hsync', action='store')
    parser.add_argument('--monitor', dest='monitor', action='store')
    parser.add_argument('--noprobe', dest='noprobe', action='store_true')
    parser.add_argument('--vsync', dest='vsync', action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_multipath(rule):
    '''
    Parse the multipath line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--name', dest='name', action='store')
    parser.add_argument('--device', dest='device', action='store')
    parser.add_argument('--rule', dest='rule', action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_network(rule):
    '''
    Parse the network line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--bootproto', dest='bootproto', action='store',
                        choices=['dhcp', 'bootp', 'static', 'ibft'])
    parser.add_argument('--device', dest='device', action='store')
    parser.add_argument('--ip', dest='ip', action='store')
    parser.add_argument('--ipv6', dest='ipv6', action='store')
    parser.add_argument('--gateway', dest='gateway', action='store')
    parser.add_argument('--nodefroute', dest='nodefroute', action='store_true')
    parser.add_argument('--nameserver', dest='nameserver', action='store')
    parser.add_argument('--nodns', dest='nodns', action='store_true')
    parser.add_argument('--netmask', dest='netmask', action='store')
    parser.add_argument('--hostname', dest='hostname', action='store')
    parser.add_argument('--ethtool', dest='ethtool', action='store')
    parser.add_argument('--essid', dest='essid', action='store')
    parser.add_argument('--wepkey', dest='wepkey', action='store')
    parser.add_argument('--wpakey', dest='wpakey', action='store')
    parser.add_argument('--onboot', dest='onboot', action='store')
    parser.add_argument('--dhcpclass', dest='dhcpclass', action='store')
    parser.add_argument('--mtu', dest='mtu', action='store')
    parser.add_argument('--noipv4', dest='noipv4', action='store_true')
    parser.add_argument('--noipv6', dest='noipv6', action='store_true')
    parser.add_argument('--activate', dest='activate', action='store_true')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_nfs(rule):
    '''
    Parse the nfs line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--server', dest='server', action='store')
    parser.add_argument('--dir', dest='dir', action='store')
    parser.add_argument('--opts', dest='opts', action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_partition(rule):
    '''
    Parse the partition line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('mntpoint')
    parser.add_argument('--size', dest='size', action='store')
    parser.add_argument('--grow', dest='grow', action='store_true')
    parser.add_argument('--maxsize', dest='maxsize', action='store')
    parser.add_argument('--noformat', dest='noformat', action='store_true')
    parser.add_argument('--onpart', '--usepart', dest='onpart', action='store')
    parser.add_argument('--ondisk', '--ondrive', dest='ondisk', action='store')
    parser.add_argument('--asprimary', dest='asprimary', action='store_true')
    parser.add_argument('--fsprofile', dest='fsprofile', action='store')
    parser.add_argument('--fstype', dest='fstype', action='store')
    parser.add_argument('--fsoptions', dest='fsoptions', action='store')
    parser.add_argument('--label', dest='label', action='store')
    parser.add_argument('--recommended', dest='recommended',
                        action='store_true')
    parser.add_argument('--onbiosdisk', dest='onbiosdisk', action='store')
    parser.add_argument('--encrypted', dest='encrypted', action='store_true')
    parser.add_argument('--passphrase', dest='passphrase', action='store')
    parser.add_argument('--escrowcert', dest='escrowcert', action='store')
    parser.add_argument('--backupphrase', dest='backupphrase', action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_raid(rule):
    '''
    Parse the raid line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)

    partitions = []
    newrules = []
    for count in range(0, len(rules)):
        if count == 0:
            newrules.append(rules[count])
            continue
        elif rules[count].startswith('--'):
            newrules.append(rules[count])
            continue
        else:
            partitions.append(rules[count])
    rules = newrules

    parser.add_argument('mntpoint')
    parser.add_argument('--level', dest='level', action='store')
    parser.add_argument('--device', dest='device', action='store')
    parser.add_argument('--spares', dest='spares', action='store')
    parser.add_argument('--fstype', dest='fstype', action='store')
    parser.add_argument('--fsoptions', dest='fsoptions', action='store')
    parser.add_argument('--label', dest='label', action='store')
    parser.add_argument('--noformat', dest='noformat', action='store_true')
    parser.add_argument('--useexisting', dest='useexisting',
                        action='store_true')
    parser.add_argument('--encrypted', dest='encrypted', action='store_true')
    parser.add_argument('--passphrase', dest='passphrase', action='store')
    parser.add_argument('--escrowcert', dest='escrowcert', action='store')
    parser.add_argument('--backuppassphrase', dest='backuppassphrase',
                        action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    if partitions:
        args['partitions'] = partitions
    parser = None
    return args


def parse_reboot(rule):
    '''
    Parse the reboot line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--eject', dest='eject', action='store_true')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_repo(rule):
    '''
    Parse the repo line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--name', dest='name', action='store')
    parser.add_argument('--baseurl', dest='baseurl', action='store')
    parser.add_argument('--mirrorlist', dest='mirrorlist', action='store')
    parser.add_argument('--cost', dest='cost', action='store')
    parser.add_argument('--excludepkgs', dest='excludepkgs', action='store')
    parser.add_argument('--includepkgs', dest='includepkgs', action='store')
    parser.add_argument('--proxy', dest='proxy', action='store')
    parser.add_argument('--ignoregroups', dest='ignoregroups', action='store')
    parser.add_argument('--noverifyssl', dest='noverifyssl',
                        action='store_true')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_rescue(rule):
    '''
    Parse the rescue line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--nomount', dest='nomount', action='store_true')
    parser.add_argument('--romount', dest='romount', action='store_true')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_rootpw(rule):
    '''
    Parse the rootpw line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--iscrypted', dest='iscrypted', action='store_true')
    parser.add_argument('--plaintext', dest='plaintext', action='store_true')
    parser.add_argument('--lock', dest='lock', action='store_true')
    parser.add_argument('password')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_selinux(rule):
    '''
    Parse the selinux line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--disabled', dest='disabled', action='store_true')
    parser.add_argument('--enforcing', dest='enforcing', action='store_true')
    parser.add_argument('--permissive', dest='permissive', action='store_true')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_services(rule):
    '''
    Parse the services line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--disabled', dest='disabled', action='store')
    parser.add_argument('--enabled', dest='enabled', action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_sshpw(rule):
    '''
    Parse the sshpw line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--username', dest='username', action='store')
    parser.add_argument('--iscrypted', dest='iscrypted', action='store_true')
    parser.add_argument('--plaintext', dest='plaintext', action='store_true')
    parser.add_argument('--lock', dest='lock', action='store_true')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_timezone(rule):
    '''
    Parse the timezone line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--utc', dest='utc', action='store_true')
    parser.add_argument('--nontp', dest='nontp', action='store_true')
    parser.add_argument('--ntpservers', dest='ntpservers', action='store')
    parser.add_argument('--isUtc', dest='isutc', action='store_true')
    parser.add_argument('timezone')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_updates(rule):
    '''
    Parse the updates line
    '''
    rules = shlex.split(rule)
    rules.pop(0)
    return {'url': rules[0]} if rules else True


def parse_upgrade(rule):
    '''
    Parse the upgrade line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--root-device', dest='root-device', action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    if args:
        return args
    return True


def parse_url(rule):
    '''
    Parse the url line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--url', dest='url', action='store')
    parser.add_argument('--proxy', dest='proxy', action='store')
    parser.add_argument('--noverifyssl', dest='noverifyssl',
                        action='store_true')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_user(rule):
    '''
    Parse the user line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--name', dest='name', action='store')
    parser.add_argument('--gecos', dest='gecos', action='store')
    parser.add_argument('--groups', dest='groups', action='store')
    parser.add_argument('--homedir', dest='homedir', action='store')
    parser.add_argument('--lock', dest='lock', action='store_true')
    parser.add_argument('--password', dest='password', action='store')
    parser.add_argument('--iscrypted', dest='iscrypted', action='store_true')
    parser.add_argument('--plaintext', dest='plaintext', action='store_true')
    parser.add_argument('--shell', dest='shell', action='store')
    parser.add_argument('--uid', dest='uid', action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_vnc(rule):
    '''
    Parse the vnc line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--host', dest='host', action='store')
    parser.add_argument('--port', dest='port', action='store')
    parser.add_argument('--password', dest='password', action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_volgroup(rule):
    '''
    Parse the volgroup line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)

    partitions = []
    newrules = []
    for count in range(0, len(rules)):
        if count == 0:
            newrules.append(rules[count])
            continue
        elif rules[count].startswith('--'):
            newrules.append(rules[count])
            continue
        else:
            partitions.append(rules[count])
    rules = newrules

    parser.add_argument('name')
    parser.add_argument('--noformat', dest='noformat', action='store_true')
    parser.add_argument('--useexisting', dest='useexisting',
                        action='store_true')
    parser.add_argument('--pesize', dest='pesize', action='store')
    parser.add_argument('--reserved-space', dest='reserved-space',
                        action='store')
    parser.add_argument('--reserved-percent', dest='reserved-percent',
                        action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    if partitions:
        args['partitions'] = partitions
    parser = None
    return args


def parse_xconfig(rule):
    '''
    Parse the xconfig line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--defaultdesktop', dest='defaultdesktop',
                        action='store')
    parser.add_argument('--startxonboot', dest='startxonboot',
                        action='store_true')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def parse_zfcp(rule):
    '''
    Parse the zfcp line
    '''
    parser = argparse.ArgumentParser()
    rules = shlex.split(rule)
    rules.pop(0)
    parser.add_argument('--devnum', dest='devnum', action='store')
    parser.add_argument('--fcplun', dest='fcplun', action='store')
    parser.add_argument('--wwpn', dest='wwpn', action='store')

    args = clean_args(vars(parser.parse_args(rules)))
    parser = None
    return args


def mksls(src, dst=None):
    '''
    Convert a kickstart file to an SLS file
    '''
    mode = 'command'
    sls = {}
    ks_opts = {}
    with salt.utils.files.fopen(src, 'r') as fh_:
        for line in fh_:
            if line.startswith('#'):
                continue

            if mode == 'command':
                if line.startswith('auth ') or line.startswith('authconfig '):
                    ks_opts['auth'] = parse_auth(line)
                elif line.startswith('autopart'):
                    ks_opts['autopath'] = parse_autopart(line)
                elif line.startswith('autostep'):
                    ks_opts['autostep'] = parse_autostep(line)
                elif line.startswith('bootloader'):
                    ks_opts['bootloader'] = parse_bootloader(line)
                elif line.startswith('btrfs'):
                    ks_opts['btrfs'] = parse_btrfs(line)
                elif line.startswith('cdrom'):
                    ks_opts['cdrom'] = True
                elif line.startswith('clearpart'):
                    ks_opts['clearpart'] = parse_clearpart(line)
                elif line.startswith('cmdline'):
                    ks_opts['cmdline'] = True
                elif line.startswith('device'):
                    ks_opts['device'] = parse_device(line)
                elif line.startswith('dmraid'):
                    ks_opts['dmraid'] = parse_dmraid(line)
                elif line.startswith('driverdisk'):
                    ks_opts['driverdisk'] = parse_driverdisk(line)
                elif line.startswith('firewall'):
                    ks_opts['firewall'] = parse_firewall(line)
                elif line.startswith('firstboot'):
                    ks_opts['firstboot'] = parse_firstboot(line)
                elif line.startswith('group'):
                    ks_opts['group'] = parse_group(line)
                elif line.startswith('graphical'):
                    ks_opts['graphical'] = True
                elif line.startswith('halt'):
                    ks_opts['halt'] = True
                elif line.startswith('harddrive'):
                    ks_opts['harddrive'] = True
                elif line.startswith('ignoredisk'):
                    ks_opts['ignoredisk'] = parse_ignoredisk(line)
                elif line.startswith('install'):
                    ks_opts['install'] = True
                elif line.startswith('iscsi'):
                    ks_opts['iscsi'] = parse_iscsi(line)
                elif line.startswith('iscsiname'):
                    ks_opts['iscsiname'] = parse_iscsiname(line)
                elif line.startswith('keyboard'):
                    ks_opts['keyboard'] = parse_keyboard(line)
                elif line.startswith('lang'):
                    ks_opts['lang'] = parse_lang(line)
                elif line.startswith('logvol'):
                    if 'logvol' not in ks_opts.keys():
                        ks_opts['logvol'] = []
                    ks_opts['logvol'].append(parse_logvol(line))
                elif line.startswith('logging'):
                    ks_opts['logging'] = parse_logging(line)
                elif line.startswith('mediacheck'):
                    ks_opts['mediacheck'] = True
                elif line.startswith('monitor'):
                    ks_opts['monitor'] = parse_monitor(line)
                elif line.startswith('multipath'):
                    ks_opts['multipath'] = parse_multipath(line)
                elif line.startswith('network'):
                    if 'network' not in ks_opts.keys():
                        ks_opts['network'] = []
                    ks_opts['network'].append(parse_network(line))
                elif line.startswith('nfs'):
                    ks_opts['nfs'] = True
                elif line.startswith('part ') or line.startswith('partition'):
                    if 'part' not in ks_opts.keys():
                        ks_opts['part'] = []
                    ks_opts['part'].append(parse_partition(line))
                elif line.startswith('poweroff'):
                    ks_opts['poweroff'] = True
                elif line.startswith('raid'):
                    if 'raid' not in ks_opts.keys():
                        ks_opts['raid'] = []
                    ks_opts['raid'].append(parse_raid(line))
                elif line.startswith('reboot'):
                    ks_opts['reboot'] = parse_reboot(line)
                elif line.startswith('repo'):
                    ks_opts['repo'] = parse_repo(line)
                elif line.startswith('rescue'):
                    ks_opts['rescue'] = parse_rescue(line)
                elif line.startswith('rootpw'):
                    ks_opts['rootpw'] = parse_rootpw(line)
                elif line.startswith('selinux'):
                    ks_opts['selinux'] = parse_selinux(line)
                elif line.startswith('services'):
                    ks_opts['services'] = parse_services(line)
                elif line.startswith('shutdown'):
                    ks_opts['shutdown'] = True
                elif line.startswith('sshpw'):
                    ks_opts['sshpw'] = parse_sshpw(line)
                elif line.startswith('skipx'):
                    ks_opts['skipx'] = True
                elif line.startswith('text'):
                    ks_opts['text'] = True
                elif line.startswith('timezone'):
                    ks_opts['timezone'] = parse_timezone(line)
                elif line.startswith('updates'):
                    ks_opts['updates'] = parse_updates(line)
                elif line.startswith('upgrade'):
                    ks_opts['upgrade'] = parse_upgrade(line)
                elif line.startswith('url'):
                    ks_opts['url'] = True
                elif line.startswith('user'):
                    ks_opts['user'] = parse_user(line)
                elif line.startswith('vnc'):
                    ks_opts['vnc'] = parse_vnc(line)
                elif line.startswith('volgroup'):
                    ks_opts['volgroup'] = parse_volgroup(line)
                elif line.startswith('xconfig'):
                    ks_opts['xconfig'] = parse_xconfig(line)
                elif line.startswith('zerombr'):
                    ks_opts['zerombr'] = True
                elif line.startswith('zfcp'):
                    ks_opts['zfcp'] = parse_zfcp(line)

            if line.startswith('%include'):
                rules = shlex.split(line)
                if not ks_opts['include']:
                    ks_opts['include'] = []
                ks_opts['include'].append(rules[1])

            if line.startswith('%ksappend'):
                rules = shlex.split(line)
                if not ks_opts['ksappend']:
                    ks_opts['ksappend'] = []
                ks_opts['ksappend'].append(rules[1])

            if line.startswith('%packages'):
                mode = 'packages'
                if 'packages' not in ks_opts.keys():
                    ks_opts['packages'] = {'packages': {}}

                parser = argparse.ArgumentParser()
                opts = shlex.split(line)
                opts.pop(0)
                parser.add_argument('--default', dest='default', action='store_true')
                parser.add_argument('--excludedocs', dest='excludedocs',
                                    action='store_true')
                parser.add_argument('--ignoremissing', dest='ignoremissing',
                                    action='store_true')
                parser.add_argument('--instLangs', dest='instLangs', action='store')
                parser.add_argument('--multilib', dest='multilib', action='store_true')
                parser.add_argument('--nodefaults', dest='nodefaults',
                                    action='store_true')
                parser.add_argument('--optional', dest='optional', action='store_true')
                parser.add_argument('--nobase', dest='nobase', action='store_true')
                args = clean_args(vars(parser.parse_args(opts)))
                ks_opts['packages']['options'] = args

                continue

            if line.startswith('%pre'):
                mode = 'pre'

                parser = argparse.ArgumentParser()
                opts = shlex.split(line)
                opts.pop(0)
                parser.add_argument('--interpreter', dest='interpreter',
                                    action='store')
                parser.add_argument('--erroronfail', dest='erroronfail',
                                    action='store_true')
                parser.add_argument('--log', dest='log', action='store')
                args = clean_args(vars(parser.parse_args(opts)))
                ks_opts['pre'] = {'options': args, 'script': ''}

                continue

            if line.startswith('%post'):
                mode = 'post'

                parser = argparse.ArgumentParser()
                opts = shlex.split(line)
                opts.pop(0)
                parser.add_argument('--nochroot', dest='nochroot', action='store_true')
                parser.add_argument('--interpreter', dest='interpreter',
                                    action='store')
                parser.add_argument('--erroronfail', dest='erroronfail',
                                    action='store_true')
                parser.add_argument('--log', dest='log', action='store')
                args = clean_args(vars(parser.parse_args(opts)))
                ks_opts['post'] = {'options': args, 'script': ''}

                continue

            if line.startswith('%end'):
                mode = None

            if mode == 'packages':
                if line.startswith('-'):
                    package = line.replace('-', '', 1).strip()
                    ks_opts['packages']['packages'][package] = False
                else:
                    ks_opts['packages']['packages'][line.strip()] = True

            if mode == 'pre':
                ks_opts['pre']['script'] += line

            if mode == 'post':
                ks_opts['post']['script'] += line

    # Set language
    sls[ks_opts['lang']['lang']] = {'locale': ['system']}

    # Set keyboard
    sls[ks_opts['keyboard']['xlayouts']] = {'keyboard': ['system']}

    # Set timezone
    sls[ks_opts['timezone']['timezone']] = {'timezone': ['system']}
    if 'utc' in ks_opts['timezone'].keys():
        sls[ks_opts['timezone']['timezone']]['timezone'].append('utc')

    # Set network
    if 'network' in ks_opts.keys():
        for interface in ks_opts['network']:
            device = interface.get('device', None)
            if device is not None:
                del interface['device']
                sls[device] = {'proto': interface['bootproto']}
                del interface['bootproto']

                if 'onboot' in interface.keys():
                    if 'no' in interface['onboot']:
                        sls[device]['enabled'] = False
                    else:
                        sls[device]['enabled'] = True
                    del interface['onboot']

                if 'noipv4' in interface.keys():
                    sls[device]['ipv4'] = {'enabled': False}
                    del interface['noipv4']
                if 'noipv6' in interface.keys():
                    sls[device]['ipv6'] = {'enabled': False}
                    del interface['noipv6']

                for option in interface:
                    if type(interface[option]) is bool:
                        sls[device][option] = {'enabled': [interface[option]]}
                    else:
                        sls[device][option] = interface[option]
            if 'hostname' in interface:
                sls['system'] = {
                    'network.system': {
                        'enabled': True,
                        'hostname': interface['hostname'],
                        'apply_hostname': True,
                    }
                }

    # Set selinux
    if 'selinux' in ks_opts.keys():
        for mode in ks_opts['selinux']:
            sls[mode] = {'selinux': ['mode']}

    # Get package data together
    if 'nobase' not in ks_opts['packages']['options']:
        sls['base'] = {'pkg_group': ['installed']}

    packages = ks_opts['packages']['packages']
    for package in packages:
        if not packages[package]:
            continue
        if package and packages[package] is True:
            if package.startswith('@'):
                pkg_group = package.replace('@', '', 1)
                sls[pkg_group] = {'pkg_group': ['installed']}
            else:
                sls[package] = {'pkg': ['installed']}
        elif packages[package] is False:
            sls[package] = {'pkg': ['absent']}

    if dst:
        with salt.utils.files.fopen(dst, 'w') as fp_:
            salt.utils.yaml.safe_dump(sls, fp_, default_flow_style=False)
    else:
        return salt.utils.yaml.safe_dump(sls, default_flow_style=False)