tonarchy
tonarchy
https://git.tonybtw.com/tonarchy.git
git://git.tonybtw.com/tonarchy.git
Fixed wifi, nvme drives, squashfs errors.
Diff
diff --git a/src/tonarchy.c b/src/tonarchy.c
index 16b5fb2..3cb68d1 100644
--- a/src/tonarchy.c
+++ b/src/tonarchy.c
@@ -10,7 +10,7 @@ enum Install_Option {
OXIDIZED = 1
};
-static const char *XFCE_PACKAGES = "base base-devel linux linux-firmware linux-headers networkmanager git vim neovim curl wget htop btop man-db man-pages openssh sudo xorg-server xorg-xinit xorg-xrandr xorg-xset xfce4 xfce4-goodies xfce4-session xfce4-whiskermenu-plugin thunar thunar-archive-plugin file-roller firefox alacritty vlc evince eog fastfetch rofi ripgrep fd ttf-iosevka-nerd ttf-jetbrains-mono-nerd";
+static const char *XFCE_PACKAGES = "base base-devel linux linux-firmware linux-headers networkmanager git vim neovim curl wget htop btop man-db man-pages openssh sudo xorg-server xorg-xinit xorg-xrandr xorg-xset xfce4 xfce4-goodies xfce4-session xfce4-whiskermenu-plugin thunar thunar-archive-plugin file-roller firefox alacritty vlc evince eog fastfetch rofi ripgrep fd ttf-iosevka-nerd ttf-jetbrains-mono-nerd pavucontrol";
static const char *OXWM_PACKAGES = "base base-devel linux linux-firmware linux-headers networkmanager git vim neovim curl wget htop btop man-db man-pages openssh sudo xorg-server xorg-xinit xorg-xsetroot xorg-xrandr xorg-xset libx11 libxft freetype2 fontconfig pkg-config lua firefox alacritty vlc evince eog cargo ttf-iosevka-nerd ttf-jetbrains-mono-nerd picom xclip xwallpaper maim rofi pulseaudio pulseaudio-alsa pavucontrol alsa-utils fastfetch ripgrep fd pcmanfm lxappearance papirus-icon-theme gnome-themes-extra";
@@ -367,6 +367,133 @@ void show_message(const char *message) {
sleep(2);
}
+static int check_internet_connection(void) {
+ int result = system("ping -c 1 -W 2 1.1.1.1 > /dev/null 2>&1");
+ return result == 0;
+}
+
+static int list_wifi_networks(char networks[][256], char ssids[][128], int max_networks) {
+ FILE *fp = popen("nmcli -t -f SSID,SIGNAL,SECURITY device wifi list | head -20", "r");
+ if (!fp) {
+ return 0;
+ }
+
+ int count = 0;
+ char line[512];
+ while (count < max_networks && fgets(line, sizeof(line), fp) != NULL) {
+ line[strcspn(line, "\n")] = '\0';
+
+ char ssid[128], signal[32], security[64];
+ char *token = strtok(line, ":");
+ if (token) strncpy(ssid, token, sizeof(ssid) - 1);
+ token = strtok(NULL, ":");
+ if (token) strncpy(signal, token, sizeof(signal) - 1);
+ token = strtok(NULL, ":");
+ if (token) strncpy(security, token, sizeof(security) - 1);
+
+ if (strlen(ssid) > 0 && strcmp(ssid, "--") != 0) {
+ strncpy(ssids[count], ssid, 127);
+ snprintf(networks[count], 255, "%s (%s%%) [%s]", ssid, signal,
+ strlen(security) > 0 ? security : "Open");
+ count++;
+ }
+ }
+ pclose(fp);
+ return count;
+}
+
+static int connect_to_wifi(const char *ssid) {
+ int rows, cols;
+ get_terminal_size(&rows, &cols);
+
+ clear_screen();
+ draw_logo(cols);
+
+ int logo_start = (cols - 70) / 2;
+ printf("\033[%d;%dH\033[37mConnecting to: %s\033[0m", 10, logo_start, ssid);
+ printf("\033[%d;%dH\033[37mEnter password (leave empty if open): \033[0m", 12, logo_start);
+ fflush(stdout);
+
+ char password[256] = "";
+ struct termios old_term;
+ tcgetattr(STDIN_FILENO, &old_term);
+ struct termios new_term = old_term;
+ new_term.c_lflag &= ~ECHO;
+ new_term.c_lflag |= ICANON;
+ tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_term);
+
+ if (fgets(password, sizeof(password), stdin) != NULL) {
+ password[strcspn(password, "\n")] = '\0';
+ }
+
+ tcsetattr(STDIN_FILENO, TCSAFLUSH, &old_term);
+
+ clear_screen();
+ draw_logo(cols);
+ printf("\033[%d;%dH\033[37mConnecting...\033[0m", 10, logo_start);
+ fflush(stdout);
+
+ char cmd[512];
+ if (strlen(password) > 0) {
+ snprintf(cmd, sizeof(cmd), "nmcli device wifi connect '%s' password '%s' > /dev/null 2>&1", ssid, password);
+ } else {
+ snprintf(cmd, sizeof(cmd), "nmcli device wifi connect '%s' > /dev/null 2>&1", ssid);
+ }
+
+ int result = system(cmd);
+ sleep(2);
+
+ if (result == 0 && check_internet_connection()) {
+ show_message("Connected successfully!");
+ return 1;
+ } else {
+ show_message("Connection failed. Please try again.");
+ return 0;
+ }
+}
+
+static int setup_wifi_if_needed(void) {
+ if (check_internet_connection()) {
+ return 1;
+ }
+
+ int rows, cols;
+ get_terminal_size(&rows, &cols);
+
+ clear_screen();
+ draw_logo(cols);
+
+ int logo_start = (cols - 70) / 2;
+ printf("\033[%d;%dH\033[37mNo internet connection detected.\033[0m", 10, logo_start);
+ printf("\033[%d;%dH\033[37mScanning for WiFi networks...\033[0m", 11, logo_start);
+ fflush(stdout);
+
+ system("nmcli radio wifi on > /dev/null 2>&1");
+ sleep(1);
+
+ char networks[32][256];
+ char ssids[32][128];
+ int network_count = list_wifi_networks(networks, ssids, 32);
+
+ if (network_count == 0) {
+ show_message("No WiFi networks found. Please check your connection.");
+ return 0;
+ }
+
+ const char *network_ptrs[32];
+ for (int i = 0; i < network_count; i++) {
+ network_ptrs[i] = networks[i];
+ }
+
+ int selected = select_from_menu(network_ptrs, network_count);
+ if (selected < 0) {
+ show_message("WiFi setup cancelled. Installation requires internet.");
+ return 0;
+ }
+
+ return connect_to_wifi(ssids[selected]);
+}
+
static void draw_form(
const char *username,
const char *password,
@@ -649,10 +776,18 @@ static int get_form_input(
return 1;
}
+static void get_partition_name(const char *disk, int partition_num, char *output, size_t output_size) {
+ if (strstr(disk, "nvme") != NULL || strstr(disk, "mmcblk") != NULL) {
+ snprintf(output, output_size, "%sp%d", disk, partition_num);
+ } else {
+ snprintf(output, output_size, "%s%d", disk, partition_num);
+ }
+}
+
static int select_disk(char *disk_name) {
clear_screen();
- FILE *fp = popen("lsblk -d -n -o NAME,SIZE,MODEL | awk '{printf \"%s (%s) %s\\n\", $1, $2, substr($0, index($0,$3))}'", "r");
+ FILE *fp = popen("lsblk -d -n -o NAME,SIZE,MODEL,TYPE | grep -E '(disk|nvme)' | grep -v -E '(loop|rom|airoot)' | awk '{printf \"%s (%s) %s\\n\", $1, $2, substr($0, index($0,$3))}'", "r");
if (fp == NULL) {
show_message("Failed to list disks");
return 0;
@@ -721,9 +856,14 @@ static int select_disk(char *disk_name) {
static int partition_disk(const char *disk) {
char cmd[1024];
+ char part1[128], part2[128], part3[128];
int rows, cols;
get_terminal_size(&rows, &cols);
+ get_partition_name(disk, 1, part1, sizeof(part1));
+ get_partition_name(disk, 2, part2, sizeof(part2));
+ get_partition_name(disk, 3, part3, sizeof(part3));
+
clear_screen();
draw_logo(cols);
@@ -782,41 +922,41 @@ static int partition_disk(const char *disk) {
fflush(stdout);
if (uefi) {
- snprintf(cmd, sizeof(cmd), "mkfs.fat -F32 /dev/%s1 2>> /tmp/tonarchy-install.log", disk);
+ snprintf(cmd, sizeof(cmd), "mkfs.fat -F32 /dev/%s 2>> /tmp/tonarchy-install.log", part1);
if (system(cmd) != 0) {
- LOG_ERROR("Failed to format EFI partition: /dev/%s1", disk);
+ LOG_ERROR("Failed to format EFI partition: /dev/%s", part1);
show_message("Failed to format EFI partition");
return 0;
}
LOG_INFO("Formatted EFI partition");
- snprintf(cmd, sizeof(cmd), "mkswap /dev/%s2 2>> /tmp/tonarchy-install.log", disk);
+ snprintf(cmd, sizeof(cmd), "mkswap /dev/%s 2>> /tmp/tonarchy-install.log", part2);
if (system(cmd) != 0) {
- LOG_ERROR("Failed to format swap: /dev/%s2", disk);
+ LOG_ERROR("Failed to format swap: /dev/%s", part2);
show_message("Failed to format swap partition");
return 0;
}
LOG_INFO("Formatted swap partition");
- snprintf(cmd, sizeof(cmd), "mkfs.ext4 -F /dev/%s3 2>> /tmp/tonarchy-install.log", disk);
+ snprintf(cmd, sizeof(cmd), "mkfs.ext4 -F /dev/%s 2>> /tmp/tonarchy-install.log", part3);
if (system(cmd) != 0) {
- LOG_ERROR("Failed to format root: /dev/%s3", disk);
+ LOG_ERROR("Failed to format root: /dev/%s", part3);
show_message("Failed to format root partition");
return 0;
}
LOG_INFO("Formatted root partition");
} else {
- snprintf(cmd, sizeof(cmd), "mkswap /dev/%s1 2>> /tmp/tonarchy-install.log", disk);
+ snprintf(cmd, sizeof(cmd), "mkswap /dev/%s 2>> /tmp/tonarchy-install.log", part1);
if (system(cmd) != 0) {
- LOG_ERROR("Failed to format swap: /dev/%s1", disk);
+ LOG_ERROR("Failed to format swap: /dev/%s", part1);
show_message("Failed to format swap partition");
return 0;
}
LOG_INFO("Formatted swap partition");
- snprintf(cmd, sizeof(cmd), "mkfs.ext4 -F /dev/%s2 2>> /tmp/tonarchy-install.log", disk);
+ snprintf(cmd, sizeof(cmd), "mkfs.ext4 -F /dev/%s 2>> /tmp/tonarchy-install.log", part2);
if (system(cmd) != 0) {
- LOG_ERROR("Failed to format root: /dev/%s2", disk);
+ LOG_ERROR("Failed to format root: /dev/%s", part2);
show_message("Failed to format root partition");
return 0;
}
@@ -827,9 +967,9 @@ static int partition_disk(const char *disk) {
fflush(stdout);
if (uefi) {
- snprintf(cmd, sizeof(cmd), "mount /dev/%s3 /mnt 2>> /tmp/tonarchy-install.log", disk);
+ snprintf(cmd, sizeof(cmd), "mount /dev/%s /mnt 2>> /tmp/tonarchy-install.log", part3);
if (system(cmd) != 0) {
- LOG_ERROR("Failed to mount root: /dev/%s3", disk);
+ LOG_ERROR("Failed to mount root: /dev/%s", part3);
show_message("Failed to mount root partition");
return 0;
}
@@ -838,32 +978,32 @@ static int partition_disk(const char *disk) {
snprintf(cmd, sizeof(cmd), "mkdir -p /mnt/boot 2>> /tmp/tonarchy-install.log");
system(cmd);
- snprintf(cmd, sizeof(cmd), "mount /dev/%s1 /mnt/boot 2>> /tmp/tonarchy-install.log", disk);
+ snprintf(cmd, sizeof(cmd), "mount /dev/%s /mnt/boot 2>> /tmp/tonarchy-install.log", part1);
if (system(cmd) != 0) {
- LOG_ERROR("Failed to mount EFI: /dev/%s1", disk);
+ LOG_ERROR("Failed to mount EFI: /dev/%s", part1);
show_message("Failed to mount EFI partition");
return 0;
}
LOG_INFO("Mounted EFI partition");
- snprintf(cmd, sizeof(cmd), "swapon /dev/%s2 2>> /tmp/tonarchy-install.log", disk);
+ snprintf(cmd, sizeof(cmd), "swapon /dev/%s 2>> /tmp/tonarchy-install.log", part2);
if (system(cmd) != 0) {
- LOG_ERROR("Failed to enable swap: /dev/%s2", disk);
+ LOG_ERROR("Failed to enable swap: /dev/%s", part2);
show_message("Failed to enable swap");
return 0;
}
} else {
- snprintf(cmd, sizeof(cmd), "mount /dev/%s2 /mnt 2>> /tmp/tonarchy-install.log", disk);
+ snprintf(cmd, sizeof(cmd), "mount /dev/%s /mnt 2>> /tmp/tonarchy-install.log", part2);
if (system(cmd) != 0) {
- LOG_ERROR("Failed to mount root: /dev/%s2", disk);
+ LOG_ERROR("Failed to mount root: /dev/%s", part2);
show_message("Failed to mount root partition");
return 0;
}
LOG_INFO("Mounted root partition");
- snprintf(cmd, sizeof(cmd), "swapon /dev/%s1 2>> /tmp/tonarchy-install.log", disk);
+ snprintf(cmd, sizeof(cmd), "swapon /dev/%s 2>> /tmp/tonarchy-install.log", part1);
if (system(cmd) != 0) {
- LOG_ERROR("Failed to enable swap: /dev/%s1", disk);
+ LOG_ERROR("Failed to enable swap: /dev/%s", part1);
show_message("Failed to enable swap");
return 0;
}
@@ -1026,17 +1166,20 @@ static int configure_system_impl(
static int get_root_uuid(const char *disk, char *uuid_out, size_t uuid_size) {
char cmd[512];
- snprintf(cmd, sizeof(cmd), "blkid -s UUID -o value /dev/%s3", disk);
+ char part3[128];
+
+ get_partition_name(disk, 3, part3, sizeof(part3));
+ snprintf(cmd, sizeof(cmd), "blkid -s UUID -o value /dev/%s", part3);
FILE *fp = popen(cmd, "r");
if (!fp) {
- LOG_ERROR("Failed to get UUID for /dev/%s3", disk);
+ LOG_ERROR("Failed to get UUID for /dev/%s", part3);
return 0;
}
if (fgets(uuid_out, uuid_size, fp) == NULL) {
pclose(fp);
- LOG_ERROR("Failed to read UUID for /dev/%s3", disk);
+ LOG_ERROR("Failed to read UUID for /dev/%s", part3);
return 0;
}
@@ -1044,7 +1187,7 @@ static int get_root_uuid(const char *disk, char *uuid_out, size_t uuid_size) {
pclose(fp);
if (strlen(uuid_out) == 0) {
- LOG_ERROR("Empty UUID for /dev/%s3", disk);
+ LOG_ERROR("Empty UUID for /dev/%s", part3);
return 0;
}
@@ -1393,6 +1536,11 @@ int main(void) {
logger_init("/tmp/tonarchy-install.log");
LOG_INFO("Tonarchy installer started");
+ if (!setup_wifi_if_needed()) {
+ logger_close();
+ return 1;
+ }
+
char username[256] = "";
char password[256] = "";
char confirmed_password[256] = "";
@@ -1450,18 +1598,21 @@ int main(void) {
draw_logo(cols);
int logo_start = (cols - 70) / 2;
- printf("\033[%d;%dH\033[1;32mInstallation complete!\033[0m", 10, logo_start);
- printf("\033[%d;%dH\033[37mPress Enter to reboot...\033[0m", 12, logo_start);
+ printf("\033[%d;%dH\033[1;32mInstallation complete!\033[0m\n", 10, logo_start);
+ printf("\033[%d;%dH\033[37mPress Enter or Q to quit. Then, manually reboot.\033[0m\n", 12, logo_start);
fflush(stdout);
- enable_raw_mode();
char c;
- read(STDIN_FILENO, &c, 1);
+ enable_raw_mode();
+ while (read(STDIN_FILENO, &c, 1) == 1) {
+ if (c == '\r' || c == '\n' || c == 'q' || c == 'Q') {
+ break;
+ }
+ }
disable_raw_mode();
- system("eject -m /dev/sr0 2>/dev/null");
- system("reboot");
- LOG_INFO("Tonarchy installer finished");
+ LOG_INFO("Tonarchy installer finished - exiting cleanly");
logger_close();
+
return 0;
}