more code to integrate gui elements and script

This commit is contained in:
Jaromil 2011-01-12 11:38:03 +01:00
parent 0bd8f4b4b6
commit bd370c1ef5
4 changed files with 219 additions and 79 deletions

47
src/monmort.xpm Normal file
View File

@ -0,0 +1,47 @@
/* XPM */
/* The Tomb icon is an artwork by Jordi aka MonMort
a nomadic graffiti artist from Barcelona */
const char *monmort[] = {
/* columns rows colors chars-per-pixel */
"32 32 5 1",
" c #000000",
". c #010101",
"X c #020202",
"o c #C1C1C1",
"O c None",
/* pixels */
"OO OO",
"O oooooooooooooooooooooooooooo O",
" oooooooooooooooooooooooooooooo ",
" oooooooooooooooooooooooooooooo ",
" oooooooo X oooooo ooo ",
" oooooooo oooooo ooo ",
" oooooooo oooooo ooo ",
" oooooooo oooooo oooX",
" oooooooo X oooooo ooo ",
" oooooooo oooooo ooo ",
" oooooooo Xoooooo ooo ",
" oooooooo oooooo X ooo ",
" oooooooo X oooooo ooo ",
" oooooooooooooooooooooooooooooo ",
" oooooooooooooooooooooo oooooooX",
" ooooooooooooooooooooooo oooooo ",
" oooooooooooooooo X ooooo ",
"O ooooooooooooooooooooooooooooo ",
"OO oooooooooooooooooo O",
"OOOOOOOOOOOO oooo ooo ooo ooo OO",
"OOOOOOOOOOOOO ooo ooo oooXooo OO",
"OOOOOOOOOOOOO oooXooo ooo ooo OO",
"OOOOOOOOOOOOO ooo ooo ooo ooo OO",
"OOOOOOOOOOOOO ooo ooo ooo ooo OO",
"OOOOOOOOOOOOO ooo ooo ooo ooo OO",
"OOOOOOOOOOOOO ooo ooo ooo ooo OO",
"OOOOOOOOOOOOO ooo ooo ooo oooXOO",
"OOOOOOOOOOOOO ooo ooo ooo ooo OO",
"OOOOOOOOOOOOOXooo ooo ooo ooo OO",
"OOOOOOOOOOOOO ooooooooooooooo OO",
"OOOOOOOOOOOOOO ooooooooooooo OOO",
"OOOOOOOOOOOOOOO OOOO"
};

View File

