summaryrefslogtreecommitdiffstats
path: root/servers/admin_user_mgmt_server_lin/src
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2013-01-24 12:05:29 -0600
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2013-01-24 12:05:29 -0600
commit61dfcc04f73e45082f51945a7b98b7838da56da8 (patch)
tree31ba95662c5972ef74abc64e4404e7e20e2f498e /servers/admin_user_mgmt_server_lin/src
parent941d8c3b969eae32b0945987f1d849930736f5bb (diff)
downloadulab-61dfcc04f73e45082f51945a7b98b7838da56da8.tar.gz
ulab-61dfcc04f73e45082f51945a7b98b7838da56da8.zip
User management console now functional
Diffstat (limited to 'servers/admin_user_mgmt_server_lin/src')
-rw-r--r--servers/admin_user_mgmt_server_lin/src/Makefile.am2
-rw-r--r--servers/admin_user_mgmt_server_lin/src/admin_user_mgmt.cpp (renamed from servers/admin_user_mgmt_server_lin/src/admin_sys_ctl.cpp)339
-rw-r--r--servers/admin_user_mgmt_server_lin/src/admin_user_mgmt.h (renamed from servers/admin_user_mgmt_server_lin/src/admin_sys_ctl.h)5
-rw-r--r--servers/admin_user_mgmt_server_lin/src/main.cpp4
4 files changed, 251 insertions, 99 deletions
diff --git a/servers/admin_user_mgmt_server_lin/src/Makefile.am b/servers/admin_user_mgmt_server_lin/src/Makefile.am
index 6e2c003..481bdc2 100644
--- a/servers/admin_user_mgmt_server_lin/src/Makefile.am
+++ b/servers/admin_user_mgmt_server_lin/src/Makefile.am
@@ -3,7 +3,7 @@ KDE_CXXFLAGS = $(USE_EXCEPTIONS)
bin_PROGRAMS = remotefpga_adminsysctlserver
-remotefpga_adminsysctlserver_SOURCES = main.cpp admin_sys_ctl.cpp
+remotefpga_adminsysctlserver_SOURCES = main.cpp admin_user_mgmt.cpp
remotefpga_adminsysctlserver_METASOURCES = AUTO
remotefpga_adminsysctlserver_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIB_QT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_KIO) -lktexteditor -ltdekrbsocket -ltqtrla
diff --git a/servers/admin_user_mgmt_server_lin/src/admin_sys_ctl.cpp b/servers/admin_user_mgmt_server_lin/src/admin_user_mgmt.cpp
index bfb83bc..687a1e5 100644
--- a/servers/admin_user_mgmt_server_lin/src/admin_sys_ctl.cpp
+++ b/servers/admin_user_mgmt_server_lin/src/admin_user_mgmt.cpp
@@ -40,7 +40,7 @@
#include <klocale.h>
-#include "admin_sys_ctl.h"
+#include "admin_user_mgmt.h"
#define ABORT_SOCKET(s) s->close(); \
s->disconnect(); \
@@ -83,6 +83,9 @@ SysCtlSocket::SysCtlSocket(int sock, TQObject *parent, const char *name) :
if (connectToDatabase() != 0) {
exit(1);
}
+
+ m_minGID = m_config->readNumEntry("MinimumGID", 500);
+ m_maxGID = m_config->readNumEntry("MaximumGID", 65533);
}
SysCtlSocket::~SysCtlSocket() {
@@ -176,30 +179,17 @@ void SysCtlSocket::commandLoop() {
ds.setPrintableData(true);
TQString command;
ds >> command;
- if (command == "USERS") {
+ if (command == "LIST") {
TQString subCommand;
ds >> subCommand;
if (subCommand == "TERMINALS") {
clearFrameTail();
ds << TQString("OK");
- TerminalServiceStatusList list;
- TQSqlCursor databaseActivityCursor("sessions", TRUE, m_terminals_database);
- databaseActivityCursor.select();
- while (databaseActivityCursor.next()) {
- TerminalServiceStatusType status;
-
- status.protocolVersion = 1;
- status.sessionID = databaseActivityCursor.value("pk").toInt();
- status.username = databaseActivityCursor.value("username").toString();
- status.serverName = databaseActivityCursor.value("servername").toString();
- status.serverPID = databaseActivityCursor.value("server_pid").toInt();
- status.wmPID = databaseActivityCursor.value("wm_pid").toInt();
- status.state = databaseActivityCursor.value("state").toInt();
- status.display = databaseActivityCursor.value("display").toInt();
- status.loginStamp.setTime_t(databaseActivityCursor.value("stamp_start").toLongLong());
- status.activityStamp.setTime_t(databaseActivityCursor.value("stamp_statechange").toLongLong());
-
- list.append(status);
+ TQStringList list;
+ TQSqlCursor databaseServersCursor("servers", TRUE, m_terminals_database);
+ databaseServersCursor.select();
+ while (databaseServersCursor.next()) {
+ list.append(databaseServersCursor.value("name").toString());
}
ds << list;
writeEndOfFrame();
@@ -207,29 +197,41 @@ void SysCtlSocket::commandLoop() {
else if (subCommand == "WORKSPACES") {
clearFrameTail();
ds << TQString("OK");
- WorkspaceServiceStatusList list;
- TQSqlCursor databaseActivityCursor("activity", TRUE, m_workspaces_database);
- databaseActivityCursor.select();
- while (databaseActivityCursor.next()) {
- WorkspaceServiceStatusType status;
-
- status.protocolVersion = 1;
- status.sessionID = databaseActivityCursor.value("pk").toInt();
- status.stationID = databaseActivityCursor.value("station").toInt();
- status.username = databaseActivityCursor.value("username").toString();
- status.realmname = databaseActivityCursor.value("realmname").toString();
- status.serverID = databaseActivityCursor.value("serverid").toInt();
- status.serviceID = databaseActivityCursor.value("serviceid").toInt();
- status.stationID = databaseActivityCursor.value("station").toInt();
- TQSqlCursor databaseStationsCursor("stations", TRUE, m_workspaces_database);
- databaseStationsCursor.select(TQString("pk=%1").arg(status.stationID));
- if (databaseStationsCursor.next()) {
- status.stationName = databaseStationsCursor.value("name").toString();
- }
- status.loginStamp.setTime_t(databaseActivityCursor.value("logontime").toLongLong());
- status.terminateStamp.setTime_t(databaseActivityCursor.value("terminate").toLongLong());
- list.append(status);
+ StationList list;
+ TQSqlCursor databaseStationsCursor("stations", TRUE, m_workspaces_database);
+ TQSqlCursor databaseServicesCursor("services", TRUE, m_workspaces_database);
+ TQSqlCursor databaseServiceTypesCursor("servicetypes", TRUE, m_workspaces_database);
+ databaseStationsCursor.select();
+ while (databaseStationsCursor.next()) {
+ StationType st;
+ st.id = databaseStationsCursor.value("pk").toInt();
+ st.name = databaseStationsCursor.value("name").toString();
+ st.description = databaseStationsCursor.value("description").toString();
+ databaseServicesCursor.select(TQString("station=%1").arg(databaseStationsCursor.value("pk").toInt()));
+ while (databaseServicesCursor.next()) {
+ databaseServiceTypesCursor.select(TQString("serviceid=%1").arg(databaseServicesCursor.value("servicetype").toInt()));
+ ServiceType svt;
+ if (databaseServiceTypesCursor.next()) {
+ svt.type = databaseServiceTypesCursor.value("serviceid").toInt();
+ svt.name = databaseServiceTypesCursor.value("name").toString();
+ svt.description = databaseServiceTypesCursor.value("description").toString();
+ svt.clientLibrary = databaseServiceTypesCursor.value("client_library").toString();
+ svt.version = databaseServiceTypesCursor.value("version").toInt();
+ char tempchar;
+ tempchar = databaseServiceTypesCursor.value("single_instance").toInt();
+ svt.singleInstance = (tempchar != 0);
+ }
+ if (svt.name == "") {
+ svt.name = i18n("<unknown>");
+ }
+ if (svt.description == "") {
+ svt.description = i18n("<unknown>");
+ }
+ st.services.append(svt);
+ }
+
+ list.append(st);
}
ds << list;
writeEndOfFrame();
@@ -240,92 +242,237 @@ void SysCtlSocket::commandLoop() {
writeEndOfFrame();
}
}
- else if (command == "SESSION") {
+ else if (command == "LISTGROUPACCESS") {
TQString subCommand;
- TQString sessionID;
ds >> subCommand;
- ds >> sessionID;
- if (subCommand == "LOGOFF_TERMINAL") {
- TQ_UINT32 delay;
- ds >> delay;
+ if (subCommand == "TERMINALS") {
clearFrameTail();
- // FIXME UNIMPLEMENTED
- ds << TQString("ERRINVCMD");
+ ds << TQString("OK");
+ TerminalServiceAuthGroupList list;
+
+ // First search the database for groups...
+ TQSqlCursor databasePermissionsCursor("allowed_servers", TRUE, m_terminals_database);
+ databasePermissionsCursor.select();
+ while (databasePermissionsCursor.next()) {
+ TerminalServiceAuthGroupType agt;
+ TerminalServiceAuthGroupList::iterator it = list.findByName(databasePermissionsCursor.value("groupname").toString());
+ if (it != list.end()) {
+ agt = *it;
+ list.remove(it);
+ }
+ else {
+ agt.protocolVersion = 1;
+ agt.groupName = databasePermissionsCursor.value("groupname").toString();
+ }
+ agt.allowedServerNames.append(databasePermissionsCursor.value("server").toString());
+
+ list.append(agt);
+ }
+
+ // ...then search LDAP for groups that were not already in the database
+ struct group* group;
+ setgrent();
+ while ((group = getgrent())) {
+ if ((group->gr_gid >= m_minGID) && (group->gr_gid <= m_maxGID)) {
+ TerminalServiceAuthGroupType agt;
+ TerminalServiceAuthGroupList::iterator it = list.findByName(TQString(group->gr_name));
+ if (it == list.end()) {
+ agt.protocolVersion = 1;
+ agt.groupName = TQString(group->gr_name);
+ list.append(agt);
+ }
+ }
+ }
+ endgrent();
+
+ ds << list;
writeEndOfFrame();
}
- else if (subCommand == "CANCEL_LOGOFF_TERMINAL") {
+ else if (subCommand == "WORKSPACES") {
+ clearFrameTail();
+ ds << TQString("OK");
+
+ WorkspaceServiceAuthGroupList list;
+
+ // First search the database for groups...
+ TQSqlCursor databasePermissionsCursor("permissions", TRUE, m_workspaces_database);
+ databasePermissionsCursor.select();
+ while (databasePermissionsCursor.next()) {
+ WorkspaceServiceAuthGroupType agt;
+ WorkspaceServiceAuthGroupList::iterator it = list.findByName(databasePermissionsCursor.value("groupname").toString());
+ if (it != list.end()) {
+ agt = *it;
+ list.remove(it);
+ }
+ else {
+ agt.protocolVersion = 1;
+ agt.groupName = databasePermissionsCursor.value("groupname").toString();
+ }
+ agt.allowedStationIDs.append(databasePermissionsCursor.value("station").toUInt());
+
+ list.append(agt);
+ }
+
+ // ...then search LDAP for groups that were not already in the database
+ struct group* group;
+ setgrent();
+ while ((group = getgrent())) {
+ if ((group->gr_gid >= m_minGID) && (group->gr_gid <= m_maxGID)) {
+ WorkspaceServiceAuthGroupType agt;
+ WorkspaceServiceAuthGroupList::iterator it = list.findByName(TQString(group->gr_name));
+ if (it == list.end()) {
+ agt.protocolVersion = 1;
+ agt.groupName = TQString(group->gr_name);
+ list.append(agt);
+ }
+ }
+ }
+ endgrent();
+
+ ds << list;
+ writeEndOfFrame();
+ }
+ else {
clearFrameTail();
- // FIXME UNIMPLEMENTED
ds << TQString("ERRINVCMD");
writeEndOfFrame();
}
- else if (subCommand == "KILL_TERMINAL") {
+ }
+ else if (command == "SETGROUPACCESS") {
+ TQString subCommand;
+ ds >> subCommand;
+ if (subCommand == "TERMINALS") {
+ TerminalServiceAuthGroupList list;
+ ds >> list;
clearFrameTail();
- TQSqlCursor databaseActivityCursor("sessions", TRUE, m_terminals_database);
- databaseActivityCursor.select(TQString("pk=%1").arg(sessionID));
- if (databaseActivityCursor.next()) {
- // Gather server information
- TQString server_name = databaseActivityCursor.value("servername").toString();
- int server_pid = databaseActivityCursor.value("server_pid").toInt();
- // Kill server process
- TQString command = TQString("ssh root@%1 'kill -9 %2'").arg(server_name).arg(server_pid);
- if (system(command.ascii()) == 0) {
- // Remove database entry
- databaseActivityCursor.select(TQString("pk=%1").arg(sessionID));
- if (databaseActivityCursor.next()) {
- databaseActivityCursor.primeDelete();
- databaseActivityCursor.del(true);
- }
- ds << TQString("OK");
+
+ bool success = true;
+ TQSqlCursor databasePermissionsCursor("allowed_servers", TRUE, m_terminals_database);
+ TerminalServiceAuthGroupList::iterator it;
+ for (it = list.begin(); it != list.end(); ++it) {
+ TerminalServiceAuthGroupType agt = *it;
+
+ // Delete all existing entries for this group in perparation for update
+ databasePermissionsCursor.select(TQString("groupname='%1'").arg(agt.groupName));
+ while (databasePermissionsCursor.next()) {
+ databasePermissionsCursor.primeDelete();
+ databasePermissionsCursor.del(false);
}
- else {
- ds << TQString("ERRFAILED");
+
+ // Insert all entries for this group from the information structure
+ TQStringList::iterator it2;
+ for (it2 = agt.allowedServerNames.begin(); it2 != agt.allowedServerNames.end(); ++it2) {
+ TQSqlRecord *buffer = databasePermissionsCursor.primeInsert();
+ buffer->setValue("groupname", agt.groupName);
+ buffer->setValue("server", *it2);
+ databasePermissionsCursor.insert();
}
- writeEndOfFrame();
+ }
+
+ if (success) {
+ ds << TQString("OK");
}
else {
- ds << TQString("ERRINVCMD");
+ ds << TQString("ERRFAILED");
}
writeEndOfFrame();
}
- else if (subCommand == "KILL_WORKSPACE") {
- TQ_INT32 terminationOffset;
- ds >> terminationOffset;
+ else if (subCommand == "WORKSPACES") {
+ WorkspaceServiceAuthGroupList list;
+ ds >> list;
clearFrameTail();
- TQDateTime terminationTime = TQDateTime::currentDateTime();
- terminationTime = terminationTime.addSecs(terminationOffset*60);
- TQSqlCursor databaseActivityCursor("activity", TRUE, m_workspaces_database);
- databaseActivityCursor.select(TQString("pk=%1").arg(sessionID));
- if (databaseActivityCursor.next()) {
- TQSqlRecord *buffer = databaseActivityCursor.primeUpdate();
- if (terminationOffset > -2) {
- buffer->setValue("terminate", terminationTime.toTime_t());
+
+ bool success = true;
+ TQSqlCursor databasePermissionsCursor("permissions", TRUE, m_workspaces_database);
+ WorkspaceServiceAuthGroupList::iterator it;
+ for (it = list.begin(); it != list.end(); ++it) {
+ WorkspaceServiceAuthGroupType agt = *it;
+
+ // Delete all existing entries for this group in perparation for update
+ databasePermissionsCursor.select(TQString("groupname='%1'").arg(agt.groupName));
+ while (databasePermissionsCursor.next()) {
+ databasePermissionsCursor.primeDelete();
+ databasePermissionsCursor.del(false);
}
- else {
- buffer->setValue("terminate", 0);
+
+ // Insert all entries for this group from the information structure
+ TQInt32List::iterator it2;
+ for (it2 = agt.allowedStationIDs.begin(); it2 != agt.allowedStationIDs.end(); ++it2) {
+ TQSqlRecord *buffer = databasePermissionsCursor.primeInsert();
+ buffer->setValue("groupname", agt.groupName);
+ buffer->setValue("station", *it2);
+ databasePermissionsCursor.insert();
}
- databaseActivityCursor.update();
+ }
+ if (success) {
ds << TQString("OK");
}
else {
- ds << TQString("ERRINVCMD");
+ ds << TQString("ERRFAILED");
}
writeEndOfFrame();
}
- else if (subCommand == "CANCEL_KILL_WORKSPACE") {
+ else {
clearFrameTail();
- TQSqlCursor databaseActivityCursor("activity", TRUE, m_workspaces_database);
- databaseActivityCursor.select(TQString("pk=%1").arg(sessionID));
- if (databaseActivityCursor.next()) {
- TQSqlRecord *buffer = databaseActivityCursor.primeUpdate();
- buffer->setValue("terminate", 0);
- databaseActivityCursor.update();
+ ds << TQString("ERRINVCMD");
+ writeEndOfFrame();
+ }
+ }
+ else if (command == "DELETEGROUPACCESS") {
+ TQString subCommand;
+ ds >> subCommand;
+ if (subCommand == "TERMINALS") {
+ TerminalServiceAuthGroupList list;
+ ds >> list;
+ clearFrameTail();
+
+ bool success = true;
+ TQSqlCursor databasePermissionsCursor("allowed_servers", TRUE, m_terminals_database);
+ TerminalServiceAuthGroupList::iterator it;
+ for (it = list.begin(); it != list.end(); ++it) {
+ TerminalServiceAuthGroupType agt = *it;
+
+ // Delete all existing entries for this group
+ databasePermissionsCursor.select(TQString("groupname='%1'").arg(agt.groupName));
+ while (databasePermissionsCursor.next()) {
+ databasePermissionsCursor.primeDelete();
+ databasePermissionsCursor.del(false);
+ }
+ }
+
+ if (success) {
+ ds << TQString("OK");
+ }
+ else {
+ ds << TQString("ERRFAILED");
+ }
+ writeEndOfFrame();
+ }
+ else if (subCommand == "WORKSPACES") {
+ WorkspaceServiceAuthGroupList list;
+ ds >> list;
+ clearFrameTail();
+
+ bool success = true;
+ TQSqlCursor databasePermissionsCursor("permissions", TRUE, m_workspaces_database);
+ WorkspaceServiceAuthGroupList::iterator it;
+ for (it = list.begin(); it != list.end(); ++it) {
+ WorkspaceServiceAuthGroupType agt = *it;
+
+ // Delete all existing entries for this group
+ databasePermissionsCursor.select(TQString("groupname='%1'").arg(agt.groupName));
+ while (databasePermissionsCursor.next()) {
+ databasePermissionsCursor.primeDelete();
+ databasePermissionsCursor.del(false);
+ }
+ }
+ if (success) {
ds << TQString("OK");
}
else {
- ds << TQString("ERRINVCMD");
+ ds << TQString("ERRFAILED");
}
writeEndOfFrame();
}
diff --git a/servers/admin_user_mgmt_server_lin/src/admin_sys_ctl.h b/servers/admin_user_mgmt_server_lin/src/admin_user_mgmt.h
index 4812424..d0f75a2 100644
--- a/servers/admin_user_mgmt_server_lin/src/admin_sys_ctl.h
+++ b/servers/admin_user_mgmt_server_lin/src/admin_user_mgmt.h
@@ -20,6 +20,8 @@
* http://www.raptorengineeringinc.com
*/
+#include <grp.h>
+
#include <tqsocket.h>
#include <tqserversocket.h>
#include <tqapplication.h>
@@ -73,6 +75,9 @@ class SysCtlSocket : public TDEKerberosServerSocket
TQSqlDatabase* m_workspaces_database;
int m_commandLoopState;
+ gid_t m_minGID;
+ gid_t m_maxGID;
+
friend class UserMgmtServer;
};
diff --git a/servers/admin_user_mgmt_server_lin/src/main.cpp b/servers/admin_user_mgmt_server_lin/src/main.cpp
index b216a9b..d9aa95a 100644
--- a/servers/admin_user_mgmt_server_lin/src/main.cpp
+++ b/servers/admin_user_mgmt_server_lin/src/main.cpp
@@ -37,7 +37,7 @@
#include <kaboutdata.h>
#include <ksimpleconfig.h>
-#include "admin_sys_ctl.h"
+#include "admin_user_mgmt.h"
static const char description[] = I18N_NOOP("RemoteFPGA System Administration User Management Server");
@@ -58,7 +58,7 @@ int main(int argc, char *argv[])
KSimpleConfig config("remotefpga_adminusermgmtserver.conf", false);
config.setGroup("Server");
- SysCtlServer fpgasvr(0, config.readNumEntry("port", 4016), &config);
+ UserMgmtServer fpgasvr(0, config.readNumEntry("port", 4016), &config);
return app.exec();
}