Import bsdinstall. This is meant to be (eventually in conjunction with

pc-sysinstall) a replacement for sysinstall in the 9.0 release and beyond.
Currently supported platforms are sparc64, pc98, i386, amd64, powerpc, and
powerpc64. Integration into the build system will occur in the coming
weeks.

Merging with pc-sysinstall will use this code as a frontend, while
temporarily retaining the interactive partition editor here. This work
will be done in parallel with improvements on this code and release
integration.

Thanks to all who have provided testing and comments!
This commit is contained in:
Nathan Whitehorn 2011-02-18 14:54:34 +00:00
parent 11b3cbc224
commit 2118f3873f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=218799
34 changed files with 3974 additions and 0 deletions

View File

@ -32,6 +32,8 @@
..
..
libexec
bsdinstall
..
lpr
ru
..

View File

@ -7,6 +7,7 @@ SUBDIR= adduser \
arp \
bootparamd \
burncd \
bsdinstall \
cdcontrol \
chkgrp \
chown \

View File

@ -0,0 +1,6 @@
# $FreeBSD$
SUBDIR= distextract distfetch partedit scripts
SCRIPTS= bsdinstall
.include <bsd.prog.mk>

43
usr.sbin/bsdinstall/bsdinstall Executable file
View File

@ -0,0 +1,43 @@
#!/bin/sh
#-
# Copyright (c) 2011 Nathan Whitehorn
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
: ${DISTRIBUTIONS="kernel.tgz world.tgz"}; export DISTRIBUTIONS
: ${BSDINSTALL_LOG="/tmp/bsdinstall_log"}; export BSDINSTALL_LOG
: ${BSDINSTALL_TMPETC="/tmp/bsdinstall_etc"}; export BSDINSTALL_TMPETC
: ${PATH_FSTAB="$BSDINSTALL_TMPETC/fstab"}; export PATH_FSTAB
: ${BSDINSTALL_DISTDIR="/usr/freebsd-dist"}; export BSDINSTALL_DISTDIR
: ${BSDINSTALL_CHROOT="/mnt"}; export BSDINSTALL_CHROOT
VERB=$1; shift
if [ -z $VERB ]; then
VERB=auto
fi
exec /usr/libexec/bsdinstall/$VERB $@

View File

@ -0,0 +1,10 @@
# $FreeBSD$
BINDIR= /usr/libexec/bsdinstall
PROG= distextract
LDADD= -larchive -lncursesw -ldialog -lm
WARNS?= 6
NO_MAN= true
.include <bsd.prog.mk>

View File

@ -0,0 +1,176 @@
/*-
* Copyright (c) 2011 Nathan Whitehorn
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#include <stdio.h>
#include <errno.h>
#include <limits.h>
#include <archive.h>
#include <dialog.h>
static int extract_files(int nfiles, const char **files);
int
main(void)
{
char *diststring = strdup(getenv("DISTRIBUTIONS"));
const char **dists;
int i, retval, ndists = 0;
for (i = 0; diststring[i] != 0; i++)
if (isspace(diststring[i]) && !isspace(diststring[i+1]))
ndists++;
ndists++; /* Last one */
dists = calloc(ndists, sizeof(const char *));
for (i = 0; i < ndists; i++)
dists[i] = strsep(&diststring, " \t");
chdir(getenv("BSDINSTALL_CHROOT"));
retval = extract_files(ndists, dists);
free(diststring);
free(dists);
return (retval);
}
static int
extract_files(int nfiles, const char **files)
{
const char *items[nfiles*2];
char path[PATH_MAX];
int archive_files[nfiles];
int total_files, current_files, archive_file;
struct archive *archive;
struct archive_entry *entry;
char errormsg[512];
char status[8];
int i, err, progress, last_progress;
err = 0;
progress = 0;
/* Make the transfer list for dialog */
for (i = 0; i < nfiles; i++) {
items[i*2] = strrchr(files[i], '/');
if (items[i*2] != NULL)
items[i*2]++;
else
items[i*2] = files[i];
items[i*2 + 1] = "Pending";
}
init_dialog(stdin, stdout);
dialog_vars.backtitle = __DECONST(char *, "FreeBSD Installer");
dlg_put_backtitle();
dialog_msgbox("",
"Checking distribution archives.\nPlease wait...", 0, 0, FALSE);
/* Open all the archives */
total_files = 0;
for (i = 0; i < nfiles; i++) {
archive = archive_read_new();
archive_read_support_format_all(archive);
archive_read_support_compression_all(archive);
sprintf(path, "%s/%s", getenv("BSDINSTALL_DISTDIR"), files[i]);
err = archive_read_open_filename(archive, path, 4096);
if (err != ARCHIVE_OK) {
snprintf(errormsg, sizeof(errormsg),
"Error while extracting %s: %s\n", items[i*2],
archive_error_string(archive));
items[i*2 + 1] = "Failed";
dialog_msgbox("Extract Error", errormsg, 0, 0,
TRUE);
goto exit;
}
archive_files[i] = 0;
while (archive_read_next_header(archive, &entry) == ARCHIVE_OK)
archive_files[i]++;
total_files += archive_files[i];
archive_read_free(archive);
}
current_files = 0;
for (i = 0; i < nfiles; i++) {
archive = archive_read_new();
archive_read_support_format_all(archive);
archive_read_support_compression_all(archive);
sprintf(path, "%s/%s", getenv("BSDINSTALL_DISTDIR"), files[i]);
err = archive_read_open_filename(archive, path, 4096);
items[i*2 + 1] = "In Progress";
archive_file = 0;
while ((err = archive_read_next_header(archive, &entry)) ==
ARCHIVE_OK) {
last_progress = progress;
progress = (current_files*100)/total_files;
sprintf(status, "-%d",
(archive_file*100)/archive_files[i]);
items[i*2 + 1] = status;
if (progress > last_progress)
dialog_mixedgauge("Archive Extraction",
"Extracting distribution files...", 0, 0,
progress, nfiles,
__DECONST(char **, items));
err = archive_read_extract(archive, entry,
ARCHIVE_EXTRACT_TIME | ARCHIVE_EXTRACT_OWNER |
ARCHIVE_EXTRACT_PERM | ARCHIVE_EXTRACT_ACL |
ARCHIVE_EXTRACT_XATTR | ARCHIVE_EXTRACT_FFLAGS);
if (err != ARCHIVE_OK)
break;
archive_file++;
current_files++;
}
items[i*2 + 1] = "Done";
if (err != ARCHIVE_EOF) {
snprintf(errormsg, sizeof(errormsg),
"Error while extracting %s: %s\n", items[i*2],
archive_error_string(archive));
items[i*2 + 1] = "Failed";
dialog_msgbox("Extract Error", errormsg, 0, 0,
TRUE);
goto exit;
}
archive_read_free(archive);
}
err = 0;
exit:
end_dialog();
return (err);
}

View File

@ -0,0 +1,10 @@
# $FreeBSD$
BINDIR= /usr/libexec/bsdinstall
PROG= distfetch
LDADD= -lfetch -lncursesw -ldialog -lm
WARNS?= 6
NO_MAN= true
.include <bsd.prog.mk>

View File

