Add tools to build v86 images from docker container

This commit is contained in:
Fabian 2018-08-17 11:31:38 -05:00
parent 28ac891dc3
commit 8da18d339e
56 changed files with 2062 additions and 0 deletions

View file

@ -0,0 +1,57 @@
FROM i386/debian
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && \
apt-get --yes --no-install-recommends install \
linux-image-4.9.0-6-686 grub2 systemd \
libterm-readline-perl-perl \
unzip bzip2 xz-utils \
fluxbox \
xserver-xorg-input-kbd xserver-xorg-input-mouse xserver-xorg-input-evdev \
xserver-xorg-video-fbdev xserver-xorg-video-vesa \
xserver-xorg x11-xserver-utils xinit dbus-x11 \
libgdk-pixbuf2.0 libpango-1.0 libpangocairo-1.0 libgtk2.0-bin \
libc-l10n locales \
fonts-noto fonts-droid-fallback \
strace file xterm vim apt-file \
winbind cabextract \
dhcpcd5 \
wget curl \
&& \
echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen \
locale-gen \
chsh -s /bin/bash && \
echo "root:root" | chpasswd && \
mkdir -p /etc/systemd/system/serial-getty@ttyS0.service.d/ && \
systemctl enable serial-getty@ttyS0.service && \
rm /lib/systemd/system/getty.target.wants/getty-static.service && \
rm /etc/motd /etc/issue && \
systemctl disable winbind.service && \
systemctl disable systemd-timesyncd.service && \
systemctl disable apt-daily.timer && \
systemctl disable apt-daily-upgrade.timer && \
echo "tmpfs /tmp tmpfs nodev,nosuid 0 0" >> /etc/fstab
COPY getty-noclear.conf getty-override.conf /etc/systemd/system/getty@tty1.service.d/
COPY getty-autologin-serial.conf /etc/systemd/system/serial-getty@ttyS0.service.d/
COPY logind.conf /etc/systemd/logind.conf
#COPY xinitrc /root/.xinitrc
COPY xorg.conf /etc/X11/
COPY fluxbox /root/.fluxbox
COPY boot-9p /etc/initramfs-tools/scripts/boot-9p
# this needs to be commented out in order to boot from hdd
RUN printf '%s\n' 9p 9pnet 9pnet_virtio virtio virtio_ring virtio_pci | tee -a /etc/initramfs-tools/modules && \
echo 'BOOT=boot-9p' | tee -a /etc/initramfs-tools/initramfs.conf && \
update-initramfs -u
RUN apt-get --yes clean && \
rm -r /var/lib/apt/lists/* && \
rm -r /usr/share/doc/* && \
rm -r /usr/share/man/* && \
rm -r /usr/share/locale/?? && \
rm /var/log/*.log /var/log/lastlog /var/log/wtmp /var/log/apt/*.log /var/log/apt/*.xz

View file

@ -0,0 +1,33 @@
# 9p filesystem mounting -*- shell-script -*-
mountroot()
{
wait_for_udev 10
if [ ${readonly} = y ]; then
roflag="-o ro"
else
roflag="-o rw"
fi
#echo "Running: mount -t 9p -o cache=mmap ${ROOT} ${rootmnt}"
#mount -t 9p -o cache=mmap ${ROOT} ${rootmnt}
echo "Running: mount -t 9p -o cache=fscache ${ROOT} ${rootmnt}"
mount -t 9p -o cache=fscache ${ROOT} ${rootmnt}
echo "mount finished with code $?"
}
mount_top()
{
echo top
}
mount_premount()
{
echo premount
}
mount_bottom()
{
echo bottom
}

View file

@ -0,0 +1,6 @@
#!/usr/bin/env bash
set -e
docker build . --rm --tag i386/debian-full
docker rm debian-full || true
docker create -t -i --name debian-full i386/debian-full bash

View file

@ -0,0 +1,97 @@
#!/usr/bin/env node
"use strict";
const path = require("path");
// TODO:
// - Timeout
console.log("Don't forget to run make build/libv86.js before running this script");
var fs = require("fs");
var V86 = require("./../../build/libv86.js").V86;
const V86_ROOT = path.join(__dirname, "../..");
var OUTPUT_FILE = path.join(V86_ROOT, "images/debian-state-base.bin");
var SCREEN_FILE = "/tmp/screen_debian_full.txt";
process.stdin.setRawMode(true);
process.stdin.resume();
process.stdin.setEncoding("utf8");
var emulator = new V86({
bios: { url: path.join(V86_ROOT, "/bios/seabios.bin") },
vga_bios: { url: path.join(V86_ROOT, "/bios/vgabios.bin") },
hda: { url: path.join(V86_ROOT, "/images/debian-9p-boot.img"), async: true, },
autostart: true,
memory_size: 512 * 1024 * 1024,
vga_memory_size: 8 * 1024 * 1024,
network_relay_url: "<UNUSED>",
filesystem: {
basefs: {
url: path.join(V86_ROOT, "/images/debian-base-fs.json"),
},
baseurl: path.join(V86_ROOT, "/images/debian-9p-rootfs-flat/"),
//baseurl: path.join(V86_ROOT, "/images/debian-9p-rootfs/"),
},
screen_dummy: true,
});
console.log("Now booting, please stand by ...");
var boot_start = Date.now();
var serial_text = "";
process.stdin.on("data", function(c)
{
if(c === "\u0003")
{
// ctrl c
process.exit();
}
else
{
emulator.serial0_send(c);
}
});
emulator.add_listener("serial0-output-char", function(c)
{
process.stdout.write(c);
serial_text += c;
if(serial_text.endsWith("root@localhost:~# "))
{
console.error("\nBooted in %d", (Date.now() - boot_start) / 1000);
// wait a few seconds as the serial console finishes faster than the screen terminal
setTimeout(function ()
{
emulator.save_state(function(err, s)
{
if(err)
{
throw err;
}
fs.writeFile(OUTPUT_FILE, new Uint8Array(s), function(e)
{
if(e) throw e;
console.error("Saved as " + OUTPUT_FILE);
emulator.stop();
});
});
}, 5000);
}
});
//function save_screen()
//{
// var screen = emulator.screen_adapter.get_text_screen();
// fs.writeFile(SCREEN_FILE, screen.join("\n"), function(e) { if(e) throw e; });
//}
//
//setInterval(save_screen, 1000);

View file

@ -0,0 +1,95 @@
#!/usr/bin/env bash
set -veu
if [ $(id -u) != "0" ]
then
echo "Please run as root"
exit 1
fi
OUTFILE=$(dirname "$0")/../../images/debian-9p-boot.img
OUT_ROOTFS=$(dirname "$0")/../../images/debian-9p-rootfs
OUT_ROOTFS_FLAT=$(dirname "$0")/../../images/debian-9p-rootfs-flat
OUT_FSJSON=$(dirname "$0")/../../images/debian-base-fs.json
CONTAINER_NAME=debian-full
# vmlinuz, initrd.img and grub take about 25M as of time of this writing, be on
# the safe side with 64M
dd if=/dev/zero of=$OUTFILE bs=1k count=64k
(
echo o # Create a new empty DOS partition table
echo n # Add a new partition
echo p # Primary partition
echo 1 # Partition number
echo 2048 # First sector
echo # Last sector (Accept default: varies)
echo a # make bootable
echo w # Write changes
echo q # quit
) | fdisk $OUTFILE
# 1048576 is 2048 (first sector) * 512 (sector size)
mkfs.ext4 -F -E offset=1048576 $OUTFILE
KPARTX_OUTPUT=$(kpartx -a -v $OUTFILE)
echo $KPARTX_OUTPUT
LOOP_PARTITION=$(echo $KPARTX_OUTPUT | grep -o 'loop[0-9]\+p[0-9]\+')
LOOP_DEV=$(echo $LOOP_PARTITION | grep -o 'loop[0-9]\+')
echo $LOOP_PARTITION
echo $LOOP_DEV
function finish_kpartx {
kpartx -d $OUTFILE
}
trap finish_kpartx EXIT
ls -lah /dev/mapper/$LOOP_PARTITION
mount /dev/mapper/$LOOP_PARTITION /mnt
function finish_mount {
umount /mnt
finish_kpartx
}
trap finish_mount EXIT
rm -rf $OUT_ROOTFS/ && mkdir $OUT_ROOTFS/
docker export $CONTAINER_NAME | tar -xvC $OUT_ROOTFS/
$(dirname "$0")/../../tools/fs2json.py --out $OUT_FSJSON $OUT_ROOTFS/
chmod 644 $OUT_FSJSON
# Note: Not deleting old files here
$(dirname "$0")/../../tools/copy-to-sha256.py $OUT_ROOTFS $OUT_ROOTFS_FLAT
#find $OUT_ROOTFS/ -type d -exec chmod 755 {} ";"
#find $OUT_ROOTFS/ -type f -exec chmod 644 {} ";"
cp -r -av $OUT_ROOTFS/boot/ /mnt/boot/
cp -av $OUT_ROOTFS/{initrd*,vmlinuz*} /mnt/
grub-install --recheck --target=i386-pc --locales= --themes= --fonts= --root-directory /mnt/ /dev/$LOOP_DEV
cat > /mnt/boot/grub/grub.cfg << 'EOF'
set root='hd0' # XXX: I believe this has no significance, but is required to exist by grub
set timeout_style=menu
set timeout=0
menuentry 'Linux' {
#insmod ext2
#insmod gzio
#insmod fat
set root='hd0,msdos1'
echo 'Loading Linux linux ...'
#linux /vmlinuz rw root=/dev/sda1 rootfstype=ext4 init=/bin/systemd
linux /vmlinuz rw init=/bin/systemd root=host9p console=ttyS0
#linux /boot/vmlinuz debug verbose rw root=/dev/sda1 rootfstype=ext4
echo 'Loading initial ramdisk ...'
initrd /initrd.img
}
EOF
echo $OUTFILE created.

View file

@ -0,0 +1,4 @@
[app] (name=fbrun)
[Position] (WINCENTER) {0 0}
[Layer] {2}
[end]

View file

@ -0,0 +1,82 @@
! If you're looking for settings to configure, they won't be saved here until
! you change something in the fluxbox configuration menu.
session.menuFile: ~/.fluxbox/menu
session.keyFile: ~/.fluxbox/keys
session.styleFile: ~/.fluxbox/styles/Clearlooks
session.screen0.rootCommand: fbsetroot -solid black
session.screen0.slit.layer: Dock
session.screen0.slit.onhead: 0
session.screen0.slit.acceptKdeDockapps: true
session.screen0.slit.autoHide: false
session.screen0.slit.placement: RightBottom
session.screen0.slit.alpha: 255
session.screen0.slit.maxOver: false
session.screen0.window.focus.alpha: 255
session.screen0.window.unfocus.alpha: 255
session.screen0.tabs.usePixmap: true
session.screen0.tabs.maxOver: false
session.screen0.tabs.intitlebar: true
session.screen0.titlebar.left: Stick
session.screen0.titlebar.right: Minimize Maximize Close
session.screen0.iconbar.usePixmap: true
session.screen0.iconbar.mode: {static groups} (workspace)
session.screen0.iconbar.alignment: Relative
session.screen0.iconbar.iconWidth: 128
session.screen0.iconbar.iconTextPadding: 10
session.screen0.clientMenu.usePixmap: true
session.screen0.menu.alpha: 255
session.screen0.toolbar.placement: BottomCenter
session.screen0.toolbar.layer: Dock
session.screen0.toolbar.autoHide: false
session.screen0.toolbar.visible: false
session.screen0.toolbar.tools: prevworkspace, workspacename, nextworkspace, iconbar, systemtray, clock
session.screen0.toolbar.onhead: 1
session.screen0.toolbar.widthPercent: 100
session.screen0.toolbar.maxOver: false
session.screen0.toolbar.height: 0
session.screen0.toolbar.alpha: 255
session.screen0.tab.placement: TopLeft
session.screen0.tab.width: 64
session.screen0.tabFocusModel: ClickToTabFocus
session.screen0.autoRaise: true
session.screen0.maxDisableMove: false
session.screen0.edgeSnapThreshold: 10
session.screen0.tooltipDelay: 500
session.screen0.colPlacementDirection: TopToBottom
session.screen0.opaqueMove: true
session.screen0.windowPlacement: RowMinOverlapPlacement
session.screen0.focusNewWindows: true
session.screen0.clickRaises: true
session.screen0.maxDisableResize: false
session.screen0.allowRemoteActions: false
session.screen0.windowMenu: /root/.fluxbox/windowmenu
session.screen0.fullMaximization: false
session.screen0.defaultDeco: NORMAL
session.screen0.noFocusWhileTypingDelay: 0
session.screen0.menuDelay: 200
session.screen0.workspacewarping: true
session.screen0.focusSameHead: false
session.screen0.workspaceNames: Workspace 1,Workspace 2,Workspace 3,Workspace 4,
session.screen0.workspaces: 4
session.screen0.maxIgnoreIncrement: true
session.screen0.showwindowposition: false
session.screen0.focusModel: ClickFocus
session.screen0.rowPlacementDirection: LeftToRight
session.screen0.strftimeFormat: %k:%M
session.doubleClickInterval: 250
session.slitlistFile: /root/.fluxbox/slitlist
session.cacheLife: 5
session.tabPadding: 0
session.cacheMax: 200
session.appsFile: /root/.fluxbox/apps
session.ignoreBorder: false
session.styleOverlay: /root/.fluxbox/overlay
session.forcePseudoTransparency: false
session.tabsAttachArea: Window
session.autoRaiseDelay: 250
session.configVersion: 13
session.colorsPerChannel: 4
session.menuSearch: itemstart

View file

@ -0,0 +1,137 @@
# click on the desktop to get menus
OnDesktop Mouse1 :HideMenus
OnDesktop Mouse2 :WorkspaceMenu
OnDesktop Mouse3 :RootMenu
# scroll on the desktop to change workspaces
OnDesktop Mouse4 :PrevWorkspace
OnDesktop Mouse5 :NextWorkspace
# scroll on the toolbar to change current window
OnToolbar Mouse4 :PrevWindow {static groups} (iconhidden=no)
OnToolbar Mouse5 :NextWindow {static groups} (iconhidden=no)
# alt + left/right click to move/resize a window
OnWindow Mod1 Mouse1 :MacroCmd {Raise} {Focus} {StartMoving}
OnWindowBorder Move1 :StartMoving
OnWindow Mod1 Mouse3 :MacroCmd {Raise} {Focus} {StartResizing NearestCorner}
OnLeftGrip Move1 :StartResizing bottomleft
OnRightGrip Move1 :StartResizing bottomright
# alt + middle click to lower the window
OnWindow Mod1 Mouse2 :Lower
# control-click a window's titlebar and drag to attach windows
OnTitlebar Control Mouse1 :StartTabbing
# double click on the titlebar to shade
OnTitlebar Double Mouse1 :Shade
# left click on the titlebar to move the window
OnTitlebar Mouse1 :MacroCmd {Raise} {Focus} {ActivateTab}
OnTitlebar Move1 :StartMoving
# middle click on the titlebar to lower
OnTitlebar Mouse2 :Lower
# right click on the titlebar for a menu of options
OnTitlebar Mouse3 :WindowMenu
# alt-tab
Mod1 Tab :NextWindow {groups} (workspace=[current])
Mod1 Shift Tab :PrevWindow {groups} (workspace=[current])
# cycle through tabs in the current window
Mod4 Tab :NextTab
Mod4 Shift Tab :PrevTab
# go to a specific tab in the current window
Mod4 1 :Tab 1
Mod4 2 :Tab 2
Mod4 3 :Tab 3
Mod4 4 :Tab 4
Mod4 5 :Tab 5
Mod4 6 :Tab 6
Mod4 7 :Tab 7
Mod4 8 :Tab 8
Mod4 9 :Tab 9
# open a terminal
Mod1 F1 :Exec xterm
# open a dialog to run programs
Mod1 F2 :Exec fbrun
# volume settings, using common keycodes
# if these don't work, use xev to find out your real keycodes
176 :Exec amixer sset Master,0 1+
174 :Exec amixer sset Master,0 1-
160 :Exec amixer sset Master,0 toggle
# current window commands
Mod1 F4 :Close
Mod1 F5 :Kill
Mod1 F9 :Minimize
Mod1 F10 :Maximize
Mod1 F11 :Fullscreen
# open the window menu
Mod1 space :WindowMenu
# exit fluxbox
Control Mod1 Delete :Exit
# change to previous/next workspace
Control Mod1 Left :PrevWorkspace
Control Mod1 Right :NextWorkspace
# send the current window to previous/next workspace
Mod4 Left :SendToPrevWorkspace
Mod4 Right :SendToNextWorkspace
# send the current window and follow it to previous/next workspace
Control Mod4 Left :TakeToPrevWorkspace
Control Mod4 Right :TakeToNextWorkspace
# change to a specific workspace
Control F1 :Workspace 1
Control F2 :Workspace 2
Control F3 :Workspace 3
Control F4 :Workspace 4
Control F5 :Workspace 5
Control F6 :Workspace 6
Control F7 :Workspace 7
Control F8 :Workspace 8
Control F9 :Workspace 9
Control F10 :Workspace 10
Control F11 :Workspace 11
Control F12 :Workspace 12
# send the current window to a specific workspace
Mod4 F1 :SendToWorkspace 1
Mod4 F2 :SendToWorkspace 2
Mod4 F3 :SendToWorkspace 3
Mod4 F4 :SendToWorkspace 4
Mod4 F5 :SendToWorkspace 5
Mod4 F6 :SendToWorkspace 6
Mod4 F7 :SendToWorkspace 7
Mod4 F8 :SendToWorkspace 8
Mod4 F9 :SendToWorkspace 9
Mod4 F10 :SendToWorkspace 10
Mod4 F11 :SendToWorkspace 11
Mod4 F12 :SendToWorkspace 12
# send the current window and change to a specific workspace
Control Mod4 F1 :TakeToWorkspace 1
Control Mod4 F2 :TakeToWorkspace 2
Control Mod4 F3 :TakeToWorkspace 3
Control Mod4 F4 :TakeToWorkspace 4
Control Mod4 F5 :TakeToWorkspace 5
Control Mod4 F6 :TakeToWorkspace 6
Control Mod4 F7 :TakeToWorkspace 7
Control Mod4 F8 :TakeToWorkspace 8
Control Mod4 F9 :TakeToWorkspace 9
Control Mod4 F10 :TakeToWorkspace 10
Control Mod4 F11 :TakeToWorkspace 11
Control Mod4 F12 :TakeToWorkspace 12

View file

View file

@ -0,0 +1,61 @@
# Generated by fluxbox-generate_menu
#
# If you read this it means you want to edit this file manually, so here
# are some useful tips:
#
# - You can add your own menu-entries to ~/.fluxbox/usermenu
#
# - If you miss apps please let me know and I will add them for the next
# release.
#
# - The -r option prevents removing of empty menu entries and lines which
# makes things much more readable.
#
# - To prevent any other app from overwriting your menu
# you can change the menu name in ~/.fluxbox/init to:
# session.menuFile: ~/.fluxbox/my-menu
[begin] (Fluxbox)
[encoding] {UTF-8}
[exec] (xterm) {xterm}
[exec] (firefox) {} execname is NULL; cannot lookup
[exec] (Run) {fbrun}
[submenu] (Terminals)
[exec] (xterm) {xterm}
[end]
[submenu] (Editors)
[exec] (vim) {xterm -e vim}
[exec] (vi) {xterm -e vi}
[end]
[submenu] (Multimedia)
[submenu] (X-utils)
[exec] (Reload .Xdefaults) {xrdb -load $HOME/.Xdefaults}
[end]
[end]
[submenu] (Office)
[exec] (Open Office) {soffice}
[end]
[submenu] (System Tools)
[exec] (top) {xterm -e top}
[end]
[submenu] (Fluxbox menu)
[config] (Configure)
[submenu] (System Styles) {Choose a style...}
[stylesdir] (/usr/share/fluxbox/styles)
[end]
[submenu] (User Styles) {Choose a style...}
[stylesdir] (~/.fluxbox/styles)
[end]
[workspaces] (Workspace List)
[submenu] (Tools)
[exec] (Run) {fbrun}
[exec] (Regen Menu) {fluxbox-generate_menu}
[end]
[commanddialog] (Fluxbox Command)
[reconfig] (Reload config)
[restart] (Restart)
[exec] (About) {(fluxbox -v; fluxbox -info | sed 1d) | xmessage -file - -center}
[separator]
[exit] (Exit)
[end]
[endencoding]
[end]

View file

@ -0,0 +1,2 @@
! The following line will prevent styles from setting the background.
background: none

View file

@ -0,0 +1,32 @@
/* XPM */
static char * bullet_active_xpm[] = {
"6 10 19 1",
" c None",
". c #CEDEF2",
"+ c #CFDFF2",
"@ c #CEDEF1",
"# c #FFFFFF",
"$ c #CDDDF1",
"% c #CDDDF2",
"& c #CFDEF2",
"* c #F7FAFD",
"= c #CCDCF1",
"- c #F7F9FD",
"; c #C9DAEF",
"> c #CBDBEF",
", c #C8D9EF",
"' c #C6D8EE",
") c #C7D8EE",
"! c #C6D7ED",
"~ c #C5D7ED",
"{ c #C5D7EE",
".+ ",
"@#. ",
" $#% ",
" &#$ ",
" *#=",
" -#;",
" >#, ",
" '#) ",
"!#' ",
"~{ "};

