diff --git a/docker/debian-full/Dockerfile b/docker/debian-full/Dockerfile new file mode 100644 index 00000000..046637fe --- /dev/null +++ b/docker/debian-full/Dockerfile @@ -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 diff --git a/docker/debian-full/boot-9p b/docker/debian-full/boot-9p new file mode 100644 index 00000000..88e695f6 --- /dev/null +++ b/docker/debian-full/boot-9p @@ -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 +} diff --git a/docker/debian-full/build-container.sh b/docker/debian-full/build-container.sh new file mode 100755 index 00000000..e157f14f --- /dev/null +++ b/docker/debian-full/build-container.sh @@ -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 diff --git a/docker/debian-full/build-state.js b/docker/debian-full/build-state.js new file mode 100755 index 00000000..25056c3d --- /dev/null +++ b/docker/debian-full/build-state.js @@ -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: "", + 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); diff --git a/docker/debian-full/create-9p-from-container.sh b/docker/debian-full/create-9p-from-container.sh new file mode 100755 index 00000000..1f599841 --- /dev/null +++ b/docker/debian-full/create-9p-from-container.sh @@ -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. diff --git a/docker/debian-full/fluxbox/apps b/docker/debian-full/fluxbox/apps new file mode 100644 index 00000000..7b4aeadb --- /dev/null +++ b/docker/debian-full/fluxbox/apps @@ -0,0 +1,4 @@ +[app] (name=fbrun) + [Position] (WINCENTER) {0 0} + [Layer] {2} +[end] diff --git a/docker/debian-full/fluxbox/init b/docker/debian-full/fluxbox/init new file mode 100644 index 00000000..e4054272 --- /dev/null +++ b/docker/debian-full/fluxbox/init @@ -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 diff --git a/docker/debian-full/fluxbox/keys b/docker/debian-full/fluxbox/keys new file mode 100644 index 00000000..0567d04e --- /dev/null +++ b/docker/debian-full/fluxbox/keys @@ -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 diff --git a/docker/debian-full/fluxbox/lastwallpaper b/docker/debian-full/fluxbox/lastwallpaper new file mode 100644 index 00000000..e69de29b diff --git a/docker/debian-full/fluxbox/menu b/docker/debian-full/fluxbox/menu new file mode 100644 index 00000000..ad46078d --- /dev/null +++ b/docker/debian-full/fluxbox/menu @@ -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] diff --git a/docker/debian-full/fluxbox/overlay b/docker/debian-full/fluxbox/overlay new file mode 100644 index 00000000..3431cfe0 --- /dev/null +++ b/docker/debian-full/fluxbox/overlay @@ -0,0 +1,2 @@ +! The following line will prevent styles from setting the background. +background: none diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/bullet-active.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/bullet-active.xpm new file mode 100644 index 00000000..ecff74f3 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/bullet-active.xpm @@ -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", +".+ ", +"@#. ", +" $#% ", +" &#$ ", +" *#=", +" -#;", +" >#, ", +" '#) ", +"!#' ", +"~{ "}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/bullet.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/bullet.xpm new file mode 100644 index 00000000..6515a9f7 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/bullet.xpm @@ -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", +" ", +" .+ ", +" .@+ ", +" .@+ ", +" #@+ ", +" $@+ ", +" $@+ ", +" %@+ ", +" .@+ ", +" .@+ ", +" .+ ", +" "}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/close-active.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/close-active.xpm new file mode 100644 index 00000000..9b5f38a1 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/close-active.xpm @@ -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", +"............", +".++++++++++.", +".@@@@@@@@@@.", +".##$$##$$##.", +".%%$$$$$$%%.", +".&&&$$$$&&&.", +".***$$$$***.", +".==$$$$$$==.", +".--$$--$$--.", +".;;;;;;;;;;.", +".>>>>>>>>>>.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/close-inactive.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/close-inactive.xpm new file mode 100644 index 00000000..0ce800e4 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/close-inactive.xpm @@ -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", +"............", +".++++++++++.", +".++++++++++.", +".++@@++@@++.", +".++@@@@@@++.", +".###@@@@###.", +".$$$@@@@$$$.", +".%%@@@@@@%%.", +".&&@@&&@@&&.", +".**********.", +".==========.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/close-pressed.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/close-pressed.xpm new file mode 100644 index 00000000..5f39960c --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/close-pressed.xpm @@ -0,0 +1,19 @@ +/* XPM */ +static char * close_pressed_xpm[] = { +"12 12 4 1", +" c None", +". c #49678B", +"+ c #7AA1D2", +"@ c #F4F5F6", +"............", +".++++++++++.", +".++++++++++.", +".++@@++@@++.", +".++@@@@@@++.", +".+++@@@@+++.", +".+++@@@@+++.", +".++@@@@@@++.", +".++@@++@@++.", +".++++++++++.", +".++++++++++.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/label-focus.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/label-focus.xpm new file mode 100644 index 00000000..f1424dab --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/label-focus.xpm @@ -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", +".", +"+", +"@", +"#", +"$", +"%", +"&", +"*", +"=", +"-", +";", +">"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/label-unfocus.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/label-unfocus.xpm new file mode 100644 index 00000000..5dbc311d --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/label-unfocus.xpm @@ -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", +".", +"+", +"@", +"#", +"$", +"%", +"&", +"*", +"=", +"-", +";", +">"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/maximize-active.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/maximize-active.xpm new file mode 100644 index 00000000..6ff48713 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/maximize-active.xpm @@ -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", +"............", +".++++++++++.", +".@@@@@@@@@@.", +".##$$$$$$##.", +".%%$$$$$$%%.", +".&&$&&&&$&&.", +".**$****$**.", +".==$====$==.", +".--$$$$$$--.", +".;;;;;;;;;;.", +".>>>>>>>>>>.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/maximize-inactive.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/maximize-inactive.xpm new file mode 100644 index 00000000..6e9e17ad --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/maximize-inactive.xpm @@ -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", +"............", +".++++++++++.", +".++++++++++.", +".++@@@@@@++.", +".++@@@@@@++.", +".##@####@##.", +".$$@$$$$@$$.", +".%%@%%%%@%%.", +".&&@@@@@@&&.", +".**********.", +".==========.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/maximize-pressed.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/maximize-pressed.xpm new file mode 100644 index 00000000..f670fb28 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/maximize-pressed.xpm @@ -0,0 +1,19 @@ +/* XPM */ +static char * maximize_pressed_xpm[] = { +"12 12 4 1", +" c None", +". c #49678B", +"+ c #7AA1D2", +"@ c #F4F5F6", +"............", +".++++++++++.", +".++++++++++.", +".++@@@@@@++.", +".++@@@@@@++.", +".++@++++@++.", +".++@++++@++.", +".++@++++@++.", +".++@@@@@@++.", +".++++++++++.", +".++++++++++.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/menu-active.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/menu-active.xpm new file mode 100644 index 00000000..f4eac268 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/menu-active.xpm @@ -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", +"............", +".++++++++++.", +".@@@@@@@@@@.", +".####$$####.", +".%%%%$$%%%%.", +".&&$$$$$$&&.", +".**$$$$$$**.", +".====$$====.", +".----$$----.", +".;;;;;;;;;;.", +".>>>>>>>>>>.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/menu-hilite.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/menu-hilite.xpm new file mode 100644 index 00000000..9f3bae85 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/menu-hilite.xpm @@ -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", +".", +"+", +"@", +"#", +"$", +"%", +"&", +"*", +"=", +"-", +";", +">", +",", +"'", +")", +"!", +"."}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/menu-inactive.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/menu-inactive.xpm new file mode 100644 index 00000000..f3b07db0 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/menu-inactive.xpm @@ -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", +"............", +".++++++++++.", +".++++++++++.", +".++++@@++++.", +".++++@@++++.", +".##@@@@@@##.", +".$$@@@@@@$$.", +".%%%%@@%%%%.", +".&&&&@@&&&&.", +".**********.", +".==========.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/menu-pressed.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/menu-pressed.xpm new file mode 100644 index 00000000..0cab5b9e --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/menu-pressed.xpm @@ -0,0 +1,19 @@ +/* XPM */ +static char * menu_pressed_xpm[] = { +"12 12 4 1", +" c None", +". c #49678B", +"+ c #7AA1D2", +"@ c #F4F5F6", +"............", +".++++++++++.", +".++++++++++.", +".++++@@++++.", +".++++@@++++.", +".++@@@@@@++.", +".++@@@@@@++.", +".++++@@++++.", +".++++@@++++.", +".++++++++++.", +".++++++++++.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/minimize-active.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/minimize-active.xpm new file mode 100644 index 00000000..dc6c9ec7 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/minimize-active.xpm @@ -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", +"............", +".++++++++++.", +".@@@@@@@@@@.", +".##########.", +".$$$$$$$$$$.", +".%%%%%%%%%%.", +".&&&&&&&&&&.", +".**======**.", +".--======--.", +".;;;;;;;;;;.", +".>>>>>>>>>>.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/minimize-inactive.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/minimize-inactive.xpm new file mode 100644 index 00000000..8551a432 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/minimize-inactive.xpm @@ -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", +"............", +".++++++++++.", +".++++++++++.", +".++++++++++.", +".++++++++++.", +".@@@@@@@@@@.", +".##########.", +".$$%%%%%%$$.", +".&&%%%%%%&&.", +".**********.", +".==========.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/minimize-pressed.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/minimize-pressed.xpm new file mode 100644 index 00000000..3474dac0 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/minimize-pressed.xpm @@ -0,0 +1,19 @@ +/* XPM */ +static char * hide_pressed_xpm[] = { +"12 12 4 1", +" c None", +". c #49678B", +"+ c #7AA1D2", +"@ c #F4F5F6", +"............", +".++++++++++.", +".++++++++++.", +".++++++++++.", +".++++++++++.", +".++++++++++.", +".++++++++++.", +".++@@@@@@++.", +".++@@@@@@++.", +".++++++++++.", +".++++++++++.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/selected-active.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/selected-active.xpm new file mode 100644 index 00000000..e67ad166 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/selected-active.xpm @@ -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+++++.", +".+++++++++++.", +"............."}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/selected.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/selected.xpm new file mode 100644 index 00000000..d22783f7 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/selected.xpm @@ -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+++++.", +".+++++++++++.", +"............."}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/shade-active.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/shade-active.xpm new file mode 100644 index 00000000..07a3e607 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/shade-active.xpm @@ -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", +"............", +".++++++++++.", +".@@@@@@@@@@.", +".##$$$$$$##.", +".%%$$$$$$%%.", +".&&&&&&&&&&.", +".**********.", +".==========.", +".----------.", +".;;;;;;;;;;.", +".>>>>>>>>>>.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/shade-inactive.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/shade-inactive.xpm new file mode 100644 index 00000000..8c8e5ba8 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/shade-inactive.xpm @@ -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", +"............", +".++++++++++.", +".++++++++++.", +".++@@@@@@++.", +".++@@@@@@++.", +".##########.", +".$$$$$$$$$$.", +".%%%%%%%%%%.", +".&&&&&&&&&&.", +".**********.", +".==========.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/shade-pressed.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/shade-pressed.xpm new file mode 100644 index 00000000..33d539fe --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/shade-pressed.xpm @@ -0,0 +1,19 @@ +/* XPM */ +static char * shade_pressed_xpm[] = { +"12 12 4 1", +" c None", +". c #49678B", +"+ c #7AA1D2", +"@ c #F4F5F6", +"............", +".++++++++++.", +".++++++++++.", +".++@@@@@@++.", +".++@@@@@@++.", +".++++++++++.", +".++++++++++.", +".++++++++++.", +".++++++++++.", +".++++++++++.", +".++++++++++.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/shade-toggled-active.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/shade-toggled-active.xpm new file mode 100644 index 00000000..675a0ba0 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/shade-toggled-active.xpm @@ -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", +"............", +".++++++++++.", +".@@@@@@@@@@.", +".##$$$$$$##.", +".%%$$$$$$%%.", +".&&&&&&&&&&.", +".***$$$$***.", +".====$$====.", +".----------.", +".;;;;;;;;;;.", +".>>>>>>>>>>.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/shade-toggled-inactive.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/shade-toggled-inactive.xpm new file mode 100644 index 00000000..14069b0f --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/shade-toggled-inactive.xpm @@ -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", +"............", +".++++++++++.", +".++++++++++.", +".++@@@@@@++.", +".++@@@@@@++.", +".##########.", +".$$$@@@@$$$.", +".%%%%@@%%%%.", +".&&&&&&&&&&.", +".**********.", +".==========.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/shade-toggled-pressed.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/shade-toggled-pressed.xpm new file mode 100644 index 00000000..e97d62e0 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/shade-toggled-pressed.xpm @@ -0,0 +1,19 @@ +/* XPM */ +static char * shade_toggled_pressed_xpm[] = { +"12 12 4 1", +" c None", +". c #49678B", +"+ c #7AA1D2", +"@ c #F4F5F6", +"............", +".++++++++++.", +".++++++++++.", +".++@@@@@@++.", +".++@@@@@@++.", +".++++++++++.", +".+++@@@@+++.", +".++++@@++++.", +".++++++++++.", +".++++++++++.", +".++++++++++.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/stick-active.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/stick-active.xpm new file mode 100644 index 00000000..7b5c1147 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/stick-active.xpm @@ -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", +"............", +".++++++++++.", +".@@@@@@@@@@.", +".##$$##$$##.", +".%%$$%%$$%%.", +".&&&&&&&&&&.", +".**********.", +".==$$==$$==.", +".--$$--$$--.", +".;;;;;;;;;;.", +".>>>>>>>>>>.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/stick-inactive.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/stick-inactive.xpm new file mode 100644 index 00000000..7d63a5d7 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/stick-inactive.xpm @@ -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", +"............", +".++++++++++.", +".++++++++++.", +".++@@++@@++.", +".++@@++@@++.", +".##########.", +".$$$$$$$$$$.", +".%%@@%%@@%%.", +".&&@@&&@@&&.", +".**********.", +".==========.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/stick-pressed.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/stick-pressed.xpm new file mode 100644 index 00000000..01af6c17 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/stick-pressed.xpm @@ -0,0 +1,19 @@ +/* XPM */ +static char * stick_pressed_xpm[] = { +"12 12 4 1", +" c None", +". c #49678B", +"+ c #7AA1D2", +"@ c #F4F5F6", +"............", +".++++++++++.", +".++++++++++.", +".++@@++@@++.", +".++@@++@@++.", +".++++++++++.", +".++++++++++.", +".++@@++@@++.", +".++@@++@@++.", +".++++++++++.", +".++++++++++.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/stick-toggled-active.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/stick-toggled-active.xpm new file mode 100644 index 00000000..745312e9 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/stick-toggled-active.xpm @@ -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", +"............", +".++++++++++.", +".@@@@@@@@@@.", +".##########.", +".$$$%%%%$$$.", +".&&&%&%%&&&.", +".***%%*%***.", +".===%%%%===.", +".----------.", +".;;;;;;;;;;.", +".>>>>>>>>>>.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/stick-toggled-inactive.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/stick-toggled-inactive.xpm new file mode 100644 index 00000000..e644facc --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/stick-toggled-inactive.xpm @@ -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", +"............", +".++++++++++.", +".++++++++++.", +".++++++++++.", +".+++@@@@+++.", +".###@#@@###.", +".$$$@@$@$$$.", +".%%%@@@@%%%.", +".&&&&&&&&&&.", +".**********.", +".==========.", +"............"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/title-focus.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/title-focus.xpm new file mode 100644 index 00000000..6371404a --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/title-focus.xpm @@ -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", +".", +"+", +"@", +"#", +"$", +"%", +"&", +"*", +"=", +"-", +";", +">", +",", +"'", +")", +"!", +"~", +"{"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/title-unfocus.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/title-unfocus.xpm new file mode 100644 index 00000000..3fa23d1a --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/title-unfocus.xpm @@ -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", +".", +"+", +"@", +"#", +"$", +"%", +"&", +"*", +"=", +"-", +";", +">", +",", +"'", +")", +"!", +"~", +"{"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/toolbar-iconbar-focus.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/toolbar-iconbar-focus.xpm new file mode 100644 index 00000000..9d1cf257 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/toolbar-iconbar-focus.xpm @@ -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", +".", +"+", +"@", +"#", +"$", +"%", +"&", +"*", +"=", +"-", +";", +">", +",", +"'", +")", +"!", +"~", +"{", +"]", +"^"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/toolbar-iconbar-unfocus.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/toolbar-iconbar-unfocus.xpm new file mode 100644 index 00000000..9fc1446f --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/toolbar-iconbar-unfocus.xpm @@ -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", +".", +".", +".", +"+", +"+", +"@", +"@", +"@", +"#", +"#", +"$", +"%", +"&", +"*", +"=", +"-", +";", +">", +",", +"'"}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/unselected-active.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/unselected-active.xpm new file mode 100644 index 00000000..09d95cfc --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/unselected-active.xpm @@ -0,0 +1,19 @@ +/* XPM */ +static char * unselected_active_xpm[] = { +"13 13 3 1", +" c None", +". c #4B6E99", +"+ c #C9DAEF", +".............", +".+++++++++++.", +".+++++++++++.", +".+++++++++++.", +".+++++++++++.", +".+++++++++++.", +".+++++++++++.", +".+++++++++++.", +".+++++++++++.", +".+++++++++++.", +".+++++++++++.", +".+++++++++++.", +"............."}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/unselected.xpm b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/unselected.xpm new file mode 100644 index 00000000..f05df80b --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/pixmaps/unselected.xpm @@ -0,0 +1,19 @@ +/* XPM */ +static char * unselected_xpm[] = { +"13 13 3 1", +" c None", +". c #797979", +"+ c #FFFFFF", +".............", +".+++++++++++.", +".+++++++++++.", +".+++++++++++.", +".+++++++++++.", +".+++++++++++.", +".+++++++++++.", +".+++++++++++.", +".+++++++++++.", +".+++++++++++.", +".+++++++++++.", +".+++++++++++.", +"............."}; diff --git a/docker/debian-full/fluxbox/styles/Clearlooks/theme.cfg b/docker/debian-full/fluxbox/styles/Clearlooks/theme.cfg new file mode 100644 index 00000000..4a936075 --- /dev/null +++ b/docker/debian-full/fluxbox/styles/Clearlooks/theme.cfg @@ -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 diff --git a/docker/debian-full/fluxbox/windowmenu b/docker/debian-full/fluxbox/windowmenu new file mode 100644 index 00000000..d867b64c --- /dev/null +++ b/docker/debian-full/fluxbox/windowmenu @@ -0,0 +1,15 @@ +[begin] + [shade] + [stick] + [maximize] + [iconify] + [raise] + [lower] + [settitledialog] + [sendto] + [layer] + [alpha] + [extramenus] + [separator] + [close] +[end] diff --git a/docker/debian-full/getty-autologin-serial.conf b/docker/debian-full/getty-autologin-serial.conf new file mode 100644 index 00000000..ad9b2c09 --- /dev/null +++ b/docker/debian-full/getty-autologin-serial.conf @@ -0,0 +1,3 @@ +[Service] +ExecStart= +ExecStart=-/sbin/agetty --autologin root --noissue --noclear -s %I 115200,38400,9600 vt102 diff --git a/docker/debian-full/getty-noclear.conf b/docker/debian-full/getty-noclear.conf new file mode 100644 index 00000000..52671c75 --- /dev/null +++ b/docker/debian-full/getty-noclear.conf @@ -0,0 +1,2 @@ +[Service] +TTYVTDisallocate=no diff --git a/docker/debian-full/getty-override.conf b/docker/debian-full/getty-override.conf new file mode 100644 index 00000000..6ca2ac92 --- /dev/null +++ b/docker/debian-full/getty-override.conf @@ -0,0 +1,3 @@ +[Service] +ExecStart= +ExecStart=-/sbin/agetty --autologin root --noissue --noclear %I 38400 $TERM diff --git a/docker/debian-full/logind.conf b/docker/debian-full/logind.conf new file mode 100644 index 00000000..f6e5c21d --- /dev/null +++ b/docker/debian-full/logind.conf @@ -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% diff --git a/docker/debian-full/xorg.conf b/docker/debian-full/xorg.conf new file mode 100644 index 00000000..9a018628 --- /dev/null +++ b/docker/debian-full/xorg.conf @@ -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: : integer, : float, : "True"/"False", + ### : "String", : " Hz/kHz/MHz", + ### : "%" + ### [arg]: arg optional + #Option "ShadowFB" # [] + #Option "Rotate" # + #Option "fbdev" # + #Option "debug" # [] + Identifier "Card0" + Driver "fbdev" + #BusID "PCI:0:2:0" + Driver "vesa" +EndSection + +Section "Screen" + Identifier "Screen0" + Device "Card0" + Monitor "Monitor0" + SubSection "Display" + #Viewport 0 0 + Depth 24 + Modes "1280x1024" + EndSubSection +EndSection + diff --git a/tools/copy-to-sha256.py b/tools/copy-to-sha256.py new file mode 100755 index 00000000..10fd1986 --- /dev/null +++ b/tools/copy-to-sha256.py @@ -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() diff --git a/tools/fs2json.py b/tools/fs2json.py new file mode 100755 index 00000000..9f087b6f --- /dev/null +++ b/tools/fs2json.py @@ -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()