@ -0,0 +1,187 @@
/*-
* Copyright (c) 2011 Nathan Whitehorn
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#include <sys/param.h>
#include <stdio.h>
#include <errno.h>
#include <fetch.h>
#include <dialog.h>
static int fetch_files(int nfiles, char **urls);
int
main(void)
{
char *diststring = strdup(getenv("DISTRIBUTIONS"));
char **urls;
int i, nfetched, ndists = 0;
for (i = 0; diststring[i] != 0; i++)
if (isspace(diststring[i]) && !isspace(diststring[i+1]))
ndists++;
ndists++; /* Last one */
urls = calloc(ndists, sizeof(const char *));
for (i = 0; i < ndists; i++) {
urls[i] = malloc(PATH_MAX);
sprintf(urls[i], "%s/%s", getenv("BSDINSTALL_DISTSITE"),
strsep(&diststring, " \t"));
}
chdir(getenv("BSDINSTALL_DISTDIR"));
nfetched = fetch_files(ndists, urls);
free(diststring);
for (i = 0; i < ndists; i++)
free(urls[i]);
free(urls);
return ((nfetched == ndists) ? 0 : 1);
}
static int
fetch_files(int nfiles, char **urls)
{
const char **items;
FILE *fetch_out, *file_out;
struct url_stat ustat;
off_t total_bytes, current_bytes, fsize;
char status[8];
char errormsg[512];
uint8_t block[4096];
size_t chunk;
int i, progress, last_progress;
int nsuccess = 0; /* Number of files successfully downloaded */
progress = 0;
/* Make the transfer list for dialog */
items = calloc(sizeof(char *), nfiles * 2);
for (i = 0; i < nfiles; i++) {
items[i*2] = strrchr(urls[i], '/');
if (items[i*2] != NULL)
items[i*2]++;
else
items[i*2] = urls[i];
items[i*2 + 1] = "Pending";
}
init_dialog(stdin, stdout);
dialog_vars.backtitle = __DECONST(char *, "FreeBSD Installer");
dlg_put_backtitle();
dialog_msgbox("", "Connecting to server.\nPlease wait...", 0, 0, FALSE);
/* Try to stat all the files */
total_bytes = 0;
for (i = 0; i < nfiles; i++) {
if (fetchStatURL(urls[i], &ustat, "") == 0 && ustat.size > 0)
total_bytes += ustat.size;
}
current_bytes = 0;
for (i = 0; i < nfiles; i++) {
last_progress = progress;
if (total_bytes == 0)
progress = (i*100)/nfiles;
fetchLastErrCode = 0;
fetch_out = fetchXGetURL(urls[i], &ustat, "");
if (fetch_out == NULL) {
snprintf(errormsg, sizeof(errormsg),
"Error while fetching %s: %s\n", urls[i],
fetchLastErrString);
items[i*2 + 1] = "Failed";
dialog_msgbox("Fetch Error", errormsg, 0, 0,
TRUE);
continue;
}
items[i*2 + 1] = "In Progress";
fsize = 0;
file_out = fopen(items[i*2], "w+");
if (file_out == NULL) {
snprintf(errormsg, sizeof(errormsg),
"Error while fetching %s: %s\n",
urls[i], strerror(errno));
items[i*2 + 1] = "Failed";
dialog_msgbox("Fetch Error", errormsg, 0, 0,
TRUE);
fclose(fetch_out);
continue;
}
while ((chunk = fread(block, 1, sizeof(block), fetch_out))
> 0) {
if (fwrite(block, 1, chunk, file_out) < chunk)
break;
current_bytes += chunk;
fsize += chunk;
if (total_bytes > 0) {
last_progress = progress;
progress = (current_bytes*100)/total_bytes;
}
if (ustat.size > 0) {
sprintf(status, "-%jd", (fsize*100)/ustat.size);
items[i*2 + 1] = status;
}
if (progress > last_progress)
dialog_mixedgauge("Fetching Distribution",
"Fetching distribution files...", 0, 0,
progress, nfiles,
__DECONST(char **, items));
}
if (ustat.size > 0 && fsize < ustat.size) {
if (fetchLastErrCode == 0)
snprintf(errormsg, sizeof(errormsg),
"Error while fetching %s: %s\n",
urls[i], strerror(errno));
else
snprintf(errormsg, sizeof(errormsg),
"Error while fetching %s: %s\n",
urls[i], fetchLastErrString);
items[i*2 + 1] = "Failed";
dialog_msgbox("Fetch Error", errormsg, 0, 0,
TRUE);
} else {
items[i*2 + 1] = "Done";
nsuccess++;
}
fclose(fetch_out);
fclose(file_out);
}
end_dialog();
free(items);
return (nsuccess);
}

View File

@ -0,0 +1,25 @@
# $FreeBSD$
BINDIR= /usr/libexec/bsdinstall
PROG= partedit
LINKS= ${BINDIR}/partedit ${BINDIR}/autopart
LDADD= -lgeom -lncursesw -lutil -ldialog -lm
PARTEDIT_ARCH= ${MACHINE}
.if ${MACHINE} == "i386" || ${MACHINE} == "amd64"
PARTEDIT_ARCH= x86
.endif
.if ${MACHINE} == "sun4v"
PARTEDIT_ARCH= sparc64
.endif
.if !exists(partedit_${PARTEDIT_ARCH}.c)
PARTEDIT_ARCH= generic
.endif
SRCS= diskeditor.c partedit.c gpart_ops.c partedit_${PARTEDIT_ARCH}.c \
part_wizard.c
WARNS?= 3
NO_MAN= true
.include <bsd.prog.mk>

View File

@ -0,0 +1,261 @@
/*-
* Copyright (c) 2011 Nathan Whitehorn
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#include <stdio.h>
#include <unistd.h>
#include <libutil.h>
#include <dialog.h>
#include <dlg_keys.h>
#include "diskeditor.h"
static void
print_partedit_item(WINDOW *partitions, struct partedit_item *items,
int item, int nscroll, int selected)
{
chtype attr = A_NORMAL;
char sizetext[16];
int y = item - nscroll + 1;
wattrset(partitions, selected ? item_selected_attr : item_attr);
wmove(partitions, y, MARGIN + items[item].indentation*2);
dlg_print_text(partitions, items[item].name, 8, &attr);
wmove(partitions, y, 15);
wattrset(partitions, item_attr);
humanize_number(sizetext, 7, items[item].size, "B", HN_AUTOSCALE,
HN_DECIMAL);
dlg_print_text(partitions, sizetext, 8, &attr);
wmove(partitions, y, 25);
dlg_print_text(partitions, items[item].type, 15, &attr);
wmove(partitions, y, 40);
if (items[item].mountpoint != NULL)
dlg_print_text(partitions, items[item].mountpoint, 8, &attr);
}
int
diskeditor_show(const char *title, const char *cprompt,
struct partedit_item *items, int nitems, int *selected, int *nscroll)
{
WINDOW *dialog, *partitions;
char *prompt;
const char *buttons[] =
{ "Create", "Delete", "Modify", "Revert", "Auto", "Exit", NULL };
int x, y;
int i;
int height, width, min_width;
int partlist_height, partlist_width, min_partlist_width;
int cur_scroll = 0;
int key, fkey;
int cur_button = 0, cur_part = 0;
int result = DLG_EXIT_UNKNOWN;
static DLG_KEYS_BINDING binding[] = {
ENTERKEY_BINDINGS,
DLG_KEYS_DATA( DLGK_ENTER, ' ' ),
DLG_KEYS_DATA( DLGK_ITEM_NEXT, KEY_DOWN ),
DLG_KEYS_DATA( DLGK_ITEM_PREV, KEY_UP ),
DLG_KEYS_DATA( DLGK_FIELD_NEXT, KEY_RIGHT ),
DLG_KEYS_DATA( DLGK_FIELD_NEXT, TAB ),
DLG_KEYS_DATA( DLGK_FIELD_PREV, KEY_BTAB ),
DLG_KEYS_DATA( DLGK_FIELD_PREV, KEY_LEFT ),
SCROLLKEY_BINDINGS,
END_KEYS_BINDING
};
/*
* Set up editor window.
*/
prompt = dlg_strclone(cprompt);
min_width = 50;
height = width = 0;
partlist_height = 10;
min_partlist_width = 0;
dlg_tab_correct_str(prompt);
dlg_button_layout(buttons, &min_width);
dlg_auto_size(title, prompt, &height, &width, 2, min_width);
height += partlist_height;
partlist_width = width - 2*MARGIN;
dlg_print_size(height, width);
dlg_ctl_size(height, width);
x = dlg_box_x_ordinate(width);
y = dlg_box_y_ordinate(height);
dialog = dlg_new_window(height, width, y, x);
dlg_register_window(dialog, "diskeditorbox", binding);
dlg_register_buttons(dialog, "diskeditorbox", buttons);
dlg_draw_box(dialog, 0, 0, height, width, dialog_attr, border_attr);
dlg_draw_bottom_box(dialog);
dlg_draw_title(dialog, title);
wattrset(dialog, dialog_attr);
/* Partition list sub-window */
partitions = dlg_sub_window(dialog, partlist_height, partlist_width,
y + 3, x + 1);
dlg_register_window(partitions, "partlist", binding);
dlg_register_buttons(partitions, "partlist", buttons);
wattrset(partitions, menubox_attr);
dlg_draw_buttons(dialog, height - 2*MARGIN, 0, buttons,
cur_button, FALSE, width);
dlg_print_autowrap(dialog, prompt, height, width);
if (selected != NULL)
cur_part = *selected;
if (nscroll != NULL)
cur_scroll = *nscroll;
if (cur_part - cur_scroll >= partlist_height - 2 ||
cur_part - cur_scroll < 0)
cur_scroll = cur_part;
repaint:
dlg_draw_box(dialog, 3, 1, partlist_height, partlist_width,
menubox_border_attr, menubox_attr);
for (i = cur_scroll; i < MIN(cur_scroll + partlist_height - 2, nitems);
i++)
print_partedit_item(partitions, items, i, cur_scroll,
i == cur_part);
if (nitems > partlist_height - 2)
dlg_draw_arrows(partitions, cur_scroll > 0,
nitems > cur_scroll + partlist_height - 2,
partlist_width - 5, 0, partlist_height - 1);
wrefresh(partitions);
while (result == DLG_EXIT_UNKNOWN) {
key = dlg_mouse_wgetch(dialog, &fkey);
if ((i = dlg_char_to_button(key, buttons)) >= 0) {
cur_button = i;
dlg_draw_buttons(dialog, height - 2*MARGIN, 0, buttons,
cur_button, FALSE, width);
break;
}
if (!fkey)
continue;
switch (key) {
case DLGK_FIELD_NEXT:
cur_button = dlg_next_button(buttons, cur_button);
if (cur_button < 0)
cur_button = 0;
dlg_draw_buttons(dialog, height - 2*MARGIN, 0, buttons,
cur_button, FALSE, width);
break;
case DLGK_FIELD_PREV:
cur_button = dlg_prev_button(buttons, cur_button);
if (cur_button < 0)
cur_button = 0;
dlg_draw_buttons(dialog, height - 2*MARGIN, 0, buttons,
cur_button, FALSE, width);
break;
case DLGK_ITEM_NEXT:
if (cur_part == nitems - 1)
break; /* End of list */
/* Deselect old item */
print_partedit_item(partitions, items, cur_part,
cur_scroll, 0);
/* Select new item */
cur_part++;
if (cur_part - cur_scroll >= partlist_height - 2) {
cur_scroll = cur_part;
goto repaint;
}
print_partedit_item(partitions, items, cur_part,
cur_scroll, 1);
wrefresh(partitions);
break;
case DLGK_ITEM_PREV:
if (cur_part == 0)
break; /* Start of list */
/* Deselect old item */
print_partedit_item(partitions, items, cur_part,
cur_scroll, 0);
/* Select new item */
cur_part--;
if (cur_part - cur_scroll < 0) {
cur_scroll = cur_part;
goto repaint;
}
print_partedit_item(partitions, items, cur_part,
cur_scroll, 1);
wrefresh(partitions);
break;
case DLGK_PAGE_NEXT:
cur_scroll += (partlist_height - 2);
if (cur_scroll + partlist_height - 2 >= nitems)
cur_scroll = nitems - (partlist_height - 2);
if (cur_part < cur_scroll)
cur_part = cur_scroll;
goto repaint;
case DLGK_PAGE_PREV:
cur_scroll -= (partlist_height - 2);
if (cur_scroll < 0)
cur_scroll = 0;
if (cur_part >= cur_scroll + partlist_height - 2)
cur_part = cur_scroll;
goto repaint;
case DLGK_PAGE_FIRST:
cur_scroll = 0;
cur_part = cur_scroll;
goto repaint;
case DLGK_PAGE_LAST:
cur_scroll = nitems - (partlist_height - 2);
cur_part = cur_scroll;
goto repaint;
case DLGK_ENTER:
goto done;
default:
if (is_DLGK_MOUSE(key)) {
cur_button = key - M_EVENT;
dlg_draw_buttons(dialog, height - 2*MARGIN, 0,
buttons, cur_button, FALSE, width);
goto done;
}
break;
}
}
done:
if (selected != NULL)
*selected = cur_part;
if (nscroll != NULL)
*nscroll = cur_scroll;
dlg_del_window(partitions);
dlg_del_window(dialog);
dlg_mouse_free_regions();
return (cur_button);
}