View file

@ -0,0 +1,22 @@
/* XPM */
static char * bullet_xpm[] = {
"12 12 7 1",
" c None",
". c #808080",
"+ c #7F7F7F",
"@ c #000000",
"# c #797979",
"$ c #131313",
"% c #787878",
" ",
" .+ ",
" .@+ ",
" .@+ ",
" #@+ ",
" $@+ ",
" $@+ ",
" %@+ ",
" .@+ ",
" .@+ ",
" .+ ",
" "};

View file

@ -0,0 +1,28 @@
/* XPM */
static char * close_active_xpm[] = {
"12 12 13 1",
" c None",
". c #49678B",
"+ c #ADC7E9",
"@ c #A7C3E7",
"# c #A1BFE5",
"$ c #F4F5F6",
"% c #9BBAE2",
"& c #90B2DE",
"* c #86ABD9",
"= c #84AAD8",
"- c #82A8D6",
"; c #7FA6D5",
"> c #7CA4D3",
"............",
".++++++++++.",
".@@@@@@@@@@.",
".##$$##$$##.",
".%%$$$$$$%%.",
".&&&$$$$&&&.",
".***$$$$***.",
".==$$$$$$==.",
".--$$--$$--.",
".;;;;;;;;;;.",
".>>>>>>>>>>.",
"............"};