@ -1,4 +1,4 @@
#!/bin/bash #!/bin/zsh
# #
# Tomb # Tomb
# #
@ -30,7 +30,7 @@
VERSION=0.9 VERSION=0.9
DATE=Jan/2011 DATE=Jan/2011
PATH=/usr/bin:/usr/sbin:/bin:/sbin # PATH=/usr/bin:/usr/sbin:/bin:/sbin
# standard output message routines # standard output message routines
# it's always useful to wrap them, in case we change behaviour later # it's always useful to wrap them, in case we change behaviour later
@ -126,6 +126,11 @@ ask_password() {
} }
# drop privileges
exec_as_user() {
func "executing as user '$SUDO_USER': ${(f)@}"
sudo -u $SUDO_USER ${@} &
}
############################ ############################
@ -134,16 +139,15 @@ ask_password() {
notice "Tomb - simple commandline tool for encrypted storage" notice "Tomb - simple commandline tool for encrypted storage"
act "version $VERSION ($DATE) by Jaromil @ dyne.org" act "version $VERSION ($DATE) by Jaromil @ dyne.org"
act "" func "invoked with args \"${(f)@}\" "
func "invoked with args \"$*\" "
func "running on `date`" func "running on `date`"
OPTS=`getopt -o hvs:k: -n 'tomb' -- "$@"` OPTS=`getopt -o hvs:k:S -n 'tomb' -- "$@"`
while true; do while true; do
case "$1" in case "$1" in
-h) -h)
act ""
notice "Syntax: tomb [options] command [file] [mountpoint | size]" notice "Syntax: tomb [options] command [file] [mountpoint | size]"
act "" act ""
notice "Options:" notice "Options:"
@ -151,6 +155,7 @@ while true; do
act "-v print out the version information for this tool" act "-v print out the version information for this tool"
act "-s size of the storage file when creating one (in MBytes)" act "-s size of the storage file when creating one (in MBytes)"
act "-k path to the key to use for decryption" act "-k path to the key to use for decryption"
act "-S acquire super user rights if possible"
act "" act ""
notice "Commands:" notice "Commands:"
act "create create a new encrypted storage FILE and keys" act "create create a new encrypted storage FILE and keys"
@ -159,6 +164,7 @@ while true; do
echo; exit 2 ;; echo; exit 2 ;;
-v) -v)
# print out the GPL license in this file # print out the GPL license in this file
act ""
cat $0 | awk ' cat $0 | awk '
BEGIN { license=0 } BEGIN { license=0 }
/^# This source/ { license=1 } /^# This source/ { license=1 }
@ -167,6 +173,37 @@ BEGIN { license=0 }
' '
act "" act ""
exit 0 ;; exit 0 ;;
-S) GETPRIV=true; shift 1 ;;
*) break ;;
esac
done
id | grep root > /dev/null
if [ $? != 0 ]; then
error "This program must be run as root to produce results"
if [ "$GETPRIV" = "true" ]; then
which gksu > /dev/null
if [ $? = 0 ]; then
act "Using gksu for root execution of 'tomb ${(f)@}'"
gksu "tomb ${(f)@}"
exit $?
fi
which sudo > /dev/null
if [ $? = 0 ]; then
act "Using sudo for root execution of 'tomb ${(f)@}'"
sudo "tomb ${(f)@}"
exit $?
fi
exit 1
else
exit 1
fi
fi
# now process the real options
OPTS=`getopt -o hvs:k:S -n 'tomb' -- "$@"`
while true; do
case "$1" in
-s) SIZE=$2; shift 2 ;; -s) SIZE=$2; shift 2 ;;
-k) KEY=$2; shift 2 ;; -k) KEY=$2; shift 2 ;;
--) shift; break ;; --) shift; break ;;
@ -180,11 +217,7 @@ if [ -z $CMD ]; then
exit 0 exit 0
fi fi
id | grep root > /dev/null
if [ $? != 0 ]; then
error "This program must be run as root to produce results"
exit 1
fi
func "command: $CMD for file $FILE" func "command: $CMD for file $FILE"
@ -193,7 +226,7 @@ tombtab=${tombdir}/fstab
if ! [ -r ${tombtab} ]; then if ! [ -r ${tombtab} ]; then
act "creating tomb filesystem tab in your home" act "creating tomb filesystem tab in your home"
mkdir -p ${HOME}/.tomb mkdir -p ${HOME}/.tomb
echo "# entombed filesystem information, see man tomb" > ${tombtab} echo "# entombed filesystem information, see man tomb (TODO)" > ${tombtab}
echo "# format here is similar to the system wide fstab" >> ${tombtab} echo "# format here is similar to the system wide fstab" >> ${tombtab}
echo "# <file system> <mount point> <type> <options> <key>" >> ${tombtab} echo "# <file system> <mount point> <type> <options> <key>" >> ${tombtab}
fi fi
@ -379,7 +412,9 @@ mount_tomb() {
mount -t ext4 -o rw,noatime,nodev /dev/mapper/${mapper} ${MOUNT} mount -t ext4 -o rw,noatime,nodev /dev/mapper/${mapper} ${MOUNT}
notice "encrypted storage $FILE succesfully mounted on $MOUNT" notice "encrypted storage $FILE succesfully mounted on $MOUNT"
if [ $DISPLAY ]; then
exec_as_user tomb-gtk ${FILE} ${MOUNT}
fi
} }
umount_tomb() { umount_tomb() {
@ -388,7 +423,7 @@ umount_tomb() {
how_many_tombs="`ls /dev/mapper/tomb* 2>/dev/null | wc -w`" how_many_tombs="`ls /dev/mapper/tomb* 2>/dev/null | wc -w`"
if [ $how_many_tombs = 0 ]; then if [ $how_many_tombs = 0 ]; then
error "there is no tomb found to be mounted" error "there is no open tomb to be closed"
return return
elif [ $how_many_tombs = 1 ]; then elif [ $how_many_tombs = 1 ]; then
mapper=`ls /dev/mapper/tomb* 2>/dev/null` mapper=`ls /dev/mapper/tomb* 2>/dev/null`
@ -450,6 +485,8 @@ umount_tomb() {
# fi # fi
notice "crypt storage ${mapper} unmounted" notice "crypt storage ${mapper} unmounted"
exec_as_user tomb-notify "Tomb closed:" "${FILE}
Rest In Peace."
} }
@ -457,8 +494,10 @@ case "$CMD" in
create) create_tomb ;; create) create_tomb ;;
format) format_tomb ;; format) format_tomb ;;
mount) mount_tomb ;; mount) mount_tomb ;;
open) mount_tomb ;;
umount) umount_tomb ;; umount) umount_tomb ;;
unmount) umount_tomb ;; unmount) umount_tomb ;;
close) umount_tomb ;;
*) error "command \"$CMD\" not recognized" *) error "command \"$CMD\" not recognized"
act "try -h for help" act "try -h for help"
;; ;;

