salt/utils/kickstart.py
# -*- 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)