View File

@ -0,0 +1,47 @@
/*-
* Copyright (c) 2011 Nathan Whitehorn
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#ifndef _PARTEDIT_DISKEDITOR_H
#define _PARTEDIT_DISKEDITOR_H
#include <inttypes.h>
struct partedit_item {
int indentation;
const char *name;
intmax_t size;
const char *type;
char *mountpoint;
void *cookie;
};
int diskeditor_show(const char *title, const char *prompt,
struct partedit_item *items, int nitems, int *selected, int *scroll);
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,344 @@
/*-
* Copyright (c) 2011 Nathan Whitehorn
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#include <sys/param.h>
#include <errno.h>
#include <libutil.h>
#include <inttypes.h>
#include <libgeom.h>
#include <dialog.h>
#include <dlg_keys.h>
#include "partedit.h"
#define MIN_FREE_SPACE (1024*1024*1024) /* 1 GB */
#define SWAP_SIZE(available) MIN(available/20, 4*1024*1024*1024LL)
static char *boot_disk(struct gmesh *mesh);
static char *wizard_partition(struct gmesh *mesh, const char *disk);
static int wizard_makeparts(struct gmesh *mesh, const char *disk);
int
part_wizard(void) {
int error;
struct gmesh mesh;
char *disk, *schemeroot;
startwizard:
error = geom_gettree(&mesh);
dlg_put_backtitle();
error = geom_gettree(&mesh);
disk = boot_disk(&mesh);
if (disk == NULL)
return (1);
dlg_clear();
dlg_put_backtitle();
schemeroot = wizard_partition(&mesh, disk);
free(disk);
if (schemeroot == NULL)
return (1);
geom_deletetree(&mesh);
dlg_clear();
dlg_put_backtitle();
error = geom_gettree(&mesh);
error = wizard_makeparts(&mesh, schemeroot);
if (error)
goto startwizard;
free(schemeroot);
geom_deletetree(&mesh);
return (0);
}
static char *
boot_disk(struct gmesh *mesh)
{
struct gclass *classp;
struct gconfig *gc;
struct ggeom *gp;
struct gprovider *pp;
DIALOG_LISTITEM *disks = NULL;
const char *type;
char diskdesc[512];
char *chosen;
int i, err, selected, n = 0;
LIST_FOREACH(classp, &mesh->lg_class, lg_class) {
if (strcmp(classp->lg_name, "DISK") != 0 &&
strcmp(classp->lg_name, "MD") != 0)
continue;
LIST_FOREACH(gp, &classp->lg_geom, lg_geom) {
if (LIST_EMPTY(&gp->lg_provider))
continue;
LIST_FOREACH(pp, &gp->lg_provider, lg_provider) {
type = NULL;
LIST_FOREACH(gc, &pp->lg_config, lg_config)
if (strcmp(gc->lg_name, "type") == 0)
type = gc->lg_val;
/* Skip swap-backed md devices */
if (strcmp(classp->lg_name, "MD") == 0 &&
type != NULL && strcmp(type, "swap") == 0)
continue;
disks = realloc(disks, (++n)*sizeof(disks[0]));
disks[n-1].name = pp->lg_name;
humanize_number(diskdesc, 7, pp->lg_mediasize,
"B", HN_AUTOSCALE, HN_DECIMAL);
if (strncmp(pp->lg_name, "ad", 2) == 0)
strcat(diskdesc, " ATA Hard Disk");
else if (strncmp(pp->lg_name, "da", 2) == 0)
strcat(diskdesc, " SCSI Hard Disk");
else if (strncmp(pp->lg_name, "md", 2) == 0)
strcat(diskdesc, " Memory Disk");
else if (strncmp(pp->lg_name, "cd", 2) == 0) {
n--;
continue;
}
disks[n-1].text = strdup(diskdesc);
disks[n-1].help = NULL;
disks[n-1].state = 0;
}
}
}
if (n > 1) {
err = dlg_menu("Partitioning",
"Select the disk on which to install FreeBSD.", 0, 0, 0,
n, disks, &selected, NULL);
chosen = (err == 0) ? strdup(disks[selected].name) : NULL;
} else if (n == 1) {
chosen = strdup(disks[0].name);
} else {
chosen = NULL;
}
for (i = 0; i < n; i++)
free(disks[i].text);
return (chosen);
}
static struct gprovider *
provider_for_name(struct gmesh *mesh, const char *name)
{
struct gclass *classp;
struct gprovider *pp = NULL;
struct ggeom *gp;
LIST_FOREACH(classp, &mesh->lg_class, lg_class) {
if (strcmp(classp->lg_name, "DISK") != 0 &&
strcmp(classp->lg_name, "PART") != 0 &&
strcmp(classp->lg_name, "MD") != 0)
continue;
LIST_FOREACH(gp, &classp->lg_geom, lg_geom) {
if (LIST_EMPTY(&gp->lg_provider))
continue;
LIST_FOREACH(pp, &gp->lg_provider, lg_provider)
if (strcmp(pp->lg_name, name) == 0)
break;
if (pp != NULL) break;
}
if (pp != NULL) break;
}
return (pp);
}
static char *
wizard_partition(struct gmesh *mesh, const char *disk)
{
struct gclass *classp;
struct ggeom *gpart = NULL;
struct gconfig *gc;
char message[512];
const char *scheme = NULL;
char *retval = NULL;
int choice;
LIST_FOREACH(classp, &mesh->lg_class, lg_class)
if (strcmp(classp->lg_name, "PART") == 0)
break;
if (classp != NULL) {
LIST_FOREACH(gpart, &classp->lg_geom, lg_geom)
if (strcmp(gpart->lg_name, disk) == 0)
break;
}
if (gpart != NULL) {
LIST_FOREACH(gc, &gpart->lg_config, lg_config) {
if (strcmp(gc->lg_name, "scheme") == 0) {
scheme = gc->lg_val;
break;
}
}
}
query:
dialog_vars.yes_label = "Entire Disk";
dialog_vars.no_label = "Partition";
if (gpart != NULL)
dialog_vars.defaultno = TRUE;
snprintf(message, sizeof(message), "Would you like to use this entire "
"disk (%s) for FreeBSD or partition it to share it with other "
"operating systems? Using the entire disk will erase any data "
"currently stored there.", disk);
choice = dialog_yesno("Partition", message, 0, 0);
dialog_vars.yes_label = NULL;
dialog_vars.no_label = NULL;
dialog_vars.defaultno = FALSE;
if (choice == 1 && scheme != NULL && !is_scheme_bootable(scheme)) {
char warning[512];
int subchoice;
sprintf(warning, "The existing partition scheme on this "
"disk (%s) is not bootable on this platform. To install "
"FreeBSD, it must be repartitioned. This will destroy all "
"data on the disk. Are you sure you want to proceed?",
scheme);
subchoice = dialog_yesno("Non-bootable Disk", warning, 0, 0);
if (subchoice != 0)
goto query;
gpart_destroy(gpart, 1);
gpart_partition(disk, default_scheme());
scheme = default_scheme();
}
if (scheme == NULL || strcmp(scheme, "(none)") == 0 || choice == 0) {
if (gpart != NULL) { /* Erase partitioned disk */
choice = dialog_yesno("Confirmation", "This will erase "
"the disk. Are you sure you want to proceed?", 0, 0);
if (choice != 0)
goto query;
gpart_destroy(gpart, 1);
}
gpart_partition(disk, default_scheme());
scheme = default_scheme();
}
if (strcmp(scheme, "PC98") == 0 || strcmp(scheme, "MBR") == 0) {
struct gmesh submesh;
geom_gettree(&submesh);
gpart_create(provider_for_name(&submesh, disk),
"freebsd", NULL, NULL, &retval,
choice /* Non-interactive for "Entire Disk" */);
geom_deletetree(&submesh);
} else {
retval = strdup(disk);
}
return (retval);
}
static int
wizard_makeparts(struct gmesh *mesh, const char *disk)
{
struct gmesh submesh;
struct gclass *classp;
struct ggeom *gp;
struct gconfig *gc;
const char *scheme;
struct gprovider *pp;
intmax_t swapsize, available;
char swapsizestr[10], rootsizestr[10];
int retval;
LIST_FOREACH(classp, &mesh->lg_class, lg_class)
if (strcmp(classp->lg_name, "PART") == 0)
break;
LIST_FOREACH(gp, &classp->lg_geom, lg_geom)
if (strcmp(gp->lg_name, disk) == 0)
break;
LIST_FOREACH(gc, &gp->lg_config, lg_config)
if (strcmp(gc->lg_name, "scheme") == 0)
scheme = gc->lg_val;
pp = provider_for_name(mesh, disk);
available = gpart_max_free(gp, NULL)*pp->lg_sectorsize;
if (available < MIN_FREE_SPACE) {
char availablestr[10], neededstr[10], message[512];
humanize_number(availablestr, 7, available, "B", HN_AUTOSCALE,
HN_DECIMAL);
humanize_number(neededstr, 7, MIN_FREE_SPACE, "B", HN_AUTOSCALE,
HN_DECIMAL);
sprintf(message, "There is not enough free space on %s to "
"install FreeBSD (%s free, %s required). Would you like "
"to choose another disk or to open the partition editor?",
disk, availablestr, neededstr);
dialog_vars.yes_label = "Another Disk";
dialog_vars.no_label = "Editor";
retval = dialog_yesno("Warning", message, 0, 0);
dialog_vars.yes_label = NULL;
dialog_vars.no_label = NULL;
return (!retval); /* Editor -> return 0 */
}
swapsize = SWAP_SIZE(available);
humanize_number(swapsizestr, 7, swapsize, "B", HN_AUTOSCALE,
HN_NOSPACE | HN_DECIMAL);
humanize_number(rootsizestr, 7, available - swapsize - 1024*1024,
"B", HN_AUTOSCALE, HN_NOSPACE | HN_DECIMAL);
geom_gettree(&submesh);
pp = provider_for_name(&submesh, disk);
gpart_create(pp, "freebsd-ufs", rootsizestr, "/", NULL, 0);
geom_deletetree(&submesh);
geom_gettree(&submesh);
pp = provider_for_name(&submesh, disk);
gpart_create(pp, "freebsd-swap", swapsizestr, NULL, NULL, 0);
geom_deletetree(&submesh);
return (0);
}