View file

@ -0,0 +1,25 @@
/* XPM */
static char * close_inactive_xpm[] = {
"12 12 10 1",
" c None",
". c #928F8B",
"+ c #FFFFFF",
"@ c #6D6C6C",
"# c #FEFDFD",
"$ c #F9F8F8",
"% c #FAF9F9",
"& c #FBFAFA",
"* c #FCFBFB",
"= c #FDFDFD",
"............",
".++++++++++.",
".++++++++++.",
".++@@++@@++.",
".++@@@@@@++.",
".###@@@@###.",
".$$$@@@@$$$.",
".%%@@@@@@%%.",
".&&@@&&@@&&.",
".**********.",
".==========.",
"............"};

View file

@ -0,0 +1,19 @@
/* XPM */
static char * close_pressed_xpm[] = {
"12 12 4 1",
" c None",
". c #49678B",
"+ c #7AA1D2",
"@ c #F4F5F6",
"............",
".++++++++++.",
".++++++++++.",
".++@@++@@++.",
".++@@@@@@++.",
".+++@@@@+++.",
".+++@@@@+++.",
".++@@@@@@++.",
".++@@++@@++.",
".++++++++++.",
".++++++++++.",
"............"};

View file

@ -0,0 +1,28 @@
/* XPM */
static char * label_focus_xpm[] = {
"1 12 13 1",
" c None",
". c #94B6E0",
"+ c #93B5DF",
"@ c #91B4DF",
"# c #90B3DE",
"$ c #8EB1DD",
"% c #8BAFDB",
"& c #86ABD9",
"* c #85AAD8",
"= c #84A9D7",
"- c #82A8D6",
"; c #81A7D5",
"> c #80A6D5",
".",
"+",
"@",
"#",
"$",
"%",
"&",
"*",
"=",
"-",
";",
">"};