View File

@ -1,106 +1,90 @@
/* Tomb - encrypted storage undertaker
*
* (c) Copyright 2007-2011 Denis Roio <jaromil@dyne.org>
*
* This source code is free software; you can redistribute it and/or
* modify it under the terms of the GNU Public License as published
* by the Free Software Foundation; either version 3 of the License,
* or (at your option) any later version.
*
* This source code is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* Please refer to the GNU Public License for more details.
*
* You should have received a copy of the GNU Public License along with
* this source code; if not, write to:
* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <libnotify/notify.h>
/* The Tomb icon is an artwork by Jordi aka MonMort /* The Tomb icon is an artwork by Jordi aka MonMort
a nomadic graffiti artist from Barcelona */ a nomadic graffiti artist from Barcelona */
const char *monmort[] = { #include <monmort.xpm>
/* columns rows colors chars-per-pixel */
"32 32 5 1",
" c #000000",
". c #010101",
"X c #020202",
"o c #C1C1C1",
"O c None",
/* pixels */
"OO OO",
"O oooooooooooooooooooooooooooo O",
" oooooooooooooooooooooooooooooo ",
" oooooooooooooooooooooooooooooo ",
" oooooooo X oooooo ooo ",
" oooooooo oooooo ooo ",
" oooooooo oooooo ooo ",
" oooooooo oooooo oooX",
" oooooooo X oooooo ooo ",
" oooooooo oooooo ooo ",
" oooooooo Xoooooo ooo ",
" oooooooo oooooo X ooo ",
" oooooooo X oooooo ooo ",
" oooooooooooooooooooooooooooooo ",
" oooooooooooooooooooooo oooooooX",
" ooooooooooooooooooooooo oooooo ",
" oooooooooooooooo X ooooo ",
"O ooooooooooooooooooooooooooooo ",
"OO oooooooooooooooooo O",
"OOOOOOOOOOOO oooo ooo ooo ooo OO",
"OOOOOOOOOOOOO ooo ooo oooXooo OO",
"OOOOOOOOOOOOO oooXooo ooo ooo OO",
"OOOOOOOOOOOOO ooo ooo ooo ooo OO",
"OOOOOOOOOOOOO ooo ooo ooo ooo OO",
"OOOOOOOOOOOOO ooo ooo ooo ooo OO",
"OOOOOOOOOOOOO ooo ooo ooo ooo OO",
"OOOOOOOOOOOOO ooo ooo ooo oooXOO",
"OOOOOOOOOOOOO ooo ooo ooo ooo OO",
"OOOOOOOOOOOOOXooo ooo ooo ooo OO",
"OOOOOOOOOOOOO ooooooooooooooo OO",
"OOOOOOOOOOOOOO ooooooooooooo OOO",
"OOOOOOOOOOOOOOO OOOO"
};
GtkStatusIcon *status_tomb; GtkStatusIcon *status_tomb;
GtkMenu *menu_tomb; GtkMenu *menu_tomb;
NotifyNotification *notice;
GError *error;
// forward declaration of callbacks // forward declaration of callbacks
gboolean left_click(GtkWidget *w, GdkEvent *e); gboolean left_click(GtkWidget *w, GdkEvent *e);
gboolean cb_open(GtkWidget *w, GdkEvent *e); gboolean cb_close(GtkWidget *w, GdkEvent *e);
gboolean cb_quit(GtkWidget *w, GdkEvent *e);
int main(int argc, char **argv) { int main(int argc, char **argv) {
GObject *tray; GObject *tray;
GdkPixbuf *pb_monmort; GdkPixbuf *pb_monmort;
GtkWidget *menu_open, *menu_close, *menu_quit; GtkWidget *menu_close;
gint menu_x, menu_y; gint menu_x, menu_y;
gboolean push_in = true; gboolean push_in = true;
char tomb_file[512];
gtk_set_locale(); gtk_set_locale();
gtk_init(&argc, &argv); gtk_init(&argc, &argv);
// libnotify
notify_init(PACKAGE);
// set and show the status icon // set and show the status icon
pb_monmort = gdk_pixbuf_new_from_xpm_data(monmort); pb_monmort = gdk_pixbuf_new_from_xpm_data(monmort);
status_tomb = gtk_status_icon_new_from_pixbuf(pb_monmort); status_tomb = gtk_status_icon_new_from_pixbuf(pb_monmort);
// gtk_status_icon_set_name(status_tomb, "tomb"); // gtk_status_icon_set_name(status_tomb, "tomb");
gtk_status_icon_set_title(status_tomb, "Tomb"); gtk_status_icon_set_title(status_tomb, "Tomb");
gtk_status_icon_set_tooltip_text (status_tomb, "Tomb - encrypted storage undertaker"); gtk_status_icon_set_tooltip_text (status_tomb, "Tomb - crypto undertaker");
// gtk_status_icon_set_blinking(status_tomb, true); // gtk_status_icon_set_blinking(status_tomb, true);
menu_tomb = (GtkMenu*) gtk_menu_new(); menu_tomb = (GtkMenu*) gtk_menu_new();
menu_open = gtk_menu_item_new_with_label("Open");
gtk_menu_attach(menu_tomb, menu_open, 0, 1, 0, 1);
g_signal_connect_swapped(menu_open, "activate", G_CALLBACK(cb_open), NULL);
gtk_widget_show(menu_open);
menu_close = gtk_menu_item_new_with_label("Close"); menu_close = gtk_menu_item_new_with_label("Close");
gtk_menu_attach(menu_tomb, menu_close, 0, 1, 1, 2); gtk_menu_attach(menu_tomb, menu_close, 0, 1, 0, 1);
g_signal_connect_swapped(menu_close, "activate", G_CALLBACK(cb_close), NULL);
gtk_widget_show(menu_close); gtk_widget_show(menu_close);
menu_quit = gtk_menu_item_new_with_label("Quit");
gtk_menu_attach(menu_tomb, menu_quit, 0, 1, 2, 3);
g_signal_connect_swapped(menu_quit, "activate", G_CALLBACK(cb_quit), NULL);
gtk_widget_show(menu_quit);
g_signal_connect_swapped(status_tomb, "activate", G_CALLBACK(left_click), menu_tomb); g_signal_connect_swapped(status_tomb, "activate", G_CALLBACK(left_click), menu_tomb);
notice = notify_notification_new_with_status_icon
("Tomb encrypted undertaker",
"We started digging out bones",
NULL, status_tomb);
notify_notification_set_icon_from_pixbuf(notice, pb_monmort);
notify_notification_show(notice, &error);
gtk_main(); gtk_main();
notify_uninit();
exit(0); exit(0);
} }
// callbacks // callbacks
@ -109,7 +93,7 @@ gboolean left_click(GtkWidget *w, GdkEvent *e) {
gtk_status_icon_position_menu, status_tomb, gtk_status_icon_position_menu, status_tomb,
1, gtk_get_current_event_time()); 1, gtk_get_current_event_time());
} }
gboolean cb_open(GtkWidget *w, GdkEvent *e) { gboolean cb_close(GtkWidget *w, GdkEvent *e) {
execlp("tomb","tomb","mount","sarcofago","/mnt/etrom",NULL); execlp("tomb","tomb","-S","umount",NULL);
gtk_main_quit();
} }
gboolean cb_quit(GtkWidget *w, GdkEvent *e) { gtk_main_quit(); }

70
src/tomb-notify.cpp Normal file
View File

@ -0,0 +1,70 @@
/* Tomb - encrypted storage undertaker
*
* (c) Copyright 2007-2011 Denis Roio <jaromil@dyne.org>
*
* This source code is free software; you can redistribute it and/or
* modify it under the terms of the GNU Public License as published
* by the Free Software Foundation; either version 3 of the License,
* or (at your option) any later version.
*
* This source code is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* Please refer to the GNU Public License for more details.
*
* You should have received a copy of the GNU Public License along with
* this source code; if not, write to:
* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
// this file is a notification tool to send messages on the screen
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <libnotify/notify.h>
/* The Tomb icon is an artwork by Jordi aka MonMort
a nomadic graffiti artist from Barcelona */
#include <monmort.xpm>
int main(int argc, char **argv) {
NotifyNotification *notice;
GError *error;
GdkPixbuf *pb_monmort;
char title[256];
char body[512];
gtk_set_locale();
gtk_init(&argc, &argv);
// libnotify
notify_init(PACKAGE);
if(argc<3)
snprintf(body,511, "I'm the crypto undertaker.\nLet's start digging out bones.");
else
snprintf(body,511, "%s", argv[2]);
if(argc<2)
snprintf(title,255,"%s version %s",PACKAGE,VERSION);
else
snprintf(title,255, "%s", argv[1]);
// set the icon
pb_monmort = gdk_pixbuf_new_from_xpm_data(monmort);
notice = notify_notification_new(title, body, NULL, NULL);
notify_notification_set_icon_from_pixbuf(notice, pb_monmort);
notify_notification_show(notice, &error);
notify_uninit();
usleep(.5);
exit(0);
}