View File

@ -0,0 +1,445 @@
/*-
* Copyright (c) 2011 Nathan Whitehorn
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#include <sys/param.h>
#include <libgen.h>
#include <libutil.h>
#include <inttypes.h>
#include <errno.h>
#include <fstab.h>
#include <libgeom.h>
#include <dialog.h>
#include <dlg_keys.h>
#include "diskeditor.h"
#include "partedit.h"
struct pmetadata_head part_metadata;
static int apply_changes(struct gmesh *mesh);
static struct partedit_item *read_geom_mesh(struct gmesh *mesh, int *nitems);
static void add_geom_children(struct ggeom *gp, int recurse,
struct partedit_item **items, int *nitems);
static void init_fstab_metadata(void);
static void get_mount_points(struct partedit_item *items, int nitems);
static int validate_setup(void);
int
main(int argc, const char **argv) {
struct partition_metadata *md;
const char *prompt;
struct partedit_item *items;
struct gmesh mesh;
int i, op, nitems, nscroll;
int error;
TAILQ_INIT(&part_metadata);
init_fstab_metadata();
init_dialog(stdin, stdout);
if (strcmp(basename(argv[0]), "sade") != 0)
dialog_vars.backtitle = __DECONST(char *, "FreeBSD Installer");
dialog_vars.item_help = TRUE;
nscroll = i = 0;
if (strcmp(basename(argv[0]), "autopart") == 0) { /* Guided */
prompt = "Please review the disk setup. When complete, press "
"the Exit button.";
part_wizard();
} else {
prompt = "Create partitions for FreeBSD. No changes will be "
"made until you select Exit.";
}
/* Show the part editor either immediately, or to confirm wizard */
while (1) {
error = geom_gettree(&mesh);
items = read_geom_mesh(&mesh, &nitems);
get_mount_points(items, nitems);
dlg_clear();
dlg_put_backtitle();
if (i >= nitems)
i = nitems - 1;
op = diskeditor_show("Partition Editor", prompt,
items, nitems, &i, &nscroll);
switch (op) {
case 0: /* Create */
gpart_create((struct gprovider *)(items[i].cookie),
NULL, NULL, NULL, NULL, 1);
break;
case 1: /* Delete */
gpart_delete((struct gprovider *)(items[i].cookie));
break;
case 2: /* Modify */
gpart_edit((struct gprovider *)(items[i].cookie));
break;
case 3: /* Revert */
gpart_revert_all(&mesh);
while ((md = TAILQ_FIRST(&part_metadata)) != NULL) {
if (md->fstab != NULL) {
free(md->fstab->fs_spec);
free(md->fstab->fs_file);
free(md->fstab->fs_vfstype);
free(md->fstab->fs_mntops);
free(md->fstab->fs_type);
free(md->fstab);
}
if (md->newfs != NULL)
free(md->newfs);
free(md->name);
TAILQ_REMOVE(&part_metadata, md, metadata);
free(md);
}
init_fstab_metadata();
break;
case 4: /* Auto */
part_wizard();
break;
}
error = 0;
if (op == 5 && validate_setup()) { /* Finished */
dialog_vars.extra_button = TRUE;
dialog_vars.extra_label =
__DECONST(char *, "Abort");
dialog_vars.ok_label = __DECONST(char *, "Save");
op = dialog_yesno("Confirmation", "Your changes will "
"now be written to disk. If you have chosen to "
"overwrite existing data, it will be PERMANENTLY "
"ERASED. Are you sure you want to proceed?", 0, 0);
dialog_vars.extra_button = FALSE;
dialog_vars.ok_label = NULL;
if (op == 0) { /* Save */
error = apply_changes(&mesh);
break;
} else if (op == 3) { /* Don't save => Quit */
gpart_revert_all(&mesh);
error = -1;
break;
}
}
geom_deletetree(&mesh);
free(items);
}
geom_deletetree(&mesh);
free(items);
end_dialog();
return (error);
}
struct partition_metadata *
get_part_metadata(const char *name, int create)
{
struct partition_metadata *md;
TAILQ_FOREACH(md, &part_metadata, metadata)
if (md->name != NULL && strcmp(md->name, name) == 0)
break;
if (md == NULL && create) {
md = calloc(1, sizeof(*md));
md->name = strdup(name);
TAILQ_INSERT_TAIL(&part_metadata, md, metadata);
}
return (md);
}
void
delete_part_metadata(const char *name) {
struct partition_metadata *md;
TAILQ_FOREACH(md, &part_metadata, metadata) {
if (md->name != NULL && strcmp(md->name, name) == 0) {
if (md->fstab != NULL) {
free(md->fstab->fs_spec);
free(md->fstab->fs_file);
free(md->fstab->fs_vfstype);
free(md->fstab->fs_mntops);
free(md->fstab->fs_type);
free(md->fstab);
}
if (md->newfs != NULL)
free(md->newfs);
free(md->name);
TAILQ_REMOVE(&part_metadata, md, metadata);
free(md);
break;
}
}
}
static int
validate_setup(void)
{
struct partition_metadata *md;
int root_found = FALSE;
TAILQ_FOREACH(md, &part_metadata, metadata) {
if (md->fstab != NULL && strcmp(md->fstab->fs_file, "/") == 0)
root_found = TRUE;
/* XXX: Check for duplicate mountpoints */
}
if (!root_found) {
dialog_msgbox("Error", "No root partition was found. "
"The root FreeBSD partition must have a mountpoint of '/'.",
0, 0, TRUE);
return (FALSE);
}
return (TRUE);
}
static int
apply_changes(struct gmesh *mesh)
{
struct partition_metadata *md;
char message[512];
int i, nitems, error;
const char **items;
const char *fstab_path;
FILE *fstab;
nitems = 1; /* Partition table changes */
TAILQ_FOREACH(md, &part_metadata, metadata) {
if (md->newfs != NULL)
nitems++;
}
items = calloc(nitems * 2, sizeof(const char *));
items[0] = "Writing partition tables";
items[1] = "7"; /* In progress */
i = 1;
TAILQ_FOREACH(md, &part_metadata, metadata) {
if (md->newfs != NULL) {
char *item;
item = malloc(255);
sprintf(item, "Initializing %s", md->name);
items[i*2] = item;
items[i*2 + 1] = "Pending";
i++;
}
}
i = 0;
dialog_mixedgauge("Initializing",
"Initializing file systems. Please wait.", 0, 0, i*100/nitems,
nitems, __DECONST(char **, items));
gpart_commit(mesh);
items[i*2 + 1] = "3";
i++;
if (getenv("BSDINSTALL_LOG") == NULL)
setenv("BSDINSTALL_LOG", "/dev/null", 1);
TAILQ_FOREACH(md, &part_metadata, metadata) {
if (md->newfs != NULL) {
items[i*2 + 1] = "7"; /* In progress */
dialog_mixedgauge("Initializing",
"Initializing file systems. Please wait.", 0, 0,
i*100/nitems, nitems, __DECONST(char **, items));
sprintf(message, "(echo %s; %s) >>%s 2>>%s",
md->newfs, md->newfs, getenv("BSDINSTALL_LOG"),
getenv("BSDINSTALL_LOG"));
error = system(message);
items[i*2 + 1] = (error == 0) ? "3" : "1";
i++;
}
}
dialog_mixedgauge("Initializing",
"Initializing file systems. Please wait.", 0, 0,
i*100/nitems, nitems, __DECONST(char **, items));
for (i = 1; i < nitems; i++)
free(__DECONST(char *, items[i*2]));
free(items);
if (getenv("PATH_FSTAB") != NULL)
fstab_path = getenv("PATH_FSTAB");
else
fstab_path = "/etc/fstab";
fstab = fopen(fstab_path, "w+");
if (fstab == NULL) {
sprintf(message, "Cannot open fstab file %s for writing (%s)\n",
getenv("PATH_FSTAB"), strerror(errno));
dialog_msgbox("Error", message, 0, 0, TRUE);
return (-1);
}
fprintf(fstab, "# Device\tMountpoint\tFStype\tOptions\tDump\tPass#\n");
TAILQ_FOREACH(md, &part_metadata, metadata) {
if (md->fstab != NULL)
fprintf(fstab, "%s\t%s\t%s\t%s\t%d\t%d\n",
md->fstab->fs_spec, md->fstab->fs_file,
md->fstab->fs_vfstype, md->fstab->fs_mntops,
md->fstab->fs_freq, md->fstab->fs_passno);
}
fclose(fstab);
return (0);
}
static struct partedit_item *
read_geom_mesh(struct gmesh *mesh, int *nitems) {
struct gclass *classp;
struct ggeom *gp;
struct partedit_item *items;
*nitems = 0;
items = NULL;
/*
* Build the device table. First add all disks (and CDs).
*/
LIST_FOREACH(classp, &mesh->lg_class, lg_class) {
if (strcmp(classp->lg_name, "DISK") != 0 &&
strcmp(classp->lg_name, "MD") != 0)
continue;
/* Now recurse into all children */
LIST_FOREACH(gp, &classp->lg_geom, lg_geom)
add_geom_children(gp, 0, &items, nitems);
}
return (items);
}
static void
add_geom_children(struct ggeom *gp, int recurse, struct partedit_item **items,
int *nitems) {
struct gconsumer *cp;
struct gprovider *pp;
struct gconfig *gc;
if (strcmp(gp->lg_class->lg_name, "PART") == 0 &&
!LIST_EMPTY(&gp->lg_config)) {
LIST_FOREACH(gc, &gp->lg_config, lg_config) {
if (strcmp(gc->lg_name, "scheme") == 0)
(*items)[*nitems-1].type = gc->lg_val;
}
}
if (LIST_EMPTY(&gp->lg_provider))
return;
LIST_FOREACH(pp, &gp->lg_provider, lg_provider) {
if (strcmp(gp->lg_class->lg_name, "LABEL") == 0)
continue;
/* Skip WORM media */
if (strncmp(pp->lg_name, "cd", 2) == 0)
continue;
*items = realloc(*items,
(*nitems+1)*sizeof(struct partedit_item));
(*items)[*nitems].indentation = recurse;
(*items)[*nitems].name = pp->lg_name;
(*items)[*nitems].size = pp->lg_mediasize;
(*items)[*nitems].mountpoint = NULL;
(*items)[*nitems].type = "";
(*items)[*nitems].cookie = pp;
LIST_FOREACH(gc, &pp->lg_config, lg_config) {
if (strcmp(gc->lg_name, "type") == 0)
(*items)[*nitems].type = gc->lg_val;
}
/* Skip swap-backed MD devices */
if (strcmp(gp->lg_class->lg_name, "MD") == 0 &&
strcmp((*items)[*nitems].type, "swap") == 0)
continue;
(*nitems)++;
LIST_FOREACH(cp, &pp->lg_consumers, lg_consumers)
add_geom_children(cp->lg_geom, recurse+1, items,
nitems);
/* Only use first provider for acd */
if (strcmp(gp->lg_class->lg_name, "ACD") == 0)
break;
}
}
static void
init_fstab_metadata(void)
{
struct fstab *fstab;
struct partition_metadata *md;
setfsent();
while ((fstab = getfsent()) != NULL) {
md = calloc(1, sizeof(struct partition_metadata));
md->name = NULL;
if (strncmp(fstab->fs_spec, "/dev/", 5) == 0)
md->name = strdup(&fstab->fs_spec[5]);
md->fstab = malloc(sizeof(struct fstab));
md->fstab->fs_spec = strdup(fstab->fs_spec);
md->fstab->fs_file = strdup(fstab->fs_file);
md->fstab->fs_vfstype = strdup(fstab->fs_vfstype);
md->fstab->fs_mntops = strdup(fstab->fs_mntops);
md->fstab->fs_type = strdup(fstab->fs_type);
md->fstab->fs_freq = fstab->fs_freq;
md->fstab->fs_passno = fstab->fs_passno;
md->newfs = NULL;
TAILQ_INSERT_TAIL(&part_metadata, md, metadata);
}
}
static void
get_mount_points(struct partedit_item *items, int nitems)
{
struct partition_metadata *md;
int i;
for (i = 0; i < nitems; i++) {
TAILQ_FOREACH(md, &part_metadata, metadata) {
if (md->name != NULL && md->fstab != NULL &&
strcmp(md->name, items[i].name) == 0) {
items[i].mountpoint = md->fstab->fs_file;
break;
}
}
}
}