View file

@ -0,0 +1,28 @@
/* XPM */
static char * label_unfocus_xpm[] = {
"1 12 13 1",
" c None",
". c #E8E7E6",
"+ c #E7E6E5",
"@ c #E6E5E3",
"# c #E5E4E2",
"$ c #E4E3E1",
"% c #E2E1DF",
"& c #DEDCDA",
"* c #DDDBD9",
"= c #DCDAD8",
"- c #DBD9D7",
"; c #DAD8D6",
"> c #D9D7D5",
".",
"+",
"@",
"#",
"$",
"%",
"&",
"*",
"=",
"-",
";",
">"};

View file

@ -0,0 +1,28 @@
/* XPM */
static char * maximize_active_xpm[] = {
"12 12 13 1",
" c None",
". c #49678B",
"+ c #ADC7E9",
"@ c #A7C3E7",
"# c #A1BFE5",
"$ c #F4F5F6",
"% c #9BBAE2",
"& c #90B2DE",
"* c #86ABD9",
"= c #84AAD8",
"- c #82A8D6",
"; c #7FA6D5",
"> c #7CA4D3",
"............",
".++++++++++.",
".@@@@@@@@@@.",
".##$$$$$$##.",
".%%$$$$$$%%.",
".&&$&&&&$&&.",
".**$****$**.",
".==$====$==.",
".--$$$$$$--.",
".;;;;;;;;;;.",
".>>>>>>>>>>.",
"............"};

View file

@ -0,0 +1,25 @@
/* XPM */
static char * maximize_inactive_xpm[] = {
"12 12 10 1",
" c None",
". c #928F8B",
"+ c #FFFFFF",
"@ c #6D6C6C",
"# c #FEFDFD",
"$ c #F9F8F8",
"% c #FAF9F9",
"& c #FBFAFA",
"* c #FCFBFB",
"= c #FDFDFD",
"............",
".++++++++++.",
".++++++++++.",
".++@@@@@@++.",
".++@@@@@@++.",
".##@####@##.",
".$$@$$$$@$$.",
".%%@%%%%@%%.",
".&&@@@@@@&&.",
".**********.",
".==========.",
"............"};

View file

@ -0,0 +1,19 @@
/* XPM */
static char * maximize_pressed_xpm[] = {
"12 12 4 1",
" c None",
". c #49678B",
"+ c #7AA1D2",
"@ c #F4F5F6",
"............",
".++++++++++.",
".++++++++++.",
".++@@@@@@++.",
".++@@@@@@++.",
".++@++++@++.",
".++@++++@++.",
".++@++++@++.",
".++@@@@@@++.",
".++++++++++.",
".++++++++++.",
"............"};

View file

@ -0,0 +1,28 @@
/* XPM */
static char * menu_active_xpm[] = {
"12 12 13 1",
" c None",
". c #49678B",
"+ c #ADC7E9",
"@ c #A7C3E7",
"# c #A1BFE5",
"$ c #F4F5F6",
"% c #9BBAE2",
"& c #90B2DE",
"* c #86ABD9",
"= c #84AAD8",
"- c #82A8D6",
"; c #7FA6D5",
"> c #7CA4D3",
"............",
".++++++++++.",
".@@@@@@@@@@.",
".####$$####.",
".%%%%$$%%%%.",
".&&$$$$$$&&.",
".**$$$$$$**.",
".====$$====.",
".----$$----.",
".;;;;;;;;;;.",
".>>>>>>>>>>.",
"............"};

View file

@ -0,0 +1,37 @@
/* XPM */
static char * menu_hilite_xpm[] = {
"1 17 17 1",
" c None",
". c #4B6E99",
"+ c #A6C4E8",
"@ c #A4C2E7",
"# c #A2C0E6",
"$ c #A0BFE5",
"% c #9EBDE5",
"& c #9CBCE4",
"* c #9ABAE3",
"= c #96B7E1",
"- c #91B3DE",
"; c #8FB2DD",
"> c #8DB0DC",
", c #8BAFDB",
"' c #89ADDA",
") c #87ACD9",
"! c #85AAD8",
".",
"+",
"@",
"#",
"$",
"%",
"&",
"*",
"=",
"-",
";",
">",
",",
"'",
")",
"!",
"."};

View file

@ -0,0 +1,25 @@
/* XPM */
static char * menu_inactive_xpm[] = {
"12 12 10 1",
" c None",
". c #928F8B",
"+ c #FFFFFF",
"@ c #6D6C6C",
"# c #FEFDFD",
"$ c #F9F8F8",
"% c #FAF9F9",
"& c #FBFAFA",
"* c #FCFBFB",
"= c #FDFDFD",
"............",
".++++++++++.",
".++++++++++.",
".++++@@++++.",
".++++@@++++.",
".##@@@@@@##.",
".$$@@@@@@$$.",
".%%%%@@%%%%.",
".&&&&@@&&&&.",
".**********.",
".==========.",
"............"};

View file

@ -0,0 +1,19 @@
/* XPM */
static char * menu_pressed_xpm[] = {
"12 12 4 1",
" c None",
". c #49678B",
"+ c #7AA1D2",
"@ c #F4F5F6",
"............",
".++++++++++.",
".++++++++++.",
".++++@@++++.",
".++++@@++++.",
".++@@@@@@++.",
".++@@@@@@++.",
".++++@@++++.",
".++++@@++++.",
".++++++++++.",
".++++++++++.",
"............"};

View file

