| Hash | Commit message | Author | Date | Files | + | - |
1 | commit 20a67062ce4976fd0676cc554295c0293f5d5e9c |
2 | Author: Connor Etherington <[email protected]> |
3 | Date: Tue Apr 26 07:28:18 2022 +0200 |
4 | |
5 | Update. |
6 | --- |
7 | LICENSE | 29 ++++ |
8 | PKGBUILD | 21 +++ |
9 | README.md | 64 +++++++ |
10 | auto | 93 ++++++++++ |
11 | auto.install | 41 +++++ |
12 | autoCleanInstall | 282 ++++++++++++++++++++++++++++++ |
13 | autoInstall | 517 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
14 | autoPart | 151 ++++++++++++++++ |
15 | 8 files changed, 1198 insertions(+) |
16 | |
17 | diff --git a/LICENSE b/LICENSE |
18 | new file mode 100644 |
19 | index 0000000..e130fff |
20 | --- /dev/null |
21 | +++ b/LICENSE |
22 | @@ -0,0 +1,29 @@ |
23 | +MIT/X Consortium License |
24 | + |
25 | +Creator and Maintainer : |
26 | +© 2020-2022 Connor Etherington <[email protected]> |
27 | +--------------------------------------------------------------------------- |
28 | +Contributors: |
29 | + |
30 | + |
31 | +--------------------------------------------------------------------------- |
32 | + |
33 | +Permission is hereby granted, free of charge, to any person obtaining a copy |
34 | +of this software and associated documentation files (the "Software"), to deal |
35 | +in the Software without restriction, including without limitation the rights |
36 | +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
37 | +copies of the Software, and to permit persons to whom the Software is |
38 | +furnished to do so, subject to the following conditions: |
39 | + |
40 | +THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN ALL |
41 | +COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. |
42 | + |
43 | + |
44 | +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
45 | +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
46 | +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
47 | +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
48 | +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
49 | +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
50 | +SOFTWARE. |
51 | + |
52 | diff --git a/PKGBUILD b/PKGBUILD |
53 | new file mode 100644 |
54 | index 0000000..072d3df |
55 | --- /dev/null |
56 | +++ b/PKGBUILD |
57 | @@ -0,0 +1,21 @@ |
58 | +# Maintainer: Connor Etherington <[email protected]> |
59 | +# --- |
60 | +pkgname=auto |
61 | +pkgver=4.2 |
62 | +pkgrel=1 |
63 | +pkgdesc='ArchLinux bootstrap and partitioning script, with a selection of WM and DEs' |
64 | +arch=(x86_64) |
65 | +url="https://gitlab.com/a4to/${pkgname}" |
66 | +install="auto.install" |
67 | +license=('MIT') |
68 | +depends=(dialog) |
69 | +makedepends=(git)[41m |
70 | +source=("git+$url.git") |
71 | +sha256sums=('SKIP') |
72 | + |
73 | +package() { |
74 | + cd "$srcdir" |
75 | + install -Dm755 ${pkgname}/{auto,autoCleanInstall,autoInstall,autoPart} -t "${pkgdir}/usr/bin" |
76 | + install -Dm644 ${pkgname}/LICENSE "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE" |
77 | + install -Dm644 ${pkgname}/README.md "${pkgdir}/usr/share/doc/${pkgname}/README.md" |
78 | +} |
79 | diff --git a/README.md b/README.md |
80 | new file mode 100644 |
81 | index 0000000..21eb2e3 |
82 | --- /dev/null |
83 | +++ b/README.md |
84 | @@ -0,0 +1,64 @@ |
85 | +# Automate BootStrapping Scripts |
86 | + |
87 | +Auto, was built as a method of providing users with a simple yet extensive way to bootstrap and install Arch Linux. |
88 | + |
89 | +During the installation process, you will be given the option to install either bare Arch Linux, and make all further installations decisions[41m |
90 | +yourself, or to choose from a selection of one of the supported bare, or pre-configured desktop environment and window managers.[41m |
91 | + |
92 | +We beleive that Arch Linux, being a rolling release distribution, should if possible always be installed via a script in opposed to an ISO |
93 | +image. This will in turn always ensure that the user is getting the most recent and up to date packages, enhancing user experience, numerous[41m |
94 | +security factors and ensuring a successfull installation. |
95 | + |
96 | +--- |
97 | + |
98 | +The package consists of 4 scripts: |
99 | + |
100 | ++ **auto**: A front-end to initiate the installlation process. |
101 | ++ **autoPart**: A partitioning script. |
102 | ++ **autoInstall**: The base install script. |
103 | ++ **autoCleanInstall**: The clean install script. |
104 | + |
105 | + |
106 | +`autoInstall`: This script is to be used for installing AutoLinux ontop of an existing Arch Linux installation, as a new user profile. |
107 | + |
108 | + |
109 | +`autoCleanInstall`: This script is intended for use when performing a clean/fresh installation, with no pre-existing OS installed on the partition(s) reserved for the installation. |
110 | +This script also includes section for partitioning your drive, so running the autoPart script is **NOT** required. |
111 | + |
112 | + |
113 | +`autoPart`: This script is for useage outside of the AutoLinux installation process, and serves simply as a helper when partitioning your drive for any fresh installation. |
114 | + |
115 | +*NOTE*: The options are limited to partition selection, or drive wipe.[41m |
116 | +As for creating new partitions and deleting existing partitions, an external program such as cfdisk, fdisk or parted will be required if necessary. |
117 | +The script also does not allow for manual selection of a file system type, and the rootfs is automatially set to ext4. |
118 | + |
119 | + |
120 | + |
121 | +## Usage: |
122 | + |
123 | +The `auto` script is used to initiate the installation process, and each step of the install is explained there further.\n |
124 | +However, these scripts can also be run manually if the user chooses to do so. |
125 | + |
126 | +If run manually, please read the function of both the `autoInstall` and `autoCleanInstall` script, and select *EITHER* `autoInstall` or `autoCleanInstall` to carry out[41m |
127 | +the installation process. The `autoCleanInstall` script calls the `autoInstall` script upon completion of the base installation, so running both scripts is **NOT** required.[41m |
128 | + |
129 | + |
130 | + |
131 | +## Currently Supported Editions: |
132 | + |
133 | ++ AutoLinux - DWM Edition |
134 | ++ AutoLinux - Plasma Edition |
135 | ++ KDE Plasma (Plasma out the box) |
136 | ++ Gnome (Gnome out the box) |
137 | ++ Xfce4 (Xfce out the box) |
138 | ++ Bare Arch Linux (No Additional Packages)[41m |
139 | + |
140 | + |
141 | + |
142 | +**Prerequisites** |
143 | + |
144 | ++ The script takes care of all requirements dependencies do not have to be manually installed. ✔ |
145 | + |
146 | + |
147 | +I hope you find these scripts helpfull ! - a4to |
148 | + |
149 | diff --git a/auto b/auto |
150 | new file mode 100755 |
151 | index 0000000..1c93c07 |
152 | --- /dev/null |
153 | +++ b/auto |
154 | @@ -0,0 +1,93 @@ |
155 | +#!/usr/bin/env bash |
156 | +######################################################################################################################################################################################## |
157 | +## ~ A U T O L I N U X F R O N T E N D ~ ## |
158 | +######################################################################################################################################################################################## |
159 | + |
160 | +# _ _ _ __ _ _ #[41m |
161 | +# /.\ _ _ FJ_ ____ FJ / J _ _ _ _ _ FJ LJ #[41m |
162 | +# //_\\ J | | LJ _| F __ J J | LFJ J ' \ J J | | L J \/ F #[41m |
163 | +# / ___ \ | | | || |-' | |--| | | | J L | |\\ | | | | | / \ #[41m |
164 | +# / L___J \ F L__J JF |__-.F L__J J F L_____ J L F L \ JJ F L__J J / /\ \ #[41m |
165 | +# J__L J__J\____,__\_____J\______/J________LJ__LJ__L \\J__LJ\____,__LJ__//\\__L #[41m |
166 | +# |__L J__|J____,__J_____FJ______F|________||__||__L J__| J____,__F|__/ \__| #[41m |
167 | + |
168 | +######################################################################################################################################################################################## |
169 | +######################################################################################################################################################################################## |
170 | + |
171 | +check_root(){ [ "$(id -u)" -ne 0 ] && err "root priviledges are required to run this script."; } |
172 | + |
173 | +err(){ echo -e "\n$(tput bold; tput setaf 1)[-] ERROR: ${*}$(tput sgr0)" && exit 1 ; } |
174 | + |
175 | + |
176 | +SRCDIR="$(realpath "$(dirname $0)")" |
177 | + |
178 | +TITLE=' ~ AutoLinux ~ ' |
179 | + |
180 | +TITLE2=' ~ Automate OS ~ ' |
181 | + |
182 | +WELCOME1="\n Welcome, and thank you for using AutoLinux!\n\n This script is built to make the Arch Linux installation process as quick and painless as possible ...\n\n" |
183 | + |
184 | +WELCOME2="\nYou have the opportunity to select an edition out of of 3 installation categories, namely:\n\n\n |
185 | +1. AutoLinux Editions - Desktop environments and Window managers with AutoLinux at their heart, focused\n on minimalism and a simple, yet comprehensive end user simplicity.\n\n |
186 | +2. Minimal Desktops - Desktop environments with only the minimal packages native to the DE, providing\n the user with a basic desktop experience. No config files.\n\n |
187 | +3. Bare Arch Linux - A clean Arch Linux install. No additional packages whatsoever, leaving all further\n decisions to the user. (Requires a very basic understanding of Arch Linux)\n\n\n |
188 | +Ready to begin?\n\n" |
189 | + |
190 | +cleanInstall=( |
191 | + '1' 'Fresh Install' |
192 | + '2' 'Existing OS') |
193 | + |
194 | +installTypes="\\n What kind of installation would you like to perform?\\n\\n |
195 | +1. Fresh Install - This is a clean install, with no existing OS on the installalation partitions/drive.\\n |
196 | +2. Existing OS - I am installing AutoLinux ontop of an existing OS, as a new user profile.\\n " |
197 | + |
198 | +requierments(){ pacman -Qq dialog && dialog --infobox "Syncronizing package database..." 4 40 &&[41m |
199 | + pacman -Syy parted sudo --needed --noconfirm >/dev/null 2>&1 || |
200 | + pacman -Syy dialog parted sudo --needed --noconfirm || |
201 | + err 'User exited.' ; } |
202 | + |
203 | +well1Menu(){ dialog \ |
204 | + --stdout --colors \ |
205 | + --title "$TITLE2" \ |
206 | + --msgbox "$WELCOME1" \ |
207 | + 9 113 ; } |
208 | + |
209 | +well2Menu(){ dialog \ |
210 | + --stdout --colors \ |
211 | + --title "$TITLE" \ |
212 | + --yes-label "Lets get Started!" \ |
213 | + --no-label "No, I changed my mind." \ |
214 | + --yesno "$WELCOME2" \ |
215 | + 21 108 || exit 1 ; } |
216 | + |
217 | +installMenu(){ \ |
218 | + select=$(dialog \ |
219 | + --stdout --colors \ |
220 | + --title "$TITLE" \ |
221 | + --menu "$installTypes" \ |
222 | + 12 108 0 "${cleanInstall[@]}" ) ; |
223 | + |
224 | + case $select in |
225 | + 1) dialog \ |
226 | + --stdout --colors \ |
227 | + --title "$TITLE" \ |
228 | + --msgbox "\\n Great, you will now be taken to partioning before the installation process begins.\n " \ |
229 | + 7 90 && sh ${SRCDIR}/autoCleanInstall ;; |
230 | + 2) dialog \ |
231 | + --stdout --colors \ |
232 | + --title "$TITLE" \ |
233 | + --msgbox "\n Great, Thank you for choosing AutoLinux!\n " \ |
234 | + 7 90 && sh ${SRCDIR}/autoInstall ;; |
235 | + *) exit 1 ;; esac ; } |
236 | + |
237 | + |
238 | +check_root |
239 | + |
240 | +requierments || err "User exited." |
241 | + |
242 | +! well1Menu && clear && exit 1 |
243 | + |
244 | +! well2Menu && clear && exit 1 |
245 | + |
246 | +installMenu[41m |
247 | + |
248 | diff --git a/auto.install b/auto.install |
249 | new file mode 100644 |
250 | index 0000000..f7fe1e5 |
251 | --- /dev/null |
252 | +++ b/auto.install |
253 | @@ -0,0 +1,41 @@ |
254 | +post_install() { |
255 | +echo -e '\n\033[1m\033[32m\033[4mAutomate BootStrapping Scripts |
256 | + |
257 | +\033[0m\033[36mAuto, was built as a method of providing users with a simple yet extensive way to bootstrap and install Arch Linux. |
258 | + |
259 | +During the installation process, you will be given the option to install either bare Arch Linux, and make all further installations[41m |
260 | +decisions yourself, or to choose from a selection of one of the supported bare, or pre-configured desktop environment and window managers.[41m |
261 | + |
262 | +We beleive that Arch Linux, being a rolling release distribution, should if possible always be installed via a script in opposed to an ISO |
263 | +image. This will in turn ensure that the user is getting the most recent and up to date packages, enhancing user experience, numerous[41m |
264 | +security factors and ensuring a successfull installation. |
265 | + |
266 | + |
267 | +\033[32mThe package consists of 4 scripts: |
268 | + |
269 | +\033[35mauto:\033[0m\033[36m A front-end to initiate the installation process.\033[0m |
270 | +\033[35mautoPart:\033[0m\033[36m A partitioning script.\033[0m |
271 | +\033[35mautoInstall:\033[0m\033[36m The base install script.\033[0m |
272 | +\033[35mautoCleanInstall:\033[0m\033[36m The clean install script.\033[0m\n |
273 | + |
274 | +\033[1m\033[33mautoInstall:\033[0m\033[36m This script is to be used for installing AutoLinux ontop of an existing Arch Linux installation, as a new user profile. |
275 | + |
276 | +\033[1m\033[33mautoCleanInstall:\033[0m\033[36m This script is intended for use when performing a clean/fresh installation, with no pre-existing OS installed on the partition(s) reserved for the installation. |
277 | +This script also includes section for partitioning your drive, so running the autoPart script is \033[31m\033[1mNOT\033[0m\033[36m required. |
278 | + |
279 | +\033[1m\033[33mautoPart:\033[0m\033[36m This script is for useage outside of the AutoLinux installation process, and serves simply as a helper when partitioning your drive for any fresh installation. |
280 | + |
281 | +\033[3m\033[1m\033[36mNOTE:\033[0m\033[36m The options are limited to partition selection, or drive wipe.[41m |
282 | +As for creating new partitions and deleting existing partitions, an external program such as cfdisk, fdisk or parted will be required if necessary. |
283 | +The script also does not allow for manual selection of a file system type, and the rootfs is automatially set to ext4.\n |
284 | + |
285 | +\033[32m\033[1mUsage: \033[36m |
286 | + |
287 | +The \033[33m\033[3m\033[1mauto\033[0m\033[36m script is provided to initiate the installation process, and each step of the install is explained there further. |
288 | +However, these scripts can also be run manually if the user chooses to do so. |
289 | + |
290 | +If run manually, please read the function of both the \033[33m\033[3m\033[1mautoInstall\033[0m\033[36m and \033[3m\033[33m\033[1mautoCleanInstall\033[0m\033[36m script, and select \033[35mEITHER\033[0m\033[36m \033[1m\033[33m\033[3mautoInstall\033[0m\033[36m or \033[33m\033[1m\033[3mautoCleanInstall\033[0m\033[36m to carry out[41m |
291 | +the installation process. The \033[33m\033[1m\033[3mautoCleanInstall\033[0m\033[36m script calls the \033[33m\033[1m\033[3mautoInstall\033[0m\033[36m script upon completion of the base installation, so running both scripts is \033[31m\033[1mNOT\033[0m\033[36m required.\n\n[41m |
292 | + |
293 | +\033[34mI hope you find these scripts helpful! - \033[3m\033[1m\033[33ma4to\n\n\033[0m' |
294 | +} |
295 | diff --git a/autoCleanInstall b/autoCleanInstall |
296 | new file mode 100755 |
297 | index 0000000..8bf2009 |
298 | --- /dev/null |
299 | +++ b/autoCleanInstall |
300 | @@ -0,0 +1,282 @@ |
301 | +#!/usr/bin/env bash |
302 | +######################################################################################################################################################################################### |
303 | +## A U T O L I N U X B O O T S T R A P S C R I P T ## |
304 | +######################################################################################################################################################################################### |
305 | + |
306 | +# _ _ _ __ _ _ #[41m |
307 | +# /.\ _ _ FJ_ ____ FJ / J _ _ _ _ _ FJ LJ #[41m |
308 | +# //_\\ J | | LJ _| F __ J J | LFJ J ' \ J J | | L J \/ F #[41m |
309 | +# / ___ \ | | | || |-' | |--| | | | J L | |\\ | | | | | / \ #[41m |
310 | +# / L___J \ F L__J JF |__-.F L__J J F L_____ J L F L \ JJ F L__J J / /\ \ #[41m |
311 | +# J__L J__J\____,__\_____J\______/J________LJ__LJ__L \\J__LJ\____,__LJ__//\\__L #[41m |
312 | +# |__L J__|J____,__J_____FJ______F|________||__||__L J__| J____,__F|__/ \__| #[41m |
313 | + |
314 | +######################################################################################################################################################################################### |
315 | +######################################################################################################################################################################################### |
316 | + |
317 | +# Debugging: |
318 | +# trap 'lastCommand=$currentCommand; currentCommand=$BASH_COMMAND' DEBUG |
319 | +# trap 'echo $lastCommand' EXIT QUIT STOP ERR |
320 | + |
321 | +######################################################################################################################################################################################### |
322 | + |
323 | +lines(){ cat $1|wc -l; } |
324 | + |
325 | +selectParts(){ selBoot ; selSwap ; selRootFS ; } |
326 | + |
327 | +err(){ echo >&2 "$(tput bold; tput setaf 1)[-] ERROR: ${*}$(tput sgr0)" ; exit 1337 ; } |
328 | + |
329 | +dsks=$(mktemp) ; selDsk=$(mktemp) |
330 | +selPar=$(mktemp) ; selPart=$(mktemp) |
331 | +selSwap=$(mktemp) ; selBoot=$(mktemp) |
332 | +selRootFS=$(mktemp) ; selSwap=$(mktemp) |
333 | +wholeDisk=$(mktemp) ; confirm=$(mktemp) |
334 | +partitions=$(mktemp) ; chRootDir=$(mktemp) |
335 | +tmpZone=$(mktemp) ; mntMntPT=$(mktemp) |
336 | + |
337 | +srcdir=$(cd $(dirname ${BASH_SOURCE[0]}) && pwd && echo) |
338 | + |
339 | +trap 'rm -f $dsks $selPar $selPart $selSwap $selBoot $selRootFS $wholeDisk $partitions $chRootDir $tmpZone $confirm' EXIT QUIT STOP ERR |
340 | + |
341 | +continents=( |
342 | +'Africa' 'Africa' |
343 | +'America' 'America' |
344 | +'Antarctica' 'Antarctica' |
345 | +'Arctic' 'Arctic' |
346 | +'Asia' 'Asia' |
347 | +'Atlantic' 'Atlantic' |
348 | +'Australia' 'Australia' |
349 | +'Brazil' 'Brazil' |
350 | +'Canad' 'Canada' |
351 | +'Chile' 'Chile' |
352 | +'Europe' 'Europe' |
353 | +'Indian' 'Indian' |
354 | +'Mexico' 'Mexico' |
355 | +'Pacific' 'Pacific' |
356 | +'US' 'US' |
357 | +'Etc' 'Etc') |
358 | + |
359 | +warn(){ echo >&2 "$(tput bold; tput setaf 1)[!] WARNING: ${*}$(tput sgr0)"; } |
360 | + |
361 | +check_root(){ [ "$(id -u)" -ne 0 ] && err "root priviledges are required to run this script."; } |
362 | + |
363 | +mkmnt(){ $(mkdir -p /mnt/home/drives/"$1" >/dev/null 2>&1 && $(mount /dev/"$2" /mnt/home/drives/"$1") >/dev/null 2>&1) ; } |
364 | + |
365 | +fail(){ err " CATASTROPHIC FAILIURE IN UNKNOWN REGIONS CAPTAIN . . ." ; } |
366 | + |
367 | +requierments(){ pacman -Qq dialog && dialog --infobox "Syncronizing package database..." 4 40 &&[41m |
368 | + pacman -Syy parted sudo --needed --noconfirm >/dev/null 2>&1 || |
369 | + pacman -Syy dialog parted sudo --needed --noconfirm || |
370 | + err 'User exited.' ; } |
371 | + |
372 | +init(){[41m |
373 | +pacConf /etc/pacman.conf && |
374 | +timedatectl set-ntp true ; } |
375 | + |
376 | +pacConf(){ \ |
377 | +dialog --infobox "Updating Repos and Keys..." 4 40[41m |
378 | + |
379 | +cat ${1}|grep -q "ILoveCandy" || |
380 | +sed -i '/\[options\]/aILoveCandy' ${1} |
381 | + |
382 | +for repo in core extra community multilib; do |
383 | +grep -q "^\[$repo\]" ${1} || echo "[$repo] |
384 | +Include = /etc/pacman.d/mirrorlist |
385 | +" >> ${1} ; done ; } |
386 | + |
387 | +getLocale(){ \ |
388 | +continent=$(dialog \ |
389 | + --title ' ~ Timezone Selection ~ ' \ |
390 | + --stdout --no-tags --no-cancel --menu \ |
391 | + "\n Please select your native country :\n " 10 45 0 \ |
392 | + ${continents[@]}) |
393 | + |
394 | + |
395 | +echo 'zones=(' > $tmpZone |
396 | +for x in $(ls -1 /usr/share/zoneinfo/${continent}); do |
397 | +echo "'${x}' '${x}'" >>${tmpZone} ; done |
398 | +echo ')' >>${tmpZone} |
399 | +source ${tmpZone} |
400 | + |
401 | +zone=$(dialog \ |
402 | + --title ' ~ Timezone Selection ~ ' \ |
403 | + --stdout --no-tags --no-cancel --menu \ |
404 | + "\n Select your local timezone :\n " 48 45 44 \ |
405 | + ${zones[@]}) |
406 | + |
407 | +echo ${continent}/${zone} > ${tmpZone} ; } |
408 | + |
409 | + |
410 | +selDisk(){ \ |
411 | + dialog --stdout --colors --title "Partitioning" \ |
412 | + --menu "\\n Which drive will be used for the AutoLinux installation?\\n " 30 65 0 \ |
413 | + "${drives[@]}" > $selDsk || err "User exited." |
414 | +} |
415 | + |
416 | +selBoot(){ \ |
417 | + dialog --stdout --no-cancel --colors --title "Partitioning" \ |
418 | + --menu "\\n Which Partition will be used for the bootloader?\\n " 30 65 0 \ |
419 | + "${parts[@]}" > $selBoot || err "User exited." |
420 | +} |
421 | + |
422 | +selSwap(){ \ |
423 | + dialog --stdout --colors --title "Partitioning" \ |
424 | + --ok-label "Continue" \ |
425 | + --cancel-label "No Swap" \ |
426 | + --menu "\\n Which Partition will be used for the swap?\\n " 30 65 0 \ |
427 | + "${parts[@]}" > $selSwap |
428 | +} |
429 | + |
430 | +selRootFS(){ \ |
431 | + dialog --stdout --no-cancel --colors --title "Partitioning" \ |
432 | + --menu "\\n Which Partition will be used for the root filesystem?\\n " 30 65 0 \ |
433 | + "${parts[@]}" > $selRootFS || err "User exited." |
434 | +} |
435 | + |
436 | +wholeDisk(){ \ |
437 | + dialog --stdout --colors --extra-button \ |
438 | + --title "Partitioning" \ |
439 | + --extra-label "WIPE DISK" \ |
440 | + --yes-label 'Select Partitions' \ |
441 | + --no-label 'Go Back' \ |
442 | + --yesno "Would you like to wipe the entire drive, or manually select partitions?" 6 80 ;[41m |
443 | + echo $? > $wholeDisk |
444 | +} |
445 | + |
446 | +allDisks(){ \ |
447 | +fdisk -l|grep -B 1 "Disk model:"|sed 's/,.*sectors//g;s/://g;s/Disk\s*\///g;s/Disk model //g'|xargs|sed \ |
448 | +'s/ -- /\n/g;s/dev/"\/dev/g;s/\n/"\n/g;s/^/drives=(\n/g;s/$/"\n)/g'|sed 's/ /" "/;s/iB /iB /' >$dsks ; source $dsks ; } |
449 | + |
450 | +getDisk(){ \ |
451 | +eval $(fdisk -lo Device,Size,Type|grep $(cat $selDsk) >$selPar ; n=1 ; echo "parts=(" >$selPart |
452 | +cat $selPar|while read x; do echo "$(head -n $n $selPar|tail -n1|cut -d' ' -f1|sed "s/^/'/;s/$/'/")\ |
453 | +$(echo $x|cut -d' ' -f2-|sed "s/^/\t\'/;s/$/\'/")"|sed '/Disk.*bytes,.*sectors/d'; ((n++)) ; done >>$selPart && |
454 | +echo -e ")" >>$selPart) ; source $selPart ; } |
455 | + |
456 | +confirm(){ \ |
457 | + dialog --stdout --colors --title "Partitioning" \ |
458 | + --yes-label 'NO. Go Back' \ |
459 | + --no-label 'YES. Continue' \ |
460 | + --yesno "\\nAre you sure you want to completely wipe $(cat $selDsk)?\\n\\nThis action CANNOT be undone." 9 90 ; |
461 | + WIPE=$? ; } |
462 | + |
463 | +wipeDisk(){ \ |
464 | + PRTED="parted -s $(cat $selDsk)" |
465 | + wipefs $(cat $selDsk) |
466 | + dialog --colors --title "Partitioning" --infobox "Preparing $(cat $selDsk)1 - the legacy boot partition, Pease be patient..." 3 80 ; |
467 | + $PRTED mklabel gpt >/dev/null 2>&1 |
468 | + $PRTED mkpart primary 1 3 >/dev/null 2>&1 |
469 | + $PRTED name 1 legacy >/dev/null 2>&1 |
470 | + $PRTED set 1 bios_grub on |
471 | + dialog --colors --title "Partitioning" --infobox "Preparing $(cat $selDsk)2 - the uefi boot partition, Pease be patient..." 3 80 ; |
472 | + $PRTED mkpart primary fat32 3MiB 256MiB >/dev/null 2>&1 |
473 | + $PRTED name 2 boot >/dev/null 2>&1 |
474 | + $PRTED set 2 boot on |
475 | + yes|mkfs.fat -F32 $(cat $selDsk)2 >/dev/null 2>&1 |
476 | + dialog --colors --title "Partitioning" --infobox "Preparing $(cat $selDsk)3 - the swap partition, Pease be patient..." 3 80 ; |
477 | + swapoff $(cat $selDsk)3 >/dev/null 2>&1 |
478 | + $PRTED mkpart primary 256MiB 4352MiB >/dev/null 2>&1 |
479 | + $PRTED name 3 swap >/dev/null 2>&1 |
480 | + $PRTED set 3 swap on |
481 | + yes|mkswap $(cat $selDsk)3 >/dev/null 2>&1 ; |
482 | + swapon $(cat $selDsk)3 >/dev/null 2>&1 |
483 | + dialog --colors --title "Partitioning" --infobox "Preparing $(cat $selDsk)4 - the root filesystem, Pease be patient..." 3 80 ; |
484 | + $PRTED mkpart primary ext4 4352MiB 100% >/dev/null 2>&1 |
485 | + $PRTED name 4 rootfs >/dev/null 2>&1 |
486 | + yes|mkfs.ext4 $(cat $selDsk)4 >/dev/null 2>&1 ; } |
487 | + |
488 | +definedPartitioning(){ \ |
489 | + dialog --colors --title "Partitioning" --infobox "Preparing the $(cat $selBoot) - the boot partition, Pease be patient..." 3 80 ; |
490 | + yes|mkfs.fat -F32 $(cat $selBoot) >/dev/null 2>&1 |
491 | + [ -n "$(cat $selSwap)" ] && dialog --colors --title "Partitioning" --infobox "Preparing the $(cat $selSwap) - the swap partition, Pease be patient..." 3 80 ; |
492 | + [ -n "$(cat $selSwap)" ] && yes|mkswap $(cat $selSwap) >/dev/null 2>&1 |
493 | + dialog --colors --title "Partitioning" --infobox "Preparing $(cat $selRootFS) - the root filesystem, Pease be patient..." 3 80 ; |
494 | + yes|mkfs.ext4 $(cat $selRootFS) >/dev/null 2>&1 |
495 | + [ -n "$(cat $selSwap)" ] && swapon $(cat $selSwap) >/dev/null 2>&1 |
496 | +} |
497 | + |
498 | +definedConfirm(){ \ |
499 | + dialog --colors --title "Partitioning" \ |
500 | + --yes-label "Wait, Go Back" \ |
501 | + --no-label "Im Sure" \ |
502 | + --yesno "\\nAre you happy with your selection?\\n\\n1. Boot Partition: $(cat $selBoot)\\n2. Swap Partition: $(cat $selSwap)\\n3. Root File System: $(cat $selRootFS)\\n\\nOnce you have confirmed, there in no going back." 14 80 ; |
503 | + defConf=$? ; } |
504 | + |
505 | +completion(){ dialog --colors --title " ~ AutoLinux ~ " \ |
506 | + --infobox "\\nPartitioning Completed Successfully! Now continuing to install base system..." 5 85 ; } |
507 | + |
508 | +begin(){ \ |
509 | +n=1 ; selDisk || err "User Exited." |
510 | +getDisk || err "User Exited." |
511 | +wholeDisk || err "User Exited." |
512 | +[41m |
513 | +case "$(cat $wholeDisk)" in |
514 | + 1) getDisk && begin ;; |
515 | + 0) selectParts ; definedConfirm && [ $defConf -eq 0 ] && begin ||[41m |
516 | + [ $defConf -eq 1 ] && definedPartitioning && wipeType='manual' ;; |
517 | + 3) confirm && case "$(echo $WIPE)" in[41m |
518 | + '0') begin ;; |
519 | + '1') wipeDisk && wipeType='automatic'; mount $(cat $selDsk)4 /mnt ;; |
520 | + esac ;; esac ; } |
521 | + |
522 | +base_install(){ \ |
523 | + for x in base linux-firmware base-devel; do |
524 | + dialog --colors --title " ~ AutoLinux ~ " --infobox "Installing $x, part of the fundaemental system packages..." 3 80 ; |
525 | + sudo pacstrap /mnt ${x} --noconfirm >/dev/null 2>&1 ; done ; unset x ; } |
526 | + |
527 | +post_install(){ \ |
528 | + for x in efibootmgr dosfstools mtools pacman-contrib os-prober; do |
529 | + dialog --colors --title " ~ AutoLinux ~ " --infobox "Installing $x, needed for the installation..." 3 80 ; |
530 | + sudo pacstrap /mnt ${x} --noconfirm >/dev/null 2>&1 ; done ; unset x ; } |
531 | + |
532 | +cp_scripts(){ cd $srcdir ; cp autoInstall /mnt ; } |
533 | + |
534 | +checkMnt(){ \ |
535 | + echo -en "mntMount='$(lsblk -lnD --output NAME,MOUNTPOINT|grep '/mnt'|uniq|cut -d' ' -f1|xargs|sed 's/ /,/g')'" >>${mntMntPT} && source ${mntMntPT} ; echo $mntMount|read mntMount |
536 | + [ -z "${mntMount}" ] && [ $(ls -1 /mnt|wc -l) -eq 0 ] && return 0 |
537 | + [ -z "${mntMount}" ] && [ $(ls -1 /mnt|wc -l) -ge 1 ] && dialog --colors --title " ~ AutoLinux ~ " --msgbox "\\n WARNING: The /mnt directory is not empty.\\n\\nThis will cause problems with the installation. Please ensure that you empty '/mnt' before proceeding." 10 80 && clear && echo -e "\n" && exit 1 |
538 | + [ -n "${mntMount}" ] && dialog --colors --title " ~ AutoLinux ~ " --yes-label "Continue" --no-label "EXIT" --yesno "\\nWARNING: "$mntMount" - is/are currently mounted at /mnt.\\n\\nAny files and directories will be lost. Are you sure you want to continue?" 10 80 && return 0 || clear && echo -e "\n" && exit 1[41m |
539 | +} |
540 | + |
541 | +linkLocale(){ \ |
542 | + dialog --colors --title " ~ AutoLinux ~ " --infobox "Setting timezone..." 3 50 ; |
543 | + ln -sf /usr/share/zoneinfo/$(cat $tmpZone) /mnt/etc/localtime |
544 | +} |
545 | + |
546 | + |
547 | +# Script Begins: |
548 | + |
549 | +check_root ; checkMnt |
550 | + |
551 | +requierments ; init[41m |
552 | + |
553 | +allDisks || err "Could not find any disks." |
554 | + |
555 | +getLocale || err "User Exited." |
556 | + |
557 | +begin |
558 | + |
559 | + |
560 | +case "$wipeType" in |
561 | + 'manual') mount $(cat $selRootFS) /mnt && completion && sleep 3 ||[41m |
562 | + swapoff $(cat ${selSwap}) >/dev/null 2>&1[41m |
563 | + ! [ -d /mnt/boot/EFI ] && mkdir -p /mnt/boot/EFI; mount $(cat $selBoot) /mnt/boot/EFI ;; |
564 | + 'automatic') mount $(cat $selDsk)4 /mnt && completion && sleep 3 ||[41m |
565 | + ! [ -d /mnt/boot/EFI ] && mkdir -p /mnt/boot/EFI; mount $(cat $selDsk)2 /mnt/boot/EFI ;; |
566 | +esac |
567 | + |
568 | + |
569 | +base_install && post_install || err "User Exited." |
570 | + |
571 | +linkLocale || err "User Exited." |
572 | + |
573 | +pacConf /mnt/etc/pacman.conf |
574 | + |
575 | +genfstab -U /mnt > /mnt/etc/fstab[41m |
576 | + |
577 | +cp_scripts && arch-chroot /mnt /usr/bin/bash /autoInstall && |
578 | + rm /mnt/autoInstall && umount -l /mnt && exit 0 |
579 | + |
580 | + |
581 | +######################################################################################################################################################################################### |
582 | +######################################################################################################################################################################################### |
583 | diff --git a/autoInstall b/autoInstall |
584 | new file mode 100755 |
585 | index 0000000..122a17b |
586 | --- /dev/null |
587 | +++ b/autoInstall |
588 | @@ -0,0 +1,517 @@ |
589 | +#!/usr/bin/env bash |
590 | +######################################################################################################################################################################################### |
591 | +## A U T O L I N U X B O O T S T R A P S C R I P T ## |
592 | +######################################################################################################################################################################################### |
593 | + |
594 | +# _ _ _ __ _ _ #[41m |
595 | +# /.\ _ _ FJ_ ____ FJ / J _ _ _ _ _ FJ LJ #[41m |
596 | +# //_\\ J | | LJ _| F __ J J | LFJ J ' \ J J | | L J \/ F #[41m |
597 | +# / ___ \ | | | || |-' | |--| | | | J L | |\\ | | | | | / \ #[41m |
598 | +# / L___J \ F L__J JF |__-.F L__J J F L_____ J L F L \ JJ F L__J J / /\ \ #[41m |
599 | +# J__L J__J\____,__\_____J\______/J________LJ__LJ__L \\J__LJ\____,__LJ__//\\__L #[41m |
600 | +# |__L J__|J____,__J_____FJ______F|________||__||__L J__| J____,__F|__/ \__| #[41m |
601 | + |
602 | +######################################################################################################################################################################################### |
603 | +######################################################################################################################################################################################### |
604 | + |
605 | +# Debugging: |
606 | +# trap 'lastCommand=$currentCommand; currentCommand=$BASH_COMMAND' DEBUG |
607 | +# trap 'echo $lastCommand' EXIT QUIT STOP ERR |
608 | + |
609 | +######################################################################################################################################################################################### |
610 | + |
611 | + #-------------------------------# |
612 | +## ### VARIABLES & FUNCTIONS ### ## |
613 | + #-------------------------------# |
614 | + |
615 | +pkgdir="/opt" |
616 | + |
617 | +aurhelper="yay" |
618 | + |
619 | +TITLE=' ~ Automate OS ~ ' |
620 | + |
621 | +mirlist="/etc/pacman.d/mirrorlist" |
622 | + |
623 | +lmirlist="/etc/pacman.d/local-mirrorlist" |
624 | + |
625 | +envConf="https://gitlab.com/a4to/dotfiles.git" |
626 | + |
627 | + |
628 | +arch="$(uname -m)" |
629 | + |
630 | +srcdir="$(cd $(dirname ${BASH_SOURCE[0]}) && pwd && echo)" |
631 | + |
632 | +area="$(curl -4 ifconfig.co/country-iso 2>/dev/null)"[41m |
633 | + |
634 | +bootid="$(lsblk|grep boot |sed 's/p.*$//;s/├─//;s/└─//'|sed 's/^/\/dev\//;s/$/\//')" |
635 | + |
636 | +rmdblck="$([ -f /var/lib/pacman/db.lck ] && rm -rf /var/lib/pacman/db.lck)" |
637 | + |
638 | + |
639 | +KERNELS=( |
640 | + '1' 'linux ' |
641 | + '2' 'linux-lts ' |
642 | + '3' 'linux-hardened ' |
643 | + '4' 'linux-zen ') |
644 | + |
645 | +EDITIONS=([41m |
646 | + '1' 'AutoLinux - DWM Edition ' |
647 | + '2' 'AutoLinux - Plasma Edition ' |
648 | + '3' 'KDE Plasma (Plasma Desktop and Apps) ' |
649 | + '4' 'Gnome (Gnome Desktop and Apps) ' |
650 | + '5' 'Xfce (Xfce4 Desktop and Apps) ' |
651 | + '6' 'Bare Arch Linux (No Additional Packages) ') |
652 | +[41m |
653 | + |
654 | +installpkg(){ pacman --noconfirm --needed -S "$*" >/dev/null 2>&1 ; } |
655 | + |
656 | +check_root(){ [ "$(id -u)" -ne 0 ] && err "Root priviledges are required to run this script!"; } |
657 | + |
658 | +err(){ echo >&2 "$(tput bold; tput setaf 1)[-] ERROR: ${*}$(tput sgr0)" && $rmdblck ; exit 1337; } |
659 | + |
660 | + |
661 | +newmirrors(){ \ |
662 | + dialog --title "$TITLE" --infobox " Testing fastest mirrors for most efficient downloads..." 4 50 |
663 | + mv /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.backup && reflector --sort rate -a48 -f20 -l20 -c 'ZA,US,UK,Germany,Netherlands' \ |
664 | +-p 'http,https' --save /etc/pacman.d/mirrorlist >/dev/null 2>&1 ; } |
665 | + |
666 | +initmsg1(){ \ |
667 | + dialog --title " Welcome to Automate! " --msgbox "\\n Welcome, and thank you for using AutoLinux!\\n\\n This script will now install the Arch/AutoLinux edition of your choice.\\n" 9 80 ; } |
668 | + |
669 | +whichedition(){ |
670 | + edition="$(dialog --title "$TITLE" --colors --menu "\\n Please Select the Edition You Wish to Install :\\n " 16 60 5 "${EDITIONS[@]}" 3>&1 1>&2 2>&3 3>&1)" ; } |
671 | + |
672 | +initmsg2(){ |
673 | + dialog --colors --title " Please Note :" --yes-label " Lets Get Going! " --no-label " I Changed My Mind. " --yesno "\\n An Arch Linux, or Arch based system is required for the AutoLinux installation.\\n\\n If you are running any other distrobution the installation will fail." 9 90 ; } |
674 | + |
675 | +selKernel(){ |
676 | + kernel="$(dialog --colors --title "Kernel Selection" --menu "\\n Please choose your kernel:\\n\\n (If unsure, select the default '1. Linux' kernel)" 15 56 6 "${KERNELS[@]}" 3>&1 1>&2 2>&3 3>&1)" ; }[41m |
677 | + |
678 | + |
679 | +user_and_password() { |
680 | + name=$(dialog --inputbox " Please enter a name for the user account: " 10 60 3>&1 1>&2 2>&3 3>&1) || exit 1 |
681 | + while ! echo "$name" | grep -q "^[a-z_][a-z0-9_-]*$"; do |
682 | + name=$(dialog --no-cancel --inputbox "Username not valid. Give a username beginning with a letter, with only lowercase letters, - or _." 10 60 3>&1 1>&2 2>&3 3>&1) |
683 | + done |
684 | + pass1=$(dialog --no-cancel --passwordbox "Enter a password for that user:" 10 60 3>&1 1>&2 2>&3 3>&1) |
685 | + pass2=$(dialog --no-cancel --passwordbox "Retype the password." 10 60 3>&1 1>&2 2>&3 3>&1) |
686 | + while ! [ "$pass1" = "$pass2" ]; do |
687 | + unset pass2 |
688 | + pass1=$(dialog --no-cancel --passwordbox "Passwords do not match.\\n\\nEnter password again." 10 60 3>&1 1>&2 2>&3 3>&1) |
689 | + pass2=$(dialog --no-cancel --passwordbox "Retype password." 10 60 3>&1 1>&2 2>&3 3>&1) |
690 | + done ; } |
691 | + |
692 | +root_user_password(){ |
693 | + dialog --colors --title "$TITLE" --yes-label ' Change Root Password ' --no-label ' Keep Current Password ' --yesno "\\nWould you like to change the root password?\\n\\nIf this is a clean install and not an addition to an existing system, it is essential that you change the root password.\\n\\nChange root password?" 12 66 3>&1 1>&2 2>&3 3>&1 || return 0 ; |
694 | + pass3=$(dialog --no-cancel --passwordbox "Enter a password for the root user:" 10 60 3>&1 1>&2 2>&3 3>&1) |
695 | + pass4=$(dialog --no-cancel --passwordbox "Retype the password." 10 60 3>&1 1>&2 2>&3 3>&1) |
696 | + while ! [ "$pass3" = "$pass4" ]; do |
697 | + unset pass2 |
698 | + pass3=$(dialog --no-cancel --passwordbox "Passwords do not match.\\n\\nEnter password again." 10 60 3>&1 1>&2 2>&3 3>&1) |
699 | + pass4=$(dialog --no-cancel --passwordbox "Retype password." 10 60 3>&1 1>&2 2>&3 3>&1) |
700 | + done ; } |
701 | + |
702 | +usercheck() { \ |
703 | + ! { id -u "$name" >/dev/null 2>&1; } || |
704 | + dialog --colors --title "WARNING!" --yes-label " CONTINUE " --no-label " RETURN " --yesno "\nThe user '$name' already exists on this system. AutoLinux can install for this user, but will overwrite any existing configuration files existing on \\nthis users account. \\n\\nHowever, it will not overwrite any other user files, documents, videos, or personal files of any sorts.\\n\\nIrrespective, only click <CONTINUE> if you are certain you have backed up any wanted system 'config' files.\\n\\nThe users password will also be changed to the one you just provided." 17 85 ; } |
705 | + |
706 | +preinstall() { \ |
707 | + dialog --title " The calm before the STORM!" --yes-label "CONTINUE" --no-label " EXIT " --yesno "\\nThe rest of the proccess is automated and might take a while, depending on your connection. \\n\\nSo sit back, relax and please do not stop the process if it seems stuck.\\nSome packages just take longer to compile than others.\\n\\n\\nReady when you are?" 14 82 ; } |
708 | + |
709 | + |
710 | +adduserandpass() { \ |
711 | + dialog --infobox " Adding user \"$name\"..." 4 50 |
712 | + useradd -m "$name" >/dev/null 2>&1 |
713 | + usermod -aG wheel,audio,optical,video,kvm,network,adm "$name" && chown $name /home/"$name" >/dev/null 2>&1 |
714 | + export repodir="/home/$name/.local/src"; mkdir -p "$repodir"; chown -R "$name":wheel "$(dirname "$repodir")" |
715 | + echo "$name:$pass1" | chpasswd >/dev/null 2>&1 |
716 | + unset pass1 pass2 ; } |
717 | + |
718 | +setrootpass(){ |
719 | + dialog --infobox " Changing password for root user..." 4 50 |
720 | + [ -z "$pass3" ] && pass3="autolinux" ; |
721 | + echo "root:$pass3" | chpasswd >/dev/null 2>&1 |
722 | + unset pass3 pass4 ; } |
723 | + |
724 | +bootload(){ |
725 | + dialog --colors --title " Clean Install or Existing System? " --yes-label " Install GRUB! " --no-label " I have a bootloader. " --yesno "\\n Would you like AutoLinux to install the GRUB bootloader? \\n\\n If it is your first time installing an OS and you have not yet installed or \n configured a bootloader, then selecting 'yes' would be a required for the \n system to function or boot." 11 82 && |
726 | + loader="$?" ; } |
727 | + |
728 | +addmirrors(){ |
729 | + dialog --colors --title " Additional Mirrors and Repositories " --yes-label " Yes, Add Them! " --no-label " No Thanks. " --yesno "\\n Would you like to add the additional Mirrors and Repositories to the build?\\n\\n These mirrors would be beneficial as they would give you access/availability to many extra\n resources and repositories to acquire packages and other software.\n\n\n NOTE: Adding these extra mirrors would also significantly speed up the installation process,\n since you will be downloading binary versions of most aur packages, instead of compiling \n everything from source." 15 100 |
730 | + yesmir="$?" ; } |
731 | + |
732 | +chshell(){ |
733 | +chsh -s /bin/zsh >/dev/null 2>&1 |
734 | +chsh -s /bin/zsh "$name" >/dev/null 2>&1 |
735 | +sudo -u "$name" mkdir -p "/home/$name/.cache/zsh/" ; } |
736 | + |
737 | +refreshkeys() { \ |
738 | + dialog --infobox "Refreshing Arch Keyring..." 4 40 |
739 | + pacman --noconfirm -S archlinux-keyring >/dev/null 2>&1 |
740 | + dialog --infobox "Updating Repos and Keys..." 4 40[41m |
741 | + for repo in core extra community multilib; do |
742 | + grep -q "^\[$repo\]" /etc/pacman.conf || echo "[$repo] |
743 | +Include = /etc/pacman.d/mirrorlist |
744 | +" >> /etc/pacman.conf |
745 | +done |
746 | + |
747 | + pacman-key --init >/dev/null 2>&1[41m |
748 | + pacman-key --populate >/dev/null 2>&1 |
749 | + pacman -Syy >/dev/null 2>&1 |
750 | +} |
751 | + |
752 | +addConcise(){ |
753 | + |
754 | + dialog --infobox "Adding Concise Keyring..." 4 40 |
755 | +[41m |
756 | + yes|pacman-key --recv-key 81BACEEBC3EA26E127166E4A819BB92A9A48160E --keyserver keyserver.ubuntu.com >/dev/null 2>&1[41m |
757 | + yes|pacman-key --lsign-key 81BACEEBC3EA26E127166E4A819BB92A9A48160E >/dev/null 2>&1 |
758 | + yes|pacman -U 'https://gitlab.com/a4to/concise/-/raw/master/x86_64/concise-keyring-1.0.3-1-any.pkg.tar.zst' >/dev/null 2>&1[41m |
759 | +[41m |
760 | + cat /etc/pacman.conf|grep -q "^\[concise\]"|| cat << EOF >>/etc/pacman.conf |
761 | +[41m |
762 | +[concise] |
763 | +SigLevel = Required DatabaseOptional |
764 | +Server = https://gitlab.com/a4to/\$repo/-/raw/master/\$arch |
765 | +EOF |
766 | + |
767 | + pacman-key --init >/dev/null 2>&1[41m |
768 | + pacman-key --populate >/dev/null 2>&1 |
769 | + pacman -Syy >/dev/null 2>&1 |
770 | + |
771 | + } |
772 | + |
773 | +conciseRepos(){ |
774 | + dialog --stdout --title "$TITLE" --yes-label "Yes, Add Them!" --no-label "No Thanks." --yesno "\\n\\n Would you like to add the Concise mirrors and repositories to your build?\\n\\n\\nThese mirrors are highly recommended and would be very beneficial as they contain all the AutoLinux pre-compiled binaries as well as easy access to many more packages and other software.\n\nNOTE: Adding these mirrors would also significantly speed up the installation process,\nsince you will be downloading binary versions of most aur packages, instead of compiling \neverything from source." 18 95 |
775 | + yesConcise="$?" ; } |
776 | + |
777 | + |
778 | +sudoers(){ echo -e "\n$*" >> /etc/sudoers ; } |
779 | + |
780 | +gpudrivers(){ \ |
781 | + dialog --infobox " Detecting Graphics Card..." 4 40 |
782 | + local GPU="$(hwinfo|grep gpu|grep Driver:|cut -d ':' -f2|sed 's/\s*//;s/"//g')" |
783 | +[41m |
784 | + case ${GPU} in |
785 | + AMD|amd|Amd|amd-gpu) dialog --infobox " Installing AMD GPU Drivers..." 4 40 |
786 | + yes|${aurhelper} -S --needed xf86-video-amdgpu >/dev/null 2>&1 ;; |
787 | + NVIDIA|Nvidia|nvidia|nvidia-gpu) dialog --infobox " Installing NVIDIA GPU Drivers..." 4 40 |
788 | + yes|${aurhelper} -S --needed nvidia-470xx-dkms nvidia-470xx-settings nvidia-470xx-utils >/dev/null 2>&1 ;; |
789 | + Intel|INTEL|intel|intel-gpu) dialog --infobox " Installing Intel GPU Drivers..." 4 40 |
790 | + yes|${aurhelper} -S --needed vulkan-intel xf86-video-intel intel-gpu-tools >/dev/null 2>&1 ;; |
791 | + Radeon|radeon|RADEON|radeon-gpu) dialog --infobox " Installing Radeon GPU Drivers..." 4 40 |
792 | + yes|${aurhelper} -S --needed opencl-mesa vulkan-raedon >/dev/null 2>&1 ;; |
793 | + *) dialog --infobox " Unknown GPU Detected, Skipping GPU Driver Installation..." 4 40 && sleep 2 ;; |
794 | + |
795 | + esac; unset x ; } |
796 | + |
797 | +cpudrivers(){ \ |
798 | + dialog --infobox " Detecting CPU..." 4 40 |
799 | + local CPU="$(lscpu|grep 'Model name:'|cut -d ':' -f2|sed 's/\s*//'|cut -d\ -f1)" |
800 | +[41m |
801 | + case ${CPU} in |
802 | + Intel|INTEL|intel|intel-cpu) dialog --infobox " Installing Intel CPU Drivers..." 4 40 |
803 | + yes|${aurhelper} -S --needed intel-ucode >/dev/null 2>&1 ;; |
804 | + AMD|amd|Amd|amd-cpu) dialog --infobox " Installing AMD CPU Drivers..." 4 40 |
805 | + yes|${aurhelper} -S --needed amd-ucode >/dev/null 2>&1 ;; |
806 | + *) dialog --infobox " Unknown CPU Detected, Skipping CPU Driver Installation..." 4 40 ; sleep 2 ;; |
807 | + |
808 | + esac ; unset x ; } |
809 | + |
810 | +replacedir(){ \ |
811 | + dialog --infobox "Installing AutoLinux custom builds of '$(basename "$1")' ($n of $total). $2" 5 70 |
812 | + destdir="/usr/share" |
813 | + clonename="$(basename "$1" .git)" |
814 | + clonepath="$destdir/$clonename" |
815 | + [ -e "$clonepath" ] && sudo mv $clonepath "$clonepath'-old'" ; |
816 | + git clone "$1" $clonepath >/dev/null 2>&1 |
817 | + cd /tmp || return 1 ; } |
818 | + |
819 | +archlinuxinstall(){ |
820 | + dialog --infobox "Installing "$1", an AUR helper..." 4 50 |
821 | + [ -d "$pkgdir"/"$1" ] && rm -rf "$pkgdir"/"$1" ; |
822 | + sudo git clone --depth 1 https://aur.archlinux.org/"$1".git $pkgdir/"$1" >/dev/null 2>&1 ; |
823 | + chown "$name":wheel $pkgdir/"$1" ||{ cd "$pkgdir/$1" || return 1 ; sudo -u "$name" git pull --force origin master;} |
824 | + cd "$pkgdir/$1"&&sudo -u "$name" makepkg --noconfirm -si >/dev/null 2>&1 || return 1 ; cd /tmp ; } |
825 | + |
826 | +maininstall(){ |
827 | + dialog --title "AutoLinux Installation" --infobox "Installing '$1' ($n of $total). $2" 5 70 |
828 | + installpkg "$1" ; } |
829 | + |
830 | +gitinstall(){ |
831 | + progname="$(basename "$1" .git)" |
832 | + dir="$repodir/$progname" |
833 | + dialog --title "AutoLinux Installation" --infobox "Cloning and Building '$progname' ($n of $total). '$(basename "$1")' $2" 5 70 |
834 | + sudo -u "$name" git clone --depth 1 "$1" "$dir" >/dev/null 2>&1 || { cd "$dir" || return 1 ; sudo -u "$name" git pull --force origin master;} |
835 | + cd "$dir" || exit 1 |
836 | + makepkg -sri >/dev/null 2>&1 |
837 | + cd /tmp || return 1 ; } |
838 | + |
839 | +gitcompile(){ |
840 | + progname="$(basename "$1" .git)" |
841 | + dir="$repodir/$progname" |
842 | + dialog --title "AutoLinux Installation" --infobox "Installing the AutoLinux build of '$progname' ($n of $total). $(basename "$1") $2" 5 70 |
843 | + sudo -u "$name" git clone --depth 1 "$1" "$dir" >/dev/null 2>&1 || { cd "$dir" || return 1 ; sudo -u "$name" git pull --force origin master;} |
844 | + cd "$dir" || exit 1 |
845 | + make >/dev/null 2>&1 |
846 | + make install >/dev/null 2>&1 |
847 | + cd /tmp || return 1 ; } |
848 | + |
849 | +aurinstall(){ \ |
850 | + dialog --title "AutoLinux Installation" --infobox "Installing '$1' ($n of $total) from the AUR. $2" 5 70 |
851 | + echo "$aurinstalled" | grep -q "^$1$" && return 1 |
852 | + sudo -u "$name" $aurhelper -S --noconfirm "$1" >/dev/null 2>&1 |
853 | + } |
854 | + |
855 | +pipinstall(){ \ |
856 | + dialog --title "AutoLinux Installation" --infobox "Installing the Python package '$1' ($n of $total). $2" 5 70 |
857 | + [ -x "$(command -v "pip")" ] || installpkg python-pip >/dev/null 2>&1 |
858 | + yes | pip install "$1" ; } |
859 | + |
860 | +installationloop(){ \ |
861 | + ([ -f "$pkgsfile" ] && cp "$pkgsfile" /tmp/editions.csv) || curl -Ls "$pkgsfile" | sed '/^#/d' > /tmp/editions.csv |
862 | + total=$(wc -l < /tmp/editions.csv) |
863 | + aurinstalled=$(pacman -Qqm) |
864 | + while IFS=, read -r tag program comment; do |
865 | + n=$((n+1)) |
866 | + echo "$comment" | grep -q "^\".*\"$" && comment="$(echo "$comment" | sed "s/\(^\"\|\"$\)//g")" |
867 | + case "$tag" in |
868 | + "A") aurinstall "$program" "$comment" ;; |
869 | + "M") gitinstall "$program" "$comment" ;; |
870 | + "G") gitcompile "$program" "$comment" ;; |
871 | + "P") pipinstall "$program" "$comment" ;; |
872 | + "R") replacedir "$program" "$comment" ;; |
873 | +[41m *) maininstall "$program" "$comment" ;; |
874 | + esac |
875 | + done < /tmp/editions.csv ; } |
876 | + |
877 | +placeconfigs() { |
878 | + dialog --infobox " Downloading and installing config files..." 4 60 |
879 | + branch="$configChoice" ; dir=$(mktemp -d) |
880 | + [ ! -d "$2" ] && mkdir -p "$2" |
881 | + chown "$name":wheel "$dir" "$2" |
882 | + sudo -u "$name" git clone --recursive -b "$branch" --depth 1 --recurse-submodules "$1" "$dir" >/dev/null 2>&1 |
883 | + sudo -u "$name" cp -rfT "$dir" "$2" ; } |
884 | + |
885 | +systembeepoff() { dialog --infobox "Getting rid of that retarded error beep sound..." 4 40 |
886 | + rmmod pcspkr >/dev/null 2>&1 & echo "blacklist pcspkr" > /etc/modprobe.d/nobeep.conf >/dev/null 2>&1 ; sleep 2 ; } |
887 | + |
888 | +mirrors(){ |
889 | +cd /tmp |
890 | + dialog --infobox " Adding ArcoLinux Mirrors and Keys..." 4 50 |
891 | + sudo wget https://github.com/arcolinux/arcolinux_repo/raw/master/x86_64/arcolinux-keyring-20230919-6-any.pkg.tar.zst -O /tmp/arcolinux-keyring-20230919-6-any.pkg.tar.zst >/dev/null 2>&1 |
892 | +yes |sudo pacman -U --noconfirm --needed /tmp/arcolinux-keyring-20230919-6-any.pkg.tar.zst >/dev/null 2>&1 |
893 | + sudo wget https://raw.githubusercontent.com/arcolinux/arcolinux-mirrorlist/master/etc/pacman.d/arcolinux-mirrorlist -O /etc/pacman.d/arcolinux-mirrorlist >/dev/null 2>&1 |
894 | +sed -i '/arcolinux_repo/{N;d}' /etc/pacman.conf; sed -i '/arcolinux_repo_3party/{N;d}' /etc/pacman.conf; sed -i '/arcolinux_repo_xlarge/{N;d}' /etc/pacman.conf ; |
895 | +echo -e "[arcolinux_repo]\nInclude = /etc/pacman.d/arcolinux-mirrorlist\n\n[arcolinux_repo_3party]\nInclude = /etc/pacman.d/arcolinux-mirrorlist\n\n[arcolinux_repo_xlarge]\nInclude = /etc/pacman.d/arcolinux-mirrorlist\n" >> /etc/pacman.conf ; |
896 | + |
897 | + dialog --infobox " Adding Chaotic Mirrors and Keys..." 4 50 && |
898 | +yes|pacman-key --recv-key FBA220DFC880C036 --keyserver keyserver.ubuntu.com >/dev/null 2>&1 |
899 | +yes|pacman-key --lsign-key FBA220DFC880C036 >/dev/null 2>&1 |
900 | +yes|pacman -U \ |
901 | + 'https://cdn-mirror.chaotic.cx/chaotic-aur/chaotic-keyring.pkg.tar.zst' >/dev/null 2>&1 \ |
902 | + 'https://cdn-mirror.chaotic.cx/chaotic-aur/chaotic-mirrorlist.pkg.tar.zst' >/dev/null 2>&1 && |
903 | +sed -i '/chaotic-aur/{N;d}' /etc/pacman.conf |
904 | +echo -e "[chaotic-aur]\nInclude = /etc/pacman.d/chaotic-mirrorlist\n" >> /etc/pacman.conf ; |
905 | + |
906 | + dialog --infobox " Adding BlackArch Mirrors and Keys..." 4 50 && |
907 | +curl -LO blackarch.org/strap.sh >/dev/null 2>&1 && |
908 | +echo 46f035c31d758c077cce8f16cf9381e8def937bb strap.sh | sha1sum -c >/dev/null 2>&1 && |
909 | +chmod +x strap.sh ; sudo sh strap.sh >/dev/null 2>&1 && |
910 | + |
911 | + dialog --infobox " Updating System Keys and Mirrors..." 4 50 |
912 | +yes|pacman -Syyu >/dev/null 2>&1 ; } |
913 | + |
914 | + |
915 | +system_config(){ \ |
916 | +dialog --infobox "Setting System Information..." 4 40 ; sleep 2[41m |
917 | + |
918 | +case $edition in |
919 | + 1) systemctl enable mpd.service >/dev/null 2>&1 ; systemctl enable NetworkManager.service >/dev/null 2>&1 ;; |
920 | + 2) systemctl enable sddm.service >/dev/null 2>&1 ; systemctl enable NetworkManager.service >/dev/null 2>&1 ;; |
921 | + 3) systemctl enable sddm.service >/dev/null 2>&1 ; systemctl enable NetworkManager.service >/dev/null 2>&1 ;; |
922 | + 4) systemctl enable gdm.service >/dev/null 2>&1 ; systemctl enable NetworkManager.service >/dev/null 2>&1 ;; |
923 | + 5) systemctl enable sddm.service >/dev/null 2>&1 ; systemctl enable NetworkManager.service >/dev/null 2>&1 ;; |
924 | +esac |
925 | + |
926 | +case $edition in |
927 | + 1|2) hostname="AutoLinux" ; grep -q "ILoveCandy" /etc/pacman.conf ||[41m |
928 | + sed -i "/^\[options\]/aILoveCandy" /etc/pacman.conf ;[41m |
929 | + sed -i "/^#ParallelDownloads = .*/ParallelDownloads = 10/;s/^#Color$/Color/" /etc/pacman.conf |
930 | + systemctl enable bluetooth-autoconnect.service >/dev/null 2>&1 ;; |
931 | + 3|4|5|6) hostname="ArchLinux" ;; |
932 | +esac |
933 | + |
934 | +! [ -f /etc/hostname ] && echo "$hostname" > /etc/hostname |
935 | +sed -i "s/#en_"${area}".UTF-8/en_"${area}".UTF-8/g" /etc/locale.gen |
936 | +echo "LANG=en_${area}.UTF-8" >> /etc/locale.conf ; locale-gen >/dev/null 2>&1 |
937 | + |
938 | +[ $(cat /etc/hosts|wc -wc|sed 's/\s*//g') -eq 1165 ] && echo -e "127.0.0.1 localhost\n::1 localhost\n127.0.1.1 $hostname.localhost $hostname" >/etc/hosts |
939 | + |
940 | +[ -f /etc/localtime ] && rm /etc/localtime ; ln -sF /usr/share/zoneinfo/Africa/Harare /etc/localtime ; systemctl enable bluetooth.service >/dev/null 2>&1 |
941 | +rm -rf /tmp/pulse* ~/.pulse* ~/.config/pulse /home/$name/.pulse* /home/$name/.config/pulse* ; } |
942 | + |
943 | + |
944 | +xftlib(){ \[41m |
945 | + dialog --title "AutoLinux Installation" --infobox "Lastly installing 'libxft-bgra' .\nSuckless software to display color emojis without causing any errors." 6 80 |
946 | + ! pacman -Qq libxft-bgra >/dev/null 2>&1 && pacman -R --noconfirm libxft-bgra >/dev/null 2>&1 ; |
947 | + yes | sudo -u "$name" $aurhelper -S libxft-bgra-git >/dev/null 2>&1 ; } |
948 | + |
949 | + |
950 | +yesGrub(){ \ |
951 | + dialog --infobox "Initiating the Grub Bootloader..." 4 40 |
952 | + pacman -S --noconfirm --needed grub >/dev/null 2>&1[41m |
953 | + ! [ -d /sys/firmware/efi/efivars ] &&[41m |
954 | + grub-install --target=i386-pc --bootloader-id=AutoLinux --force >/dev/null 2>&1 ; |
955 | + [ -d /sys/firmware/efi/efivars ] && pacman -S --noconfirm --needed grub efibootmgr >/dev/null 2>&1 && |
956 | + grub-install --target=x86_64-efi --bootloader-id=AutoLinux --recheck >/dev/null 2>&1 ; |
957 | + grub-mkconfig -o /boot/grub/grub.cfg >/dev/null 2>&1 ; grubtheme ; } |
958 | + |
959 | +grubTheme(){ \ |
960 | + dialog --infobox "Setting Grub theme..." 4 30[41m |
961 | + sleep 1 && mkdir -p /boot/grub/themes/AutoLinux && |
962 | + cp /home/$name/.local/share/wallpapers/0.jpg /boot/grub/themes/AutoLinux/wp1.jpg >/dev/null 2>&1[41m |
963 | + sed -i 's/#GRUB_BACKGROUND.*/GRUB_BACKGROUND="\/boot\/grub\/themes\/AutoLinux\/wp1jpg"/g' /etc/default/grub >/dev/null 2>&1 |
964 | + sed -i 's/GRUB_BACKGROUND.*/GRUB_BACKGROUND="\/boot\/grub\/themes\/AutoLinux\/wp1jpg"/g' /etc/default/grub >/dev/null 2>&1 |
965 | + sed -i 's/GRUB_TIMEOUT=.*/GRUB_TIMEOUT=10/g' /etc/default/grub >/dev/null 2>&1 |
966 | + sed -i 's/#GRUB_GFXMODE.*/GRUB_GFXMODE=1920x1080x32/g' /etc/default/grub >/dev/null 2>&1 |
967 | +} |
968 | + |
969 | + |
970 | +finalize(){ \ |
971 | + dialog --infobox "Preparing welcome message..." 4 50 |
972 | + case $edition in |
973 | + 2) sed -i 's/Name=.*$/Name=AutoLinux (Plasma)/g' /usr/share/xsessions/plasma.desktop && cp -r /home/$name/.local/bin/* /usr/local/bin/ && dialog --title "Time to Celebrate" --msgbox "\\n The AutoLinux installation process has completed successfully\!\\n\\n\\n Provided there were no hidden errors, all the programs and configuration files should be in place.\\n\\nautolinux-Plasma will automatically start up in the login manager the next time you reboot your computer.\\n\\n\\n\\n Enjoy AutoLinux! - a4to" 17 110 ;; |
974 | + *) dialog --title "Time to Celebrate!" --msgbox "\\nInstallation completed successfully! Provided there were no hidden errors, all the programs and configuration files should be in place.\\n\\nTo run the new graphical environment, log out and log back in as your new user, then run the command 'startx' to start the graphical environment \\n(it will start automatically in tty1).\\n\\n Enjoy AutoLinux! - a4to" 13 80 ;; esac ; }[41m |
975 | + |
976 | + |
977 | +rebootmsg(){ \ |
978 | + i=10 ; i=$i ; clear |
979 | + until [ $i -lt 0 ] ; do |
980 | + echo -e " Exiting in: $i\n" | figlet -tc |lolcat && sleep 1 && clear && |
981 | + ((i=$i-1)) ; done && umount -l /mnt && exit 0 || rebootmsg ; } |
982 | + |
983 | + |
984 | + |
985 | +### SCRIPT BEGIN ### |
986 | + |
987 | +check_root |
988 | + |
989 | +installpkg dialog || err "Root priviledges are required to run this script!" |
990 | + |
991 | +initmsg1 || err "User exited." |
992 | + |
993 | +initmsg2 || err "User exited." |
994 | + |
995 | +whichedition || err "User exited." |
996 | + |
997 | +user_and_password || err "User exited." |
998 | + |
999 | +usercheck || err "User exited." |