View File

@ -0,0 +1,80 @@
/*-
* Copyright (c) 2011 Nathan Whitehorn
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#ifndef _PARTEDIT_PARTEDIT_H
#define _PARTEDIT_PARTEDIT_H
#include <sys/queue.h>
#include <inttypes.h>
#include <fstab.h>
struct gprovider;
struct gmesh;
struct ggeom;
TAILQ_HEAD(pmetadata_head, partition_metadata);
extern struct pmetadata_head part_metadata;
struct partition_metadata {
char *name; /* name of this partition, as in GEOM */
struct fstab *fstab; /* fstab data for this partition */
char *newfs; /* shell command to initialize partition */
int bootcode;
TAILQ_ENTRY(partition_metadata) metadata;
};
struct partition_metadata *get_part_metadata(const char *name, int create);
void delete_part_metadata(const char *name);
int part_wizard(void);
/* gpart operations */
void gpart_delete(struct gprovider *pp);
void gpart_destroy(struct ggeom *lg_geom, int force);
void gpart_edit(struct gprovider *pp);
void gpart_create(struct gprovider *pp, char *default_type, char *default_size,
char *default_mountpoint, char **output, int interactive);
intmax_t gpart_max_free(struct ggeom *gp, intmax_t *start);
void gpart_revert(struct gprovider *pp);
void gpart_revert_all(struct gmesh *mesh);
void gpart_commit(struct gmesh *mesh);
int gpart_partition(const char *lg_name, const char *scheme);
void set_default_part_metadata(const char *name, const char *scheme,
const char *type, const char *mountpoint, int newfs);
/* machine-dependent bootability checks */
const char *default_scheme(void);
int is_scheme_bootable(const char *part_type);
size_t bootpart_size(const char *part_type);
const char *bootcode_path(const char *part_type);
const char *partcode_path(const char *part_type);
#endif

View File

@ -0,0 +1,69 @@
/*-
* Copyright (c) 2011 Nathan Whitehorn
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#include <string.h>
#include "partedit.h"
const char *
default_scheme(void) {
/*
* Our loader can parse GPT, so pick that as the default for lack of
* a better idea.
*/
return ("GPT");
}
int
is_scheme_bootable(const char *part_type) {
/*
* We don't know anything about this platform, so don't irritate the
* user by claiming the chosen partition scheme isn't bootable.
*/
return (1);
}
/* No clue => no boot partition, bootcode, or partcode */
size_t
bootpart_size(const char *part_type) {
return (0);
}
const char *
bootcode_path(const char *part_type) {
return (NULL);
}
const char *
partcode_path(const char *part_type) {
return (NULL);
}