@ -0,0 +1,28 @@
/* XPM */
static char * hide_active_xpm[] = {
"12 12 13 1",
" c None",
". c #49678B",
"+ c #ADC7E9",
"@ c #A7C3E7",
"# c #A1BFE5",
"$ c #9BBAE2",
"% c #90B2DE",
"& c #86ABD9",
"* c #84AAD8",
"= c #FFFFFF",
"- c #82A8D6",
"; c #7FA6D5",
"> c #7CA4D3",
"............",
".++++++++++.",
".@@@@@@@@@@.",
".##########.",
".$$$$$$$$$$.",
".%%%%%%%%%%.",
".&&&&&&&&&&.",
".**======**.",
".--======--.",
".;;;;;;;;;;.",
".>>>>>>>>>>.",
"............"};

View file

@ -0,0 +1,25 @@
/* XPM */
static char * hide_inactive_xpm[] = {
"12 12 10 1",
" c None",
". c #928F8B",
"+ c #FFFFFF",
"@ c #FEFDFD",
"# c #F9F8F8",
"$ c #FAF9F9",
"% c #6D6C6C",
"& c #FBFAFA",
"* c #FCFBFB",
"= c #FDFDFD",
"............",
".++++++++++.",
".++++++++++.",
".++++++++++.",
".++++++++++.",
".@@@@@@@@@@.",
".##########.",
".$$%%%%%%$$.",
".&&%%%%%%&&.",
".**********.",
".==========.",
"............"};

View file

@ -0,0 +1,19 @@
/* XPM */
static char * hide_pressed_xpm[] = {
"12 12 4 1",
" c None",
". c #49678B",
"+ c #7AA1D2",
"@ c #F4F5F6",
"............",
".++++++++++.",
".++++++++++.",
".++++++++++.",
".++++++++++.",
".++++++++++.",
".++++++++++.",
".++@@@@@@++.",
".++@@@@@@++.",
".++++++++++.",
".++++++++++.",
"............"};

View file

@ -0,0 +1,49 @@
/* XPM */
static char * selected_active_xpm[] = {
"13 13 33 1",
" c None",
". c #4B6E99",
"+ c #C9DAEF",
"@ c #BDCDE0",
"# c #53585F",
"$ c #AEBDCE",
"% c #BACADD",
"& c #36393C",
"* c #1A1A1A",
"= c #717A84",
"- c #C7D7EC",
"; c #414549",
"> c #767F8A",
", c #A9B7C8",
"' c #939EAD",
") c #7B8590",
"! c #606770",
"~ c #C6D7EB",
"{ c #373A3D",
"] c #1D1D1E",
"^ c #909BA9",
"/ c #B8C8DB",
"( c #222223",
"_ c #2E3032",
": c #C1D1E5",
"< c #292A2C",
"[ c #1E1E1F",
"} c #484C52",
"| c #8D98A6",
"1 c #2F3133",
"2 c #28292B",
"3 c #767F8B",
"4 c #B4C2D5",
".............",
".+++++++++++.",
".+++++++@#$+.",
".++++++%&*=+.",
".+++++-;*>++.",
".+,'++)*!+++.",
".~{]^/(_:+++.",
".+,<[}*|++++.",
".++,<*1~++++.",
".+++,23+++++.",
".++++,4+++++.",
".+++++++++++.",
"............."};

View file

@ -0,0 +1,49 @@
/* XPM */
static char * selected_xpm[] = {
"13 13 33 1",
" c None",
". c #797979",
"+ c #FFFFFF",
"@ c #EFEFEF",
"# c #646464",
"$ c #DCDCDC",
"% c #ECECEC",
"& c #3F3F3F",
"* c #1A1A1A",
"= c #8C8C8C",
"- c #FCFCFC",
"; c #4D4D4D",
"> c #929292",
", c #D5D5D5",
"' c #B8B8B8",
") c #999999",
"! c #767676",
"~ c #FBFBFB",
"{ c #404040",
"] c #1E1E1E",
"^ c #B4B4B4",
"/ c #E9E9E9",
"( c #242424",
"_ c #343434",
": c #F4F4F4",
"< c #2D2D2D",
"[ c #1F1F1F",
"} c #565656",
"| c #B0B0B0",
"1 c #353535",
"2 c #2C2C2C",
"3 c #939393",
"4 c #E3E3E3",
".............",
".+++++++++++.",
".+++++++@#$+.",
".++++++%&*=+.",
".+++++-;*>++.",
".+,'++)*!+++.",
".~{]^/(_:+++.",
".+,<[}*|++++.",
".++,<*1~++++.",
".+++,23+++++.",
".++++,4+++++.",
".+++++++++++.",
"............."};

View file

@ -0,0 +1,28 @@
/* XPM */
static char * shade_active_xpm[] = {
"12 12 13 1",
" c None",
". c #49678B",
"+ c #ADC7E9",
"@ c #A7C3E7",
"# c #A1BFE5",
"$ c #F4F5F6",
"% c #9BBAE2",
"& c #90B2DE",
"* c #86ABD9",
"= c #84AAD8",
"- c #82A8D6",
"; c #7FA6D5",
"> c #7CA4D3",
"............",
".++++++++++.",
".@@@@@@@@@@.",
".##$$$$$$##.",
".%%$$$$$$%%.",
".&&&&&&&&&&.",
".**********.",
".==========.",
".----------.",
".;;;;;;;;;;.",
".>>>>>>>>>>.",
"............"};

View file

@ -0,0 +1,25 @@
/* XPM */
static char * shade_inactive_xpm[] = {
"12 12 10 1",
" c None",
". c #928F8B",
"+ c #FFFFFF",
"@ c #6D6C6C",
"# c #FEFDFD",
"$ c #F9F8F8",
"% c #FAF9F9",
"& c #FBFAFA",
"* c #FCFBFB",
"= c #FDFDFD",
"............",
".++++++++++.",
".++++++++++.",
".++@@@@@@++.",
".++@@@@@@++.",
".##########.",
".$$$$$$$$$$.",
".%%%%%%%%%%.",
".&&&&&&&&&&.",
".**********.",
".==========.",
"............"};

View file

@ -0,0 +1,19 @@
/* XPM */
static char * shade_pressed_xpm[] = {
"12 12 4 1",
" c None",
". c #49678B",
"+ c #7AA1D2",
"@ c #F4F5F6",
"............",
".++++++++++.",
".++++++++++.",
".++@@@@@@++.",
".++@@@@@@++.",
".++++++++++.",
".++++++++++.",
".++++++++++.",
".++++++++++.",
".++++++++++.",
".++++++++++.",
"............"};

View file

@ -0,0 +1,28 @@
/* XPM */
static char * shade_toggled_active_xpm[] = {
"12 12 13 1",
" c None",
". c #49678B",
"+ c #ADC7E9",
"@ c #A7C3E7",
"# c #A1BFE5",
"$ c #F4F5F6",
"% c #9BBAE2",
"& c #90B2DE",
"* c #86ABD9",
"= c #84AAD8",
"- c #82A8D6",
"; c #7FA6D5",
"> c #7CA4D3",
"............",
".++++++++++.",
".@@@@@@@@@@.",
".##$$$$$$##.",
".%%$$$$$$%%.",
".&&&&&&&&&&.",
".***$$$$***.",
".====$$====.",
".----------.",
".;;;;;;;;;;.",
".>>>>>>>>>>.",
"............"};

View file

@ -0,0 +1,25 @@
/* XPM */
static char * shade_toggled_inactive_xpm[] = {
"12 12 10 1",
" c None",
". c #928F8B",
"+ c #FFFFFF",
"@ c #6D6C6C",
"# c #FEFDFD",
"$ c #F9F8F8",
"% c #FAF9F9",
"& c #FBFAFA",
"* c #FCFBFB",
"= c #FDFDFD",
"............",
".++++++++++.",
".++++++++++.",
".++@@@@@@++.",
".++@@@@@@++.",
".##########.",
".$$$@@@@$$$.",
".%%%%@@%%%%.",
".&&&&&&&&&&.",
".**********.",
".==========.",
"............"};

