forked from linuxmuster/linuxmuster-prepare
-
Notifications
You must be signed in to change notification settings - Fork 0
/
lmn72-appliance
152 lines (130 loc) · 4.76 KB
/
lmn72-appliance
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#!/usr/bin/python3
#
# lmn72-appliance
# thomas@linuxmuster.net
# 20220620
#
import getopt
import os
import subprocess
import sys
import urllib.request
# check if the user and go on
if not os.geteuid() == 0:
sys.exit('Please start the script as root user.\n You can use the command "sudo -i" to achieve this.')
# help
def usage(rc):
print('Installs linuxmuster.net package repo, downloads and installs linuxmuster-prepare package.')
print('If profile option is set it initially prepares a linuxmuster.net ubuntu appliance.\n')
print('Usage: lmn72-appliance [options]')
print('\n[options] are:\n')
print(
'-t, --hostname=<hostname> : Hostname to apply (optional, works only with')
print(' server profile).')
print('-n, --ipnet=<ip/bitmask> : Ip address and bitmask assigned to the host')
print(
' (optional, default is 10.0.0.x/16, depending')
print(' on the profile).')
print('-p, --profile=<profile> : Host profile to apply, mandatory. Expected')
print(' values are "server" or "ubuntu".')
print(' Profile name is also used as hostname, except for')
print(' "server" if set with -t.')
print('-l, --pvdevice=<device> : Device to use for lvm (server profile only).')
print('-f, --firewall=<firewallip> : Firewall/gateway ip (default *.254).')
print('-d, --domain=<domainname> : Domainname (default linuxmuster.lan).')
print('-u, --unattended : Unattended mode, do not ask, use defaults.')
print('-h, --help : Print this help.')
sys.exit(rc)
# get cli args
try:
opts, args = getopt.getopt(sys.argv[1:], "d:f:hl:n:p:t:u", [
"domain=", "firewall=", "help", "pvdevice=", "ipnet=", "profile=", "hostname=", "unattended"])
except getopt.GetoptError as err:
# print help information and exit:
print(err) # will print something like "option -a not recognized"
usage(2)
# default values
unattended = ''
profile = ''
hostname = ''
domainname = ''
firewallip = ''
ipnet = ''
pvdevice = ''
profile_list = ['server', 'ubuntu']
# evaluate options
for o, a in opts:
if o in ("-u", "--unattended"):
unattended = ' -u'
elif o in ("-p", "--profile"):
profile = a
elif o in ("-t", "--hostname"):
hostname = ' -t ' + a
elif o in ("-l", "--pvdevice"):
pvdevice = ' -l ' + a
elif o in ("-d", "--domain"):
domainname = ' -d ' + a
elif o in ("-n", "--ipnet"):
ipnet = ' -n ' + a
elif o in ("-f", "--firewall"):
firewallip = ' -f ' + a
elif o in ("-h", "--help"):
usage(0)
else:
assert False, "unhandled option"
usage(1)
if profile != '' and profile not in profile_list:
usage(1)
# repo data
lmnkey_remote = 'https://deb.linuxmuster.net/pub.gpg'
lmnkey_local = '/etc/apt/trusted.gpg.d/linuxmuster.net.gpg'
lmn72_list = '/etc/apt/sources.list.d/lmn72.list'
lmn71_deb = 'deb https://deb.linuxmuster.net/ lmn71 main'
lmn72_deb = 'deb https://deb.linuxmuster.net/ lmn72 main'
pkgname = 'linuxmuster-prepare'
rmpkgs = 'lxd lxd-client lxcfs lxc-common snapd'
# return content of text file
def readTextfile(tfile):
if not os.path.isfile(tfile):
return False, None
try:
infile = open(tfile, 'r')
content = infile.read()
infile.close()
return True, content
except:
print('Cannot read ' + tfile + '!')
return False, None
# write textfile
def writeTextfile(tfile, content, flag):
try:
outfile = open(tfile, flag)
outfile.write(content)
outfile.close()
return True
except:
print('Failed to write ' + tfile + '!')
return False
# install repos
print('## install lmn72 repo')
urllib.request.urlretrieve(lmnkey_remote, lmnkey_local)
writeTextfile(lmn72_list, lmn71_deb + '\n', 'w')
writeTextfile(lmn72_list, lmn72_deb, 'a')
# get updates
print('## install software updates')
subprocess.call('apt clean', shell=True)
subprocess.call('apt update', shell=True)
subprocess.call(
'DEBIAN_FRONTEND=noninteractive apt -y purge ' + rmpkgs, shell=True)
subprocess.call(
'DEBIAN_FRONTEND=noninteractive apt -y dist-upgrade', shell=True)
# get lmn72 packages
print('## install ' + pkgname + ' package')
subprocess.call(
'DEBIAN_FRONTEND=noninteractive echo -e "y\ny\ny\n" | apt -y install ' + pkgname, shell=True)
# invoke prepare script if profile is set
if profile != '':
print('## invoke lmn71-prepare')
profile = ' -p ' + profile
subprocess.call('lmn71-prepare -i' + unattended + profile
+ hostname + domainname + firewallip + ipnet + pvdevice, shell=True)