View File

@ -0,0 +1,69 @@
/*-
* Copyright (c) 2011 Nathan Whitehorn
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#include <string.h>
#include "partedit.h"
const char *
default_scheme(void) {
return ("PC98");
}
int
is_scheme_bootable(const char *part_type) {
if (strcmp(part_type, "BSD") == 0)
return (1);
if (strcmp(part_type, "PC98") == 0)
return (1);
return (0);
}
size_t
bootpart_size(const char *part_type) {
/* No boot partition */
return (0);
}
const char *
bootcode_path(const char *part_type) {
if (strcmp(part_type, "PC98") == 0)
return ("/boot/pc98boot");
if (strcmp(part_type, "BSD") == 0)
return ("/boot/boot");
return (NULL);
}
const char *
partcode_path(const char *part_type) {
/* No partcode */
return (NULL);
}

View File

@ -0,0 +1,63 @@
/*-
* Copyright (c) 2011 Nathan Whitehorn
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#include <string.h>
#include "partedit.h"
const char *
default_scheme(void) {
return ("APM");
}
int
is_scheme_bootable(const char *part_type) {
if (strcmp(part_type, "APM") == 0)
return (1);
return (0);
}
size_t
bootpart_size(const char *part_type) {
if (strcmp(part_type, "APM") == 0)
return (800*1024);
return (0);
}
const char *
bootcode_path(const char *part_type) {
return (NULL);
}
const char *
partcode_path(const char *part_type) {
if (strcmp(part_type, "APM") == 0)
return ("/boot/boot1.hfs");
return (NULL);
}

View File

@ -0,0 +1,63 @@
/*-
* Copyright (c) 2011 Nathan Whitehorn
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#include <string.h>
#include "partedit.h"
const char *
default_scheme(void) {
return ("VTOC8");
}
int
is_scheme_bootable(const char *part_type) {
if (strcmp(part_type, "VTOC8") == 0)
return (1);
return (0);
}
size_t
bootpart_size(const char *part_type) {
/* No standalone boot partition */
return (0);
}
const char *
bootcode_path(const char *part_type) {
return (NULL);
}
const char *
partcode_path(const char *part_type) {
if (strcmp(part_type, "VTOC8") == 0)
return ("/boot/boot1");
return (NULL);
}

View File

@ -0,0 +1,79 @@
/*-
* Copyright (c) 2011 Nathan Whitehorn
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#include <string.h>
#include "partedit.h"
const char *
default_scheme(void) {
return ("GPT");
}
int
is_scheme_bootable(const char *part_type) {
if (strcmp(part_type, "BSD") == 0)
return (1);
if (strcmp(part_type, "GPT") == 0)
return (1);
if (strcmp(part_type, "MBR") == 0)
return (1);
return (0);
}
size_t
bootpart_size(const char *part_type) {
if (strcmp(part_type, "GPT") == 0)
return (64*1024);
/* No partcode except for GPT */
return (0);
}
const char *
bootcode_path(const char *part_type) {
if (strcmp(part_type, "GPT") == 0)
return ("/boot/pmbr");
if (strcmp(part_type, "MBR") == 0)
return ("/boot/mbr");
if (strcmp(part_type, "BSD") == 0)
return ("/boot/boot");
return (NULL);
}
const char *
partcode_path(const char *part_type) {
if (strcmp(part_type, "GPT") == 0)
return ("/boot/gptboot");
/* No partcode except for GPT */
return (NULL);
}

View File

@ -0,0 +1,9 @@
# $FreeBSD$
SCRIPTS= auto adduser config hostname jail keymap mount netconfig rootpass \
services time umount wlanconfig
BINDIR= /usr/libexec/bsdinstall
NO_MAN= true
.include <bsd.prog.mk>

View File

@ -0,0 +1,34 @@
#!/bin/sh
#-
# Copyright (c) 2011 Nathan Whitehorn
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
clear
echo "FreeBSD Installer"
echo "========================"
echo "Add Users"
echo
chroot $BSDINSTALL_CHROOT adduser

192
usr.sbin/bsdinstall/scripts/auto Executable file
View File

@ -0,0 +1,192 @@
#!/bin/sh
#-
# Copyright (c) 2011 Nathan Whitehorn
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
echo "Begun Installation at $(date)" > $BSDINSTALL_LOG
error() {
dialog --backtitle "FreeBSD Installer" --title "Abort" \
--no-label "Exit" --yes-label "Restart" --yesno \
"An installation step has been aborted. Would you like to restart the installation or exit the installer?" 0 0
if [ $? -ne 0 ]; then
exit
else
test -f $PATH_FSTAB && bsdinstall umount
exec $0
fi
}
rm -rf $BSDINSTALL_TMPETC
mkdir $BSDINSTALL_TMPETC
trap true SIGINT # This section is optional
bsdinstall keymap
trap error SIGINT # Catch cntrl-C here
bsdinstall hostname || error
FETCH_DISTRIBUTIONS=""
for dist in $DISTRIBUTIONS; do
if [ ! -f $BSDINSTALL_DISTDIR/$dist ]; then
FETCH_DISTRIBUTIONS="$FETCH_DISTRIBUTIONS $dist"
fi
done
if [ ! -z "$FETCH_DISTRIBUTIONS" -a ! -z $BSDINSTALL_CONFIGCURRENT ]; then
dialog --backtitle "FreeBSD Installer" --title "Network Installation" --msgbox "No installation files were found on the boot volume. The next few screens will allow you to configure networking so that they can be downloaded from the Internet." 0 0
bsdinstall netconfig || error
NETCONFIG_DONE=yes
fi
rm $PATH_FSTAB
touch $PATH_FSTAB
dialog --backtitle "FreeBSD Installer" --title "Partitioning" --extra-button \
--extra-label "Manual" --ok-label "Guided" --cancel-label "Shell" \
--yesno "Would you like to use the guided partitioning tool (recommended for beginners) or to set up partitions manually (experts)? You can also open a shell and set up partitions entirely by hand." 0 0
case $? in
0) # Guided
bsdinstall autopart || error
bsdinstall mount || error
;;
1) # Shell
clear
echo "Use this shell to set up partitions for the new system. When finished, mount the system at $BSDINSTALL_CHROOT and place an fstab file for the new system at $PATH_FSTAB. Then type 'exit'. You can also enter the partition editor at any time by entering 'bsdinstall partedit'."
sh
;;
3) # Manual
bsdinstall partedit || error
bsdinstall mount || error
;;
*)
error
;;
esac
if [ ! -z "$FETCH_DISTRIBUTIONS" ]; then
ALL_DISTRIBUTIONS="$DISTRIBUTIONS"
# Download to a directory in the new system as scratch space
BSDINSTALL_FETCHDEST="$BSDINSTALL_CHROOT/usr/bsdinstall-dist"
mkdir -p "$BSDINSTALL_FETCHDEST" || error
export DISTRIBUTIONS="$FETCH_DISTRIBUTIONS"
# Try to use any existing distfiles
[ -d $BSDINSTALL_DISTDIR -a "$FETCH_DISTRIBUTIONS" != "$ALL_DISTRIBUTIONS" ] && mount_unionfs "$BSDINSTALL_FETCHDEST" "$BSDINSTALL_DISTDIR"
# Otherwise, fetch everything
if [ $? -ne 0 ]; then
export DISTRIBUTIONS="$ALL_DISTRIBUTIONS"
export BSDINSTALL_DISTDIR="$BSDINSTALL_FETCHDEST"
fi
bsdinstall distfetch || error
export DISTRIBUTIONS="$ALL_DISTRIBUTIONS"
fi
bsdinstall distextract || error
bsdinstall rootpass || error
trap true SIGINT # This section is optional
if [ "$NETCONFIG_DONE" != yes ]; then
bsdinstall netconfig # Don't check for errors -- the user may cancel
fi
bsdinstall time
bsdinstall services
dialog --backtitle "FreeBSD Installer" --title "Add User Accounts" --yesno \
"Would you like to add users to the installed system now?" 0 0 && \
bsdinstall adduser
finalconfig() {
exec 3>&1
REVISIT=$(dialog --backtitle "FreeBSD Installer" \
--title "Final Configuration" --no-cancel --menu \
"Setup of your FreeBSD system is nearly complete. You can now modify your configuration choices or apply more complex changes using a shell." 0 0 0 \
"Add User" "Add a user to the system" \
"Root Password" "Change root password" \
"Hostname" "Set system hostname" \
"Network" "Networking configuration" \
"Services" "Set daemons to run on startup" \
"Time Zone" "Set system timezone" \
"Shell" "Open a shell in the new system" \
"Reboot" "Apply configuration and reboot" 2>&1 1>&3)
exec 3>&-
case "$REVISIT" in
"Add User")
bsdinstall adduser
finalconfig
;;
"Root Password")
bsdinstall rootpass
finalconfig
;;
"Hostname")
bsdinstall hostname
finalconfig
;;
"Network")
bsdinstall netconfig
finalconfig
;;
"Services")
bsdinstall services
finalconfig
;;
"Time Zone")
bsdinstall time
finalconfig
;;
"Shell")
clear
echo This shell is operating in a chroot in the new system. \
When finished making configuration changes, type \"exit\".
chroot "$BSDINSTALL_CHROOT" /bin/sh
# Don't hose local rc.conf changes
cp $BSDINSTALL_CHROOT/etc/rc.conf $BSDINSTALL_TMPETC/rc.conf.manual
finalconfig
;;
esac
}
# Allow user to change his mind
finalconfig
trap error SIGINT # SIGINT is bad again
bsdinstall config || error
if [ ! -z "$BSDINSTALL_FETCHDEST" ]; then
[ "$BSDINSTALL_FETCHDEST" != "$BSDINSTALL_DISTDIR" ] && \
umount "$BSDINSTALL_DISTDIR"
rm -rf "$BSDINSTALL_FETCHDEST"
fi
echo "Installation Completed at $(date)" >> $BSDINSTALL_LOG