View file

@ -0,0 +1,19 @@
/* XPM */
static char * shade_toggled_pressed_xpm[] = {
"12 12 4 1",
" c None",
". c #49678B",
"+ c #7AA1D2",
"@ c #F4F5F6",
"............",
".++++++++++.",
".++++++++++.",
".++@@@@@@++.",
".++@@@@@@++.",
".++++++++++.",
".+++@@@@+++.",
".++++@@++++.",
".++++++++++.",
".++++++++++.",
".++++++++++.",
"............"};

View file

@ -0,0 +1,28 @@
/* XPM */
static char * stick_active_xpm[] = {
"12 12 13 1",
" c None",
". c #49678B",
"+ c #ADC7E9",
"@ c #A7C3E7",
"# c #A1BFE5",
"$ c #F4F5F6",
"% c #9BBAE2",
"& c #90B2DE",
"* c #86ABD9",
"= c #84AAD8",
"- c #82A8D6",
"; c #7FA6D5",
"> c #7CA4D3",
"............",
".++++++++++.",
".@@@@@@@@@@.",
".##$$##$$##.",
".%%$$%%$$%%.",
".&&&&&&&&&&.",
".**********.",
".==$$==$$==.",
".--$$--$$--.",
".;;;;;;;;;;.",
".>>>>>>>>>>.",
"............"};

View file

@ -0,0 +1,25 @@
/* XPM */
static char * stick_inactive_xpm[] = {
"12 12 10 1",
" c None",
". c #928F8B",
"+ c #FFFFFF",
"@ c #6D6C6C",
"# c #FEFDFD",
"$ c #F9F8F8",
"% c #FAF9F9",
"& c #FBFAFA",
"* c #FCFBFB",
"= c #FDFDFD",
"............",
".++++++++++.",
".++++++++++.",
".++@@++@@++.",
".++@@++@@++.",
".##########.",
".$$$$$$$$$$.",
".%%@@%%@@%%.",
".&&@@&&@@&&.",
".**********.",
".==========.",
"............"};

View file

@ -0,0 +1,19 @@
/* XPM */
static char * stick_pressed_xpm[] = {
"12 12 4 1",
" c None",
". c #49678B",
"+ c #7AA1D2",
"@ c #F4F5F6",
"............",
".++++++++++.",
".++++++++++.",
".++@@++@@++.",
".++@@++@@++.",
".++++++++++.",
".++++++++++.",
".++@@++@@++.",
".++@@++@@++.",
".++++++++++.",
".++++++++++.",
"............"};

View file

@ -0,0 +1,28 @@
/* XPM */
static char * stick_toggled_active_xpm[] = {
"12 12 13 1",
" c None",
". c #49678B",
"+ c #ADC7E9",
"@ c #A7C3E7",
"# c #A1BFE5",
"$ c #9BBAE2",
"% c #F4F5F6",
"& c #90B2DE",
"* c #86ABD9",
"= c #84AAD8",
"- c #82A8D6",
"; c #7FA6D5",
"> c #7CA4D3",
"............",
".++++++++++.",
".@@@@@@@@@@.",
".##########.",
".$$$%%%%$$$.",
".&&&%&%%&&&.",
".***%%*%***.",
".===%%%%===.",
".----------.",
".;;;;;;;;;;.",
".>>>>>>>>>>.",
"............"};

View file

@ -0,0 +1,25 @@
/* XPM */
static char * stick_toggled_inactive_xpm[] = {
"12 12 10 1",
" c None",
". c #928F8B",
"+ c #FFFFFF",
"@ c #6D6C6C",
"# c #FEFDFD",
"$ c #F9F8F8",
"% c #FAF9F9",
"& c #FBFAFA",
"* c #FCFBFB",
"= c #FDFDFD",
"............",
".++++++++++.",
".++++++++++.",
".++++++++++.",
".+++@@@@+++.",
".###@#@@###.",
".$$$@@$@$$$.",
".%%%@@@@%%%.",
".&&&&&&&&&&.",
".**********.",
".==========.",
"............"};

View file

@ -0,0 +1,40 @@
/* XPM */
static char * title_focus_xpm[] = {
"1 18 19 1",
" c None",
". c #ADD3FF",
"+ c #98B9E2",
"@ c #96B8E1",
"# c #94B6E0",
"$ c #93B5DF",
"% c #91B4DF",
"& c #90B3DE",
"* c #8EB1DD",
"= c #8BAFDB",
"- c #86ABD9",
"; c #85AAD8",
"> c #84A9D7",
", c #82A8D6",
"' c #81A7D5",
") c #80A6D5",
"! c #7EA4D4",
"~ c #7DA3D3",
"{ c #7A9FCE",
".",
"+",
"@",
"#",
"$",
"%",
"&",
"*",
"=",
"-",
";",
">",
",",
"'",
")",
"!",
"~",
"{"};

View file

@ -0,0 +1,40 @@
/* XPM */
static char * title_unfocus_xpm[] = {
"1 18 19 1",
" c None",
". c #FFFFFF",
"+ c #EAE9E8",
"@ c #E9E8E7",
"# c #E8E7E6",
"$ c #E7E6E5",
"% c #E6E5E3",
"& c #E5E4E2",
"* c #E4E3E1",
"= c #E2E1DF",
"- c #DEDCDA",
"; c #DDDBD9",
"> c #DCDAD8",
", c #DBD9D7",
"' c #DAD8D6",
") c #D9D7D5",
"! c #D8D6D4",
"~ c #D7D5D3",
"{ c #D2D0CE",
".",
"+",
"@",
"#",
"$",
"%",
"&",
"*",
"=",
"-",
";",
">",
",",
"'",
")",
"!",
"~",
"{"};

View file

@ -0,0 +1,44 @@
/* XPM */
static char * toolbar_iconbar_focus_xpm[] = {
"1 20 21 1",
" c None",
". c #CCC9C7",
"+ c #D1CFCC",
"@ c #D6D3D1",
"# c #D6D4D2",
"$ c #D5D3D1",
"% c #D4D2D0",
"& c #D3D1CF",
"* c #D2D0CE",
"= c #D0CECC",
"- c #CFCDCB",
"; c #CAC8C5",
"> c #C9C7C4",
", c #C8C6C3",
"' c #C7C4C1",
") c #C6C3C0",
"! c #C4C2BF",
"~ c #C3C1BE",
"{ c #C2C0BD",
"] c #C1BEBB",
"^ c #C0BDBA",
".",
"+",
"@",
"#",
"$",
"%",
"&",
"*",
"=",
"-",
";",
">",
",",
"'",
")",
"!",
"~",
"{",
"]",
"^"};

View file

@ -0,0 +1,38 @@
/* XPM */
static char * toolbar_iconbar_unfocus_xpm[] = {
"1 20 15 1",
" c None",
". c #FEFEFE",
"+ c #FDFDFD",
"@ c #FCFCFC",
"# c #FBFBFB",
"$ c #F5F5F4",
"% c #F3F3F2",
"& c #F2F2F1",
"* c #F1F0EF",
"= c #EFEFEE",
"- c #EEEDEC",
"; c #ECECEB",
"> c #EBEAE9",
", c #EAE9E8",
"' c #E8E7E6",
".",
".",
".",
"+",
"+",
"@",
"@",
"@",
"#",
"#",
"$",
"%",
"&",
"*",
"=",
"-",
";",
">",
",",
"'"};

View file

