/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set et sw=2 ts=2: */ /*************************************************************************** * admin_connection.cc * * Thu Feb 3 09:33:44 CET 2011 * Copyright 2011 Bent Bisballe Nyeng * deva@aasimon.org ****************************************************************************/ /* * This file is part of Pracro. * * Pracro is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Pracro is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Pracro; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "admin_connection.h" #include "admin_rc.h" #include "admin_export.h" #include "debug.h" #include "configuration.h" static std::string admin_sessionunlock(Environment &env, std::string id) { Session *session = env.sessions.session(id); if(session) { if(session->isReadonly()) { env.sessions.deleteSession(id); return "Session " + id + " was 'readonly' and has been discarded."; } else { session->setIdle(true); return "Session " + id + " has been deactivated (set to idle)."; } } return "Session " + id + " does not exist or has been committed."; } static std::string admin_listactivesessions(Environment &env) { std::string str; std::vector act = env.sessions.activeSessions(); std::vector::iterator i = act.begin(); while(i != act.end()) { Session *s = env.sessions.session(*i); SessionAutolock lock(*s); str += "Session " + *i + ": "+s->templ+" on "+s->patientid+" "+ std::string(s->idle()?"[idle]":"[active]")+"\n"; i++; } return str; } static std::string admin_header(std::string uri) { return admin_rc("header1") + uri + admin_rc("header2"); } static std::string admin_flush(Environment &env) { env.sessions.store(); return "All sessions flushed to disc in " + Conf::session_path + "."; } AdminConnection::AdminConnection(Environment &e, headers_t a, std::string u) : env(e), args(a), uri(u) {} AdminConnection::~AdminConnection() {} bool AdminConnection::handle(const char *data, size_t size) { status = 200; // OK if(data == NULL && size == 0) { DEBUG(admin, "URI: %s\n", uri.c_str()); if(uri == "/") { reply = admin_header(uri) + "Command list:\n" "/sessionunlock?id=[ID] unlock session with [ID] as its session id.\n" "/listactivesessions lists all active sessions on the server.\n" "/flushsessions flushes all active sessions to disc.\n" "/export?template=[TEMPLATE] export template with name [TEMPLATE] to a\n csf file (comma seperated file, that can be opened in OOCalc or Excel).\n" + admin_rc("footer"); return true; } if(uri == "/sessionunlock" && args.find("id") != args.end()) { reply = admin_header(uri) + admin_sessionunlock(env, args["id"]) + admin_rc("footer"); return true; } if(uri == "/listactivesessions") { reply = admin_header(uri) + admin_listactivesessions(env) + admin_rc("footer"); return true; } if(uri == "/flushsessions") { reply = admin_header(uri) + admin_flush(env) + admin_rc("footer"); return true; } if(uri == "/export" && args.find("template") != args.end()) { bool ok; std::string res = admin_export(env, args["template"], &ok); if(!ok) reply = admin_header(uri) + res + admin_rc("footer"); else { reply = res; hdrs["Content-Type"] = "text/csv; charset=UTF-8"; hdrs["Content-Disposition"] = "attachment; filename=\""+args["template"]+".csv\""; } return true; } if(uri == "/favicon.ico") { hdrs["Content-Type"] = "image/ico"; reply = admin_rc("favicon"); return true; } reply = admin_header(uri) + "'" + uri + "' not recognised as a valid command." + admin_rc("footer"); return true; } return true; } void AdminConnection::getReply(Httpd::Reply &r) { if(hdrs.find("Content-Type") == hdrs.end()) hdrs["Content-Type"] = "text/html; charset=UTF-8"; r.data = reply; r.headers = hdrs; r.status = status; // http 'OK' }