View File

@ -0,0 +1,32 @@
#!/bin/sh
#-
# Copyright (c) 2011 Nathan Whitehorn
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
cat $BSDINSTALL_TMPETC/rc.conf.* >> $BSDINSTALL_TMPETC/rc.conf
rm $BSDINSTALL_TMPETC/rc.conf.*
cp $BSDINSTALL_TMPETC/* $BSDINSTALL_CHROOT/etc

View File

@ -0,0 +1,48 @@
#!/bin/sh
#-
# Copyright (c) 2011 Nathan Whitehorn
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
: ${DIALOG_OK=0}
: ${DIALOG_CANCEL=1}
: ${DIALOG_HELP=2}
: ${DIALOG_EXTRA=3}
: ${DIALOG_ITEM_HELP=4}
: ${DIALOG_ESC=255}
exec 3>&1
HOSTNAME=`dialog --backtitle 'FreeBSD Installer' --title 'Set Hostname' --nocancel --inputbox \
'Please choose a hostname for this machine.
If you are running on a managed network, please ask your network administrator for an appropriate name.' \
0 0 $(hostname) 2>&1 1>&3`
if [ $? -eq $DIALOG_CANCEL ]; then exit 1; fi
exec 3>&-
echo "hostname=\"$HOSTNAME\"" > $BSDINSTALL_TMPETC/rc.conf.hostname
if [ ! -z $BSDINSTALL_CONFIGCURRENT ]; then
hostname -s "$HOSTNAME"
fi

View File

@ -0,0 +1,81 @@
#!/bin/sh
#-
# Copyright (c) 2011 Nathan Whitehorn
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
echo "Begun Installation at $(date)" > $BSDINSTALL_LOG
export BSDINSTALL_CHROOT=$1
export DISTRIBUTIONS="`echo $DISTRIBUTIONS | sed 's/kernel\.[^ ]* //g'`"
error() {
dialog --backtitle "FreeBSD Installer" --title "Abort" \
--no-label "Exit" --yes-label "Restart" --yesno \
"You have canceled an installation step. Would you like to restart the installation or exit the installer?" 0 0
if [ $? -ne 0 ]; then
exit
else
test -f $PATH_FSTAB && bsdinstall umount
exec $0
fi
}
rm -rf $BSDINSTALL_TMPETC
mkdir $BSDINSTALL_TMPETC
trap error SIGINT # SIGINT is bad
FETCH_DISTRIBUTIONS=""
for dist in $DISTRIBUTIONS; do
if [ ! -f $BSDINSTALL_DISTDIR/$dist ]; then
FETCH_DISTRIBUTIONS="$FETCH_DISTRIBUTIONS $dist"
fi
done
if [ ! -z $FETCH_DISTRIBUTIONS ]; then
ALL_DISTRIBUTIONS=$DISTRIBUTIONS
DISTRIBUTIONS=$FETCH_DISTRIBUTIONS
bsdinstall distfetch || error
DISTRIBUTIONS=$ALL_DISTRIBUTIONS
fi
bsdinstall distextract || error
bsdinstall rootpass || error
trap true SIGINT # This section is optional
bsdinstall time
bsdinstall services
dialog --backtitle "FreeBSD Installer" --title "Add User Accounts" --yesno \
"Would you like to add users to the installed system now?" 0 0 && \
bsdinstall adduser
trap error SIGINT # SIGINT is bad again
bsdinstall config || error
echo "Installation Completed at $(date)" >> $BSDINSTALL_LOG

View File

@ -0,0 +1,32 @@
#!/bin/sh
#-
# Copyright (c) 2011 Nathan Whitehorn
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
kbdcontrol -d >/dev/null 2>&1
if [ $? -eq 0 ]; then
kbdmap 3>&2 2>&1 1>&3 | grep 'keymap=' > $BSDINSTALL_TMPETC/rc.conf.keymap
fi

View File

@ -0,0 +1,55 @@
#!/bin/sh
#-
# Copyright (c) 2011 Nathan Whitehorn
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
TMP_FSTAB=/tmp/bsdinstall-tmp-fstab
cat $PATH_FSTAB | awk -v BSDINSTALL_CHROOT=$BSDINSTALL_CHROOT '{
if ($2 ~ "^/.*") {
fsname = $2;
if (fsname == "/")
fsname = ""
printf("%s\t%s%s\t%s\t%s\t%s\t%s\n", $1, BSDINSTALL_CHROOT,
fsname, $3, $4, $5, $6);
}
}' > $TMP_FSTAB
FILESYSTEMS=`cat $TMP_FSTAB | awk '/^[^#].*/ {if ($2 ~ "^/.*") printf("%s\n", $2);}' | sort -t /`
for i in $FILESYSTEMS; do
mkdir -p $i 2>/dev/null
MNTERROR=`mount -F $TMP_FSTAB $i 2>&1`
if [ $? -ne 0 ]; then
dialog --backtitle "FreeBSD Installer" --title "Error" \
--msgbox "Error mounting partition $i:\n$MNTERROR" 0 0
exit 1
fi
done
# User might want a shell and require devfs, so mount it
mkdir $BSDINSTALL_CHROOT/dev 2>/dev/null
mount -t devfs devfs $BSDINSTALL_CHROOT/dev

View File

@ -0,0 +1,121 @@
#!/bin/sh
#-
# Copyright (c) 2011 Nathan Whitehorn
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
INTERFACES=""
DIALOG_TAGS=""
: ${DIALOG_OK=0}
: ${DIALOG_CANCEL=1}
: ${DIALOG_HELP=2}
: ${DIALOG_EXTRA=3}
: ${DIALOG_ITEM_HELP=4}
: ${DIALOG_ESC=255}
echo -n > $BSDINSTALL_TMPETC/rc.conf.net
for IF in `ifconfig -l`; do
test "$IF" = "lo0" && continue
(ifconfig -g wlan | egrep -wq $IF) && continue
INTERFACES="$INTERFACES $IF"
DESC=`sysctl -n dev.$(echo $IF | sed -E 's/([[:alpha:]]*)([[:digit:]]*)/\1.\2/g').%desc`
DIALOG_TAGS="$DIALOG_TAGS $IF \"$DESC\""
done
exec 3>&1
INTERFACE=`echo $DIALOG_TAGS | xargs dialog --backtitle 'FreeBSD Installer' --title 'Network Configuration' --menu 'Please select a network interface to configure:' 0 0 0 2>&1 1>&3`
if [ $? -eq $DIALOG_CANCEL ]; then exit 1; fi
exec 3>&-
# Do a dirty check to see if this a wireless interface -- there should be a
# better way
IFCONFIG_PREFIX=""
if ifconfig $INTERFACE | grep -q 'media: IEEE 802.11 Wireless'; then
NEXT_WLAN_IFACE=wlan0 # XXX
echo wlans_$INTERFACE=\"$NEXT_WLAN_IFACE\" >> $BSDINSTALL_TMPETC/rc.conf.net
IFCONFIG_PREFIX="WPA "
if [ ! -z $BSDINSTALL_CONFIGCURRENT ]; then
ifconfig $NEXT_WLAN_IFACE create wlandev $INTERFACE
ifconfig $NEXT_WLAN_IFACE up
fi
bsdinstall wlanconfig $NEXT_WLAN_IFACE || exec $0
INTERFACE="$NEXT_WLAN_IFACE"
fi
dialog --backtitle 'FreeBSD Installer' --title 'Network Configuration' --yesno 'Would you like to use DHCP to configure this interface?' 0 0
if [ $? -eq $DIALOG_OK ]; then
echo ifconfig_$INTERFACE=\"${IFCONFIG_PREFIX}DHCP\" >> $BSDINSTALL_TMPETC/rc.conf.net
if [ ! -z $BSDINSTALL_CONFIGCURRENT ]; then
dialog --backtitle 'FreeBSD Installer' --infobox "Acquiring DHCP lease..." 0 0
dhclient $INTERFACE 2>> $BSDINSTALL_LOG
if [ $? -ne 0 ]; then
dialog --backtitle 'FreeBSD Installer' --msgbox "DHCP lease acquisition failed." 0 0
exec $0
fi
fi
exit 0
fi
IP_ADDRESS=`ifconfig $INTERFACE inet | awk '/inet/ {printf("%s\n", $2); }'`
NETMASK=`ifconfig $INTERFACE inet | awk '/inet/ {printf("%s\n", $4); }'`
ROUTER=`netstat -rn -f inet | awk '/default/ {printf("%s\n", $2);}'`
exec 3>&1
IF_CONFIG=$(dialog --backtitle 'FreeBSD Installer' --title 'Network Configuration' --form 'Static Network Interface Configuration' 0 0 0 \
'IP Address' 1 0 "$IP_ADDRESS" 1 20 16 0 \
'Subnet Mask' 2 0 "$NETMASK" 2 20 16 0 \
'Default Router' 3 0 "$ROUTER" 3 20 16 0 \
\
'Nameserver' 5 0 "" 5 20 16 0 \
'Search Domain' 6 0 "" 6 20 20 0 \
2>&1 1>&3)
if [ $? -eq $DIALOG_CANCEL ]; then exec $0; fi
exec 3>&-
echo $INTERFACE $IF_CONFIG |
awk -v prefix="$IFCONFIG_PREFIX" '{
printf("ifconfig_%s=\"%s%s netmask %s\"\n", $1, prefix, $2, $3);
printf("defaultrouter=\"%s\"\n", $4);
}' >> $BSDINSTALL_TMPETC/rc.conf.net
if [ ! -z $BSDINSTALL_CONFIGCURRENT ]; then
. $BSDINSTALL_TMPETC/rc.conf.net
ifconfig $INTERFACE `eval echo \\\$ifconfig_$INTERFACE`
route delete default
route add default $defaultrouter
fi
echo $IF_CONFIG |
awk '{
if ($4 != "")
printf("nameserver %s\n", $4);
if ($5 != "")
printf("search %s\n", $5);
}' > $BSDINSTALL_TMPETC/resolv.conf

