- build-unified.sh: master build script (16 hooks, kernel 7.0.0-rc7) - config/package-lists: Debian package selections - assets: Alfred Commander extension tarball - docs: ARM64 investigation, kernel upgrade roadmap
477 lines
15 KiB
Bash
477 lines
15 KiB
Bash
#!/bin/bash
|
|
# ═══════════════════════════════════════════════════════════════
|
|
# Alfred Linux v2.0 — Post-Build Customization Hook
|
|
#
|
|
# This runs inside the chroot during ISO build.
|
|
# Applies branding, security hardening, and default configs.
|
|
# BUILD: v2.0-b1 (Branding)
|
|
# ═══════════════════════════════════════════════════════════════
|
|
|
|
set -e
|
|
|
|
echo "[Alfred Linux v2.0] Applying customizations..."
|
|
|
|
# ── 1. Disable telemetry services ──
|
|
TELEMETRY_SERVICES=(
|
|
"apport"
|
|
"whoopsie"
|
|
"ubuntu-report"
|
|
"popularity-contest"
|
|
)
|
|
for svc in "${TELEMETRY_SERVICES[@]}"; do
|
|
systemctl disable "$svc" 2>/dev/null || true
|
|
systemctl mask "$svc" 2>/dev/null || true
|
|
done
|
|
apt-get purge -y apport whoopsie ubuntu-report popularity-contest 2>/dev/null || true
|
|
|
|
# ── 2. Firewall defaults ──
|
|
ufw default deny incoming
|
|
ufw default allow outgoing
|
|
ufw allow ssh
|
|
ufw --force enable
|
|
|
|
# ── 3. SSH hardening ──
|
|
cat > /etc/ssh/sshd_config.d/alfred-hardening.conf << 'SSHD'
|
|
PermitRootLogin no
|
|
PasswordAuthentication yes
|
|
PubkeyAuthentication yes
|
|
X11Forwarding no
|
|
AllowAgentForwarding no
|
|
GatewayPorts no
|
|
PermitEmptyPasswords no
|
|
MaxAuthTries 3
|
|
LoginGraceTime 30
|
|
SSHD
|
|
|
|
# ── 4. XFCE4 terminal defaults ──
|
|
mkdir -p /etc/skel/.config/xfce4/terminal
|
|
cat > /etc/skel/.config/xfce4/terminal/terminalrc << 'TERM'
|
|
[Configuration]
|
|
FontName=JetBrains Mono 11
|
|
MiscAlwaysShowTabs=FALSE
|
|
MiscBell=FALSE
|
|
MiscBellUrgent=FALSE
|
|
MiscBordersDefault=TRUE
|
|
MiscCursorBlinks=TRUE
|
|
MiscCursorShape=TERMINAL_CURSOR_SHAPE_BLOCK
|
|
MiscDefaultGeometry=120x35
|
|
MiscInheritGeometry=FALSE
|
|
MiscMenubarDefault=FALSE
|
|
MiscMouseAutohide=TRUE
|
|
MiscMouseWheelZoom=TRUE
|
|
MiscToolbarDefault=FALSE
|
|
MiscConfirmClose=TRUE
|
|
MiscCycleTabs=TRUE
|
|
MiscTabCloseButtons=TRUE
|
|
MiscTabCloseMiddleClick=TRUE
|
|
MiscTabPosition=GTK_POS_TOP
|
|
MiscHighlightUrls=TRUE
|
|
MiscMiddleClickOpensUri=FALSE
|
|
MiscCopyOnSelect=FALSE
|
|
MiscShowRelaunchDialog=TRUE
|
|
MiscRewrapOnResize=TRUE
|
|
MiscUseShiftArrowsToScroll=FALSE
|
|
MiscSlimTabs=FALSE
|
|
MiscNewTabAdjacent=FALSE
|
|
MiscSearchDialogOpacity=100
|
|
MiscShowUnsafePasteDialog=TRUE
|
|
ScrollingUnlimited=TRUE
|
|
BackgroundMode=TERMINAL_BACKGROUND_TRANSPARENT
|
|
BackgroundDarkness=0.920000
|
|
ColorForeground=#e8e8f0
|
|
ColorBackground=#0a0a14
|
|
ColorCursor=#00D4FF
|
|
ColorCursorUseDefault=FALSE
|
|
ColorPalette=#1a1a2e;#e74c3c;#00b894;#fdcb6e;#0984e3;#7D00FF;#00D4FF;#e8e8f0;#8a8a9a;#e74c3c;#00b894;#fdcb6e;#0984e3;#a78bfa;#00D4FF;#ffffff
|
|
TERM
|
|
|
|
# ── 5. Custom bash prompt for Alfred Linux ──
|
|
cat >> /etc/skel/.bashrc << 'BASHRC'
|
|
|
|
# Alfred Linux prompt
|
|
parse_git_branch() {
|
|
git branch 2>/dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
|
|
}
|
|
PS1='\[\e[36m\]\u@alfred\[\e[0m\]:\[\e[35m\]\w\[\e[32m\]$(parse_git_branch)\[\e[0m\]\$ '
|
|
|
|
# Alfred Linux aliases
|
|
alias ll='ls -lah --color=auto'
|
|
alias la='ls -A --color=auto'
|
|
alias update='sudo apt update && sudo apt upgrade -y'
|
|
alias ports='ss -tulpn'
|
|
alias myip='curl -s ifconfig.me'
|
|
alias cls='clear'
|
|
|
|
# Welcome message
|
|
if [[ -z "$ALFRED_WELCOMED" ]]; then
|
|
echo -e "\e[36m"
|
|
echo " ╔═══════════════════════════════════════╗"
|
|
echo " ║ Alfred Linux 2.0 — Sovereign ║"
|
|
echo " ║ No telemetry. No tracking. Yours. ║"
|
|
echo " ╚═══════════════════════════════════════╝"
|
|
echo -e "\e[0m"
|
|
export ALFRED_WELCOMED=1
|
|
fi
|
|
BASHRC
|
|
|
|
# ── 6. Neofetch config with custom Alfred ASCII art ──
|
|
mkdir -p /etc/skel/.config/neofetch
|
|
cat > /etc/skel/.config/neofetch/config.conf << 'NEOCONF'
|
|
print_info() {
|
|
info title
|
|
info underline
|
|
info "OS" distro
|
|
info "Host" model
|
|
info "Kernel" kernel
|
|
info "Uptime" uptime
|
|
info "Packages" packages
|
|
info "Shell" shell
|
|
info "DE" de
|
|
info "WM" wm
|
|
info "Terminal" term
|
|
info "CPU" cpu
|
|
info "GPU" gpu
|
|
info "Memory" memory
|
|
info "Disk" disk
|
|
info "Network" local_ip
|
|
info cols
|
|
}
|
|
|
|
image_backend="ascii"
|
|
image_source="/etc/alfred-ascii.txt"
|
|
ascii_colors=(6 5 4 6 5 4)
|
|
NEOCONF
|
|
|
|
# Create Alfred ASCII art for neofetch
|
|
cat > /etc/alfred-ascii.txt << 'ASCII'
|
|
.---.
|
|
/ \
|
|
| A L |
|
|
| F R |
|
|
| E D |
|
|
\_____/
|
|
.----' '----.
|
|
/ \
|
|
| ███████████████ |
|
|
| █ █ |
|
|
| █ SOVEREIGN █ |
|
|
| █ LINUX █ |
|
|
| █ █ |
|
|
| ███████████████ |
|
|
\ /
|
|
'-----. .-----'
|
|
| |
|
|
/ \
|
|
'-------'
|
|
ASCII
|
|
|
|
# ── 7. Generate wallpapers via ImageMagick (if available) ──
|
|
mkdir -p /usr/share/backgrounds/alfred-linux
|
|
if command -v convert &>/dev/null; then
|
|
# Dark sovereign wallpaper — gradient background with logo text
|
|
convert -size 1920x1080 \
|
|
-define gradient:angle=135 \
|
|
gradient:'#0a0a14-#1a1a2e' \
|
|
-gravity center \
|
|
-fill '#00D4FF' -font 'DejaVu-Sans-Bold' -pointsize 72 \
|
|
-annotate +0-100 'Alfred Linux' \
|
|
-fill '#8a8a9a' -font 'DejaVu-Sans' -pointsize 28 \
|
|
-annotate +0-20 'Sovereign Computing' \
|
|
-fill '#0984e3' -pointsize 18 \
|
|
-annotate +0+40 'No telemetry. No tracking. Yours.' \
|
|
/usr/share/backgrounds/alfred-linux/default.png 2>/dev/null || echo "[WARN] Wallpaper generation failed"
|
|
|
|
# Minimal dark wallpaper
|
|
convert -size 1920x1080 \
|
|
-define gradient:angle=180 \
|
|
gradient:'#0a0a14-#12121f' \
|
|
/usr/share/backgrounds/alfred-linux/dark-minimal.png 2>/dev/null || true
|
|
|
|
# Accent wallpaper — subtle glow
|
|
convert -size 1920x1080 xc:'#0a0a14' \
|
|
-fill 'radial-gradient:' \
|
|
-draw "fill #0984e320 circle 960,540 960,800" \
|
|
/usr/share/backgrounds/alfred-linux/accent-glow.png 2>/dev/null || \
|
|
convert -size 1920x1080 \
|
|
-define gradient:angle=135 \
|
|
gradient:'#0a0a14-#0d1a2a' \
|
|
/usr/share/backgrounds/alfred-linux/accent-glow.png 2>/dev/null || true
|
|
else
|
|
echo "[WARN] ImageMagick (convert) not found — wallpapers not generated"
|
|
fi
|
|
|
|
# ── 8. XFCE4 desktop settings — set wallpaper ──
|
|
mkdir -p /etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml
|
|
cat > /etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml << 'DESKXML'
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<channel name="xfce4-desktop" version="1.0">
|
|
<property name="backdrop" type="empty">
|
|
<property name="screen0" type="empty">
|
|
<property name="monitorscreen" type="empty">
|
|
<property name="workspace0" type="empty">
|
|
<property name="last-image" type="string" value="/usr/share/backgrounds/alfred-linux/default.png"/>
|
|
<property name="image-style" type="int" value="5"/>
|
|
<property name="color-style" type="int" value="0"/>
|
|
<property name="rgba1" type="array">
|
|
<value type="double" value="0.039216"/>
|
|
<value type="double" value="0.039216"/>
|
|
<value type="double" value="0.078431"/>
|
|
<value type="double" value="1.000000"/>
|
|
</property>
|
|
</property>
|
|
</property>
|
|
</property>
|
|
</property>
|
|
</channel>
|
|
DESKXML
|
|
|
|
# ── 9. Plymouth boot theme ──
|
|
mkdir -p /usr/share/plymouth/themes/alfred
|
|
cat > /usr/share/plymouth/themes/alfred/alfred.plymouth << 'PLY'
|
|
[Plymouth Theme]
|
|
Name=Alfred Linux
|
|
Description=Alfred Linux boot splash
|
|
ModuleName=script
|
|
|
|
[script]
|
|
ImageDir=/usr/share/plymouth/themes/alfred
|
|
ScriptFile=/usr/share/plymouth/themes/alfred/alfred.script
|
|
PLY
|
|
|
|
cat > /usr/share/plymouth/themes/alfred/alfred.script << 'PLYSCRIPT'
|
|
# Alfred Linux Plymouth Script Theme
|
|
# Dark background with centered text
|
|
|
|
Window.SetBackgroundTopColor(0.039, 0.039, 0.078);
|
|
Window.SetBackgroundBottomColor(0.102, 0.102, 0.180);
|
|
|
|
# Text sprite
|
|
text_sprite = Sprite();
|
|
text_image = Image.Text("Alfred Linux", 0, 0.831, 1.0, 1, "Sans Bold 32");
|
|
text_sprite.SetImage(text_image);
|
|
text_sprite.SetX(Window.GetWidth() / 2 - text_image.GetWidth() / 2);
|
|
text_sprite.SetY(Window.GetHeight() / 2 - 60);
|
|
|
|
sub_sprite = Sprite();
|
|
sub_image = Image.Text("Sovereign Computing", 0.541, 0.541, 0.604, 1, "Sans 16");
|
|
sub_sprite.SetImage(sub_image);
|
|
sub_sprite.SetX(Window.GetWidth() / 2 - sub_image.GetWidth() / 2);
|
|
sub_sprite.SetY(Window.GetHeight() / 2);
|
|
|
|
# Progress bar
|
|
progress_box.image = Image("progress_box.png");
|
|
progress_bar.original_image = Image("progress_bar.png");
|
|
|
|
# Callback for boot progress
|
|
fun boot_progress_cb(time, progress) {
|
|
if (progress_bar.original_image) {
|
|
progress_bar.image = progress_bar.original_image.Scale(
|
|
progress_bar.original_image.GetWidth() * progress,
|
|
progress_bar.original_image.GetHeight()
|
|
);
|
|
progress_bar.sprite.SetImage(progress_bar.image);
|
|
}
|
|
}
|
|
Plymouth.SetBootProgressFunction(boot_progress_cb);
|
|
|
|
# Message callback
|
|
message_sprite = Sprite();
|
|
fun message_cb(text) {
|
|
msg_image = Image.Text(text, 0.541, 0.541, 0.604, 1, "Sans 12");
|
|
message_sprite.SetImage(msg_image);
|
|
message_sprite.SetX(Window.GetWidth() / 2 - msg_image.GetWidth() / 2);
|
|
message_sprite.SetY(Window.GetHeight() - 60);
|
|
}
|
|
Plymouth.SetMessageFunction(message_cb);
|
|
PLYSCRIPT
|
|
|
|
# Generate plymouth progress bar images
|
|
if command -v convert &>/dev/null; then
|
|
convert -size 400x8 xc:'#1a1a2e' /usr/share/plymouth/themes/alfred/progress_box.png 2>/dev/null || true
|
|
convert -size 400x8 xc:'#00D4FF' /usr/share/plymouth/themes/alfred/progress_bar.png 2>/dev/null || true
|
|
fi
|
|
|
|
# Set as default plymouth theme
|
|
if command -v plymouth-set-default-theme &>/dev/null; then
|
|
plymouth-set-default-theme -R alfred 2>/dev/null || true
|
|
elif [ -f /etc/plymouth/plymouthd.conf ]; then
|
|
sed -i 's/^Theme=.*/Theme=alfred/' /etc/plymouth/plymouthd.conf 2>/dev/null || true
|
|
fi
|
|
|
|
# Also register as an alternative
|
|
update-alternatives --install /usr/share/plymouth/themes/default.plymouth default.plymouth \
|
|
/usr/share/plymouth/themes/alfred/alfred.plymouth 200 2>/dev/null || true
|
|
|
|
# ── 10. GRUB branding ──
|
|
if [ -f /etc/default/grub ]; then
|
|
sed -i 's/GRUB_DISTRIBUTOR=.*/GRUB_DISTRIBUTOR="Alfred Linux"/' /etc/default/grub
|
|
# Add gfxmode if not present
|
|
grep -q '^GRUB_GFXMODE=' /etc/default/grub || echo 'GRUB_GFXMODE=1920x1080' >> /etc/default/grub
|
|
fi
|
|
|
|
# GRUB theme directory
|
|
mkdir -p /boot/grub/themes/alfred
|
|
cat > /boot/grub/themes/alfred/theme.txt << 'GRUBTHEME'
|
|
desktop-color: "#0a0a14"
|
|
title-text: "Alfred Linux 2.0"
|
|
title-color: "#00D4FF"
|
|
title-font: "DejaVu Sans Bold 24"
|
|
message-color: "#8a8a9a"
|
|
message-font: "DejaVu Sans 14"
|
|
|
|
+ boot_menu {
|
|
left = 25%
|
|
top = 30%
|
|
width = 50%
|
|
height = 50%
|
|
item_color = "#e8e8f0"
|
|
selected_item_color = "#00D4FF"
|
|
item_font = "DejaVu Sans 16"
|
|
selected_item_font = "DejaVu Sans Bold 16"
|
|
item_height = 30
|
|
item_padding = 5
|
|
item_spacing = 5
|
|
}
|
|
|
|
+ progress_bar {
|
|
id = "__timeout__"
|
|
left = 30%
|
|
top = 85%
|
|
width = 40%
|
|
height = 10
|
|
fg_color = "#00D4FF"
|
|
bg_color = "#1a1a2e"
|
|
border_color = "#333355"
|
|
text_color = "#e8e8f0"
|
|
}
|
|
GRUBTHEME
|
|
|
|
# ── 11. LightDM greeter config ──
|
|
mkdir -p /etc/lightdm
|
|
cat > /etc/lightdm/lightdm-gtk-greeter.conf << 'LDM'
|
|
[greeter]
|
|
background=/usr/share/backgrounds/alfred-linux/default.png
|
|
theme-name=Arc-Dark
|
|
icon-theme-name=Papirus-Dark
|
|
font-name=Inter 11
|
|
position=50%,center 50%,center
|
|
panel-position=bottom
|
|
clock-format=%A, %B %d %H:%M
|
|
indicators=~host;~spacer;~clock;~spacer;~session;~a11y;~power
|
|
LDM
|
|
|
|
# ── 11b. LightDM autologin for live session ──
|
|
mkdir -p /etc/lightdm/lightdm.conf.d
|
|
cat > /etc/lightdm/lightdm.conf.d/50-alfred-autologin.conf << 'AUTOLOGIN'
|
|
[Seat:*]
|
|
autologin-user=user
|
|
autologin-user-timeout=0
|
|
autologin-session=xfce
|
|
AUTOLOGIN
|
|
|
|
# ── 12. System branding — v2.0 ──
|
|
cat > /etc/os-release << 'OSREL'
|
|
PRETTY_NAME="Alfred Linux 2.0"
|
|
NAME="Alfred Linux"
|
|
VERSION_ID="2.0"
|
|
VERSION="2.0 (Sovereign)"
|
|
VERSION_CODENAME=sovereign
|
|
ID=alfred-linux
|
|
ID_LIKE=debian
|
|
HOME_URL="https://alfredlinux.com"
|
|
SUPPORT_URL="https://gositeme.com/support.php"
|
|
BUG_REPORT_URL="https://gositeme.com/support.php"
|
|
OSREL
|
|
|
|
cat > /etc/issue << 'ISSUE'
|
|
|
|
Alfred Linux 2.0 (Sovereign)
|
|
The Sovereign Operating System
|
|
\n \l
|
|
|
|
ISSUE
|
|
|
|
cat > /etc/issue.net << 'ISSUENET'
|
|
Alfred Linux 2.0 (Sovereign)
|
|
ISSUENET
|
|
|
|
echo "Alfred Linux 2.0" > /etc/debian_chroot
|
|
|
|
# ── 13. XFCE Panel branding ──
|
|
mkdir -p /etc/skel/.config/xfce4/panel
|
|
# Panel config will be created by XFCE on first login
|
|
# We just ensure the icon is available
|
|
mkdir -p /usr/share/icons/hicolor/48x48/apps/
|
|
if command -v convert &>/dev/null; then
|
|
# Generate simple Alfred icon (blue circle with "A")
|
|
convert -size 48x48 xc:'#00D4FF' \
|
|
-fill '#0a0a14' -font 'DejaVu-Sans-Bold' -pointsize 32 \
|
|
-gravity center -annotate +0+0 'A' \
|
|
-alpha set -virtual-pixel transparent \
|
|
\( +clone -threshold -1 -negate -morphology Distance Euclidean:1,20\! \
|
|
-level 60%,100% \) \
|
|
-compose DstIn -composite \
|
|
/usr/share/icons/hicolor/48x48/apps/alfred-linux.png 2>/dev/null || true
|
|
|
|
# Also create 128x128 and 256x256 versions
|
|
for size in 128 256; do
|
|
mkdir -p /usr/share/icons/hicolor/${size}x${size}/apps/
|
|
convert -size ${size}x${size} xc:'#00D4FF' \
|
|
-fill '#0a0a14' -font 'DejaVu-Sans-Bold' -pointsize $((size*2/3)) \
|
|
-gravity center -annotate +0+0 'A' \
|
|
/usr/share/icons/hicolor/${size}x${size}/apps/alfred-linux.png 2>/dev/null || true
|
|
done
|
|
fi
|
|
|
|
# ── 14. WireGuard mesh-ready config wizard ──
|
|
cat > /usr/local/bin/alfred-mesh-setup << 'MESHSCRIPT'
|
|
#!/bin/bash
|
|
echo ""
|
|
echo " ╔═══════════════════════════════════════╗"
|
|
echo " ║ Alfred Mesh Network Setup ║"
|
|
echo " ╚═══════════════════════════════════════╝"
|
|
echo ""
|
|
echo "This wizard will help you join the Alfred mesh network."
|
|
echo ""
|
|
echo "1. Generate new WireGuard keypair"
|
|
echo "2. Import existing config"
|
|
echo "3. Cancel"
|
|
echo ""
|
|
read -p "Choose [1-3]: " choice
|
|
case $choice in
|
|
1)
|
|
wg genkey | tee /tmp/wg-privkey | wg pubkey > /tmp/wg-pubkey
|
|
echo ""
|
|
echo "Your public key: $(cat /tmp/wg-pubkey)"
|
|
echo "Share this with your mesh admin."
|
|
echo "Private key saved temporarily at /tmp/wg-privkey"
|
|
echo ""
|
|
echo "To complete setup, create /etc/wireguard/wg0.conf with:"
|
|
echo " [Interface]"
|
|
echo " PrivateKey = $(cat /tmp/wg-privkey)"
|
|
echo " Address = <your-mesh-ip>/24"
|
|
echo " [Peer]"
|
|
echo " PublicKey = <admin-pubkey>"
|
|
echo " Endpoint = <admin-ip>:51820"
|
|
echo " AllowedIPs = 10.66.66.0/24"
|
|
rm -f /tmp/wg-privkey /tmp/wg-pubkey
|
|
;;
|
|
2)
|
|
read -p "Path to WireGuard config file: " cfgpath
|
|
if [[ -f "$cfgpath" ]]; then
|
|
sudo cp "$cfgpath" /etc/wireguard/wg0.conf
|
|
sudo chmod 600 /etc/wireguard/wg0.conf
|
|
echo "Config imported. Start with: sudo wg-quick up wg0"
|
|
else
|
|
echo "File not found: $cfgpath"
|
|
fi
|
|
;;
|
|
*)
|
|
echo "Cancelled."
|
|
;;
|
|
esac
|
|
MESHSCRIPT
|
|
chmod +x /usr/local/bin/alfred-mesh-setup
|
|
|
|
echo "[Alfred Linux v2.0] Branding and customizations applied successfully."
|