@ -0,0 +1,19 @@
/* XPM */
static char * unselected_active_xpm[] = {
"13 13 3 1",
" c None",
". c #4B6E99",
"+ c #C9DAEF",
".............",
".+++++++++++.",
".+++++++++++.",
".+++++++++++.",
".+++++++++++.",
".+++++++++++.",
".+++++++++++.",
".+++++++++++.",
".+++++++++++.",
".+++++++++++.",
".+++++++++++.",
".+++++++++++.",
"............."};

View file

@ -0,0 +1,19 @@
/* XPM */
static char * unselected_xpm[] = {
"13 13 3 1",
" c None",
". c #797979",
"+ c #FFFFFF",
".............",
".+++++++++++.",
".+++++++++++.",
".+++++++++++.",
".+++++++++++.",
".+++++++++++.",
".+++++++++++.",
".+++++++++++.",
".+++++++++++.",
".+++++++++++.",
".+++++++++++.",
".+++++++++++.",
"............."};

View file

@ -0,0 +1,129 @@
! vim: set ft=xdefaults:
! Clearlooks theme, port from Openbox
! 29.04.2012
! Menu
menu.bevelWidth: 0
menu.borderWidth: 1
menu.borderColor: #AAAAAA
menu.bullet: empty
menu.submenu.pixmap: bullet.xpm
menu.hilite.submenu.pixmap: bullet-active.xpm
menu.selected.pixmap: selected.xpm
menu.hilite.selected.pixmap: selected-active.xpm
menu.unselected.pixmap: unselected.xpm
menu.hilite.unselected.pixmap: unselected-active.xpm
menu.bullet.position: right
menu.itemHeight: 17
menu.title: flat
menu.title.justify: Center
menu.title.color: #E6E7E6
menu.title.textColor: #111111
menu.titleHeight: 17
menu.frame: flat
menu.frame.justify: left
menu.frame.color: #FFFFFF
menu.frame.textColor: #111111
menu.frame.disableColor: #AAAAAA
menu.hilite.pixmap: menu-hilite.xpm
menu.hilite.textColor: #FFFFFF
! Window
window.bevelWidth: 3
window.borderWidth: 1
window.borderColor: #585A5D
window.title.height: 18
window.justify: right
window.label.focus: ParentRelative
window.label.unfocus: ParentRelative
#window.label.focus.pixmap: label-focus.xpm
#window.label.unfocus.pixmap: label-unfocus.xpm
window.label.focus.textColor: #FFFFFF
window.label.unfocus.textColor: #70747D
window.title.focus.pixmap: title-focus.xpm
window.title.unfocus.pixmap: title-unfocus.xpm
window.handleWidth: 0
window.handle.focus: flat
window.handle.focus.color: #EAEBEC
window.handle.unfocus: flat
window.handle.unfocus.color: #EAEBEC
window.grip.focus: flat
window.grip.focus.color: #EAEBEC
window.grip.unfocus: flat
window.grip.unfocus.color: #EAEBEC
window.close.pixmap: close-active.xpm
window.close.pressed.pixmap: close-pressed.xpm
window.close.unfocus.pixmap: close-inactive.xpm
window.iconify.pixmap: minimize-active.xpm
window.iconify.pressed.pixmap: minimize-pressed.xpm
window.iconify.unfocus.pixmap: minimize-inactive.xpm
window.maximize.pixmap: maximize-active.xpm
window.maximize.pressed.pixmap: maximize-pressed.xpm
window.maximize.unfocus.pixmap: maximize-inactive.xpm
window.menuicon.pixmap: menu-active.xpm
window.menuicon.pressed.pixmap: menu-pressed.xpm
window.menuicon.unfocus.pixmap: menu-inactive.xpm
window.shade.pixmap: shade-active.xpm
window.shade.unfocus.pixmap: shade-inactive.xpm
window.shade.pressed.pixmap: shade-pressed.xpm
window.unshade.pixmap: shade-toggled-active.xpm
window.unshade.unfocus.pixmap: shade-toggled-inactive.xpm
window.unshade.pressed.pixmap: shade-toggled-pressed.xpm
window.stick.pixmap: stick-active.xpm
window.stick.unfocus.pixmap: stick-inactive.xpm
window.stick.pressed.pixmap: stick-pressed.xpm
window.stuck.pixmap: stick-toggled-active.xpm
window.stuck.unfocus.pixmap: stick-toggled-inactive.xpm
! Toolbar
toolbar.bevelWidth: 1
toolbar.borderWidth: 1
toolbar.borderColor: #585A5D
toolbar.height: 20
toolbar: flat
toolbar.color: #EAEBEC
toolbar.clock: flat
toolbar.clock.borderWidth: 0
toolbar.clock.borderColor: #A9A5A2
toolbar.clock.justify: center
toolbar.clock.textColor: #111111
toolbar.clock.color: #EDECEB
toolbar.systray: flat
toolbar.systray.borderWidth: 0
toolbar.systray.borderColor: #A9A5A2
toolbar.systray.color: #EDECEB
toolbar.workspace: flat
toolbar.workspace.borderWidth: 0
toolbar.workspace.borderColor: #A9A5A2
toolbar.workspace.justify: center
toolbar.workspace.textColor: #111111
toolbar.workspace.color: #EDECEB
toolbar.button: flat
toolbar.button.borderWidth: 0
toolbar.button.borderColor: #A9A5A2
toolbar.button.picColor: #111111
toolbar.button.color: #EDECEB
toolbar.button.pressed.picColor: #111111
toolbar.button.pressed.color: #CFCDCB
toolbar.iconbar.empty: flat
toolbar.iconbar.empty.color: #EDECEB
toolbar.iconbar.focused.pixmap: toolbar-iconbar-focus.xpm
toolbar.iconbar.focused.borderWidth: 1
toolbar.iconbar.focused.borderColor: #A9A5A2
toolbar.iconbar.focused.justify: center
toolbar.iconbar.focused.textColor: #111111
toolbar.iconbar.unfocused.pixmap: toolbar-iconbar-unfocus.xpm
toolbar.iconbar.unfocused.borderWidth: 1
toolbar.iconbar.unfocused.borderColor: #A9A5A2
toolbar.iconbar.unfocused.justify: center
toolbar.iconbar.unfocused.textColor: #111111
! Slit
slit: flat
slit.bevelWidth: 0
slit.borderColor: #585A5D
slit.borderWidth: 1
slit.color: #EDECEB
! Font
*.font: Sans-8

View file

@ -0,0 +1,15 @@
[begin]
[shade]
[stick]
[maximize]
[iconify]
[raise]
[lower]
[settitledialog]
[sendto]
[layer]
[alpha]
[extramenus]
[separator]
[close]
[end]

View file

@ -0,0 +1,3 @@
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin root --noissue --noclear -s %I 115200,38400,9600 vt102

View file

@ -0,0 +1,2 @@
[Service]
TTYVTDisallocate=no

View file

@ -0,0 +1,3 @@
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin root --noissue --noclear %I 38400 $TERM

View file

@ -0,0 +1,37 @@
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See logind.conf(5) for details.
[Login]
NAutoVTs=0
ReserveVT=0
#KillUserProcesses=no
#KillOnlyUsers=
#KillExcludeUsers=root
#InhibitDelayMaxSec=5
#HandlePowerKey=poweroff
#HandleSuspendKey=suspend
#HandleHibernateKey=hibernate
#HandleLidSwitch=suspend
#HandleLidSwitchDocked=ignore
#PowerKeyIgnoreInhibited=no
#SuspendKeyIgnoreInhibited=no
#HibernateKeyIgnoreInhibited=no
#LidSwitchIgnoreInhibited=yes
#HoldoffTimeoutSec=30s
#IdleAction=ignore
#IdleActionSec=30min
#RuntimeDirectorySize=10%
#RemoveIPC=yes
#InhibitorsMax=8192
#SessionsMax=8192
#UserTasksMax=33%

