Commit 1dde927f by Csók Tamás

Initial files from previous assignment

parent 2d557726
Desktop client for CIRCLE, providing single click connection to the VMs further enhancing the ease of use.
Python, Selenium, Remmina based application. Tested and made for Debian based Linux systems.
To install the client Root rights are necessary.
The installation guide can be found at the "doc" subfolder, while the installation subfolder is the "dist".
To install simply run the "dist/install.sh" bash script.
Current source code can be found at the "src" subfolder.
[Desktop Entry]
Version=0.1
Name=Cloud GUI
Comment=Tool to use IK Cloud
Exec=cloud2
Icon=/usr/share/icons/cloud.svg
Terminal=true
Type=Application
Categories=Utility;Application;
#!/usr/bin/python
# -*- coding: utf-8 -*-
##
# A cloudban létrehozott virtuális gépekhez történő kapcsolódást segítő program
##
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import platform, argparse, sys, time
##
# Paraméterek átadására használt struktúra
# state A virtuális gép állapota, azt figyeljük, hogy fut-e
# protocol SSH, NX és RDP lehetséges
# host A virtuális gép címe
# port Ezen a porton csatlakozunk a virtuális géphez
# user Csatlakozáshoz használt név
# password Csatlakozáshoz használt jelszó
class Struct:
pass
##
# Argument parser, argparse modulon alapszik
# @return args
#
def pars_arguments():
parser = argparse.ArgumentParser();
parser.add_argument("-u", "--username", type=str)
parser.add_argument("-p", "--password", type=str)
parser.add_argument("-d", "--driver", help="Select webdriver. Aside from Firefox, you have to install first the proper driver.", \
type=str, choices=['firefox', 'chrome', 'ie', 'opera', 'safari'], default="firefox")
parser.add_argument("-o", "--old", help="Use old interface", action="store_true")
args = parser.parse_args();
return args
class Browser:
##
# Browser inicializálás
# @param args Az args.driver paraméterrel meghatározhatjuk, melyik böngészőt akarjuk használni.
#
def __init__(self, args):
self.args = args
if args.driver == "firefox":
self.driver = webdriver.Firefox()
elif args.driver == "chrome":
self.driver = webdriver.Chrome()
elif args.driver == "ie":
self.driver = webdriver.Ie()
elif args.driver == "opera":
self.driver = webdriver.Opera()
elif args.driver == "safari":
self.driver = webdriver.Safari()
self.driver.implicitly_wait(10)
##
# Címtáras beléptetés a parancssorban megadott paraméterek alapján
#
def login(self):
driver = self.driver
args = self.args
if args.username is not None:
driver.find_element_by_name("j_username").clear()
driver.find_element_by_name("j_username").send_keys(args.username)
if args.password is not None:
driver.find_element_by_name("j_password").clear()
driver.find_element_by_name("j_password").send_keys(args.password)
if args.username is not None and args.password is not None:
driver.find_element_by_css_selector("input[type='submit']").click()
##
# A régi webes felület használata
# @return vm Virtuális gép csatlakozásához szükséges paraméterek
#
def old_main(self):
vm = Struct()
driver = self.driver
driver.maximize_window()
driver.get("https://cloud.ik.bme.hu/info/")
driver.find_element_by_css_selector("a[href*='/login/']").click()
self.login()
vm.state, vm.protocol = "", "NONE"
try:
while vm.state.upper()[:3] not in ("FUT", "RUN"):
element = WebDriverWait(driver, 7200).until(EC.presence_of_element_located((By.CSS_SELECTOR, "input.hidden-password.shown[type='text']")))
vm.password = element.get_attribute("value")
vm.state = driver.find_element_by_css_selector("#state > div > p").text
vm.protocol = driver.find_element_by_css_selector("#vm-credentials > div > table > tbody > tr:nth-child(1) > td").text
vm.host,vm.port = driver.find_element_by_css_selector("#vm-credentials > div > table > tbody > tr:nth-child(2) > td").text.split(':')
vm.user = driver.find_element_by_css_selector("#vm-credentials > div > table > tbody > tr:nth-child(4) > td").text
except:
print "Browser session timed out!"
finally:
driver.find_element_by_css_selector("a[href*='/logout/']").click()
return vm
##
# Az új webes felület használata
# @return vm Virtuális gép csatlakozásához szükséges paraméterek
#
def main(self):
vm = Struct()
driver = self.driver
driver.maximize_window()
driver.get("https://demo.cloud.bme.hu/")
driver.find_element_by_css_selector("a[href*='/login/']").click()
self.login()
vm.state, vm.protocol = "", "NONE"
try:
while vm.state.upper()[:3] not in ("FUT", "RUN"):
element = WebDriverWait(driver,7200).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#vm-details-pw-eye.icon-eye-close")))
vm.state = driver.find_element_by_css_selector("#vm-details-state > span").text
#cl: connection string converted to list
cl = driver.find_element_by_css_selector("#vm-info-pane > input").get_attribute("value").split()
if cl[0] == "sshpass":
vm.protocol = "SSH"
vm.user, vm.host = cl[6].split("@")
vm.password, vm.port = cl[2], cl[8]
elif cl[0] == "rdesktop":
vm.protocol = "RDP"
vm.host, vm.port = cl[1].split(":")
vm.user, vm.password = cl[3], cl[5]
except:
print "Browser session timed out!"
finally:
driver.find_element_by_css_selector("a[href*='/logout/']").click()
return vm
##
# Főprogram
# beolvassuk a paramétereket
# megnyitjuk a kiválasztott böngészőben a weboldalt
# bejelentkezünk a címtárba
# kiválasztjuk a futtatni kívánt klienst
# kapcsolódunk a klienshez
def main():
args = pars_arguments()
browser = Browser(args)
if args.old:
vm = browser.old_main()
else:
vm = browser.main()
browser.driver.quit()
if platform.system() == "Linux":
from cloud_connect_from_linux import connect
elif platform.system() == "Windows":
from cloud_connect_from_windows import connect
if vm.state.upper()[:3] in ("FUT", "RUN"):
connect(vm)
if __name__ == "__main__":
main()
This diff is collapsed. Click to expand it.
#!/usr/bin/python
import cloud
if __name__ == '__main__':
try:
cloud.main()
finally:
pass
# -*- coding: utf-8 -*-
##
# Távoli klienshez csatlakozás linux OS alól
##
import sys, os, time, subprocess, glob
##
# A távoli klienshez csatlakozás valósítja meg
# NX és RDP esetén a remmina programot hívja meg. Ha a remmina-ban még nem szerepel
# a kliens, a program elkészíti az indításhoz szükséges profilt.
# @param vm Paraméterek a csatlakozáshoz
# vm.protocol SSH, NX és RDP lehetséges
# vm.host A virtuális gép címe
# vm.port Ezen a porton csatlakozunk a virtuális géphez
# vm.user Csatlakozáshoz használt név
# vm.password Csatlakozáshoz használt jelszó
#
def connect(vm):
if vm.protocol == "SSH":
command = "sshpass -p %s ssh -p %s -o StrictHostKeyChecking=no %s@%s" % (vm.password, vm.port, vm.user, vm.host)
subprocess.call(command, shell=True)
elif vm.protocol in ("NX", "RDP"):
server = "%s:%s" % (vm.host, vm.port)
listdir = os.path.expanduser("~/.remmina/*.remmina")
found = False
for config_file in glob.glob(listdir):
with open(config_file) as f:
if server in f.read():
found = True
break
if not found:
config_file = "%s%s%s" % (os.path.expanduser("~/.remmina/"), str(int(time.time()*1000)), ".remmina")
password = subprocess.check_output(["remminapasswd", vm.password])
f = open(config_file, 'w')
if vm.protocol == "NX":
f.write(NX_template)
else:
f.write(RDP_template)
f.write("name=%s:%s\nprotocol=%s\nserver=%s\nusername=%s\npassword=%s\n" % (vm.protocol, server, vm.protocol, server, vm.user, password))
f.close()
subprocess.call(["remmina", "-c", config_file])
NX_template = """[remmina]
ssh_auth=0
quality=2
disableencryption=0
ssh_charset=
ssh_privatekey=
resolution=
group=
ssh_loopback=0
exec=
ssh_username=
ssh_server=
ssh_enabled=0
nx_privatekey=
showcursor=0
disableclipboard=0
window_maximize=1
viewmode=4
"""
RDP_template = """[remmina]
disableclipboard=0
ssh_auth=0
clientname=
quality=2
ssh_charset=
ssh_privatekey=
console=0
resolution=
group=
ssh_loopback=0
shareprinter=0
ssh_username=
ssh_server=
security=
execpath=
sound=off
exec=
ssh_enabled=0
sharefolder=
domain=
colordepth=24
window_maximize=1
viewmode=4
"""
# -*- coding: utf-8 -*-
##
# Távoli klienshez csatlakozás windows OS alól
##
##
# A távoli klienshez csatlakozás valósítja majd meg windows alól
# @param vm Paraméterek a csatlakozáshoz
# vm.protocol SSH, NX és RDP lehetséges
# vm.host A virtuális gép címe
# vm.port Ezen a porton csatlakozunk a virtuális géphez
# vm.user Csatlakozáshoz használt név
# vm.password Csatlakozáshoz használt jelszó
#
def connect(vm):
pass
#!/bin/bash
sudo apt-get install sshpass python-pip remmina-plugin-nx remmina-plugin-rdp
sudo pip install selenium
if [ "$(uname -m)" == 'x86_64' ]; then
sudo cp remminapasswd64 /usr/local/bin/remminapasswd
else
sudo cp remminapasswd32 /usr/local/bin/remminapasswd
fi
sudo cp cloud2 /usr/local/bin/
sudo chmod +x /usr/local/bin/cloud2
sudo cp cloud.py /usr/local/bin/
sudo chmod +x /usr/local/bin/cloud.py
sudo cp cloud_connect_from_linux.py /usr/local/bin/
sudo chmod +x /usr/local/bin/cloud_connect_from_linux.py
sudo cp cloud.svg /usr/share/icons/
cp cloud.desktop $(xdg-user-dir DESKTOP)
sudo chmod +x $(xdg-user-dir DESKTOP)/cloud.desktop
remmina
\ No newline at end of file
#!/bin/bash
sudo rm -f /usr/local/bin/remminapasswd
sudo rm -f /usr/local/bin/cloud2
sudo rm -f /usr/local/bin/cloud.py
sudo rm -f /usr/local/bin/cloud_connect_from_linux.py
sudo rm -f /usr/share/icons/cloud.svg
rm -f $(xdg-user-dir DESKTOP)/cloud.desktop
\ No newline at end of file
A telepítéshez szükséges összes fájlt valamint a dokumentációt egy tömörített állomány tartalmazza.
1. Csomagoljuk ki az állományt egy tetszőleges helyre.
2. A következő lépésben nyissunk egy terminált és menjünk el (cd parancs) arra a mappára ahova az előbb kitömörí-tettünk.
3. Végül írjuk be: ./install.sh a konzolba.
A telepítés sikeres lefuttatásához szükség lesz majd megadni a jelszavunkat (vagy a rendszergazda jelszavát, helyi beállítástól függő-en).
A többit a szkript automatikusan végzi, amint végzett bezárhatjuk a konzolt és az asztalon megjelent ikonnal használhatjuk is a programot.
A program törlése hasonlóképpen zajlik, a kitömörített mappában adjuk ki a: ./uninstall.sh parancsot terminál segítségével (lsd. telepítés).
A szkript telepítéshez hasonló-an szintén kérni fog jelszót a törlés sikeres elvégzéséhez.
\ No newline at end of file
# fordításhoz szükséges: libglib2.0-dev, libgtk2.0-dev, libgcrypt11-dev
gcc -DHAVE_LIBGCRYPT -o remminapasswd remmina_passwd.c remmina_crypt.c remmina_pref.c remmina_string_array.c -Wall `pkg-config --libs --cflags gtk+-2.0` `libgcrypt-config --cflags --libs`
/*
* Remmina - The GTK+ Remote Desktop Client
* Copyright (C) 2009 - Vic Lee
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <glib.h>
#ifdef HAVE_LIBGCRYPT
#include <gcrypt.h>
#endif
#include "remmina_pref.h"
#include "remmina_crypt.h"
#ifdef HAVE_LIBGCRYPT
static gboolean remmina_crypt_init(gcry_cipher_hd_t *phd)
{
guchar* secret;
gcry_error_t err;
gsize secret_len;
secret = g_base64_decode(remmina_pref.secret, &secret_len);
if (secret_len < 32)
{
g_print("secret corrupted\n");
g_free(secret);
return FALSE;
}
err = gcry_cipher_open(phd, GCRY_CIPHER_3DES, GCRY_CIPHER_MODE_CBC, 0);
if (err)
{
g_print("gcry_cipher_open failure: %s\n", gcry_strerror(err));
g_free(secret);
return FALSE;
}
err = gcry_cipher_setkey((*phd), secret, 24);
if (err)
{
g_print("gcry_cipher_setkey failure: %s\n", gcry_strerror(err));
g_free(secret);
gcry_cipher_close((*phd));
return FALSE;
}
err = gcry_cipher_setiv((*phd), secret + 24, 8);
if (err)
{
g_print("gcry_cipher_setiv failure: %s\n", gcry_strerror(err));
g_free(secret);
gcry_cipher_close((*phd));
return FALSE;
}
g_free(secret);
return TRUE;
}
gchar* remmina_crypt_encrypt(const gchar *str)
{
guchar* buf;
gint buf_len;
gchar* result;
gcry_error_t err;
gcry_cipher_hd_t hd;
if (!str || str[0] == '\0')
return NULL;
if (!remmina_crypt_init(&hd))
return NULL;
buf_len = strlen(str);
/* Pack to 64bit block size, and make sure it's always 0-terminated */
buf_len += 8 - buf_len % 8;
buf = (guchar*) g_malloc(buf_len);
memset(buf, 0, buf_len);
memcpy(buf, str, strlen(str));
err = gcry_cipher_encrypt(hd, buf, buf_len, NULL, 0);
if (err)
{
g_print("gcry_cipher_encrypt failure: %s\n", gcry_strerror(err));
g_free(buf);
gcry_cipher_close(hd);
return NULL;
}
result = g_base64_encode(buf, buf_len);
g_free(buf);
gcry_cipher_close(hd);
return result;
}
gchar* remmina_crypt_decrypt(const gchar *str)
{
guchar* buf;
gsize buf_len;
gcry_error_t err;
gcry_cipher_hd_t hd;
if (!str || str[0] == '\0')
return NULL;
if (!remmina_crypt_init(&hd))
return NULL;
buf = g_base64_decode(str, &buf_len);
err = gcry_cipher_decrypt(hd, buf, buf_len, NULL, 0);
if (err)
{
g_print("gcry_cipher_decrypt failure: %s\n", gcry_strerror(err));
g_free(buf);
gcry_cipher_close(hd);
return NULL;
}
gcry_cipher_close(hd);
/* Just in case */
buf[buf_len - 1] = '\0';
return (gchar*) buf;
}
#else
gchar* remmina_crypt_encrypt(const gchar *str)
{
return NULL;
}
gchar* remmina_crypt_decrypt(const gchar *str)
{
return NULL;
}
#endif
/*
* Remmina - The GTK+ Remote Desktop Client
* Copyright (C) 2009 - Vic Lee
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __REMMINACRYPT_H__
#define __REMMINACRYPT_H__
G_BEGIN_DECLS
gchar* remmina_crypt_encrypt(const gchar* str);
gchar* remmina_crypt_decrypt(const gchar* str);
G_END_DECLS
#endif /* __REMMINACRYPT_H__ */
#include <glib/gprintf.h>
#include "remmina_pref.h"
#include "remmina_crypt.h"
int main(int argc, char **argv)
{
if (argc == 2) {
remmina_pref_init();
g_printf("%s", remmina_crypt_encrypt(argv[1]));
return 0;
} else {
/* No (or too many) parameter(s) given, exit with code 1 to signal error */
return 1;
}
}
/*
* Remmina - The GTK+ Remote Desktop Client
* Copyright (C) 2009-2011 Vic Lee
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __REMMINAPREF_H__
#define __REMMINAPREF_H__
/*
* Remmina Perference Loader
*/
G_BEGIN_DECLS
enum
{
REMMINA_VIEW_FILE_LIST,
REMMINA_VIEW_FILE_TREE
};
enum
{
REMMINA_ACTION_CONNECT = 0,
REMMINA_ACTION_EDIT = 1
};
enum
{
AUTO_MODE = 0,
SCROLLED_WINDOW_MODE = 1,
FULLSCREEN_MODE = 2,
SCROLLED_FULLSCREEN_MODE = 3,
VIEWPORT_FULLSCREEN_MODE = 4
};
enum
{
REMMINA_TAB_BY_GROUP = 0,
REMMINA_TAB_BY_PROTOCOL = 1,
REMMINA_TAB_ALL = 8,
REMMINA_TAB_NONE = 9
};
typedef struct _RemminaPref
{
/* In RemminaPrefDialog */
gboolean save_view_mode;
gboolean save_when_connect;
gboolean invisible_toolbar;
gboolean always_show_tab;
gboolean hide_connection_toolbar;
gint default_action;
gint scale_quality;
gchar *resolutions;
gint sshtunnel_port;
gint recent_maximum;
gint default_mode;
gint tab_mode;
gint auto_scroll_step;
gboolean applet_new_ontop;
gboolean applet_hide_count;
gboolean applet_enable_avahi;
gboolean disable_tray_icon;
gboolean minimize_to_tray;
guint hostkey;
guint shortcutkey_fullscreen;
guint shortcutkey_autofit;
guint shortcutkey_nexttab;
guint shortcutkey_prevtab;
guint shortcutkey_scale;
guint shortcutkey_grab;
guint shortcutkey_minimize;
guint shortcutkey_disconnect;
guint shortcutkey_toolbar;
/* In View menu */
gboolean hide_toolbar;
gboolean hide_statusbar;
gboolean show_quick_search;
gboolean small_toolbutton;
gint view_file_mode;
/* Auto */
gint main_width;
gint main_height;
gboolean main_maximize;
gint main_sort_column_id;
gint main_sort_order;
gchar *expanded_group;
gboolean toolbar_pin_down;
/* Crypto */
gchar *secret;
/* VTE */
gchar *vte_font;
gboolean vte_allow_bold_text;
gint vte_lines;
guint vte_shortcutkey_copy;
guint vte_shortcutkey_paste;
} RemminaPref;
#define DEFAULT_SSHTUNNEL_PORT 4732
#define DEFAULT_SSH_PORT 22
extern const gchar *default_resolutions;
extern gchar *remmina_pref_file;
extern RemminaPref remmina_pref;
void remmina_pref_init(void);
void remmina_pref_save(void);
void remmina_pref_add_recent(const gchar *protocol, const gchar *server);
gchar* remmina_pref_get_recent(const gchar *protocol);
void remmina_pref_clear_recent(void);
guint remmina_pref_keymap_get_keyval(const gchar *keymap, guint keyval);
gchar** remmina_pref_keymap_groups(void);
gint remmina_pref_get_scale_quality(void);
gint remmina_pref_get_sshtunnel_port(void);
void remmina_pref_set_value(const gchar *key, const gchar *value);
gchar* remmina_pref_get_value(const gchar *key);
G_END_DECLS
#endif /* __REMMINAPREF_H__ */
/*
* Remmina - The GTK+ Remote Desktop Client
* Copyright (C) 2009 - Vic Lee
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include <glib.h>
#include <string.h>
#include "remmina_string_array.h"
RemminaStringArray*
remmina_string_array_new(void)
{
return g_ptr_array_new();
}
RemminaStringArray*
remmina_string_array_new_from_string(const gchar *strs)
{
RemminaStringArray *array;
gchar *buf, *ptr1, *ptr2;
array = remmina_string_array_new();
if (!strs || strs[0] == '\0')
return array;
buf = g_strdup(strs);
ptr1 = buf;
while (ptr1)
{
ptr2 = strchr(ptr1, ',');
if (ptr2)
*ptr2++ = '\0';
remmina_string_array_add(array, ptr1);
ptr1 = ptr2;
}
g_free(buf);
return array;
}
RemminaStringArray*
remmina_string_array_new_from_allocated_string(gchar *strs)
{
RemminaStringArray *array;
array = remmina_string_array_new_from_string(strs);
g_free(strs);
return array;
}
void remmina_string_array_add(RemminaStringArray* array, const gchar *str)
{
g_ptr_array_add(array, g_strdup(str));
}
gint remmina_string_array_find(RemminaStringArray* array, const gchar *str)
{
gint i;
for (i = 0; i < array->len; i++)
{
if (g_strcmp0(remmina_string_array_index(array, i), str) == 0)
return i;
}
return -1;
}
void remmina_string_array_remove_index(RemminaStringArray* array, gint i)
{
g_ptr_array_remove_index(array, i);
}
void remmina_string_array_remove(RemminaStringArray* array, const gchar *str)
{
gint i;
i = remmina_string_array_find(array, str);
if (i >= 0)
{
remmina_string_array_remove_index(array, i);
}
}
void remmina_string_array_intersect(RemminaStringArray* array, const gchar *dest_strs)
{
RemminaStringArray *dest_array;
gint i, j;
dest_array = remmina_string_array_new_from_string(dest_strs);
i = 0;
while (i < array->len)
{
j = remmina_string_array_find(dest_array, remmina_string_array_index(array, i));
if (j < 0)
{
remmina_string_array_remove_index(array, i);
continue;
}
i++;
}
remmina_string_array_free(dest_array);
}
static gint remmina_string_array_compare_func(const gchar **a, const gchar **b)
{
return g_strcmp0(*a, *b);
}
void remmina_string_array_sort(RemminaStringArray *array)
{
g_ptr_array_sort(array, (GCompareFunc) remmina_string_array_compare_func);
}
gchar*
remmina_string_array_to_string(RemminaStringArray* array)
{
GString *gstr;
gint i;
gstr = g_string_new("");
for (i = 0; i < array->len; i++)
{
if (i > 0)
g_string_append_c(gstr, ',');
g_string_append(gstr, remmina_string_array_index(array, i));
}
return g_string_free(gstr, FALSE);
}
void remmina_string_array_free(RemminaStringArray *array)
{
g_ptr_array_foreach(array, (GFunc) g_free, NULL);
g_ptr_array_free(array, TRUE);
}
/*
* Remmina - The GTK+ Remote Desktop Client
* Copyright (C) 2009 - Vic Lee
*
* This program 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.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __REMMINASTRINGARRAY_H__
#define __REMMINASTRINGARRAY_H__
G_BEGIN_DECLS
typedef GPtrArray RemminaStringArray;
RemminaStringArray* remmina_string_array_new(void);
#define remmina_string_array_index(array,i) (gchar*)g_ptr_array_index(array,i)
RemminaStringArray* remmina_string_array_new_from_string(const gchar *strs);
RemminaStringArray* remmina_string_array_new_from_allocated_string(gchar *strs);
void remmina_string_array_add(RemminaStringArray *array, const gchar *str);
gint remmina_string_array_find(RemminaStringArray *array, const gchar *str);
void remmina_string_array_remove_index(RemminaStringArray *array, gint i);
void remmina_string_array_remove(RemminaStringArray *array, const gchar *str);
void remmina_string_array_intersect(RemminaStringArray *array, const gchar *dest_strs);
void remmina_string_array_sort(RemminaStringArray *array);
gchar* remmina_string_array_to_string(RemminaStringArray *array);
void remmina_string_array_free(RemminaStringArray *array);
G_END_DECLS
#endif /* __REMMINASTRINGARRAY_H__ */
#!/usr/bin/python
# -*- coding: utf-8 -*-
##
# A cloudban létrehozott virtuális gépekhez történő kapcsolódást segítő program
##
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import platform, argparse, sys, time
##
# Paraméterek átadására használt struktúra
# state A virtuális gép állapota, azt figyeljük, hogy fut-e
# protocol SSH, NX és RDP lehetséges
# host A virtuális gép címe
# port Ezen a porton csatlakozunk a virtuális géphez
# user Csatlakozáshoz használt név
# password Csatlakozáshoz használt jelszó
class Struct:
pass
##
# Argument parser, argparse modulon alapszik
# @return args
#
def pars_arguments():
parser = argparse.ArgumentParser();
parser.add_argument("-u", "--username", type=str)
parser.add_argument("-p", "--password", type=str)
parser.add_argument("-d", "--driver", help="Select webdriver. Aside from Firefox, you have to install first the proper driver.", \
type=str, choices=['firefox', 'chrome', 'ie', 'opera', 'safari'], default="firefox")
parser.add_argument("-o", "--old", help="Use old interface", action="store_true")
args = parser.parse_args();
return args
class Browser:
##
# Browser inicializálás
# @param args Az args.driver paraméterrel meghatározhatjuk, melyik böngészőt akarjuk használni.
#
def __init__(self, args):
self.args = args
if args.driver == "firefox":
self.driver = webdriver.Firefox()
elif args.driver == "chrome":
self.driver = webdriver.Chrome()
elif args.driver == "ie":
self.driver = webdriver.Ie()
elif args.driver == "opera":
self.driver = webdriver.Opera()
elif args.driver == "safari":
self.driver = webdriver.Safari()
self.driver.implicitly_wait(10)
##
# Címtáras beléptetés a parancssorban megadott paraméterek alapján
#
def login(self):
driver = self.driver
args = self.args
if args.username is not None:
driver.find_element_by_name("j_username").clear()
driver.find_element_by_name("j_username").send_keys(args.username)
if args.password is not None:
driver.find_element_by_name("j_password").clear()
driver.find_element_by_name("j_password").send_keys(args.password)
if args.username is not None and args.password is not None:
driver.find_element_by_css_selector("input[type='submit']").click()
##
# A régi webes felület használata
# @return vm Virtuális gép csatlakozásához szükséges paraméterek
#
def old_main(self):
vm = Struct()
driver = self.driver
driver.maximize_window()
driver.get("https://cloud.ik.bme.hu/info/")
driver.find_element_by_css_selector("a[href*='/login/']").click()
self.login()
vm.state, vm.protocol = "", "NONE"
try:
while vm.state.upper()[:3] not in ("FUT", "RUN"):
element = WebDriverWait(driver, 7200).until(EC.presence_of_element_located((By.CSS_SELECTOR, "input.hidden-password.shown[type='text']")))
vm.password = element.get_attribute("value")
vm.state = driver.find_element_by_css_selector("#state > div > p").text
vm.protocol = driver.find_element_by_css_selector("#vm-credentials > div > table > tbody > tr:nth-child(1) > td").text
vm.host,vm.port = driver.find_element_by_css_selector("#vm-credentials > div > table > tbody > tr:nth-child(2) > td").text.split(':')
vm.user = driver.find_element_by_css_selector("#vm-credentials > div > table > tbody > tr:nth-child(4) > td").text
except:
print "Browser session timed out!"
finally:
driver.find_element_by_css_selector("a[href*='/logout/']").click()
return vm
##
# Az új webes felület használata
# @return vm Virtuális gép csatlakozásához szükséges paraméterek
#
def main(self):
vm = Struct()
driver = self.driver
driver.maximize_window()
driver.get("https://demo.cloud.bme.hu/")
driver.find_element_by_css_selector("a[href*='/login/']").click()
self.login()
vm.state, vm.protocol = "", "NONE"
try:
while vm.state.upper()[:3] not in ("FUT", "RUN"):
element = WebDriverWait(driver,7200).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#vm-details-pw-eye.icon-eye-close")))
vm.state = driver.find_element_by_css_selector("#vm-details-state > span").text
#cl: connection string converted to list
cl = driver.find_element_by_css_selector("#vm-info-pane > input").get_attribute("value").split()
if cl[0] == "sshpass":
vm.protocol = "SSH"
vm.user, vm.host = cl[6].split("@")
vm.password, vm.port = cl[2], cl[8]
elif cl[0] == "rdesktop":
vm.protocol = "RDP"
vm.host, vm.port = cl[1].split(":")
vm.user, vm.password = cl[3], cl[5]
except:
print "Browser session timed out!"
finally:
driver.find_element_by_css_selector("a[href*='/logout/']").click()
return vm
##
# Főprogram
# beolvassuk a paramétereket
# megnyitjuk a kiválasztott böngészőben a weboldalt
# bejelentkezünk a címtárba
# kiválasztjuk a futtatni kívánt klienst
# kapcsolódunk a klienshez
def main():
args = pars_arguments()
browser = Browser(args)
if args.old:
vm = browser.old_main()
else:
vm = browser.main()
browser.driver.quit()
if platform.system() == "Linux":
from cloud_connect_from_linux import connect
elif platform.system() == "Windows":
from cloud_connect_from_windows import connect
if vm.state.upper()[:3] in ("FUT", "RUN"):
connect(vm)
if __name__ == "__main__":
main()
#!/usr/bin/python
import cloud
if __name__ == '__main__':
try:
cloud.main()
finally:
pass
# -*- coding: utf-8 -*-
##
# Távoli klienshez csatlakozás linux OS alól
##
import sys, os, time, subprocess, glob
##
# A távoli klienshez csatlakozás valósítja meg
# NX és RDP esetén a remmina programot hívja meg. Ha a remmina-ban még nem szerepel
# a kliens, a program elkészíti az indításhoz szükséges profilt.
# @param vm Paraméterek a csatlakozáshoz
# vm.protocol SSH, NX és RDP lehetséges
# vm.host A virtuális gép címe
# vm.port Ezen a porton csatlakozunk a virtuális géphez
# vm.user Csatlakozáshoz használt név
# vm.password Csatlakozáshoz használt jelszó
#
def connect(vm):
if vm.protocol == "SSH":
command = "sshpass -p %s ssh -p %s -o StrictHostKeyChecking=no %s@%s" % (vm.password, vm.port, vm.user, vm.host)
subprocess.call(command, shell=True)
elif vm.protocol in ("NX", "RDP"):
server = "%s:%s" % (vm.host, vm.port)
listdir = os.path.expanduser("~/.remmina/*.remmina")
found = False
for config_file in glob.glob(listdir):
with open(config_file) as f:
if server in f.read():
found = True
break
if not found:
config_file = "%s%s%s" % (os.path.expanduser("~/.remmina/"), str(int(time.time()*1000)), ".remmina")
password = subprocess.check_output(["remminapasswd", vm.password])
f = open(config_file, 'w')
if vm.protocol == "NX":
f.write(NX_template)
else:
f.write(RDP_template)
f.write("name=%s:%s\nprotocol=%s\nserver=%s\nusername=%s\npassword=%s\n" % (vm.protocol, server, vm.protocol, server, vm.user, password))
f.close()
subprocess.call(["remmina", "-c", config_file])
NX_template = """[remmina]
ssh_auth=0
quality=2
disableencryption=0
ssh_charset=
ssh_privatekey=
resolution=
group=
ssh_loopback=0
exec=
ssh_username=
ssh_server=
ssh_enabled=0
nx_privatekey=
showcursor=0
disableclipboard=0
window_maximize=1
viewmode=4
"""
RDP_template = """[remmina]
disableclipboard=0
ssh_auth=0
clientname=
quality=2
ssh_charset=
ssh_privatekey=
console=0
resolution=
group=
ssh_loopback=0
shareprinter=0
ssh_username=
ssh_server=
security=
execpath=
sound=off
exec=
ssh_enabled=0
sharefolder=
domain=
colordepth=24
window_maximize=1
viewmode=4
"""
# -*- coding: utf-8 -*-
##
# Távoli klienshez csatlakozás windows OS alól
##
##
# A távoli klienshez csatlakozás valósítja majd meg windows alól
# @param vm Paraméterek a csatlakozáshoz
# vm.protocol SSH, NX és RDP lehetséges
# vm.host A virtuális gép címe
# vm.port Ezen a porton csatlakozunk a virtuális géphez
# vm.user Csatlakozáshoz használt név
# vm.password Csatlakozáshoz használt jelszó
#
def connect(vm):
pass
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment