Add the Ceph monitoring GUI

This adds a graphical monitoring mode to the ceph cluster monitoring tool.  Its
functionality is similar to ./ceph -w. With ./ceph -g, you can watch over the
whole cluster graphically. It uses GTK2.

Signed-off-by: Colin McCabe <colinm@hq.newdream.net>
This commit is contained in:
Michael McThrow 2010-10-27 13:31:26 -07:00 committed by Colin Patrick McCabe
parent 10466c5263
commit 65fbd2ec93
24 changed files with 7611 additions and 174 deletions

View File

@ -220,6 +220,8 @@ AM_CONDITIONAL(WITH_GTK2, [test "x$HAVE_GTK2" = "xyes"])
if test "x$HAVE_GTK2" == "xyes"; then
PKG_CHECK_MODULES(GTKMM, [gtkmm-2.4 >= 1.0.0])
AC_DEFINE([HAVE_GTK2], [1],
[Define if you have GTK2])
fi
AC_CONFIG_HEADERS([src/acconfig.h])

View File

@ -29,6 +29,14 @@ cmds_CXXFLAGS = ${AM_CFLAGS}
# admin tools
ceph_SOURCES = tools/ceph.cc msg/SimpleMessenger.cc
ceph_LDADD = libcrush.a libcommon.a -ledit -lpthread -lm -lcrypto
ceph_CXXFLAGS = ${AM_CFLAGS}
if WITH_GTK2
ceph_SOURCES += tools/gui.cc
ceph_LDADD += $(GTKMM_LIBS)
ceph_CXXFLAGS += $(GTKMM_CFLAGS)
endif
cconf_SOURCES = cconf.cc
cconf_LDADD = libcommon.a -lpthread -lm -lcrypto
cauthtool_SOURCES = cauthtool.cc

View File