View File

@ -0,0 +1,37 @@
#!/bin/sh
#-
# Copyright (c) 2011 Nathan Whitehorn
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
clear
echo "FreeBSD Installer"
echo "========================"
echo
echo "Please select a password for the system management account (root):"
chroot $BSDINSTALL_CHROOT passwd root

View File

@ -0,0 +1,53 @@
#!/bin/sh
#-
# Copyright (c) 2011 Nathan Whitehorn
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
if [ -f $BSDINSTALL_TMPETC/rc.conf.services ]; then
eval `sed -e s/YES/on/I -e s/NO/off/I $BSDINSTALL_TMPETC/rc.conf.services`
else
# Default service states. Everything is off if not enabled.
sshd_enable="on"
fi
echo -n > $BSDINSTALL_TMPETC/rc.conf.services
exec 3>&1
DAEMONS=$(dialog --backtitle "FreeBSD Installer" \
--title "System Configuration" --nocancel --separate-output \
--checklist "Choose the services you would like to be started at boot:" \
0 0 0 \
sshd "Secure shell daemon" ${sshd_enable:-off} \
moused "PS/2 mouse pointer on console" ${moused_enable:-off} \
ntpd "Synchronize system and network time" ${ntpd_enable:-off} \
powerd "Adjust CPU frequency dynamically" ${powerd_enable:-off} \
2>&1 1>&3)
exec 3>&-
for daemon in $DAEMONS; do
echo ${daemon}_enable=\"YES\" >> $BSDINSTALL_TMPETC/rc.conf.services
done

View File

@ -0,0 +1,29 @@
#!/bin/sh
#-
# Copyright (c) 2011 Nathan Whitehorn
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
chroot $BSDINSTALL_CHROOT tzsetup

View File

@ -0,0 +1,42 @@
#!/bin/sh
#-
# Copyright (c) 2011 Nathan Whitehorn
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
TMP_FSTAB=/tmp/bsdinstall-tmp-fstab
cat $PATH_FSTAB | awk -v BSDINSTALL_CHROOT=$BSDINSTALL_CHROOT '{
if ($2 ~ "^/.*") {
fsname = $2;
if (fsname == "/")
fsname = ""
printf("%s\t%s%s\t%s\t%s\t%s\t%s\n", $1, BSDINSTALL_CHROOT,
fsname, $3, $4, $5, $6);
}
}' > $TMP_FSTAB
umount $BSDINSTALL_CHROOT/dev 2>/dev/null
umount -F $TMP_FSTAB -a 2>/dev/null

View File

@ -0,0 +1,137 @@
#!/bin/sh
#-
# Copyright (c) 2011 Nathan Whitehorn
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
echo -n > $BSDINSTALL_TMPETC/wpa_supplicant.conf
chmod 0600 $BSDINSTALL_TMPETC/wpa_supplicant.conf
echo "ctrl_interface=/var/run/wpa_supplicant" >> $BSDINSTALL_TMPETC/wpa_supplicant.conf
echo "eapol_version=2" >> $BSDINSTALL_TMPETC/wpa_supplicant.conf
echo "ap_scan=1" >> $BSDINSTALL_TMPETC/wpa_supplicant.conf
echo "fast_reauth=1" >> $BSDINSTALL_TMPETC/wpa_supplicant.conf
echo >> $BSDINSTALL_TMPETC/wpa_supplicant.conf
# Try to reach wpa_supplicant. If it isn't running and we can modify the
# existing system, start it. Otherwise, fail.
(wpa_cli ping >/dev/null 2>/dev/null || ([ ! -z $BSDINSTALL_CONFIGCURRENT ] && \
wpa_supplicant -B -i $1 -c $BSDINSTALL_TMPETC/wpa_supplicant.conf)) || \
(dialog --backtitle "FreeBSD Installer" --title "Error" --msgbox \
"Could not start wpa_supplicant!" 0 0; exit 1) || exit 1
# See if we succeeded
wpa_cli ping >/dev/null 2>/dev/null
if [ $? -ne 0 -a -z $BSDINSTALL_CONFIGCURRENT ]; then
dialog --backtitle "FreeBSD Installer" --title "Error" --msgbox \
"Wireless cannot be configured without making changes to the local system!" \ 0 0
exit 1
fi
wpa_cli scan >>$BSDINSTALL_LOG
dialog --backtitle "FreeBSD Installer" --title "Scanning" --ok-label "Skip" \
--pause "Waiting 5 seconds to scan for wireless networks..." \
9 40 5 || exit 1
SCAN_RESULTS=`wpa_cli scan_results`
NETWORKS=`echo "$SCAN_RESULTS" | awk -F '\t' \
'/..:..:..:..:..:../ {if (length($5) > 0) printf("\"%s\"\t%s\n", $5, $4);}' |
sort | uniq`
if [ -z $SCAN_RESULTS ]; then
dialog --backtitle "FreeBSD Installer" --title "Error" \
--yesno "No wireless networks were found. Rescan?" 0 0 && \
exec $0 $@
exit 1
fi
exec 3>&1
NETWORK=`sh -c "dialog --extra-button --extra-label \"Rescan\" \
--backtitle \"FreeBSD Installer\" --title \"Network Selection\" --menu \
\"Select a wireless network to connect to.\" 0 0 0 \
$(echo $NETWORKS | tr '\n' ' ')" 2>&1 1>&3`
case $? in
0) # OK
;;
1) # Cancel
exit 1
;;
3) # Rescan
exec $0 $@
;;
esac
exec 3>&-
ENCRYPTION=`echo "$NETWORKS" | awk -F '\t' \
"/^\"$NETWORK\"\t/ {printf(\"%s\n\", \\\$2 );}"`
if echo $ENCRYPTION | grep -q 'PSK'; then
exec 3>&1
PASS=`dialog --insecure --backtitle "FreeBSD Installer" \
--title "WPA Setup" --mixedform "" 0 0 0 \
"SSID" 1 0 "$NETWORK" 1 12 0 0 2 \
"Password" 2 0 "" 2 12 15 0 1 \
2>&1 1>&3` \
|| exec $0 $@
exec 3>&-
echo "network={
ssid=\"$NETWORK\"
psk=\"$PASS\"
priority=5
}" >> $BSDINSTALL_TMPETC/wpa_supplicant.conf
elif echo $ENCRYPTION | grep -q WEP; then
echo FOO
exec 3>&1
WEPKEY=`dialog --insecure --backtitle "FreeBSD Installer" \
--title "WEP Setup" --mixedform "" 0 0 0 \
"SSID" 1 0 "$NETWORK" 1 12 0 0 2 \
"WEP Key 0" 2 0 "" 2 12 15 0 1 \
2>&1 1>&3` \
|| exec $0 $@
echo "network={
ssid=\"$NETWORK\"
key_mgmt=NONE
wep_key0=\"$WEPKEY\"
wep_tx_keyidx=0
priority=5
}" >> $BSDINSTALL_TMPETC/wpa_supplicant.conf
else # Open
echo "network={
ssid=\"$NETWORK\"
key_mgmt=NONE
priority=5
}" >> $BSDINSTALL_TMPETC/wpa_supplicant.conf
fi
# Connect to any open networks policy
echo "network={
priority=5
key_mgmt=NONE
}" >> $BSDINSTALL_TMPETC/wpa_supplicant.conf
# Bring up new network
test ! -z $BSDINSTALL_CONFIGCURRENT && wpa_cli reconfigure >>$BSDINSTALL_LOG
exit 0