View file

@ -0,0 +1,67 @@
Section "ServerLayout"
Identifier "X.org Configured"
Screen 0 "Screen0" 0 0
InputDevice "Mouse0" "CorePointer"
InputDevice "Keyboard0" "CoreKeyboard"
EndSection
Section "Files"
ModulePath "/usr/lib/xorg/modules"
FontPath "/usr/share/fonts/misc/"
FontPath "/usr/share/fonts/TTF/"
#FontPath "/usr/share/fonts/OTF/"
#FontPath "/usr/share/fonts/Type1/"
FontPath "/usr/share/fonts/100dpi/"
FontPath "/usr/share/fonts/75dpi/"
EndSection
Section "Module"
Load "glx"
EndSection
Section "InputDevice"
Identifier "Keyboard0"
Driver "kbd"
EndSection
Section "InputDevice"
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/input/mice"
Option "ZAxisMapping" "4 5 6 7"
EndSection
Section "Monitor"
Identifier "Monitor0"
VendorName "Monitor Vendor"
ModelName "Monitor Model"
EndSection
Section "Device"
### Available Driver options are:-
### Values: <i>: integer, <f>: float, <bool>: "True"/"False",
### <string>: "String", <freq>: "<f> Hz/kHz/MHz",
### <percent>: "<f>%"
### [arg]: arg optional
#Option "ShadowFB" # [<bool>]
#Option "Rotate" # <str>
#Option "fbdev" # <str>
#Option "debug" # [<bool>]
Identifier "Card0"
Driver "fbdev"
#BusID "PCI:0:2:0"
Driver "vesa"
EndSection
Section "Screen"
Identifier "Screen0"
Device "Card0"
Monitor "Monitor0"
SubSectionSub "Display"
#Viewport 0 0
Depth 24
Modes "1280x1024"
EndSubSection
EndSection

60
tools/copy-to-sha256.py Executable file
View file

@ -0,0 +1,60 @@
#!/usr/bin/env python
import os
import logging
import stat
import argparse
import hashlib
import shutil
def hash_file(filename):
h = hashlib.sha256()
with open(filename, "rb", buffering=0) as f:
for b in iter(lambda: f.read(128 * 1024), b""):
h.update(b)
return h.hexdigest()
def main():
logging.basicConfig(format="%(message)s")
logger = logging.getLogger("copy")
logger.setLevel(logging.DEBUG)
args = argparse.ArgumentParser(description="...",
formatter_class=argparse.RawTextHelpFormatter)
args.add_argument("from_path", metavar="from", help="from")
args.add_argument("to_path", metavar="to", help="to")
args = args.parse_args()
from_path = os.path.normpath(args.from_path)
to_path = os.path.normpath(args.to_path)
def onerror(oserror):
logger.warning(oserror)
files = os.walk(from_path, onerror=onerror)
for f in files:
dirpath, dirnames, filenames = f
for filename in filenames:
absname = os.path.join(dirpath, filename)
st = os.lstat(absname)
mode = st.st_mode
assert not stat.S_ISDIR(mode)
if stat.S_ISLNK(mode) or stat.S_ISCHR(mode) or stat.S_ISBLK(mode) or stat.S_ISFIFO(mode) or stat.S_ISSOCK(mode):
continue
sha256 = hash_file(absname)
to_abs = os.path.join(to_path, sha256)
if os.path.exists(to_abs):
logger.info("Exists, skipped {}".format(to_abs))
else:
logger.info("cp {} {}".format(absname, to_abs))
shutil.copyfile(absname, to_abs)
if __name__ == "__main__":
main()

170
tools/fs2json.py Executable file
View file

@ -0,0 +1,170 @@
#!/usr/bin/env python
import argparse
import json
import os
import stat
import sys
import itertools
import logging
import hashlib
VERSION = 3
IDX_NAME = 0
IDX_SIZE = 1
IDX_MTIME = 2
IDX_MODE = 3
IDX_UID = 4
IDX_GID = 5
# target for symbolic links
# child nodes for directories
# sha256 for files
IDX_TARGET = 6
IDX_SHA256 = 6
def hash_file(filename):
h = hashlib.sha256()
with open(filename, "rb", buffering=0) as f:
for b in iter(lambda : f.read(128*1024), b""):
h.update(b)
return h.hexdigest()
def main():
logging.basicConfig(format="%(message)s")
logger = logging.getLogger("fs2json")
logger.setLevel(logging.DEBUG)
args = argparse.ArgumentParser(description="Create filesystem JSON. Example:\n"
" ./fs2xml.py --exclude /boot/ --out fs.json /mnt/",
formatter_class=argparse.RawTextHelpFormatter
)
args.add_argument("--exclude",
action="append",
metavar="path",
help="Path to exclude (relative to base path). Can be specified multiple times.")
args.add_argument("--out",
metavar="out",
nargs="?",
type=argparse.FileType("w"),
help="File to write to (defaults to stdout)",
default=sys.stdout)
args.add_argument("path",
metavar="path",
help="Base path to include in JSON")
args = args.parse_args()
path = os.path.normpath(args.path)
path = path + "/"
exclude = args.exclude or []
exclude = [os.path.join("/", os.path.normpath(p)) for p in exclude]
exclude = set(exclude)
def onerror(oserror):
logger.warning(oserror)
rootdepth = path.count("/")
files = os.walk(path, onerror=onerror)
prevpath = []
mainroot = []
result = {
"fsroot": mainroot,
"version": VERSION,
"size": 0,
}
rootstack = [mainroot]
def make_node(st, name):
obj = [None] * 7
obj[IDX_NAME] = name
obj[IDX_SIZE] = st.st_size
obj[IDX_MTIME] = int(st.st_mtime)
obj[IDX_MODE] = int(st.st_mode)
obj[IDX_UID] = st.st_uid
obj[IDX_GID] = st.st_gid
result["size"] += st.st_size
# Missing:
# int(st.st_atime),
# int(st.st_ctime),
return obj
logger.info("Creating file tree ...")
for f in files:
dirpath, dirnames, filenames = f
pathparts = dirpath.split("/")
pathparts = pathparts[rootdepth:]
fullpath = os.path.join("/", *pathparts)
if fullpath in exclude:
dirnames[:] = []
continue
depth = 0
for this, prev in zip(pathparts, prevpath):
if this != prev:
break
depth += 1
for name in prevpath[depth:]:
rootstack.pop()
oldroot = rootstack[-1]
assert len(pathparts[depth:]) == 1
openname = pathparts[-1]
if openname == "":
root = mainroot
else:
root = []
st = os.stat(dirpath)
rootobj = make_node(st, openname)
rootobj[IDX_TARGET] = root
oldroot.append(rootobj)
rootstack.append(root)
for filename in itertools.chain(filenames, dirnames):
absname = os.path.join(dirpath, filename)
st = os.lstat(absname)
isdir = stat.S_ISDIR(st.st_mode)
islink = stat.S_ISLNK(st.st_mode)
isfile = stat.S_ISREG(st.st_mode)
if isdir and not islink:
continue
obj = make_node(st, filename)
if islink:
target = os.readlink(absname)
obj[IDX_TARGET] = target
elif isfile:
obj[IDX_SHA256] = hash_file(absname)
while obj[-1] is None:
obj.pop()
root.append(obj)
prevpath = pathparts
logger.info("Creating json ...")
json.dump(result, args.out, check_circular=False, separators=(',', ':'))
if __name__ == "__main__":
main()