@ -17,14 +17,16 @@
#include <string>
using namespace std;
#include "config.h"
#include "mon/MonMap.h"
#include "mon/MonClient.h"
#include "msg/SimpleMessenger.h"
#include "acconfig.h"
#include "messages/MMonCommand.h"
#include "messages/MMonCommandAck.h"
#include "mon/MonClient.h"
#include "mon/MonMap.h"
#include "msg/SimpleMessenger.h"
#include "tools/ceph.h"
#include "common/Cond.h"
#include "common/Mutex.h"
#include "common/Timer.h"
#include "common/common_init.h"
@ -40,15 +42,22 @@ extern "C" {
#include <histedit.h>
}
enum CephToolMode {
CEPH_TOOL_MODE_CLI_INPUT = 0,
CEPH_TOOL_MODE_OBSERVER = 1,
CEPH_TOOL_MODE_ONE_SHOT_OBSERVER = 2,
CEPH_TOOL_MODE_GUI = 3
};
static enum CephToolMode ceph_tool_mode(CEPH_TOOL_MODE_CLI_INPUT);
Mutex lock("ceph.cc lock");
Cond cond;
SimpleMessenger *messenger = 0;
SafeTimer timer(lock);
MonClient mc;
struct ceph_tool_data g;
const char *outfile = 0;
static Cond cmd_cond;
static SimpleMessenger *messenger = 0;
static SafeTimer timer(g.lock);
static const char *outfile = 0;
@ -76,27 +85,22 @@ Context *resend_event = 0;
#include "messages/MMonObserve.h"
#include "messages/MMonObserveNotify.h"
int observe = 0;
bool one_shot = false;
static PGMap pgmap;
static MDSMap mdsmap;
static OSDMap osdmap;
static set<int> registered, seen;
version_t map_ver[PAXOS_NUM];
void handle_observe(MMonObserve *observe)
static void handle_observe(MMonObserve *observe)
{
dout(1) << observe->get_source() << " -> " << get_paxos_name(observe->machine_id)
<< " registered" << dendl;
lock.Lock();
g.lock.Lock();
registered.insert(observe->machine_id);
lock.Unlock();
g.lock.Unlock();
observe->put();
}
void handle_notify(MMonObserveNotify *notify)
static void handle_notify(MMonObserveNotify *notify)
{
utime_t now = g_clock.now();
@ -105,8 +109,8 @@ void handle_notify(MMonObserveNotify *notify)
<< (notify->is_latest ? " (latest)" : "")
<< dendl;
if (ceph_fsid_compare(&notify->fsid, &mc.monmap.fsid)) {
dout(0) << notify->get_source_inst() << " notify fsid " << notify->fsid << " != " << mc.monmap.fsid << dendl;
if (ceph_fsid_compare(&notify->fsid, &g.mc.monmap.fsid)) {
dout(0) << notify->get_source_inst() << " notify fsid " << notify->fsid << " != " << g.mc.monmap.fsid << dendl;
notify->put();
return;
}
@ -119,31 +123,34 @@ void handle_notify(MMonObserveNotify *notify)
{
bufferlist::iterator p = notify->bl.begin();
if (notify->is_latest) {
pgmap.decode(p);
g.pgmap.decode(p);
} else {
PGMap::Incremental inc;
inc.decode(p);
pgmap.apply_incremental(inc);
g.pgmap.apply_incremental(inc);
}
cout << now << " pg " << pgmap << std::endl;
*g.log << now << " pg " << g.pgmap << std::endl;
g.updates |= PG_MON_UPDATE;
break;
}
case PAXOS_MDSMAP:
mdsmap.decode(notify->bl);
cout << now << " mds " << mdsmap << std::endl;
g.mdsmap.decode(notify->bl);
*g.log << now << " mds " << g.mdsmap << std::endl;
g.updates |= MDS_MON_UPDATE;
break;
case PAXOS_OSDMAP:
{
if (notify->is_latest) {
osdmap.decode(notify->bl);
g.osdmap.decode(notify->bl);
} else {
OSDMap::Incremental inc(notify->bl);
osdmap.apply_incremental(inc);
g.osdmap.apply_incremental(inc);
}
cout << now << " osd " << osdmap << std::endl;
*g.log << now << " osd " << g.osdmap << std::endl;
}
g.updates |= OSD_MON_UPDATE;
break;
case PAXOS_LOG:
@ -154,14 +161,14 @@ void handle_notify(MMonObserveNotify *notify)
::decode(summary, p);
// show last log message
if (!summary.tail.empty())
cout << now << " log " << summary.tail.back() << std::endl;
*g.log << now << " log " << summary.tail.back() << std::endl;
} else {
LogEntry le;
__u8 v;
::decode(v, p);
while (!p.end()) {
le.decode(p);
cout << now << " log " << le << std::endl;
*g.log << now << " log " << le << std::endl;
}
}
break;
@ -180,7 +187,7 @@ void handle_notify(MMonObserveNotify *notify)
tClassVersionMap::iterator iter = map.begin();
if (iter != map.end())
cout << now << " class " << iter->second << std::endl;
*g.log << now << " class " << iter->second << std::endl;
}
} else {
__u8 v;
@ -190,7 +197,7 @@ void handle_notify(MMonObserveNotify *notify)
::decode(inc, p);
ClassInfo info;
inc.decode_info(info);
cout << now << " class " << info << std::endl;
*g.log << now << " class " << info << std::endl;
}
}
break;
@ -203,12 +210,12 @@ void handle_notify(MMonObserveNotify *notify)
if (notify->is_latest) {
KeyServerData data;
::decode(data, p);
cout << now << " auth " << std::endl;
*g.log << now << " auth " << std::endl;
} else {
while (!p.end()) {
AuthMonitor::Incremental inc;
inc.decode(p);
cout << now << " auth " << inc.name.to_str() << std::endl;
*g.log << now << " auth " << inc.name.to_str() << std::endl;
}
}
#endif
@ -218,22 +225,32 @@ void handle_notify(MMonObserveNotify *notify)
case PAXOS_MONMAP:
{
mc.monmap.decode(notify->bl);
cout << now << " mon " << mc.monmap << std::endl;
g.mc.monmap.decode(notify->bl);
*g.log << now << " mon " << g.mc.monmap << std::endl;
}
break;
default:
cout << now << " ignoring unknown machine id " << notify->machine_id << std::endl;
*g.log << now << " ignoring unknown machine id " << notify->machine_id << std::endl;
}
map_ver[notify->machine_id] = notify->ver;
// have we seen them all?
seen.insert(notify->machine_id);
if (one_shot && seen.size() == PAXOS_NUM) {
messenger->shutdown();
}
switch (ceph_tool_mode) {
case CEPH_TOOL_MODE_ONE_SHOT_OBSERVER:
if (seen.size() == PAXOS_NUM) {
messenger->shutdown();
}
break;
case CEPH_TOOL_MODE_GUI:
g.gui_cond.Signal();
break;
default:
// do nothing
break;
}
notify->put();
}
@ -255,9 +272,9 @@ static void send_observe_requests()
bool sent = false;
for (int i=0; i<PAXOS_NUM; i++) {
MMonObserve *m = new MMonObserve(mc.monmap.fsid, i, map_ver[i]);
MMonObserve *m = new MMonObserve(g.mc.monmap.fsid, i, map_ver[i]);
dout(1) << "mon" << " <- observe " << get_paxos_name(i) << dendl;
mc.send_mon_message(m);
g.mc.send_mon_message(m);
sent = true;
}
@ -267,35 +284,34 @@ static void send_observe_requests()
timer.add_event_after(seconds, new C_ObserverRefresh(false));
}
void handle_ack(MMonCommandAck *ack)
static void handle_ack(MMonCommandAck *ack)
{
lock.Lock();
g.lock.Lock();
reply = true;
reply_from = ack->get_source_inst();
reply_rs = ack->rs;
reply_rc = ack->r;
reply_bl = ack->get_data();
cond.Signal();
cmd_cond.Signal();
if (resend_event) {
timer.cancel_event(resend_event);
resend_event = 0;
}
lock.Unlock();
g.lock.Unlock();
ack->put();
}
void send_command()
static void send_command()
{
version_t last_seen_version = 0;
MMonCommand *m = new MMonCommand(mc.monmap.fsid, last_seen_version);
MMonCommand *m = new MMonCommand(g.mc.monmap.fsid, last_seen_version);
m->cmd = pending_cmd;
m->set_data(pending_bl);
cout << g_clock.now() << " mon" << " <- " << pending_cmd << std::endl;
mc.send_mon_message(m);
*g.log << g_clock.now() << " mon" << " <- " << pending_cmd << std::endl;
g.mc.send_mon_message(m);
}
class Admin : public Dispatcher {
bool ms_dispatch(Message *m) {
switch (m->get_type()) {
@ -319,12 +335,13 @@ class Admin : public Dispatcher {
void ms_handle_connect(Connection *con) {
if (con->get_peer_type() == CEPH_ENTITY_TYPE_MON) {
lock.Lock();
if (observe)
g.lock.Lock();
if (ceph_tool_mode != CEPH_TOOL_MODE_CLI_INPUT) {
send_observe_requests();
}
if (pending_cmd.size())
send_command();
lock.Unlock();
g.lock.Unlock();
}
}
bool ms_handle_reset(Connection *con) { return false; }
@ -334,7 +351,7 @@ class Admin : public Dispatcher {
int do_command(vector<string>& cmd, bufferlist& bl, string& rs, bufferlist& rbl)
{
Mutex::Locker l(lock);
Mutex::Locker l(g.lock);
pending_cmd = cmd;
pending_bl = bl;
@ -343,11 +360,11 @@ int do_command(vector<string>& cmd, bufferlist& bl, string& rs, bufferlist& rbl)
send_command();
while (!reply)
cond.Wait(lock);
cmd_cond.Wait(g.lock);
rs = rs;
rbl = reply_bl;
cout << g_clock.now() << " "
*g.log << g_clock.now() << " "
<< reply_from.name << " -> '"
<< reply_rs << "' (" << reply_rc << ")"
<< std::endl;
@ -355,9 +372,7 @@ int do_command(vector<string>& cmd, bufferlist& bl, string& rs, bufferlist& rbl)
return reply_rc;
}
void usage()
static void usage()
{
cerr << "usage: ceph [options] [commands]" << std::endl;
cerr << "If no commands are specified, enter interactive mode.\n";
@ -373,11 +388,13 @@ void usage()
cerr << " print current system status\n";
cerr << " -w or --watch\n";
cerr << " watch system status changes in real time (push)\n";
cerr << " -g or --gui\n";
cerr << " watch system status changes graphically\n";
generic_client_usage();
}
const char *cli_prompt(EditLine *e) {
static const char *cli_prompt(EditLine *e)
{
return "ceph> ";
}
@ -402,95 +419,21 @@ int do_cli()
/* This sets up the call back functions for history functionality */
el_set(el, EL_HIST, history, myhistory);
Tokenizer *tok = tok_init(NULL);
bufferlist in;
while (1) {
int count; // # chars read
const char *line = el_gets(el, &count);
int chars_read;
const char *line = el_gets(el, &chars_read);
if (!count) {
cout << "quit" << std::endl;
//*g.log << "typed '" << line << "'" << std::endl;
if (chars_read == 0) {
*g.log << "quit" << std::endl;
break;
}
//cout << "typed '" << line << "'" << std::endl;
if (strcmp(line, "quit\n") == 0)
break;
history(myhistory, &ev, H_ENTER, line);
int argc;
const char **argv;
tok_str(tok, line, &argc, &argv);
tok_reset(tok);
vector<string> cmd;
const char *infile = 0;
const char *outfile = 0;
for (int i=0; i<argc; i++) {
if (strcmp(argv[i], ">") == 0 && i < argc-1) {
outfile = argv[++i];
continue;
}
if (argv[i][0] == '>') {
outfile = argv[i] + 1;
while (*outfile == ' ') outfile++;
continue;
}
if (strcmp(argv[i], "<") == 0 && i < argc-1) {
infile = argv[++i];
continue;
}
if (argv[i][0] == '<') {
infile = argv[i] + 1;
while (*infile == ' ') infile++;
continue;
}
cmd.push_back(argv[i]);
}
if (cmd.empty())
continue;
if (cmd.size() == 1 && cmd[0] == "print") {
cout << "----" << std::endl;
write(1, in.c_str(), in.length());
cout << "---- (" << in.length() << " bytes)" << std::endl;
continue;
}
//cout << "cmd is " << cmd << std::endl;
bufferlist out;
if (infile) {
if (out.read_file(infile) == 0) {
cout << "read " << out.length() << " from " << infile << std::endl;
} else {
char buf[80];
cerr << "couldn't read from " << infile << ": " << strerror_r(errno, buf, sizeof(buf)) << std::endl;
continue;
}
}
in.clear();
string rs;
do_command(cmd, out, rs, in);
if (in.length()) {
if (outfile) {
if (strcmp(outfile, "-") == 0) {
cout << "----" << std::endl;
write(1, in.c_str(), in.length());
cout << "---- (" << in.length() << " bytes)" << std::endl;
} else {
in.write_file(outfile);
cout << "wrote " << in.length() << " to " << outfile << std::endl;
}
} else {
cout << "got " << in.length() << " byte payload; 'print' to dump to terminal, or add '>-' to command." << std::endl;
}
}
if (run_command(line))
break;
}
history_end(myhistory);
@ -499,12 +442,95 @@ int do_cli()
return 0;
}
int main(int argc, const char **argv, const char *envp[])
int run_command(const char *line)
{
if (strcmp(line, "quit\n") == 0)
return 1;
int argc;
const char **argv;
Tokenizer *tok = tok_init(NULL);
tok_str(tok, line, &argc, &argv);
tok_reset(tok);
tok_end(tok);
vector<string> cmd;
const char *infile = 0;
const char *outfile = 0;
for (int i=0; i<argc; i++) {
if (strcmp(argv[i], ">") == 0 && i < argc-1) {
outfile = argv[++i];
continue;
}
if (argv[i][0] == '>') {
outfile = argv[i] + 1;
while (*outfile == ' ') outfile++;
continue;
}
if (strcmp(argv[i], "<") == 0 && i < argc-1) {
infile = argv[++i];
continue;
}
if (argv[i][0] == '<') {
infile = argv[i] + 1;
while (*infile == ' ') infile++;
continue;
}
cmd.push_back(argv[i]);
}
if (cmd.empty())
return 0;
bufferlist in;
if (cmd.size() == 1 && cmd[0] == "print") {
*g.log << "----" << std::endl;
write(1, in.c_str(), in.length());
*g.log << "---- (" << in.length() << " bytes)" << std::endl;
return 0;
}
//out << "cmd is " << cmd << std::endl;
bufferlist out;
if (infile) {
if (out.read_file(infile) == 0) {
*g.log << "read " << out.length() << " from " << infile << std::endl;
} else {
char buf[80];
*g.log << "couldn't read from " << infile << ": " << strerror_r(errno, buf, sizeof(buf)) << std::endl;
return 0;
}
}
in.clear();
string rs;
do_command(cmd, out, rs, in);
if (in.length() == 0)
return 0;
if (outfile) {
if (strcmp(outfile, "-") == 0) {
*g.log << "----" << std::endl;
write(1, in.c_str(), in.length());
*g.log << "---- (" << in.length() << " bytes)" << std::endl;
}
else {
in.write_file(outfile);
*g.log << "wrote " << in.length() << " to "
<< outfile << std::endl;
}
}
else {
*g.log << "got " << in.length() << " byte payload; 'print' "
<< "to dump to terminal, or add '>-' to command." << std::endl;
}
return 0;
}
int main(int argc, const char **argv)
{
ostringstream gss;
DEFINE_CONF_VARS(usage);
vector<const char*> args;
argv_to_vec(argc, argv, args);
@ -542,12 +568,13 @@ int main(int argc, const char **argv, const char *envp[])
cout << "read " << st.st_size << " bytes from " << args[i] << std::endl;
}
} else if (CONF_ARG_EQ("status", 's')) {
CONF_SAFE_SET_ARG_VAL(&observe, OPT_BOOL);
one_shot = true;
ceph_tool_mode = CEPH_TOOL_MODE_ONE_SHOT_OBSERVER;
} else if (CONF_ARG_EQ("watch", 'w')) {
CONF_SAFE_SET_ARG_VAL(&observe, OPT_BOOL);
ceph_tool_mode = CEPH_TOOL_MODE_OBSERVER;
} else if (CONF_ARG_EQ("help", 'h')) {
usage();
} else if (CONF_ARG_EQ("gui", 'g')) {
ceph_tool_mode = CEPH_TOOL_MODE_GUI;
} else if (args[i][0] == '-' && nargs.empty()) {
cerr << "unrecognized option " << args[i] << std::endl;
usage();
@ -565,7 +592,7 @@ int main(int argc, const char **argv, const char *envp[])
}
// get monmap
if (mc.build_initial_monmap() < 0)
if (g.mc.build_initial_monmap() < 0)
return -1;
// start up network
@ -575,31 +602,39 @@ int main(int argc, const char **argv, const char *envp[])
messenger->start();
mc.set_messenger(messenger);
mc.init();
g.mc.set_messenger(messenger);
g.mc.init();
if (mc.authenticate() < 0) {
if (g.mc.authenticate() < 0) {
cerr << "unable to authenticate as " << *g_conf.entity_name << std::endl;
return -1;
}
if (mc.get_monmap() < 0) {
if (g.mc.get_monmap() < 0) {
cerr << "unable to get monmap" << std::endl;
return -1;
}
int ret = 0;
if (observe) {
lock.Lock();
send_observe_requests();
lock.Unlock();
} else {
if (vcmd.size()) {
switch (ceph_tool_mode)
{
case CEPH_TOOL_MODE_OBSERVER:
case CEPH_TOOL_MODE_ONE_SHOT_OBSERVER:
g.lock.Lock();
send_observe_requests();
g.lock.Unlock();
break;
case CEPH_TOOL_MODE_CLI_INPUT: {
if (vcmd.empty()) {
// interactive mode
do_cli();
messenger->shutdown();
break;
}
string rs;
bufferlist odata;
ret = do_command(vcmd, indata, rs, odata);
int len = odata.length();
if (len) {
if (outfile) {
@ -613,18 +648,37 @@ int main(int argc, const char **argv, const char *envp[])
cout << g_clock.now() << " got " << len << " byte payload, discarding (specify -o <outfile)" << std::endl;
}
}
} else {
// interactive mode
do_cli();
messenger->shutdown();
break;
}
messenger->shutdown();
}
case CEPH_TOOL_MODE_GUI: {
#ifdef HAVE_GTK2
g.log = &gss;
g.slog = &gss;
// TODO: make sure that we capture the log this generates in the GUI
g.lock.Lock();
send_observe_requests();
g.lock.Unlock();
run_gui(argc, (char **)argv);
#else
cerr << "I'm sorry. This tool was not compiled with support for "
<< "GTK2." << std::endl;
ret = EXIT_FAILURE;
#endif
messenger->shutdown();
break;
}
default:
assert(0);
break;
}
// wait for messenger to finish
messenger->wait();
messenger->destroy();
return ret;
}

60
src/tools/ceph.h Normal file
View File

@ -0,0 +1,60 @@
#ifndef CEPH_TOOL_H
#define CEPH_TOOL_H
#include "common/Cond.h"
#include "common/Mutex.h"
#include "mon/MonClient.h"
#include "mon/PGMap.h"
#include "mds/MDSMap.h"
#include "osd/OSDMap.h"
#include <iosfwd>
#include <stdint.h>
#define OSD_MON_UPDATE (1<<0)
#define MDS_MON_UPDATE (1<<1)
#define PG_MON_UPDATE (1<<2)
#define MON_MON_UPDATE (1<<3)
#define EVERYTHING_UPDATE 0xffffffff
// tool/ceph.cc
struct ceph_tool_data
{
PGMap pgmap;
MDSMap mdsmap;
OSDMap osdmap;
MonClient mc;
// Which aspects of the cluster have been updated recently?
uint32_t updates;
// The main log for ceph-tool
std::ostream *log;
// Used by the GUI to read from the log.
// NULL if there is no GUI active.
std::ostringstream *slog;
// The ceph-tool lock
Mutex lock;
// A condition variable used to wake up the GUI thread
Cond gui_cond;
ceph_tool_data()
: updates(EVERYTHING_UPDATE),
log(&std::cout),
slog(NULL),
lock("ceph.cc lock")
{
}
};
// tool/ceph.cc
extern struct ceph_tool_data g;
int run_command(const char *line);
// tool/gyi.cc
int run_gui(int argc, char **argv);
#endif

1727
src/tools/gui.cc Normal file

File diff suppressed because it is too large Load Diff

394
src/tools/gui.h Normal file
View File

@ -0,0 +1,394 @@
/* -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
* vim: ts=8 sw=2 smarttab
*
* gui_monitor_interface.h
*
* Michael McThrow <mmcthrow@gmail.com>
*/
#ifndef CEPH_GUI_H
#define CEPH_GUI_H
#include "common/common_init.h"
#include "mds/MDSMap.h"
#include "mon/MonMap.h"
#include "mon/PGMap.h"
#include "msg/tcp.h"
#include "osd/OSDMap.h"
#include <boost/algorithm/string.hpp>
#include <boost/format.hpp>
#include <boost/lexical_cast.hpp>
#include <gtkmm.h>
#include <iosfwd>
enum NodeType {
OSD_NODE = 0,
PG_NODE,
MDS_NODE,
MON_NODE,
NUM_NODE_TYPES
};
class GuiMonitorThread;
// Contains information about a range of nodes (or a specific node)
class NodeInfo {
public:
unsigned int begin_range;
unsigned int end_range;
enum NodeType type;
int status;
NodeInfo(unsigned int begin_range_, unsigned int end_range_,
enum NodeType type_, int status_)
: begin_range(begin_range_),
end_range(end_range_),
type(type_),
status(status_)
{
}
};
// Variables, classes, and methods releated to handling the main window and
// dialog boxes are stored in the GuiMonitor class.
class GuiMonitor
{
private:
// Used for displaying icons of the nodes in a cluster.
class NodeIconColumns : public Gtk::TreeModel::ColumnRecord {
public:
Gtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > icon;
Gtk::TreeModelColumn<Glib::ustring> caption;
Gtk::TreeModelColumn<unsigned int> begin_range;
Gtk::TreeModelColumn<unsigned int> end_range;
Gtk::TreeModelColumn<int> status;
NodeIconColumns() {
add(icon);
add(caption);
add(begin_range);
add(end_range);
add(status);
}
};
// Used for displaying information about either a cluter or a node.
class KeyValueModelColumns : public Gtk::TreeModel::ColumnRecord {
public:
Gtk::TreeModelColumn<Glib::ustring> key;
Gtk::TreeModelColumn<Glib::ustring> value;
KeyValueModelColumns() {
add(key);
add(value);
}
};
// Used for displaying different types of nodes in the "View Node..." dialog
// box.
class ViewNodeOptionColumns : public Gtk::TreeModel::ColumnRecord {
public:
Gtk::TreeModelColumn<enum NodeType> type;
Gtk::TreeModelColumn<Glib::ustring> name;
ViewNodeOptionColumns() {
add(type);
add(name);
}
};
// Variables, classes, and methods related to the node statistics and cluster
// statistics windows.
class StatsWindowInfo {
public:
StatsWindowInfo(GuiMonitor *gui_,
Glib::RefPtr<Gtk::Builder> builder,
bool is_cluster_, enum NodeType type_, int id_);
~StatsWindowInfo();
void init();
public:
/*
* GUI Elements
*/
GuiMonitor *gui;
Gtk::Window *stats_window;
Gtk::Label *stats_info_label;
Gtk::TreeView *stats_info_tree_view;
Gtk::Button *stats_copy_button;
Gtk::Button *stats_save_button;
Gtk::Button *stats_close_button;
private:
KeyValueModelColumns columns;
Glib::RefPtr<Gtk::ListStore> stats;
bool is_cluster;
enum NodeType type;
int id;
/*
* Private Functions
*/
private:
// Closes the window that contains the statistics of a node or cluster.
// Called by nodeStatsWindow by signal_delete_event.
bool closeWindow(GdkEventAny *event) {
delete this;
return true;
}
void copy();
// Closes the window that contains the statistics of a node or cluster.
// Called by nodeStatsCloseButton by signal_clicked.
void close() {
delete this;
}
void gen_osd_cluster_columns();
void gen_mds_cluster_columns();
void gen_pg_cluster_columns();
void gen_monitor_cluster_columns();
void gen_osd_node_columns();
void gen_mds_node_columns();
void gen_pg_node_columns();
std::string stats_string();
void insert_stats(const std::string &key, const std::string &value);
};
friend class StatsWindowInfo;
public:
GuiMonitor(Glib::RefPtr<Gtk::Builder> builder);
~GuiMonitor();
bool init();
void run_main_loop(Gtk::Main &kit);
void check_status();
private:
/*
* Private Functions
*/
void get_widgets(Glib::RefPtr<Gtk::Builder> builder_object);
bool open_icon(Glib::RefPtr<Gdk::Pixbuf> &icon, std::string path);
void connect_signals();
void link_elements();
void update_osd_cluster_view();
void update_mds_cluster_view();
void update_pg_cluster_view();
void update_mon_cluster_view();
std::string gen_osd_icon_caption(unsigned int begin, unsigned int end);
std::string gen_mds_icon_caption(unsigned int begin, unsigned int end);
std::string gen_pg_icon_caption(unsigned int begin, unsigned int end);
std::vector<NodeInfo *> gen_node_info_from_icons
(Glib::RefPtr<Gtk::ListStore> iconStore, enum NodeType type);
void gen_icons_from_node_info(vector<NodeInfo *>& node_info);
void view_osd_nodes(unsigned int begin, unsigned int end,
bool view_all = true);
void view_mds_nodes(unsigned int begin = 0, unsigned int end = 0,
bool view_all = true);
void view_pg_nodes(unsigned int begin, unsigned int end,
bool view_all);
int find_mds_id(const std::string &name);
void open_stats(enum NodeType type, bool is_cluster, int id);
void dialog_error(const std::string &msg, Gtk::MessageType type);
/*
* Signal handlers
*/
// Exits the program. Called by Gtk::Main by signal_quit
bool quit_signal_handler();
// Quits the GUI. Called by guiMonitorWindow by signal_delete_event.
bool quit_gui(GdkEventAny *event);
// Quits the GUI. Called by guiMonitorQuitImageMenuItem by signal_activate.
void gui_monitor_quit();
// Copies the text in guiMonitorLogTextView onto the clipboard. Called by
// guiMonitorCopyImageMenuItem by signal_activate.
void copy_log();
// Opens the "Send Command...." window. Called by
// guiMonitorSendCommandMenuItem for signal_activate.
void open_send_command();
// Opens the "View Node..." window. Called by guiMonitorViewNodeMenuItem by
// signal_activate.
void open_view_mode();
// Opens the "About" dialog box. Called by guiMonitorAboutImageMenuItem by
// signal_activate.
void open_about_dialog();
// Performs "zoom in" option for the PG cluster icon view area. Allows the
// user to "zoom in" on a narrower range of nodes until he or she selects a
// specific node of interest. Called by guiMonitorPGClusterIconView by
// signal_item_activated.
void pg_cluster_zoom_in(const Gtk::TreeModel::Path& path);
// Allows user to "zoom out" one level of the PG cluster view area to obtain
// a broader range of nodes until he or she views the overall amount of
// nodes. Called by guiMonitorPGClusterBackButton by signal_clicked
void pg_cluster_back();
// Allows user to view the broadest range of nodes in the PG cluster. Called
// by guiMonitorPGClusterViewAllButton by signal_clicked.
void pg_cluster_view_all();
// Allows user to obtain the statistics of the PG cluster. Called by
// guiMonitorPCClusterStatsButton by signal_clicked.
void pg_cluster_stats();
// Allows user to obtain the statistics of the monitor cluster. Called by
// guiMonitorMonitorClusterStatsButton by signal_clicked.
void monitor_cluster_stats();
// Performs "zoom in" option for the OSD cluster icon view area. Allows the
// user to "zoom in" on a narrower range of nodes until he or she selects a
// specific node of interest. Called by guiMonitorOSDClusterIconView by
// signal_item_activated.
void osdc_cluster_zoom_in(const Gtk::TreeModel::Path& path);
// Allows user to "zoom out" one level of the OSD cluster view area to obtain
// a broader range of nodes until he or she views the overall amount of
// nodes. Called by guiMonitorOSDClusterBackButton by signal_clicked
void osdc_cluster_back();
// Allows user to view the broadest range of nodes in the PG cluster. Called
// by guiMonitorOSDClusterViewAllButton by signal_clicked.
void osdc_cluster_view_all();
// Allows user to obtain the statistics of the OSD cluster. Called by
// guiMonitorOSDClusterStatsButton by signal_clicked.
void osdc_cluster_stats();
// Performs "zoom in" option for the MDS cluster icon view area. Allows the
// user to "zoom in" on a narrower range of nodes until he or she selects a
// specific node of interest. Called by guiMonitorMDSClusterIconView by
// signal_item_activated.
void mds_cluster_zoom_in(const Gtk::TreeModel::Path& path);
// Allows user to "zoom out" one level of the MDS cluster view area to obtain
// a broader range of nodes until he or she views the overall amount of
// nodes. Called by guiMonitorMDSClusterBackButton by signal_clicked.
void mds_cluster_back();
// Allows user to view the broadest range of nodes in the MDS cluster.
// Called by guiMonitorMDSClusterViewAllButton by signal_clicked.
void mds_cluster_view_all();
// Allows user to obtain the statistics of the MDS cluster. Called by
// guiMonitorMDSClusterStatsButton by signal_clicked.
void mds_cluster_stats();
// Called when a button is pressed in the "View Node..." dialog box.
void handle_view_node_response(int response);
// Called when a node type is selected in the "View Node..." dialog box.
void handle_view_node_change();
// Called when a button is pressed in the "Send Command..." dialog box.
void handle_send_command_response(int response);
unsigned int pg_cluster_zoom; // current zoom level of the PG cluster view
unsigned int osd_cluster_zoom; // current zoom level of the OSD cluster view
unsigned int mds_cluster_zoom; // current zoom level of the MDS cluster view
stack<vector<NodeInfo *> > old_pg_cluster_zoom_states;
stack<vector<NodeInfo *> > old_osd_cluster_zoom_states;
stack<vector<NodeInfo *> > old_mds_cluster_zoom_states;
std::vector <std::string> current_up_mds;
std::vector <pg_t> current_pgs;
bool send_command_success; // did "Send Command..." end without errors?
bool view_node_success; // did "View Node..." end without errors?"
GuiMonitorThread *thread;
///// GUI Elements /////
// Main Window
Gtk::Window *guiMonitorWindow;
Gtk::ImageMenuItem *guiMonitorQuitImageMenuItem;
Gtk::ImageMenuItem *guiMonitorCopyImageMenuItem;
Gtk::MenuItem *guiMonitorSendCommandMenuItem;
Gtk::MenuItem *guiMonitorViewNodeMenuItem;
Gtk::ImageMenuItem *guiMonitorAboutImageMenuItem;
Gtk::TextView *guiMonitorLogTextView;
Glib::RefPtr<Gtk::TextBuffer> guiMonitorLogTextBuffer;
Gtk::Statusbar *guiMonitorStatusbar;
// Main Window -- Placement Groups Section
Gtk::Label *guiMonitorPGClusterStatsLabel;
Gtk::IconView *guiMonitorPGClusterIconView;
Glib::RefPtr<Gtk::ListStore> guiMonitorPGClusterIcons;
Gtk::Button *guiMonitorPGClusterBackButton;
Gtk::Button *guiMonitorPGClusterViewAllButton;
Gtk::Button *guiMonitorPGClusterStatsButton;
// Main Window -- Monitor Cluster Section
Gtk::Label *guiMonitorMonitorClusterStatsLabel;
Gtk::Button *guiMonitorMonitorClusterStatsButton;
Gtk::TreeView *guiMonitorMonitorClusterTreeView;
Glib::RefPtr<Gtk::ListStore> guiMonitorMonitorClusterEntries;
KeyValueModelColumns monitorColumns;
// Main Window -- OSD Cluster Section
Gtk::Label *guiMonitorOSDClusterStatsLabel;
Gtk::IconView *guiMonitorOSDClusterIconView;
Glib::RefPtr<Gtk::ListStore> guiMonitorOSDClusterIcons;
Gtk::Button *guiMonitorOSDClusterBackButton;
Gtk::Button *guiMonitorOSDClusterViewAllButton;
Gtk::Button *guiMonitorOSDClusterStatsButton;
// Main Window -- Metadata Server Section
Gtk::Label *guiMonitorMDSClusterStatsLabel;
Gtk::IconView *guiMonitorMDSClusterIconView;
Glib::RefPtr<Gtk::ListStore> guiMonitorMDSClusterIcons;
Gtk::Button *guiMonitorMDSClusterBackButton;
Gtk::Button *guiMonitorMDSClusterViewAllButton;
Gtk::Button *guiMonitorMDSClusterStatsButton;
// View Node Dialog
Gtk::Dialog *viewNodeDialog;
Gtk::Entry *viewNodeNameEntry;
Gtk::ComboBox *viewNodeTypeComboBox;
Glib::RefPtr<Gtk::ListStore> viewNodeNodeTypeListStore;
Gtk::Label *viewNodeNameLabel;
ViewNodeOptionColumns viewNodeColumns;
// Send Command Window
Gtk::Dialog *sendCommandDialog;
Gtk::Entry *sendCommandPromptEntry;
// About Dialog
Gtk::AboutDialog *guiMonitorAboutDialog;
// Icons
Glib::RefPtr<Gdk::Pixbuf> blacklistIcon;
Glib::RefPtr<Gdk::Pixbuf> clientIcon;
//Glib::RefPtr<Gdk::Pixbuf> failedMDSIcon;
Glib::RefPtr<Gdk::Pixbuf> MDSIcon;
Glib::RefPtr<Gdk::Pixbuf> monitorIcon;
Glib::RefPtr<Gdk::Pixbuf> upOSDIcon;
Glib::RefPtr<Gdk::Pixbuf> downOSDIcon;
Glib::RefPtr<Gdk::Pixbuf> outOSDIcon;
Glib::RefPtr<Gdk::Pixbuf> PGIcon;
//Glib::RefPtr<Gdk::Pixbuf> stoppedMDSIcon;
NodeIconColumns icon_columns;
};
#endif

19
src/tools/gui_resources.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef GUI_RESOURCES_H
#define GUI_RESOURCES_H
/* TODO: Place these in a resource file or some other mechanism */
#define GUI_MONITOR_BUILDER_FILE "gui_resources/gui_monitor.build"
#define STATS_WINDOW_BUILDER_FILE "gui_resources/stats_window.glade"
#define BLACKLIST_ICON_PATH "gui_resources/blacklist.svg"
#define CLIENT_ICON_PATH "gui_resources/client.svg"
#define FAILED_MDS_ICON_PATH "gui_resources/failed_mds.svg"
#define MDS_ICON_PATH "gui_resources/mds.svg"
#define MONITOR_ICON_PATH "gui_resources/monitor.svg"
#define UP_OSD_ICON_PATH "gui_resources/osd.svg"
#define DOWN_OSD_ICON_PATH "gui_resources/down_osd.svg"
#define OUT_OSD_ICON_PATH "gui_resources/out_osd.svg"
#define PG_ICON_PATH "gui_resources/pg.svg"
#define STOPPED_MDS_ICON_PATH "gui_resources/stopped_mds.svg"
#endif

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 41 KiB

View File

@ -0,0 +1,96 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32px"
height="32px"
id="svg3515"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docname="client.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3517">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 16 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="32 : 16 : 1"
inkscape:persp3d-origin="16 : 10.666667 : 1"
id="perspective3523" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.197802"
inkscape:cx="16"
inkscape:cy="16"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1280"
inkscape:window-height="725"
inkscape:window-x="0"
inkscape:window-y="25" />
<metadata
id="metadata3520">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
sodipodi:type="arc"
style="fill:#ffff00;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path3525"
sodipodi:cx="17.012268"
sodipodi:cy="16.059372"
sodipodi:rx="9.6000986"
sodipodi:ry="9.3321886"
d="M 26.612367,16.059372 A 9.6000986,9.3321886 0 1 1 7.4121695,16.059372 A 9.6000986,9.3321886 0 1 1 26.612367,16.059372 z"
transform="translate(-1.3395486,-0.7144259)" />
<path
sodipodi:type="arc"
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path4036"
sodipodi:cx="12.189892"
sodipodi:cy="12.621197"
sodipodi:rx="1.4735035"
sodipodi:ry="1.4288518"
d="M 13.663395,12.621197 A 1.4735035,1.4288518 0 1 1 10.716388,12.621197 A 1.4735035,1.4288518 0 1 1 13.663395,12.621197 z"
transform="matrix(0.5306128,0,0,0.6721944,5.9896895,3.7354344)" />
<path
sodipodi:type="arc"
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path4062"
sodipodi:cx="12.189892"
sodipodi:cy="12.621197"
sodipodi:rx="1.4735035"
sodipodi:ry="1.4288518"
d="M 13.663395,12.621197 A 1.4735035,1.4288518 0 1 1 10.716388,12.621197 A 1.4735035,1.4288518 0 1 1 13.663395,12.621197 z"
transform="matrix(0.5306128,0,0,0.6721944,12.374872,3.7350247)" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 10.537782,17.086359 C 15.092248,21.015701 20.539745,17.175662 20.539745,17.175662"
id="path4066" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -0,0 +1,102 @@
<?xml version="1.0"?>
<interface>
<!-- interface-requires gtk+ 2.8 -->
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="statsWindow">
<property name="border_width">5</property>
<child>
<object class="GtkVBox" id="statsVBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="clusterStatsInfoLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="clusterStatsScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkTreeView" id="clusterStatsInfoTreeView">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="clusterStatsBottomHBox">
<property name="visible">True</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkHBox" id="clusterStatsButtonsHBox">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="clusterStatsCopyButton">
<property name="label" translatable="yes">gtk-copy</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="clusterStatsSaveButton">
<property name="label" translatable="yes">gtk-save-as</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="clusterStatsCloseButton">
<property name="label" translatable="yes">gtk-close</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 39 KiB

View File

@ -0,0 +1,118 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32px"
height="32px"
id="svg3327"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docname="failed_mds.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3329">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 16 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="32 : 16 : 1"
inkscape:persp3d-origin="16 : 10.666667 : 1"
id="perspective3335" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9180417"
inkscape:cx="-11.684466"
inkscape:cy="21.927714"
inkscape:current-layer="svg3327"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1280"
inkscape:window-height="725"
inkscape:window-x="0"
inkscape:window-y="25" />
<metadata
id="metadata3332">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 18.656491,25.047041 L 27.72077,19.956756 L 27.72077,19.956756 L 27.72077,19.956756"
id="path3461" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 18.745794,24.779131 L 18.745794,13.16971 L 18.745794,13.16971"
id="path3463" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 9.8154699,11.160387 L 18.879749,13.526923"
id="path3465" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 18.656579,13.526923 L 27.720858,8.4366372 L 27.720858,8.4366372 L 27.720858,8.4366372"
id="path3467" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.02936888px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 27.497512,8.0197056 L 27.497512,20.462992"
id="path3469" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 10.195009,11.160387 L 19.259288,6.0701016 L 19.259288,6.0701016 L 19.259288,6.0701016"
id="path3471" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.01581013px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 10.261986,23.200389 L 10.261986,11.220973 L 10.261986,11.220973"
id="path3473" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 9.8824473,22.524224 L 18.946726,24.89076"
id="path3475" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.97621411px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 18.934833,6.169838 L 27.487079,8.5601597"
id="path3477" />
<path
style="fill:#ff8080;fill-opacity:1;stroke:#00ffff;stroke-width:0.00446516;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="M 19.287403,18.922886 L 19.287403,13.770547 L 23.090962,11.633509 C 25.182922,10.458139 26.911024,9.4897458 26.931189,9.4815255 C 26.951354,9.4733047 26.962749,11.790012 26.956507,14.629762 L 26.945156,19.792944 L 23.132939,21.934085 C 21.036223,23.111713 19.313228,24.075226 19.304065,24.075226 C 19.294899,24.075226 19.287403,21.756673 19.287403,18.922886 L 19.287403,18.922886 z"
id="path3479" />
<path
style="fill:#ff8080;fill-opacity:1;stroke:#00ffff;stroke-width:0.00446516;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="M 14.476191,23.190934 L 10.803595,22.227498 L 10.803595,17.096228 L 10.803595,11.964955 L 10.926387,11.994404 C 11.194689,12.05875 17.762229,13.771129 17.981343,13.83387 L 18.215764,13.900993 L 18.215764,19.032762 C 18.215764,21.855234 18.200695,24.162243 18.182276,24.159449 C 18.163857,24.156654 16.496119,23.720823 14.476191,23.190933 L 14.476191,23.190934 z"
id="path3481" />
<path
style="fill:#ff8080;fill-opacity:1;stroke:#00ffff;stroke-width:0.00446516;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="M 14.992359,11.982284 C 13.059856,11.474631 11.492584,11.046224 11.509532,11.030268 C 11.526481,11.014313 13.244667,10.044573 15.327725,8.8752922 L 19.115103,6.7493259 L 22.583613,7.7163058 C 24.491295,8.2481441 26.066515,8.6957838 26.084103,8.7110604 C 26.12934,8.7503543 18.753688,12.884321 18.61782,12.895824 C 18.55632,12.901031 16.924862,12.489938 14.992359,11.982285 L 14.992359,11.982284 z"
id="path3483" />
</g>
<path
style="fill:#ff0000;fill-rule:evenodd;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="M 4.293991,12.550747 L 15.281556,26.569364"
id="path3336" />
<path
style="fill:#ff0000;fill-rule:evenodd;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="M 4.0414033,26.569364 L 14.397499,13.182216"
id="path3338" />
</svg>

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@ -0,0 +1,804 @@
<?xml version="1.0"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkWindow" id="guiMonitorWindow">
<property name="border_width">5</property>
<property name="title" translatable="yes">Ceph Monitor</property>
<child>
<object class="GtkVBox" id="guiMonitorVBox">
<property name="visible">True</property>
<property name="spacing">10</property>
<child>
<object class="GtkMenuBar" id="guiMonitorMenuBar">
<property name="visible">True</property>
<child>
<object class="GtkMenuItem" id="guiMonitorFileMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">_File</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="guiMonitorFileMenu">
<property name="visible">True</property>
<child>
<object class="GtkImageMenuItem" id="guiMonitorQuitImageMenuItem">
<property name="label">gtk-quit</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem" id="guiMonitorEditMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">_Edit</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="guiMonitorEditMenu">
<property name="visible">True</property>
<child>
<object class="GtkImageMenuItem" id="guiMonitorCopyImageMenuItem">
<property name="label">gtk-copy</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem" id="guiMonitorCephMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">_Ceph</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="guiMonitorCephMenu">
<property name="visible">True</property>
<child>
<object class="GtkMenuItem" id="guiMonitorSendCommandMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">_Send Command...</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="guiMonitorViewNodeMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">_View Node...</property>
<property name="use_underline">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem" id="guiMonitorHelpMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">_Help</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="guiMonitorHelpMenu">
<property name="visible">True</property>
<child>
<object class="GtkImageMenuItem" id="guiMonitorAboutImageMenuItem">
<property name="label">gtk-about</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkTable" id="guiMonitorCephInfoTable">
<property name="visible">True</property>
<property name="n_rows">2</property>
<property name="n_columns">2</property>
<child>
<object class="GtkVBox" id="guiMonitorPGClusterVBox">
<property name="visible">True</property>
<property name="border_width">5</property>
<child>
<object class="GtkLabel" id="guiMonitorPGClusterLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Placement Groups:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="guiMonitorPGClusterStatsLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="guiMonitorPGClusterScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkIconView" id="guiMonitorPGClusterIconView">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="guiMonitorPGClusterButtonHBox">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="guiMonitorPGClusterBackButton">
<property name="label" translatable="yes">Back</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="guiMonitorPGClusterViewAllButton">
<property name="label" translatable="yes">View All</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="guiMonitorPGClusterStatsButton">
<property name="label" translatable="yes">Placement Group Cluster Stats...</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="guiMonitorMonitorClusterVBox">
<property name="visible">True</property>
<property name="border_width">5</property>
<child>
<object class="GtkLabel" id="guiMonitorMonitorClusterLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Monitors:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="guiMonitorMonitorClusterStatsLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="guiMonitorMonitorClusterScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkTreeView" id="guiMonitorMonitorClusterTreeView">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="rules_hint">True</property>
</object>
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkButton" id="guiMonitorMonitorClusterStatsButton">
<property name="label" translatable="yes">Monitor Cluster Stats...</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="guiMonitorOSDClusterVBox">
<property name="visible">True</property>
<property name="border_width">5</property>
<child>
<object class="GtkLabel" id="guiMonitorOSDClusterLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">OSDs:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="guiMonitorOSDClusterStatsLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="guiMonitorOSDClusterScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkIconView" id="guiMonitorOSDClusterIconView">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="guiMonitorOSDClusterButtonHBox">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="guiMonitorOSDClusterBackButton">
<property name="label" translatable="yes">Back</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="guiMonitorOSDClusterViewAllButton">
<property name="label" translatable="yes">View All</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="guiMonitorOSDClusterStatsButton">
<property name="label" translatable="yes">OSD Cluster Stats...</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkVBox" id="guiMonitorMDSClusterVBox">
<property name="visible">True</property>
<property name="border_width">5</property>
<child>
<object class="GtkLabel" id="guiMonitorMDSClusterLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Metadata Servers:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="guiMonitorMDSClusterStatsLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="guiMonitorMDSClusterScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkIconView" id="guiMonitorMDSClusterIconView">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="guiMonitorMDSClusterButtonHBox">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="guiMonitorMDSClusterBackButton">
<property name="label" translatable="yes">Back</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="guiMonitorMDSClusterViewAllButton">
<property name="label" translatable="yes">View All</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="guiMonitorMDSClusterStatsButton">
<property name="label" translatable="yes">Metadata Server Cluster Stats...</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="guiMonitorLogVBox">
<property name="visible">True</property>
<property name="border_width">5</property>
<child>
<object class="GtkLabel" id="guiMonitorLogLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Log:</property>
<property name="justify">fill</property>
<property name="wrap_mode">word-char</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="guiMonitorLogScrolledWindow">
<property name="height_request">70</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkTextView" id="guiMonitorLogTextView">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">False</property>
<property name="wrap_mode">word</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkStatusbar" id="guiMonitorStatusbar">
<property name="visible">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkAboutDialog" id="guiMonitorAboutDialog">
<property name="border_width">5</property>
<property name="title" translatable="yes">About Ceph Monitor</property>
<property name="resizable">False</property>
<property name="window_position">center-on-parent</property>
<property name="destroy_with_parent">True</property>
<property name="icon_name">monitor</property>
<property name="type_hint">dialog</property>
<property name="has_separator">False</property>
<property name="program_name">Ceph Monitor</property>
<property name="version">0.1</property>
<property name="copyright" translatable="yes">(c) 2009 Michael McThrow
All rights reserved</property>
<property name="comments" translatable="yes">Monitoring tool for the Ceph distributed file system</property>
<property name="website">http://ceph.newdream.net</property>
<property name="website_label" translatable="yes">Ceph website</property>
<property name="authors">Author: Michael McThrow
Based on code written by Sage Weil and other contributors.</property>
<child internal-child="vbox">
<object class="GtkVBox" id="guiMonitorAboutVBox">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<placeholder/>
</child>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="guiMonitorAboutButtonBox">
<property name="visible">True</property>
<property name="layout_style">end</property>
</object>
<packing>
<property name="expand">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkDialog" id="viewNodeDialog">
<property name="border_width">5</property>
<property name="title" translatable="yes">View Node...</property>
<property name="modal">True</property>
<property name="window_position">center</property>
<property name="destroy_with_parent">True</property>
<property name="type_hint">dialog</property>
<property name="has_separator">False</property>
<child internal-child="vbox">
<object class="GtkVBox" id="viewNodeMainVBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkVBox" id="viewNodeOptionVBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel" id="viewNodeWhichNodeLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Which node would you like to view?</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="viewNodeTypeHBox">
<property name="visible">True</property>
<property name="homogeneous">True</property>
<child>
<object class="GtkLabel" id="viewNodeTypeLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">_Type of Node</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">viewNodeTypeComboBox</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="viewNodeTypeComboBox">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="has_focus">True</property>
<child>
<object class="GtkCellRendererText" id="text"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="viewNodeNameHBox">
<property name="visible">True</property>
<property name="homogeneous">True</property>
<child>
<object class="GtkLabel" id="viewNodeNameLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">_Node ID</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">viewNodeNameEntry</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="viewNodeNameEntry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">&#x25CF;</property>
<property name="caps_lock_warning">False</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="padding">5</property>
<property name="position">1</property>
</packing>
</child>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="viewNodeHButtonBox">
<property name="visible">True</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="viewNodeCancelButton">
<property name="label" translatable="yes">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="viewNodeOkButton">
<property name="label" translatable="yes">gtk-ok</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="-6">viewNodeCancelButton</action-widget>
<action-widget response="-5">viewNodeOkButton</action-widget>
</action-widgets>
</object>
<object class="GtkDialog" id="sendCommandDialog">
<property name="border_width">5</property>
<property name="title" translatable="yes">Send Command...</property>
<property name="modal">True</property>
<property name="default_width">400</property>
<property name="destroy_with_parent">True</property>
<property name="type_hint">dialog</property>
<property name="has_separator">False</property>
<child internal-child="vbox">
<object class="GtkVBox" id="sendCommandMainVBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child>
<object class="GtkVBox" id="sendCommandAreaVBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="sendCommandPromptLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">_Please enter a Ceph command:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">sendCommandPromptEntry</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="sendCommandPromptEntry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="has_focus">True</property>
<property name="invisible_char">&#x25CF;</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="padding">5</property>
<property name="position">1</property>
</packing>
</child>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="sendCommandHButtonBox">
<property name="visible">True</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="sendCommandCancelButton">
<property name="label" translatable="yes">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="sendCommandRunButton">
<property name="label" translatable="yes">_Run</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="-6">sendCommandCancelButton</action-widget>
<action-widget response="-5">sendCommandRunButton</action-widget>
</action-widgets>
</object>
</interface>

View File

@ -0,0 +1,970 @@
<?xml version="1.0"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkListStore" id="viewNodeNodeTypeListStore">
<columns>
<!-- column-name viewNodeNodeType -->
<column type="gchararray"/>
</columns>
<data>
<row>
<col id="0" translatable="yes">OSD</col>
</row>
<row>
<col id="0" translatable="yes">Metadata server</col>
</row>
<row>
<col id="0" translatable="yes">Placement group</col>
</row>
<row>
<col id="0" translatable="yes">Monitor</col>
</row>
</data>
</object>
<object class="GtkWindow" id="guiMonitorWindow">
<property name="border_width">5</property>
<property name="title" translatable="yes">Ceph Monitor</property>
<child>
<object class="GtkVBox" id="guiMonitorVBox">
<property name="visible">True</property>
<property name="spacing">10</property>
<child>
<object class="GtkMenuBar" id="guiMonitorMenuBar">
<property name="visible">True</property>
<child>
<object class="GtkMenuItem" id="guiMonitorFileMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">_File</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="guiMonitorFileMenu">
<property name="visible">True</property>
<child>
<object class="GtkImageMenuItem" id="guiMonitorQuitImageMenuItem">
<property name="label">gtk-quit</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem" id="guiMonitorEditMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">_Edit</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="guiMonitorEditMenu">
<property name="visible">True</property>
<child>
<object class="GtkImageMenuItem" id="guiMonitorCopyImageMenuItem">
<property name="label">gtk-copy</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem" id="guiMonitorCephMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">_Ceph</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="guiMonitorCephMenu">
<property name="visible">True</property>
<child>
<object class="GtkMenuItem" id="guiMonitorSendCommandMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">_Send Command...</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="guiMonitorViewNodeMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">_View Node...</property>
<property name="use_underline">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem" id="guiMonitorHelpMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">_Help</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="guiMonitorHelpMenu">
<property name="visible">True</property>
<child>
<object class="GtkImageMenuItem" id="guiMonitorAboutImageMenuItem">
<property name="label">gtk-about</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkTable" id="guiMonitorCephInfoTable">
<property name="visible">True</property>
<property name="n_rows">2</property>
<property name="n_columns">2</property>
<child>
<object class="GtkVBox" id="guiMonitorPGClusterVBox">
<property name="visible">True</property>
<property name="border_width">5</property>
<child>
<object class="GtkLabel" id="guiMonitorPGClusterLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Placement Groups:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="guiMonitorPGClusterStatsLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="guiMonitorPGClusterScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkIconView" id="guiMonitorPGClusterIconView">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="guiMonitorPGClusterButtonHBox">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="guiMonitorPGClusterBackButton">
<property name="label" translatable="yes">Back</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="guiMonitorPGClusterViewAllButton">
<property name="label" translatable="yes">View All</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="guiMonitorPGClusterStatsButton">
<property name="label" translatable="yes">Placement Group Cluster Stats...</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="guiMonitorMonitorClusterVBox">
<property name="visible">True</property>
<property name="border_width">5</property>
<child>
<object class="GtkLabel" id="guiMonitorMonitorClusterLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Monitors:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="guiMonitorMonitorClusterStatsLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="guiMonitorMonitorClusterScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkTreeView" id="guiMonitorMonitorClusterTreeView">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkButton" id="guiMonitorMonitorClusterStatsButton">
<property name="label" translatable="yes">Monitor Cluster Stats...</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="guiMonitorOSDClusterVBox">
<property name="visible">True</property>
<property name="border_width">5</property>
<child>
<object class="GtkLabel" id="guiMonitorOSDClusterLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">OSDs:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="guiMonitorOSDClusterStatsLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="guiMonitorOSDClusterScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkIconView" id="guiMonitorOSDClusterIconView">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="guiMonitorOSDClusterButtonHBox">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="guiMonitorOSDClusterBackButton">
<property name="label" translatable="yes">Back</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="guiMonitorOSDClusterViewAllButton">
<property name="label" translatable="yes">View All</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="guiMonitorOSDClusterStatsButton">
<property name="label" translatable="yes">OSD Cluster Stats...</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkVBox" id="guiMonitorMDSClusterVBox">
<property name="visible">True</property>
<property name="border_width">5</property>
<child>
<object class="GtkLabel" id="guiMonitorMDSClusterLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Metadata Servers:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="guiMonitorMDSClusterStatsLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="guiMonitorMDSClusterScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkIconView" id="guiMonitorMDSClusterIconView">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="guiMonitorMDSClusterButtonHBox">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="guiMonitorMDSClusterBackButton">
<property name="label" translatable="yes">Back</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="guiMonitorMDSClusterViewAllButton">
<property name="label" translatable="yes">View All</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="guiMonitorMDSClusterStatsButton">
<property name="label" translatable="yes">Metadata Server Cluster Stats...</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkVBox" id="guiMonitorLogVBox">
<property name="visible">True</property>
<property name="border_width">5</property>
<child>
<object class="GtkLabel" id="guiMonitorLogLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Log:</property>
<property name="justify">fill</property>
<property name="wrap_mode">word-char</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="guiMonitorLogScrolledWindow">
<property name="height_request">70</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkTextView" id="guiMonitorLogTextView">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">False</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkStatusbar" id="guiMonitorStatusbar">
<property name="visible">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkAboutDialog" id="guiMonitorAboutDialog">
<property name="border_width">5</property>
<property name="title" translatable="yes">About Ceph Monitor</property>
<property name="resizable">False</property>
<property name="window_position">center-on-parent</property>
<property name="destroy_with_parent">True</property>
<property name="icon_name">monitor</property>
<property name="type_hint">dialog</property>
<property name="has_separator">False</property>
<property name="program_name">Ceph Monitor</property>
<property name="version">0.1</property>
<property name="copyright" translatable="yes">(c) 2009 Michael McThrow
All rights reserved</property>
<property name="comments" translatable="yes">Monitoring tool for the Ceph distributed file system</property>
<property name="website">http://ceph.newdream.net</property>
<property name="website_label" translatable="yes">Ceph website</property>
<property name="authors">Main Author: Michael McThrow
Portions of the code for the Ceph Monitor were written by Sage Weil and other contributors of the Ceph distributed file system.</property>
<child internal-child="vbox">
<object class="GtkVBox" id="guiMonitorAboutVBox">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<placeholder/>
</child>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="guiMonitorAboutButtonBox">
<property name="visible">True</property>
<property name="layout_style">end</property>
</object>
<packing>
<property name="expand">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkWindow" id="clusterStatsWindow">
<property name="border_width">5</property>
<child>
<object class="GtkVBox" id="clusterStatsVBox">
<property name="visible">True</property>
<child>
<object class="GtkLabel" id="clusterStatsInfoLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="clusterStatsScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkTreeView" id="clusterStatsInfoTreeView">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="clusterStatsBottomHBox">
<property name="visible">True</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkHBox" id="clusterStatsButtonsHBox">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="clusterStatsCopyButton">
<property name="label" translatable="yes">gtk-copy</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="clusterStatsSaveButton">
<property name="label" translatable="yes">gtk-save-as</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="clusterStatsCloseButton">
<property name="label" translatable="yes">gtk-close</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkWindow" id="nodeStatsWindow">
<property name="border_width">5</property>
<child>
<object class="GtkVBox" id="nodeStatsVBox">
<property name="visible">True</property>
<child>
<object class="GtkLabel" id="nodeStatsLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="nodeStatsScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkTreeView" id="nodeStatsInfoTreeView">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="nodeStatsBottomHBox">
<property name="visible">True</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkHBox" id="nodeStatsButtonsHBox">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="nodeStatsCopyButton">
<property name="label" translatable="yes">gtk-copy</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="nodeStatsSaveButton">
<property name="label" translatable="yes">gtk-save-as</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="nodeStatsCloseButton">
<property name="label" translatable="yes">gtk-close</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkFileChooserDialog" id="saveFileChooserDialog">
<property name="border_width">5</property>
<property name="type">popup</property>
<property name="title" translatable="yes">Save File</property>
<property name="modal">True</property>
<property name="window_position">center-on-parent</property>
<property name="destroy_with_parent">True</property>
<property name="type_hint">dialog</property>
<property name="has_separator">False</property>
<property name="action">save</property>
<child internal-child="vbox">
<object class="GtkVBox" id="saveVBox">
<property name="visible">True</property>
<property name="spacing">2</property>
<child>
<placeholder/>
</child>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="saveActionsHButtonBox">
<property name="visible">True</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="saveCancelButton">
<property name="label" translatable="yes">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="saveSaveButton">
<property name="label" translatable="yes">gtk-save</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="-6">saveCancelButton</action-widget>
<action-widget response="-5">saveSaveButton</action-widget>
</action-widgets>
</object>
<object class="GtkDialog" id="viewNodeDialog">
<property name="border_width">5</property>
<property name="modal">True</property>
<property name="type_hint">normal</property>
<property name="has_separator">False</property>
<child internal-child="vbox">
<object class="GtkVBox" id="viewNodeMainVBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkVBox" id="viewNodeOptionVBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel" id="viewNodeWhichNodeLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Which node would you like to view?</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="viewNodeTypeHBox">
<property name="visible">True</property>
<property name="homogeneous">True</property>
<child>
<object class="GtkLabel" id="viewNodeTypeLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Type of Node</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="viewNodeTypeComboBox">
<property name="visible">True</property>
<property name="model">viewNodeNodeTypeListStore</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="viewNodeNameHBox">
<property name="visible">True</property>
<property name="homogeneous">True</property>
<child>
<object class="GtkLabel" id="viewNodeNameLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Node Name</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="viewNodeNameEntry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">&#x25CF;</property>
<property name="caps_lock_warning">False</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="padding">5</property>
<property name="position">1</property>
</packing>
</child>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="viewNodeHButtonBox">
<property name="visible">True</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="viewNodeCancelButton">
<property name="label" translatable="yes">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="viewNodeOkButton">
<property name="label" translatable="yes">gtk-ok</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="5">viewNodeCancelButton</action-widget>
<action-widget response="4">viewNodeOkButton</action-widget>
</action-widgets>
</object>
</interface>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,591 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.4.5 on Mon Nov 2 05:39:40 2009 -->
<glade-interface>
<widget class="GtkWindow" id="guiMonitorWindow">
<property name="title" translatable="yes">Ceph Monitor</property>
<child>
<widget class="GtkVBox" id="mainVBox">
<property name="visible">True</property>
<property name="spacing">10</property>
<child>
<widget class="GtkMenuBar" id="menuBar">
<property name="visible">True</property>
<child>
<widget class="GtkMenuItem" id="fileMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">_File</property>
<property name="use_underline">True</property>
<child>
<widget class="GtkMenu" id="fileMenu">
<property name="visible">True</property>
<child>
<widget class="GtkImageMenuItem" id="quitImageMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">gtk-quit</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</widget>
</child>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkMenuItem" id="editMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">_Edit</property>
<property name="use_underline">True</property>
<child>
<widget class="GtkMenu" id="cephMenu">
<property name="visible">True</property>
<child>
<widget class="GtkImageMenuItem" id="imagemenuitem7">
<property name="visible">True</property>
<property name="label" translatable="yes">gtk-copy</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</widget>
</child>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkMenuItem" id="cephMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">_Ceph</property>
<property name="use_underline">True</property>
<child>
<widget class="GtkMenu" id="cephMen">
<property name="visible">True</property>
<child>
<widget class="GtkMenuItem" id="sendCommandMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">_Send Command...</property>
<property name="use_underline">True</property>
</widget>
</child>
<child>
<widget class="GtkMenuItem" id="viewNodeMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">_View Node...</property>
<property name="use_underline">True</property>
</widget>
</child>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkMenuItem" id="helpMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">_Help</property>
<property name="use_underline">True</property>
<child>
<widget class="GtkMenu" id="menu3">
<property name="visible">True</property>
<child>
<widget class="GtkImageMenuItem" id="aboutMenuItem">
<property name="visible">True</property>
<property name="label" translatable="yes">gtk-about</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
</widget>
</child>
</widget>
</child>
</widget>
</child>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
<widget class="GtkTable" id="cephInfoTable">
<property name="visible">True</property>
<property name="n_rows">3</property>
<property name="n_columns">2</property>
<property name="column_spacing">20</property>
<property name="row_spacing">20</property>
<child>
<widget class="GtkVBox" id="monitorClusterVBox">
<property name="visible">True</property>
<child>
<widget class="GtkLabel" id="monitorClusterLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Monitors:</property>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="monitorClusterStatsLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkScrolledWindow" id="monitorClusterScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<child>
<widget class="GtkIconView" id="monitorClusterIconView">
<property name="visible">True</property>
<property name="can_focus">True</property>
</widget>
</child>
</widget>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="monitorClusterButtonHBox">
<property name="visible">True</property>
<child>
<widget class="GtkButton" id="monitorClusterBackButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="label" translatable="yes">Back</property>
<property name="response_id">0</property>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="monitorClusterViewAllButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="label" translatable="yes">View All</property>
<property name="response_id">0</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="position">3</property>
</packing>
</child>
</widget>
<packing>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
</packing>
</child>
<child>
<widget class="GtkVBox" id="PGClusterVBox">
<property name="visible">True</property>
<child>
<widget class="GtkLabel" id="PGClusterLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Placement Groups:</property>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="PGClusterStatsLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkScrolledWindow" id="PGClusterScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<child>
<widget class="GtkIconView" id="PGClusterIconView">
<property name="visible">True</property>
<property name="can_focus">True</property>
</widget>
</child>
</widget>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="PGClusterButtonHBox">
<property name="visible">True</property>
<child>
<widget class="GtkButton" id="PGClusterBackButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="label" translatable="yes">Back</property>
<property name="response_id">0</property>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="PGClusterViewAllButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="label" translatable="yes">View All</property>
<property name="response_id">0</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="position">3</property>
</packing>
</child>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
</packing>
</child>
<child>
<widget class="GtkVBox" id="clientsVBox">
<property name="visible">True</property>
<child>
<widget class="GtkLabel" id="clientsLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Clients:</property>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="clientsStatsLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkScrolledWindow" id="clientsScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<child>
<widget class="GtkIconView" id="clientsIconView">
<property name="visible">True</property>
<property name="can_focus">True</property>
</widget>
</child>
</widget>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="clientsButtonHBox">
<property name="visible">True</property>
<child>
<widget class="GtkButton" id="clientsBackButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="label" translatable="yes">Back</property>
<property name="response_id">0</property>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="clientsViewAllButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="label" translatable="yes">View All</property>
<property name="response_id">0</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="position">3</property>
</packing>
</child>
</widget>
<packing>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
</packing>
</child>
<child>
<widget class="GtkVBox" id="MDSClusterVBox">
<property name="visible">True</property>
<child>
<widget class="GtkLabel" id="MDSClusterLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Metadata Servers:</property>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="MDSClusterStatsLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkScrolledWindow" id="MDSClusterScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<child>
<widget class="GtkIconView" id="MDSClusterIconView">
<property name="visible">True</property>
<property name="can_focus">True</property>
</widget>
</child>
</widget>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="MDSClusterButtonHBox">
<property name="visible">True</property>
<child>
<widget class="GtkButton" id="MDSClusterBackButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="label" translatable="yes">Back</property>
<property name="response_id">0</property>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="MDSClusterViewAllButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="label" translatable="yes">View All</property>
<property name="response_id">0</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="position">3</property>
</packing>
</child>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
</packing>
</child>
<child>
<widget class="GtkVBox" id="OSDClusterVBox">
<property name="visible">True</property>
<child>
<widget class="GtkLabel" id="OSDClusterLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">OSDs:</property>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="OSDClusterStatsLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkScrolledWindow" id="OSDClusterScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<child>
<widget class="GtkIconView" id="OSDClusterIconView">
<property name="visible">True</property>
<property name="can_focus">True</property>
</widget>
</child>
</widget>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="OSDClusterButtonHBox">
<property name="visible">True</property>
<child>
<widget class="GtkButton" id="OSDClusterBackButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="label" translatable="yes">Back</property>
<property name="response_id">0</property>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="OSDClusterViewAllButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="label" translatable="yes">View All</property>
<property name="response_id">0</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="position">3</property>
</packing>
</child>
</widget>
</child>
<child>
<widget class="GtkVBox" id="summaryVBox">
<property name="visible">True</property>
<child>
<widget class="GtkLabel" id="summaryLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Summary:</property>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
</packing>
</child>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkVBox" id="logVBox">
<property name="visible">True</property>
<child>
<widget class="GtkLabel" id="logLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Log:</property>
<property name="justify">GTK_JUSTIFY_FILL</property>
<property name="wrap_mode">PANGO_WRAP_WORD_CHAR</property>
</widget>
<packing>
<property name="expand">False</property>
</packing>
</child>
<child>
<widget class="GtkScrolledWindow" id="logScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<child>
<widget class="GtkTextView" id="logTextView">
<property name="visible">True</property>
<property name="can_focus">True</property>
</widget>
</child>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="position">2</property>
</packing>
</child>
</widget>
</child>
</widget>
<widget class="GtkWindow" id="window1">
<child>
<placeholder/>
</child>
</widget>
</glade-interface>

View File

@ -0,0 +1,110 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32px"
height="32px"
id="svg3327"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docname="mds.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3329">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 16 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="32 : 16 : 1"
inkscape:persp3d-origin="16 : 10.666667 : 1"
id="perspective3335" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="22.395604"
inkscape:cx="16"
inkscape:cy="18.74316"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1280"
inkscape:window-height="725"
inkscape:window-x="0"
inkscape:window-y="25" />
<metadata
id="metadata3332">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 14.109912,23.784102 L 23.174191,18.693817 L 23.174191,18.693817 L 23.174191,18.693817"
id="path3461" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 14.199215,23.516192 L 14.199215,11.906771 L 14.199215,11.906771"
id="path3463" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 5.2688912,9.8974481 L 14.33317,12.263984"
id="path3465" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 14.11,12.263984 L 23.174279,7.1736987 L 23.174279,7.1736987 L 23.174279,7.1736987"
id="path3467" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.02936888px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 22.950933,6.7567671 L 22.950933,19.200053"
id="path3469" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 5.6484299,9.8974484 L 14.712709,4.8071631 L 14.712709,4.8071631 L 14.712709,4.8071631"
id="path3471" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.01581013px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 5.7154074,21.93745 L 5.7154074,9.9580345 L 5.7154074,9.9580345"
id="path3473" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 5.3358686,21.261285 L 14.400147,23.627821"
id="path3475" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.97621411px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 14.388254,4.9068995 L 22.9405,7.2972212"
id="path3477" />
<path
style="fill:#ff8080;fill-opacity:1;stroke:#00ffff;stroke-width:0.00446516;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="M 14.740824,17.659947 L 14.740824,12.507608 L 18.544383,10.37057 C 20.636343,9.1952001 22.364445,8.2268073 22.38461,8.218587 C 22.404775,8.2103662 22.41617,10.527073 22.409928,13.366823 L 22.398577,18.530005 L 18.58636,20.671146 C 16.489644,21.848774 14.766649,22.812287 14.757486,22.812287 C 14.74832,22.812287 14.740824,20.493734 14.740824,17.659947 L 14.740824,17.659947 z"
id="path3479" />
<path
style="fill:#ff8080;fill-opacity:1;stroke:#00ffff;stroke-width:0.00446516;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="M 9.9296123,21.927995 L 6.2570165,20.964559 L 6.2570165,15.833289 L 6.2570165,10.702016 L 6.3798085,10.731465 C 6.6481098,10.795811 13.21565,12.50819 13.434764,12.570931 L 13.669185,12.638054 L 13.669185,17.769823 C 13.669185,20.592295 13.654116,22.899304 13.635697,22.89651 C 13.617278,22.893715 11.94954,22.457884 9.9296123,21.927994 L 9.9296123,21.927995 z"
id="path3481" />
<path
style="fill:#ff8080;fill-opacity:1;stroke:#00ffff;stroke-width:0.00446516;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="M 10.44578,10.719345 C 8.5132772,10.211692 6.9460053,9.7832851 6.9629537,9.7673293 C 6.9799021,9.7513744 8.6980884,8.7816345 10.781146,7.6123537 L 14.568524,5.4863874 L 18.037034,6.4533673 C 19.944716,6.9852056 21.519936,7.4328453 21.537524,7.4481219 C 21.582761,7.4874158 14.207109,11.621382 14.071241,11.632885 C 14.009741,11.638092 12.378283,11.226999 10.44578,10.719346 L 10.44578,10.719345 z"
id="path3483" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -0,0 +1,92 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32px"
height="32px"
id="svg4068"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docname="monitor.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs4070">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 16 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="32 : 16 : 1"
inkscape:persp3d-origin="16 : 10.666667 : 1"
id="perspective4076" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.197802"
inkscape:cx="0.10402327"
inkscape:cy="16"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1280"
inkscape:window-height="725"
inkscape:window-x="0"
inkscape:window-y="25" />
<metadata
id="metadata4073">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4629"
width="28.041218"
height="27.416094"
x="1.9646713"
y="2.0834146" />
<rect
style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.96407133000000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4631"
width="22.004526"
height="21.379402"
x="4.983017"
y="5.5482764" />
<path
style="opacity:1;fill:#808080;fill-opacity:1;stroke:#000000;stroke-width:0.08930324;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 2.4794895,15.776742 L 2.4794895,2.604514 L 15.964279,2.604514 L 29.449068,2.604514 L 29.449068,15.776742 L 29.449068,28.94897 L 15.964279,28.94897 L 2.4794895,28.94897 L 2.4794895,15.776742 z M 27.484397,16.223258 L 27.484397,5.0157015 L 15.964279,5.0157015 L 4.4441607,5.0157015 L 4.4441607,16.223258 L 4.4441607,27.430815 L 15.964279,27.430815 L 27.484397,27.430815 L 27.484397,16.223258 z"
id="path4633" />
<path
style="fill:none;fill-rule:evenodd;stroke:#00f00f;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.94117647"
d="M 4.465162,18.515211 L 10.805692,8.4239446"
id="path4639" />
<path
style="fill:none;fill-rule:evenodd;stroke:#00ff00;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 10.805692,8.6918543 L 16.342493,22.980373"
id="path4641" />
<path
style="fill:none;fill-rule:evenodd;stroke:#00ff00;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 16.25319,22.89107 L 20.986261,13.24632 L 27.416095,18.068695 L 27.416095,18.068695"
id="path4643" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -0,0 +1,102 @@
<?xml version="1.0"?>
<interface>
<!-- interface-requires gtk+ 2.8 -->
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="nodeStatsWindow">
<property name="border_width">5</property>
<child>
<object class="GtkVBox" id="nodeStatsVBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="nodeStatsLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="nodeStatsScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkTreeView" id="nodeStatsInfoTreeView">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="nodeStatsBottomHBox">
<property name="visible">True</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkHBox" id="nodeStatsButtonsHBox">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="nodeStatsCopyButton">
<property name="label" translatable="yes">gtk-copy</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="nodeStatsSaveButton">
<property name="label" translatable="yes">gtk-save-as</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="nodeStatsCloseButton">
<property name="label" translatable="yes">gtk-close</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 39 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 41 KiB

View File

@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32px"
height="32px"
id="svg4645"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docname="pg.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs4647">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 16 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="32 : 16 : 1"
inkscape:persp3d-origin="16 : 10.666667 : 1"
id="perspective4653" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.197802"
inkscape:cx="0.10402327"
inkscape:cy="12.42787"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1280"
inkscape:window-height="725"
inkscape:window-x="0"
inkscape:window-y="25" />
<metadata
id="metadata4650">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<rect
style="opacity:1;fill:#ffb380;fill-opacity:1;stroke:#000000;stroke-width:0.51228672;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect4655"
width="28.028931"
height="27.761021"
x="1.9708146"
y="2.2681644" />
<rect
style="opacity:1;fill:#ececec;fill-opacity:1;stroke:#000000;stroke-width:0.44339502;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5166"
width="9.5227489"
height="6.9329543"
x="5.1512856"
y="4.019784" />
<rect
style="opacity:1;fill:#ececec;fill-opacity:1;stroke:#000000;stroke-width:0.44339502;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5168"
width="9.5227489"
height="6.9329543"
x="5.0619822"
y="12.905456" />
<rect
style="opacity:1;fill:#ececec;fill-opacity:1;stroke:#000000;stroke-width:0.44609264;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5178"
width="9.520051"
height="7.0195599"
x="17.74439"
y="3.9764812" />
<rect
style="opacity:1;fill:#ececec;fill-opacity:1;stroke:#000000;stroke-width:0.44339502;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5180"
width="9.5227489"
height="6.9329543"
x="17.653738"
y="12.905456" />
<rect
style="opacity:1;fill:#ececec;fill-opacity:1;stroke:#000000;stroke-width:0.44339502;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5182"
width="9.5227489"
height="6.9329543"
x="5.0619822"
y="20.942747" />
<rect
style="opacity:1;fill:#ececec;fill-opacity:1;stroke:#000000;stroke-width:0.44339502;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect5184"
width="9.5227489"
height="6.9329543"
x="17.564436"
y="21.032051" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -0,0 +1,159 @@
<?xml version="1.0"?>
<interface>
<!-- interface-requires gtk+ 2.8 -->
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="statsWindow">
<property name="border_width">5</property>
<property name="default_width">350</property>
<property name="default_height">500</property>
<property name="destroy_with_parent">True</property>
<property name="type_hint">dialog</property>
<child>
<object class="GtkVBox" id="statsVBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="statsInfoLabel">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="statsScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkTreeView" id="statsInfoTreeView">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="headers_clickable">False</property>
<property name="rules_hint">True</property>
</object>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="statsBottomHBox">
<property name="visible">True</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkHBox" id="statsButtonsHBox">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="statsCopyButton">
<property name="label" translatable="yes">gtk-copy</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="statsCloseButton">
<property name="label" translatable="yes">gtk-close</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkFileChooserDialog" id="saveFileChooserDialog">
<property name="border_width">5</property>
<property name="type">popup</property>
<property name="title" translatable="yes">Save File</property>
<property name="modal">True</property>
<property name="window_position">center-on-parent</property>
<property name="destroy_with_parent">True</property>
<property name="type_hint">dialog</property>
<property name="has_separator">False</property>
<property name="action">save</property>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox5">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child>
<placeholder/>
</child>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area5">
<property name="visible">True</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="saveCancelButton">
<property name="label" translatable="yes">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="saveSaveButton">
<property name="label" translatable="yes">gtk-save</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="-6">saveCancelButton</action-widget>
<action-widget response="-5">saveSaveButton</action-widget>
</action-widgets>
</object>
</interface>

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32px"
height="32px"
id="svg3327"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docname="stopped_mds.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3329">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 16 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="32 : 16 : 1"
inkscape:persp3d-origin="16 : 10.666667 : 1"
id="perspective3335" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.598901"
inkscape:cx="-15.791953"
inkscape:cy="18.74316"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1280"
inkscape:window-height="725"
inkscape:window-x="0"
inkscape:window-y="25" />
<metadata
id="metadata3332">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 20.003926,24.677134 L 29.068205,19.586849 L 29.068205,19.586849 L 29.068205,19.586849"
id="path3461" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 20.093229,24.409224 L 20.093229,12.799803 L 20.093229,12.799803"
id="path3463" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 11.162905,10.79048 L 20.227184,13.157016"
id="path3465" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 20.004014,13.157016 L 29.068293,8.0667311 L 29.068293,8.0667311 L 29.068293,8.0667311"
id="path3467" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.02936888px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 28.844947,7.6497995 L 28.844947,20.093085"
id="path3469" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 11.542444,10.790481 L 20.606723,5.7001955 L 20.606723,5.7001955 L 20.606723,5.7001955"
id="path3471" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.01581013px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 11.609421,22.830482 L 11.609421,10.851067 L 11.609421,10.851067"
id="path3473" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 11.229882,22.154317 L 20.294161,24.520853"
id="path3475" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.97621411px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 20.282268,5.7999319 L 28.834514,8.1902536"
id="path3477" />
<path
style="fill:#ff8080;fill-opacity:1;stroke:#00ffff;stroke-width:0.00446516;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="M 20.634838,18.552979 L 20.634838,13.40064 L 24.438397,11.263602 C 26.530357,10.088232 28.258459,9.1198397 28.278624,9.1116194 C 28.298789,9.1033986 28.310184,11.420105 28.303942,14.259855 L 28.292591,19.423037 L 24.480374,21.564178 C 22.383658,22.741806 20.660663,23.705319 20.6515,23.705319 C 20.642334,23.705319 20.634838,21.386766 20.634838,18.552979 L 20.634838,18.552979 z"
id="path3479" />
<path
style="fill:#ff8080;fill-opacity:1;stroke:#00ffff;stroke-width:0.00446516;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="M 15.823626,22.821027 L 12.15103,21.857591 L 12.15103,16.726321 L 12.15103,11.595048 L 12.273822,11.624497 C 12.542124,11.688843 19.109664,13.401222 19.328778,13.463963 L 19.563199,13.531086 L 19.563199,18.662855 C 19.563199,21.485327 19.54813,23.792336 19.529711,23.789542 C 19.511292,23.786747 17.843554,23.350916 15.823626,22.821026 L 15.823626,22.821027 z"
id="path3481" />
<path
style="fill:#ff8080;fill-opacity:1;stroke:#00ffff;stroke-width:0.00446516;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0"
d="M 16.339794,11.612377 C 14.407291,11.104724 12.840019,10.676317 12.856968,10.660362 C 12.873916,10.644407 14.592102,9.6746669 16.67516,8.5053861 L 20.462538,6.3794198 L 23.931048,7.3463997 C 25.83873,7.878238 27.41395,8.3258777 27.431538,8.3411543 C 27.476775,8.3804482 20.101123,12.514414 19.965255,12.525917 C 19.903755,12.531124 18.272297,12.120031 16.339794,11.612378 L 16.339794,11.612377 z"
id="path3483" />
<path
sodipodi:type="arc"
style="fill:#ff0000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path3438"
sodipodi:cx="11.609421"
sodipodi:cy="17.890089"
sodipodi:rx="4.4651618"
sodipodi:ry="4.1079493"
d="M 16.074583,17.890089 A 4.4651618,4.1079493 0 1 1 7.144259,17.890089 A 4.4651618,4.1079493 0 1 1 16.074583,17.890089 z"
transform="translate(-1.2502454,-0.7144259)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.1 KiB