diff --git a/.gitignore b/.gitignore index ab363b8930dd767f4e11624e49537f2d5cdf0a63..1cf536a6e14181ff69813ce7d81ed22fc5b86312 100644 --- a/.gitignore +++ b/.gitignore @@ -9,12 +9,14 @@ build/ .fetched_source list* test +scripts/.resut.out logs/ server/local_builds/ /config remote/modules/systemd/dltmp.systemd-204.tar.xz scripts/home/ stage4/ +useful/backup-por-facilidade/ useful/ainda-nao-sei-usar-o-git.tar.gz useful/ainda-nao-sei-usar-o-git/ useful/stg312-dummy/ @@ -29,10 +31,10 @@ useful/stg312/po/ useful/stg312/stage4-cloner-doc.odt useful/stg312/stage4_cloner useful/stg312/transl-test.txt -useful/stg312/upload useful/stg312/user_data.info useful/stg4cloner/cloner.desktop useful/unused/ -/server/configs/enris/ -/server/modules/image-creator/ +server/configs/enris/ +server/modules/image-creator/ + diff --git a/scripts/clone_stage4 b/scripts/clone_stage4 index 4c430aa8f24ec068dd2b536f4c948551771ebdea..26e4e08d28065eaca580497360539da237d116b6 100755 --- a/scripts/clone_stage4 +++ b/scripts/clone_stage4 @@ -54,5 +54,5 @@ else fi pinfo "Cloning via rsync" -cat "$INCLUDE" "$EXCLUDE" | rsync -a --delete --delete-excluded --numeric-ids -v --exclude-from=- "${RSYNC_OPTS}" "${RSYNC_SOURCE}" "${TARGET_DIR}" || perror "rsync from '${RSYNC_SOURCE}' to '${TARGET_DIR}' failed." +cat "$INCLUDE" "$EXCLUDE" | rsync -a --delete --exclude="${TARGET_DIR}" --delete-excluded --numeric-ids -v --exclude-from=- "${RSYNC_OPTS}" "${RSYNC_SOURCE}" "${TARGET_DIR}" || perror "rsync from '${RSYNC_SOURCE}' to '${TARGET_DIR}' failed." diff --git a/useful/stg312/.data.out b/useful/stg312/.data.out index 475f41c0ae5e31e70ad6599a70aac9e3526909e6..d1e10cde50140361b6234b15184cc7c900090a51 100644 --- a/useful/stg312/.data.out +++ b/useful/stg312/.data.out @@ -1 +1 @@ -{"login":"root","name":"MEGA ROOT","email":"root@root.com","city":null,"status":"ok","msg":"Get informations of user successful","code":"002"} \ No newline at end of file +{"login":"root","name":"Alessandro Elias","email":"ae11@c3sl.ufpr.br","city":null,"status":"ok","msg":"Get informations of user successful","code":"002"} \ No newline at end of file diff --git a/useful/stg312/.progress.out b/useful/stg312/.progress.out index d409fce75c098000a0caeff61f892b619c48e4d2..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/useful/stg312/.progress.out +++ b/useful/stg312/.progress.out @@ -1 +0,0 @@ -Nothing to see here, move along now \ No newline at end of file diff --git a/useful/stg312/.result.out b/useful/stg312/.result.out deleted file mode 100644 index b4785957bc986dc39c629de9fac9df46972c00fc..0000000000000000000000000000000000000000 --- a/useful/stg312/.result.out +++ /dev/null @@ -1 +0,0 @@ -s diff --git a/useful/stg312/.size.out b/useful/stg312/.size.out index a0d4409031c861fe4c5de264846b2a5f783c9ab1..b6353807ba5d203a3fe3d9298d4ed0fca7efb301 100644 --- a/useful/stg312/.size.out +++ b/useful/stg312/.size.out @@ -1 +1 @@ -1727784 testando-linha-de-comando-4.r1.tar.gz +1729632 testando-versao0-release.r1.tar.gz diff --git a/useful/stg312/.speed.out b/useful/stg312/.speed.out index b0b7ac78a6d09612cdae970e34d2fb5c4b3acfc0..1490ffa46bd88be89f070611cd21efd3254c62c1 100644 --- a/useful/stg312/.speed.out +++ b/useful/stg312/.speed.out @@ -1,3 +1,3 @@ -Ping: 2.781 ms -Download: 48.69 Mbyte/s -Upload: 18.60 Mbyte/s +Ping: 2.766 ms +Download: 47.71 Mbyte/s +Upload: 27.54 Mbyte/s diff --git a/useful/stg312/.upid.out b/useful/stg312/.upid.out index 89c4a26baf2009963985a25addfe80db252f5711..4e51b2bca5456ec9309851a446a2464a645feb67 100644 --- a/useful/stg312/.upid.out +++ b/useful/stg312/.upid.out @@ -1 +1 @@ -{"uploadid":"dqjl1SbOqGCRIVYorSppGBme18HGNzEfS3R","status":"ok","code":"003","msg":"New upload succesful"} \ No newline at end of file +{"uploadid":"ITMF3PllC6JxmO50UpfeBaM23FlxePUBXmp","status":"ok","code":"003","msg":"New upload succesful"} \ No newline at end of file diff --git a/useful/stg312/clone_stage4.sh b/useful/stg312/clone_stage4.sh index ab97032f6d06a5d2e506c1b5a9ca3e3cd19f4ac2..9a385813d71417cb40294ba77a2960e62c028644 100755 --- a/useful/stg312/clone_stage4.sh +++ b/useful/stg312/clone_stage4.sh @@ -2,6 +2,7 @@ #$1 é o caminho para o tm-scripts, $2 é a pasta selecionada pelo usuario, $3 é "local", $4 é a pasta onde será clonado o stage 4, $5 é o nome da imagem, $6 é se a pasta não compactada deve ser removida ou não #pwd #./loading_screen_openslx & +echo n > .result.out mkdir -p $2 echo criou o dir caminho=$(pwd) @@ -26,16 +27,20 @@ else #echo Escreveu #cat .result.out echo "Sucesso ao clonar." + cd "$2" if mksquashfs "$4" "$5" -b 1M ; then - mv "$5" "$2" + cd $caminho + echo move do 5 pro 2 + #mv "$5" "$2" if [ $6 == "1" ]; then rm -rf "$4" fi cd "$2" - /root/dnbd3/build/dnbd3-server --crc "$5" - tar cvzf "$5".tar.gz user_data.info "$5" "$5".crc + #/root/dnbd3/build/dnbd3-server --crc "$5" + tar cvzf "$5".tar.gz user_data.info "$5" split --verbose -n $7 "$5".tar.gz "$5".tar.gz. du "$5".tar.gz > .size.out + echo move do .size mv .size.out "$caminho" cd "$caminho" #echo Caminho novo diff --git a/useful/stg312/dependencies.sh b/useful/stg312/dependencies.sh new file mode 100755 index 0000000000000000000000000000000000000000..fcc3f5b6644b77d9bf2f39c4989498b0897cccd5 --- /dev/null +++ b/useful/stg312/dependencies.sh @@ -0,0 +1,10 @@ +apt-get update +apt-get install -y squashfs-tools +apt-get install -y synaptic +apt-get install -y libjansson-dev +apt-get install -y libjansson4 +apt-get install -y python-setuptools +easy_install speedtest_cli +apt-get install -y libcurl4-openssl-dev +apt-get install -y libgtk-3-dev + diff --git a/useful/stg312/line-s.png b/useful/stg312/line-s.png new file mode 100644 index 0000000000000000000000000000000000000000..e31f6bdeeb96e538e0891b249fc0fb06003b207a Binary files /dev/null and b/useful/stg312/line-s.png differ diff --git a/useful/stg312/makefile b/useful/stg312/makefile index 386966be89c25608f5bcddee039b0357197b6905..be912afe7c64006e5209e25a8b61ac56302ffe82 100644 --- a/useful/stg312/makefile +++ b/useful/stg312/makefile @@ -1,7 +1,7 @@ NAME=openslx_gui CFLAGS=-g -Wall -fdiagnostics-show-option GTKFLAGS=-export-dynamic `pkg-config --cflags --libs gtk+-3.0 jansson` -lX11 -lcurl -SRCS=openslx_gui.c stg4.c utils.c +SRCS=openslx_gui.c stg4.c utils.c upload-utils.c CC=gcc # top-level rule to create the program. diff --git a/useful/stg312/openslx_gui b/useful/stg312/openslx_gui index 948679a21d2eff91ac2f132eefc4c0c1795c7404..5fa4d8e3cb5ec26018d7d9aa70bdef71e40250a3 100755 Binary files a/useful/stg312/openslx_gui and b/useful/stg312/openslx_gui differ diff --git a/useful/stg312/openslx_gui.c b/useful/stg312/openslx_gui.c index d495fe2f639281fda2b9b6887b19b9128a2e6d8f..90575f0051693ad8d15a18f6bdd5f0a1637de80b 100644 --- a/useful/stg312/openslx_gui.c +++ b/useful/stg312/openslx_gui.c @@ -6,7 +6,6 @@ #include <sys/wait.h> #include "utils.h" #include "stg4.h" -#include <X11/Xlib.h> #include <gdk/gdkkeysyms.h> #include <unistd.h> #include <locale.h> @@ -14,19 +13,27 @@ #include <gdk/gdk.h> #include <glib.h> #include <jansson.h> +#include "upload-utils.h" +//FUnção que mostra a tela de upload antigo, caso ele exista void tela_upload_antigo(GtkWidget *w,gpointer p){ + GtkWidget *window_upload_antigo, *janela_ant, *button_continua_upload, *button_nao_continua, *label_nome_imagem, *label_parte_upload; GtkBuilder *builder; FILE *upload_in_progress; char *old_upload; old_upload = malloc(255*sizeof(char)); - dados *data_ant = p; - janela_ant = (GtkWidget*) data_ant->dado1; + #ifdef DEBUG + puts("Entrou na tela de upload antigo"); + puts(""); + #endif /*DEBUG*/ + + dados *data_ant = p; //Pega os dados recebidos pela chamada da função + janela_ant = (GtkWidget*) data_ant->dado1; //Pega a janela antiga que chamou essa nova janela - builder = gtk_builder_new(); - gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); + builder = gtk_builder_new(); //Cria um novo Builder gtk + gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets button_continua_upload = GTK_WIDGET(gtk_builder_get_object(builder, "button_continua_upload")); button_nao_continua = GTK_WIDGET(gtk_builder_get_object(builder, "button_nao_continua")); @@ -34,11 +41,16 @@ void tela_upload_antigo(GtkWidget *w,gpointer p){ label_nome_imagem = GTK_WIDGET(gtk_builder_get_object(builder, "label_nome_imagem")); label_parte_upload = GTK_WIDGET(gtk_builder_get_object(builder, "label_parte_upload")); - upload_in_progress = fopen(".progress.out", "a+"); - printf("Linha %d\n", __LINE__); + #ifdef DEBUG + puts("Vai abrir o arquivo de upload antigo"); + puts(""); + #endif /*DEBUG*/ + + upload_in_progress = fopen(".progress.out", "a+"); //Abre o arquivo para ler os dados do upload antigo, abre com a+ para poder dar rewind + rewind(upload_in_progress); fscanf(upload_in_progress, "%s", old_upload); - printf("Linha %d\n", __LINE__); + fscanf(upload_in_progress, "%s", old_upload); fscanf(upload_in_progress, "%s", old_upload); gtk_label_set_text(GTK_LABEL(label_nome_imagem), old_upload); @@ -48,33 +60,46 @@ void tela_upload_antigo(GtkWidget *w,gpointer p){ data_ant->dado1 = window_upload_antigo; g_signal_connect(window_upload_antigo, "destroy", G_CALLBACK(sair), NULL); - g_signal_connect(button_continua_upload, "clicked", G_CALLBACK(faz_upload_teste), data_ant); + g_signal_connect(button_continua_upload, "clicked", G_CALLBACK(faz_upload_teste), data_ant); //Isso chama a teste pois o upload.c lida com os dados do arquivo a ser feito o upload. g_signal_connect(button_nao_continua, "clicked", G_CALLBACK(tela_principal), data_ant); - gtk_widget_hide(janela_ant); + gtk_widget_hide(janela_ant); //Esconde a janela anterior gtk_widget_show_all(window_upload_antigo); } +//tela principal do programa, chamada após o login void tela_principal(GtkWidget *w,gpointer p){ + GtkWidget *janela_principal, *janela_ant, *button_stg4, *button_ajuda_tela_principal, *button_stg4_update, *label_greeting; GtkBuilder *builder; int status; + #ifdef DEBUG + puts("Entrou na tela principal"); + puts(""); + #endif /*DEBUG*/ + + //Se não encontrou o arquivo .speed.out, calcula a velocidade de upload do usuário. if((access(".speed.out", F_OK) == -1)){ - puts("Entrou no if"); - g_spawn_command_line_sync("./squash.sh 1", NULL, NULL, &status, NULL); // Executa o script + + #ifdef DEBUG + puts("Entrou no if"); + puts(""); + #endif /*DEBUG*/ + + g_spawn_command_line_sync("speedtest-cli --bytes --simple > .speed.out", NULL, NULL, &status, NULL); // Executa o script } - builder = gtk_builder_new(); - gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); + builder = gtk_builder_new(); //Cria um novo Builder gtk + gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets - dados *data_ant = p; + dados *data_ant = p; //Pega os dados recebidos pela chamada da função - FILE *upload_antigo = fopen(".progress.out", "w"); + FILE *upload_antigo = fopen(".progress.out", "w"); //Zera o arquivo de upload antigo, o programa só chega aqui se o usuario ja lidou com o upload antigo fclose(upload_antigo); - if(data_ant){ - janela_ant = (GtkWidget*) data_ant->dado1; + //if(data_ant){ //ver se isso faz alguma coisa + janela_ant = (GtkWidget*) data_ant->dado1; //Pega a janela antiga que chamou essa nova janela char *greeting_text; greeting_text = malloc(255*sizeof(char)); @@ -82,23 +107,35 @@ void tela_principal(GtkWidget *w,gpointer p){ user_info dados_do_user; if(janela_ant){ - gtk_widget_hide(janela_ant); + gtk_widget_hide(janela_ant); //Esconde a janela anterior } - pega_dados_do_usuario(&dados_do_user); - puts(dados_do_user.name); - puts(dados_do_user.login); - puts(dados_do_user.email); - puts(dados_do_user.city); - gera_arquivo_dados_usuario(); + #ifdef DEBUG + puts("Vai pegar dados do usuário"); + puts(""); + #endif /*DEBUG*/ + + pega_dados_do_usuario(&dados_do_user); //Pega os dados do usuário recebidos no login + + #ifdef DEBUG + puts(dados_do_user.name); + puts(dados_do_user.login); + puts(dados_do_user.email); + puts(dados_do_user.city); + puts(""); + #endif /*DEBUG*/ + + #ifdef DEBUG + puts("Vai gerar arquivo de dados do usuário"); + puts(""); + #endif /*DEBUG*/ + + gera_arquivo_dados_usuario(); //Cria o user_data.info strcpy(greeting_text, dados_do_user.name); strcat(greeting_text, "!"); label_greeting = GTK_WIDGET(gtk_builder_get_object(builder, "label_greeting")); gtk_label_set_text(GTK_LABEL(label_greeting), greeting_text); - /* - * FAZ LOGIN - */ - } + //} @@ -111,7 +148,6 @@ void tela_principal(GtkWidget *w,gpointer p){ data->dado1 = janela_principal; data->builder = builder; data->dado2 = button_stg4; - data->control = 0; g_signal_connect(janela_principal, "destroy", G_CALLBACK(sair), NULL); g_signal_connect (G_OBJECT (janela_principal), "key_press_event", G_CALLBACK (on_key_press), data); //Conecta os sinais pra quando apertar uma tecla @@ -123,24 +159,26 @@ void tela_principal(GtkWidget *w,gpointer p){ gtk_widget_show_all(janela_principal); } +//Função que mostra a tela de login para o usuario void tela_login(){ + #ifdef DEBUG + puts("tela de login"); + puts(""); + #endif /*DEBUG*/ GtkWidget *window_login, *button_login, *entry_login, *entry_passwd, *label_login_erro; GtkBuilder *builder; - builder = gtk_builder_new(); - gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); - printf("Linha %d\n", __LINE__); + builder = gtk_builder_new(); //Cria um novo Builder gtk + gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets window_login = GTK_WIDGET(gtk_builder_get_object(builder, "window_login")); g_signal_connect(window_login, "destroy", G_CALLBACK(sair), NULL); - printf("Linha %d\n", __LINE__); button_login = GTK_WIDGET(gtk_builder_get_object(builder, "button_login")); label_login_erro = GTK_WIDGET(gtk_builder_get_object(builder, "label_login_erro")); entry_login = GTK_WIDGET(gtk_builder_get_object(builder, "entry_login")); entry_passwd = GTK_WIDGET(gtk_builder_get_object(builder, "entry_passwd")); - printf("Linha %d\n", __LINE__); struct dados *data = malloc(sizeof(*data)); data->dado1 = window_login; @@ -149,24 +187,29 @@ void tela_login(){ data->dado3 = entry_login; data->dado4 = entry_passwd; data->dado5 = label_login_erro; - data->control = 0; - printf("Linha %d\n", __LINE__); g_signal_connect (G_OBJECT (window_login), "key_press_event", G_CALLBACK (on_key_press), data); - printf("Linha %d\n", __LINE__); g_signal_connect(entry_passwd, "activate", G_CALLBACK(faz_login), data); - g_signal_connect(button_login, "clicked", G_CALLBACK(faz_login), data); - //g_signal_connect(button_login, "clicked", G_CALLBACK(faz_login_dummy), data); - //g_signal_connect(entry_passwd, "activate", G_CALLBACK(faz_login_dummy), data); - printf("Linha %d\n", __LINE__); + g_signal_connect(button_login, "clicked", G_CALLBACK(faz_login), data); //Caso ele aperte enter com o foco no password gtk_widget_show_all(window_login); } +// Main int main(int argc, char *argv[]){ - XInitThreads(); + + #ifdef DEBUG + puts("Vai iniciar o GTK"); + puts(""); + #endif /*DEBUG*/ + gtk_init(&argc, &argv); //Inicia o GTK + + #ifdef DEBUG + puts("Vai informar os locales para a tradução"); + puts(""); + #endif /*DEBUG*/ setlocale(LC_ALL, ""); bindtextdomain("openslx_gui_v01", "/usr/share/locale"); textdomain("openslx_gui_v01"); @@ -174,13 +217,18 @@ int main(int argc, char *argv[]){ pid_t pid; int status; - if (argc == 1){ + if (argc == 1){ //Caso seja chamado para mostrar a GUI GtkCssProvider *provider; GdkDisplay *display; GdkScreen *screen; GFile *css; + #ifdef DEBUG + puts("vai carregar os estilos css"); + puts(""); + #endif /*DEBUG*/ + css = g_file_new_for_path("./styles.css"); provider = gtk_css_provider_new(); @@ -193,7 +241,7 @@ int main(int argc, char *argv[]){ gtk_main(); }else{ - if (argc == 6){ + if (argc == 6){ //Se for a opção com parametros @@ -206,7 +254,6 @@ int main(int argc, char *argv[]){ gtk_entry_set_text(GTK_ENTRY(login), argv[4]); gtk_entry_set_text(GTK_ENTRY(senha), argv[5]); - data->control = 2; data->dado3 = login; data->dado4 = senha; diff --git a/useful/stg312/openslx_gui.h b/useful/stg312/openslx_gui.h index c506f53bf5ba906bc6df5d626b104cc42277829f..76bf7b06ba575f65de4dd93261a58be39127dba4 100644 --- a/useful/stg312/openslx_gui.h +++ b/useful/stg312/openslx_gui.h @@ -7,6 +7,8 @@ #include <curl/curl.h> #include <curl/easy.h> +#define DEBUG //Comment this for release version + // Using http://www.digip.org/jansson/ for dealing with Json packages for Login/upload. All code was found in their tutorials. // Using https://curl.haxx.se/libcurl/c/example.html for doing http requests for Login/upload, // the documenting and debugging of this library is a hellhole, i STRONGLY recommend coding this with the one responsible for the site API next to you @@ -24,7 +26,6 @@ typedef struct dados{ GtkWidget *dado6; GtkBuilder *builder; GPid pid; - int control; user_info informacoes; }dados; diff --git a/useful/stg312/openslx_gui_v01.glade b/useful/stg312/openslx_gui_v01.glade index 0c0f69765bd89340874e2c8fc6f2966d31071dcf..f36ddadd94579acf610b17abb0f888a19bf86c2f 100644 --- a/useful/stg312/openslx_gui_v01.glade +++ b/useful/stg312/openslx_gui_v01.glade @@ -4,13 +4,18 @@ <requires lib="gtk+" version="3.10"/> <object class="GtkMessageDialog" id="error_dialog"> <property name="can_focus">False</property> + <property name="type">popup</property> + <property name="window_position">center</property> + <property name="icon">openslx_icon</property> <property name="type_hint">dialog</property> + <property name="gravity">center</property> <property name="message_type">error</property> <property name="buttons">ok</property> <property name="text" translatable="yes">Algum dos passos do processo não foi completado com sucesso. </property> <property name="secondary_text" translatable="yes"> Cheque se executou o programa como root. -Cheque o terminal para descobrir onde aconteceu o erro. +Cheque o terminal para descobrir onde aconteceu o erro. +Caso esteja tentando fazer upload de um arquivo, reinicie o programa e clique em "continuar" para continuar de onde parou. O programa irá sair agora.</property> <child internal-child="vbox"> <object class="GtkBox" id="messagedialog-vbox"> @@ -56,6 +61,7 @@ O programa irá sair agora.</property> <property name="visible">True</property> <property name="can_focus">False</property> <property name="margin_left">10</property> + <property name="margin_bottom">5</property> <property name="row_spacing">10</property> <property name="column_spacing">10</property> <child> @@ -88,7 +94,7 @@ O programa irá sair agora.</property> <property name="can_focus">False</property> <property name="halign">start</property> <property name="valign">center</property> - <property name="label" translatable="yes">Destino da Imagem:</property> + <property name="label" translatable="yes">Destino do sistema:</property> </object> </child> </object> @@ -116,7 +122,7 @@ O programa irá sair agora.</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="tooltip_text" translatable="yes">Nome da imagem desejada. Pode um nome qualquer permitido pelo Linux. Ex: ubuntu, meu_ubuntu, meu_linux, escola_xxxxx</property> - <property name="text" translatable="yes">nome-imagem</property> + <property name="text" translatable="yes">nome-sistema</property> </object> </child> </object> @@ -125,7 +131,7 @@ O programa irá sair agora.</property> <object class="GtkLabel" id="label3"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="label" translatable="yes">Nome da Imagem:</property> + <property name="label" translatable="yes">Nome do seu sistema:</property> </object> </child> </object> @@ -156,8 +162,8 @@ O programa irá sair agora.</property> </child> <child> <object class="GtkCheckButton" id="check_button_remove"> - <property name="label" translatable="yes">Remover imagem -não compactada?</property> + <property name="label" translatable="yes">Remover sistema +não compactado?</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> @@ -166,6 +172,7 @@ não compactada?</property> <property name="valign">center</property> <property name="margin_left">27</property> <property name="xalign">0</property> + <property name="active">True</property> <property name="draw_indicator">True</property> </object> <packing> @@ -216,6 +223,7 @@ não compactada?</property> <property name="halign">baseline</property> <property name="title" translatable="yes">OpenSLX - Stateless extensions</property> <property name="resizable">False</property> + <property name="window_position">center</property> <property name="default_width">440</property> <property name="default_height">540</property> <property name="icon">openslx_icon</property> @@ -245,11 +253,11 @@ não compactada?</property> <object class="GtkLabel" id="label_info"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="label" translatable="yes">Bem vindo ao Gerador de novas Imagens + <property name="label" translatable="yes">Bem vindo ao Gerador de novos sistemas do Openslx! -Por essa interface você poderá gerar sua -própria imagem Linux com os pacotes +Por essa interface você poderá gerar seu +próprio sistema Linux com os pacotes de seu interesse! Para iniciar o processo clique em algum @@ -291,7 +299,7 @@ Se precisar de ajuda, ative <property name="can_focus">False</property> <child> <object class="GtkButton" id="button_stg4"> - <property name="label" translatable="yes">Gerar sua imagem!</property> + <property name="label" translatable="yes">Gerar seu sistema!</property> <property name="name">gerar</property> <property name="width_request">300</property> <property name="height_request">50</property> @@ -379,7 +387,7 @@ Se precisar de ajuda, ative <property name="can_focus">False</property> <child> <object class="GtkButton" id="button_stg4_update"> - <property name="label" translatable="yes">Atualizar sua imagem!</property> + <property name="label" translatable="yes">Atualizar seus sistemas!</property> <property name="name">atualizar</property> <property name="width_request">300</property> <property name="height_request">50</property> @@ -461,9 +469,11 @@ Se precisar de ajuda, ative <property name="pixbuf">pic.png</property> </object> <object class="GtkWindow" id="window_stg4_inic"> + <property name="name">instal_window</property> <property name="can_focus">False</property> <property name="title" translatable="yes">OpenSLX - Stateless extensions</property> <property name="resizable">False</property> + <property name="window_position">center</property> <property name="icon">openslx_icon</property> <property name="gravity">center</property> <property name="has_resize_grip">False</property> @@ -472,6 +482,7 @@ Se precisar de ajuda, ative <property name="visible">True</property> <property name="can_focus">False</property> <property name="margin_left">10</property> + <property name="margin_bottom">5</property> <property name="row_spacing">35</property> <property name="column_spacing">10</property> <property name="column_homogeneous">True</property> @@ -482,6 +493,7 @@ Se precisar de ajuda, ative <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="tooltip_text" translatable="yes">Segue com a geração da imagem.</property> + <property name="margin_right">5</property> </object> <packing> <property name="left_attach">2</property> @@ -512,7 +524,7 @@ Se precisar de ajuda, ative <property name="can_focus">False</property> <property name="label" translatable="yes">Não se esqueça de instalar todos os pacotes e fazer as mudanças desejadas! Clique no botão abaixo para -iniciar o gerenciador de pacotes do Ubuntu ou aperte f12 +iniciar o gerenciador de pacotes do Ubuntu ou aperte f6 para abrir um console.</property> <property name="lines">6</property> </object> @@ -563,6 +575,7 @@ instalar softwares</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="tooltip_text" translatable="yes">Abre o software Gerenciador de Pacotes do Ubuntu para te auxiliar a instalar os pacotes desejados. Essa opção pode ser demorada pois o software é pesado. Se estiver utilizando um computador mais velho tente optar pelo Shell.</property> + <property name="margin_right">5</property> </object> <packing> <property name="left_attach">1</property> @@ -617,8 +630,15 @@ instalar softwares</property> <property name="halign">start</property> <property name="valign">center</property> <property name="label" translatable="yes">Upload completo! -Aguarde alguns minutos e sua imagem estará -disponível no nosso site. +Aguarde alguns minutos e seu sistema estará +disponível no nosso site para configuração. +Clique no botão abaixo para ser levado ao site. +Nele faça login com o mesmo login e senha que usou para logar aqui +e clique em Gerenciamento de Imagens. Edite as configurações do sistema +que fez upload e ele estará pronta para uso! + +Caso o navegador não abra, entre no site: +http://slxboxdev.c3sl.br </property> </object> </child> @@ -656,16 +676,42 @@ disponível no nosso site. </packing> </child> <child> - <object class="GtkButton" id="button_return_upload_confirm"> - <property name="label" translatable="yes">Voltar</property> - <property name="width_request">300</property> - <property name="height_request">50</property> + <object class="GtkGrid" id="grid15"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Utiliza o Squashfs para gerar uma versão compactada da imagem que será utilizada depois.</property> - <property name="valign">center</property> - <property name="resize_mode">immediate</property> + <property name="can_focus">False</property> + <property name="column_spacing">5</property> + <property name="column_homogeneous">True</property> + <child> + <object class="GtkButton" id="button_return_upload_confirm"> + <property name="label" translatable="yes">Voltar</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Utiliza o Squashfs para gerar uma versão compactada da imagem que será utilizada depois.</property> + <property name="valign">center</property> + <property name="resize_mode">immediate</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="button_site"> + <property name="label" translatable="yes">Ir para o site</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> </object> <packing> <property name="left_attach">0</property> @@ -689,6 +735,7 @@ disponível no nosso site. <property name="can_focus">False</property> <property name="title" translatable="yes">OpenSLX - Stateless extensions</property> <property name="resizable">False</property> + <property name="window_position">center</property> <property name="icon">openslx_icon</property> <property name="gravity">center</property> <property name="has_resize_grip">False</property> @@ -697,6 +744,7 @@ disponível no nosso site. <property name="visible">True</property> <property name="can_focus">False</property> <property name="margin_left">10</property> + <property name="margin_bottom">5</property> <property name="row_spacing">15</property> <property name="column_spacing">10</property> <child> @@ -718,8 +766,8 @@ disponível no nosso site. <property name="can_focus">False</property> <property name="halign">start</property> <property name="valign">center</property> - <property name="label" translatable="yes">A sua imagem foi gerada com sucesso! -Agora faça upload da imagem para nosso servidor!</property> + <property name="label" translatable="yes">O seu sistema foi gerado com sucesso! +Agora faça upload dele para nosso servidor!</property> </object> </child> </object> @@ -859,6 +907,8 @@ Agora faça upload da imagem para nosso servidor!</property> <object class="GtkWindow" id="window_escolha_imagem"> <property name="can_focus">False</property> <property name="title" translatable="yes">OpenSLX - Stateless extensions</property> + <property name="window_position">center</property> + <property name="gravity">center</property> <child> <object class="GtkGrid" id="grid6"> <property name="visible">True</property> @@ -1009,6 +1059,8 @@ Agora faça upload da imagem para nosso servidor!</property> <property name="height_request">50</property> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> <property name="active">True</property> </object> <packing> @@ -1035,6 +1087,43 @@ Agora faça upload da imagem para nosso servidor!</property> </object> </child> </object> + <object class="GtkMessageDialog" id="space_dialog"> + <property name="can_focus">False</property> + <property name="title" translatable="yes">Erro ao gerar imagem!</property> + <property name="window_position">center</property> + <property name="icon">openslx_icon</property> + <property name="type_hint">dialog</property> + <property name="gravity">center</property> + <property name="message_type">warning</property> + <property name="buttons">ok</property> + <property name="text" translatable="yes">Atenção!</property> + <property name="secondary_text" translatable="yes">Não é possível criar sistemas com espaços no nome.</property> + <child internal-child="vbox"> + <object class="GtkBox" id="messagedialog-vbox3"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">2</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="messagedialog-action_area3"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + </object> + </child> + </object> <object class="GtkWindow" id="window_help"> <property name="width_request">500</property> <property name="height_request">500</property> @@ -1042,23 +1131,53 @@ Agora faça upload da imagem para nosso servidor!</property> <property name="title" translatable="yes">OpenSLX - Help</property> <property name="resizable">False</property> <property name="modal">True</property> + <property name="window_position">center</property> <property name="default_width">500</property> <property name="default_height">500</property> <property name="icon">openslx_icon</property> + <property name="gravity">center</property> <property name="has_resize_grip">False</property> <child> <object class="GtkPaned" id="paned1"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="margin_left">5</property> + <property name="margin_top">5</property> <property name="orientation">vertical</property> <child> - <object class="GtkLabel" id="label10"> + <object class="GtkBox" id="box2"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="label" translatable="yes">Bem vindo à tela de ajuda do gerador de imagens do OpenSlx! -Escolha para qual tela você precisa de ajuda ao lado!</property> - <property name="justify">center</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Bem vindo </property> + <attributes> + <attribute name="font-desc" value="Sans Bold 16"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Escolha para qual tela você precisa de ajuda ao lado!</property> + <property name="justify">right</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> </object> <packing> <property name="resize">False</property> @@ -1090,8 +1209,9 @@ Escolha para qual tela você precisa de ajuda ao lado!</property> </packing> </child> <child> - <object class="GtkButton" id="button_help_2a_tela"> - <property name="label" translatable="yes">2a Tela</property> + <object class="GtkButton" id="button_help_pacotes"> + <property name="label" translatable="yes">Instalação +de pacotes</property> <property name="name">2</property> <property name="visible">True</property> <property name="can_focus">True</property> @@ -1105,8 +1225,9 @@ Escolha para qual tela você precisa de ajuda ao lado!</property> </packing> </child> <child> - <object class="GtkButton" id="button_help_3a_tela"> - <property name="label" translatable="yes">3a Tela</property> + <object class="GtkButton" id="button_help_criacao"> + <property name="label" translatable="yes">Criação do + sistema</property> <property name="name">3</property> <property name="visible">True</property> <property name="can_focus">True</property> @@ -1120,8 +1241,9 @@ Escolha para qual tela você precisa de ajuda ao lado!</property> </packing> </child> <child> - <object class="GtkButton" id="button_help_4a_tela"> - <property name="label" translatable="yes">4a Tela</property> + <object class="GtkButton" id="button_help_upload"> + <property name="label" translatable="yes">Upload do + sistema</property> <property name="name">4</property> <property name="visible">True</property> <property name="can_focus">True</property> @@ -1135,8 +1257,9 @@ Escolha para qual tela você precisa de ajuda ao lado!</property> </packing> </child> <child> - <object class="GtkButton" id="button_help_5a_tela"> - <property name="label" translatable="yes">5a Tela</property> + <object class="GtkButton" id="button_help_confirmacao"> + <property name="label" translatable="yes">Confirmação + de upload</property> <property name="name">5</property> <property name="visible">True</property> <property name="can_focus">True</property> @@ -1149,6 +1272,21 @@ Escolha para qual tela você precisa de ajuda ao lado!</property> <property name="height">1</property> </packing> </child> + <child> + <object class="GtkButton" id="button_glossario"> + <property name="label" translatable="yes">Glossário</property> + <property name="name">6</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">5</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> </object> <packing> <property name="resize">False</property> @@ -1165,14 +1303,140 @@ Escolha para qual tela você precisa de ajuda ao lado!</property> <property name="visible">True</property> <property name="can_focus">False</property> <child> - <object class="GtkLabel" id="label_help_info"> + <object class="GtkBox" id="box1"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="label" translatable="yes">Janela de finalização & Upload da imagem!\n\n -Agora sua imagem já está completa!\n -Clique em \"Upload!\" para fazer o Upload\n -dela para nosso site! Possibilitando o uso dela\n -em outras máquinas!</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel" id="label_titulo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Tela de ajuda</property> + <property name="justify">center</property> + <property name="wrap">True</property> + <attributes> + <attribute name="font-desc" value="<Enter Value> 20"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkImage" id="image11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">line-s.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label_oque_help"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">O que essa página faz?</property> + <attributes> + <attribute name="font-desc" value="Sans Bold Italic 10"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkImage" id="image9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">line-s.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label_descricao"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="label" translatable="yes">Ajuda você com qualquer dúvida que venha a surgir enquanto usa o nosso software</property> + <property name="wrap">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="GtkImage" id="image8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">line-s.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label_como_help"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_top">5</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="label" translatable="yes">Como faço o que quero nessa janela?</property> + <attributes> + <attribute name="font-desc" value="Sans Bold Italic 10"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="GtkImage" id="image10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="pixbuf">line-s.png</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label_conteudo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="label" translatable="yes">Escolha sobre o que deseja saber ao lado e clique no botão.</property> + <property name="wrap">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> </object> </child> </object> @@ -1193,9 +1457,11 @@ em outras máquinas!</property> </child> </object> <object class="GtkWindow" id="window_login"> + <property name="name">login</property> <property name="can_focus">False</property> <property name="title" translatable="yes">OpenSLX - Login</property> <property name="resizable">False</property> + <property name="window_position">center</property> <property name="icon">openslx_icon</property> <property name="gravity">center</property> <property name="has_resize_grip">False</property> @@ -1204,6 +1470,8 @@ em outras máquinas!</property> <property name="visible">True</property> <property name="can_focus">False</property> <property name="margin_left">10</property> + <property name="margin_right">5</property> + <property name="margin_bottom">5</property> <property name="row_spacing">5</property> <child> <object class="GtkGrid" id="grid8"> @@ -1370,6 +1638,10 @@ em outras máquinas!</property> <object class="GtkGrid" id="grid10"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="margin_left">5</property> + <property name="margin_right">5</property> + <property name="margin_top">5</property> + <property name="margin_bottom">5</property> <child> <object class="GtkFrame" id="frame5"> <property name="visible">True</property> diff --git a/useful/stg312/stg4.c b/useful/stg312/stg4.c index c8f0b5f198dde6dd4293986c8feb83dce3e4eb2a..04029e0801ad611d93f8ebf707cd3224f664c056 100644 --- a/useful/stg312/stg4.c +++ b/useful/stg312/stg4.c @@ -5,228 +5,254 @@ #include <stdlib.h> #include <string.h> #include <errno.h> -#include <sys/wait.h> +//#include <sys/wait.h> #include "utils.h" +#include "upload-utils.h" #include <gdk/gdkkeysyms.h> #include <gdk/gdk.h> #include <glib.h> -void stg4_tela_confirmacao_upload(GtkWidget *w,gpointer p){ - //pid_t pid; // Para quando for implementado - GtkWidget *window_stg4_upload_confirm, *janela_ant, *button_return_upload_confirm; //*loading_screen; // Para quando for implementado +//Ultima tela do sistema, mostra ao usuario o que ele deve fazer para ter a imagem habilitada +void stg4_tela_confirmacao_upload(GPid pid, gint status,gpointer p){ + #ifdef DEBUG + puts("stg4_tela_confirmação_upload"); + puts(""); + #endif /*DEBUG*/ + + GtkWidget *window_stg4_upload_confirm, *janela_ant, *button_return_upload_confirm, *button_site; GtkBuilder *builder; - puts("Aqui"); + dados *data_ant = p; //Pega os dados recebidos pela chamada da função + + #ifdef DEBUG + puts("Vai fechar o processo de upload"); + puts(""); + #endif /*DEBUG*/ + GtkWidget *loading; + loading = data_ant->dado6; + pid = data_ant->pid; + checa_sucesso(); //Checa sucesso do upload + g_spawn_close_pid(pid); //Fecha o processo de upload que estava rodando + + janela_ant = (GtkWidget*) data_ant->dado1; //Pega a janela antiga que chamou essa nova janela + + builder = gtk_builder_new(); //Cria um novo Builder gtk + gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets - dados *data_ant = p; - puts("Aqui8"); - janela_ant = (GtkWidget*) data_ant->dado1; - puts("Aqui7"); - builder = data_ant->builder; - puts("Aqui6"); window_stg4_upload_confirm = GTK_WIDGET(gtk_builder_get_object(builder, "window_stg4_upload_confirm")); - puts("Aqui9"); - g_signal_connect(window_stg4_upload_confirm, "destroy", G_CALLBACK(chama_tela_principal), NULL); - puts("Aqui10"); + + g_signal_connect(window_stg4_upload_confirm, "destroy", G_CALLBACK(chama_tela_principal), NULL); //Chama a tela principal ao destruir essa janela + button_return_upload_confirm = GTK_WIDGET(gtk_builder_get_object(builder, "button_return_upload_confirm")); - puts("Aqui11"); - //loading_screen = GTK_WIDGET(gtk_builder_get_object(builder, "loading_screen")); + button_site = GTK_WIDGET(gtk_builder_get_object(builder, "button_site")); - puts("Aqui2"); struct dados *data = malloc(sizeof(*data)); data->dado1 = window_stg4_upload_confirm; - data->dado6 = window_stg4_upload_confirm; data->builder = builder; data->dado2 = button_return_upload_confirm; - data->control = 0; g_signal_connect (G_OBJECT (window_stg4_upload_confirm), "key_press_event", G_CALLBACK (on_key_press), data); //Conecta os sinais pra quando apertar uma tecla g_signal_connect(button_return_upload_confirm, "clicked", G_CALLBACK(mata_janela_e_chama_tela_principal), data); + g_signal_connect(button_site, "clicked", G_CALLBACK(abre_site), data); + - puts("Aqui3"); - gtk_widget_hide(janela_ant); - puts("Aqui4"); + gtk_widget_hide(janela_ant); //Esconde a janela anterior + + gtk_widget_hide(loading); gtk_widget_show_all(window_stg4_upload_confirm); - puts("Aqui5"); + } +//Isso não esta implementado ainda, só ignore void stg4_tela_img_select(GtkWidget *w,gpointer p){ - //pid_t pid; // Para quando for implementado - GtkWidget *window_escolha_imagem, *janela_ant, *button_update_img; //*loading_screen; // Para quando for implementado + + GtkWidget *window_escolha_imagem, *janela_ant, *button_update_img; GtkBuilder *builder; - dados *data_ant = p; - janela_ant = (GtkWidget*) data_ant->dado1; + dados *data_ant = p; //Pega os dados recebidos pela chamada da função + janela_ant = (GtkWidget*) data_ant->dado1; //Pega a janela antiga que chamou essa nova janela builder = data_ant->builder; - int status; window_escolha_imagem = GTK_WIDGET(gtk_builder_get_object(builder, "window_escolha_imagem")); - g_signal_connect(window_escolha_imagem, "destroy", G_CALLBACK(chama_tela_principal), NULL); + g_signal_connect(window_escolha_imagem, "destroy", G_CALLBACK(chama_tela_principal), NULL); //Chama a tela principal ao destruir essa janela button_update_img = GTK_WIDGET(gtk_builder_get_object(builder, "button_update_img")); //loading_screen = GTK_WIDGET(gtk_builder_get_object(builder, "loading_screen")); - g_spawn_command_line_sync("./squash.sh 1", NULL, NULL, &status, NULL); // Executa o script - struct dados *data = malloc(sizeof(*data)); data->dado1 = window_escolha_imagem; data->builder = builder; data->dado2 = button_update_img; - data->control = 0; g_signal_connect (G_OBJECT (window_escolha_imagem), "key_press_event", G_CALLBACK (on_key_press), data); //Conecta os sinais pra quando apertar uma tecla - gtk_widget_hide(janela_ant); + gtk_widget_hide(janela_ant); //Esconde a janela anterior gtk_widget_show_all(window_escolha_imagem); } -// // A função que exibe a 3a tela do programa, a tela final -void stg4_clique_2a_tela(GtkWidget *w,gpointer p){ - GPid pid; - GChildWatchFunc handler; - GtkWidget *window_stg4_final, *button_stg4_final_sair, *janela_ant, *button_help_4at, *loading_screen, *button_stg4_upload, *label_tempo_upload; - GtkBuilder *builder; - int i; - char *version, *home, *tmscripts, *pasta_do_stg4, *number_of_parts_str, **argv, *texto_tempo_upload, *temp; +// // A função que exibe a 2a tela do programa, a tela de upload +void stg4_2a_tela(GPid pid, gint status,gpointer p){ - argv = malloc(10*sizeof(char*)); - for (i=0; i < 10; i++){ - argv[i] = malloc(255*sizeof(char)); - } - version = malloc(255*sizeof(char)); - pasta_do_stg4 = malloc(255*sizeof(char)); - home = malloc(255*sizeof(char)); - tmscripts = malloc(255*sizeof(char)); - number_of_parts_str = malloc(255*sizeof(char)); + #ifdef DEBUG + puts("stg4_2a_tela"); + puts(""); + #endif /*DEBUG*/ + + GtkWidget *window_stg4_final, *button_stg4_final_sair, *janela_ant, *button_help_4at, *button_stg4_upload, *label_tempo_upload; + GtkBuilder *builder; + char *texto_tempo_upload, *temp; texto_tempo_upload = malloc(255*sizeof(char)); temp = malloc(255*sizeof(char)); - dados *data_ant = p; - janela_ant = (GtkWidget*) data_ant->dado1; - builder = data_ant->builder; + dados *data_ant = p; //Pega os dados recebidos pela chamada da função + janela_ant = (GtkWidget*) data_ant->dado1; //Pega a janela antiga que chamou essa nova janela + builder = gtk_builder_new(); //Cria um novo Builder gtk + gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets - window_stg4_final = GTK_WIDGET(gtk_builder_get_object(builder, "window_stg4_final")); - g_signal_connect(window_stg4_final, "destroy", G_CALLBACK(chama_tela_principal), NULL); - loading_screen = GTK_WIDGET(gtk_builder_get_object(builder, "loading_screen")); - gtk_widget_show(loading_screen); + #ifdef DEBUG + puts("Vai fechar o processo de clonagem de imagem"); + puts(""); + #endif /*DEBUG*/ + GtkWidget *loading; + loading = data_ant->dado6; + pid = data_ant->pid; + checa_sucesso(); //Checa sucesso da criação da imagem + g_spawn_close_pid(pid); //Fecha o processo de criação de imagem que estava rodando - struct dados *data = malloc(sizeof(*data)); - //tmscripts = acha_tm_scripts(); - acha_tm_scripts(tmscripts); - - strcpy(version, gtk_entry_get_text(GTK_ENTRY(data_ant->dado4))); - - strcat(version, ".r1"); - - strcpy(home, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_ant->dado3))); - - strcpy(pasta_do_stg4, home); - strcat(home, "/pasta-"); - strcat(home, version); - strcat(tmscripts, "/scripts"); - - //gboolean g_spawn_async_with_pipes (const gchar *working_directory, gchar **argv, gchar **envp, GSpawnFlags flags, - // GSpawnChildSetupFunc child_setup, gpointer user_data, GPid *child_pid, GError **error); - - //strcpy(argv[0], CLONE_STG4_SCRIPT_DUMMY); - strcpy(argv[0], CLONE_STG4_SCRIPT); - - strcpy(argv[1], tmscripts); + window_stg4_final = GTK_WIDGET(gtk_builder_get_object(builder, "window_stg4_final")); + g_signal_connect(window_stg4_final, "destroy", G_CALLBACK(chama_tela_principal), NULL); //Chama a tela principal ao destruir essa janela - strcpy(argv[2], pasta_do_stg4); + struct dados *data = malloc(sizeof(*data)); - strcpy(argv[3], "local"); + button_help_4at = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_4at")); + button_stg4_final_sair = GTK_WIDGET(gtk_builder_get_object(builder, "button_stg4_final_sair")); + button_stg4_upload = GTK_WIDGET(gtk_builder_get_object(builder, "button_stg4_upload")); + label_tempo_upload = GTK_WIDGET(gtk_builder_get_object(builder, "label_tempo_upload")); - strcpy(argv[4], home ); - strcpy(argv[5], version); + #ifdef DEBUG + puts("Vai calcular o tempo de upload estimado"); + puts(""); + #endif /*DEBUG*/ - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data_ant->dado6))) - strcpy(argv[6], "1"); - else - strcpy(argv[6], "0"); + strcpy(texto_tempo_upload, "Tempo estimado de upload: "); + sprintf(temp, "%d",calcula_tempo_upload() ); //Estima o tempo de upload de imagem + strcat(texto_tempo_upload, temp); + strcat(texto_tempo_upload, " segundos"); + gtk_label_set_text(GTK_LABEL(label_tempo_upload), texto_tempo_upload); //Modifica o texto para o tempo calculado - sprintf(number_of_parts_str, "%d", NUMBER_OF_PARTS); - strcpy(argv[7], number_of_parts_str); + data->dado2 = button_stg4_final_sair; + data->dado3 = data_ant->dado4; //Nome da imagem + data->dado4 = data_ant->dado3; //Pasta da imagem + data->dado1 = window_stg4_final; + data->builder = builder; - argv[8] = NULL; + g_signal_connect (G_OBJECT (window_stg4_final), "key_press_event", G_CALLBACK (on_key_press), data); //Conecta os sinais pra quando apertar uma tecla + g_signal_connect(button_help_4at, "clicked", G_CALLBACK(help_screen), NULL); - if(g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL)){ - puts("Deu certo o spawn"); - } - //, environ); + g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload), data); + //g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload_teste), data); - data->dado6 = loading_screen; - data->dado2 = window_stg4_final; - data->control = 0; - data->pid = pid; + g_signal_connect(button_stg4_final_sair, "clicked", G_CALLBACK(mata_janela_e_chama_tela_principal), data); //Caso o usuario não queira fazer upload por algum motivo, volta para a janela principal + gtk_widget_hide(janela_ant); //Esconde a janela anterior + gtk_widget_hide(loading); + gtk_widget_show_all(window_stg4_final); - handler = sai_do_script; +} - g_child_watch_add(pid, handler, data); - printf("Linha %d\n", __LINE__); +//Função que chama o script que gera a imagem do usuario. +void stg4_clique_2a_tela(GtkWidget *w,gpointer p){ + #ifdef DEBUG + puts("stg4_clique_2a_tela"); + puts(""); + #endif /*DEBUG*/ + GPid pid; + GChildWatchFunc handler; + GtkWidget *window_stg4_final, *loading_screen; + GtkBuilder *builder; + int i; + char *version, *home, *tmscripts, *pasta_do_stg4, *number_of_parts_str, **argv; - /* - * checa_sucesso(); //Checa se o script foi executado corretamente + argv = malloc(10*sizeof(char*)); //Vetor de argumentos para a g_spawn + for (i=0; i < 10; i++){ + argv[i] = malloc(255*sizeof(char)); + } + version = malloc(255*sizeof(char)); + pasta_do_stg4 = malloc(255*sizeof(char)); + home = malloc(255*sizeof(char)); + tmscripts = malloc(255*sizeof(char)); + number_of_parts_str = malloc(255*sizeof(char)); - strcpy(pasta_do_stg4, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_ant->dado3))); - strcpy(version, gtk_entry_get_text(GTK_ENTRY(data_ant->dado4))); - strcat(version, gtk_entry_get_text(GTK_ENTRY(data_ant->dado5))); - //strcpy(local, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_ant->dado2))); - strcpy(local, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_ant->dado3))); - strcat(local, "/pasta-"); - strcat(local, version); + dados *data_ant = p; //Pega os dados recebidos pela chamada da função + builder = data_ant->builder; - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data_ant->dado6))){ - execlp("./squash.sh", "./squash.sh", "0", local, version, "1",pasta_do_stg4, NULL);// se o usuário decidiu remover os arquivos não compactados - }else{ - execlp("./squash.sh", "./squash.sh", "0", local, version, "0",pasta_do_stg4, NULL);// Se o usuário decidiu não remover os arquivos compactados - } - * */ + window_stg4_final = GTK_WIDGET(gtk_builder_get_object(builder, "window_stg4_final")); + g_signal_connect(window_stg4_final, "destroy", G_CALLBACK(chama_tela_principal), NULL); //Chama a tela principal ao destruir essa janela + loading_screen = GTK_WIDGET(gtk_builder_get_object(builder, "loading_screen")); + gtk_widget_show(loading_screen); + struct dados *data = malloc(sizeof(*data)); - printf("Linha %d\n", __LINE__); - button_help_4at = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_4at")); - button_stg4_final_sair = GTK_WIDGET(gtk_builder_get_object(builder, "button_stg4_final_sair")); - button_stg4_upload = GTK_WIDGET(gtk_builder_get_object(builder, "button_stg4_upload")); - label_tempo_upload = GTK_WIDGET(gtk_builder_get_object(builder, "label_tempo_upload")); - printf("Linha %d\n", __LINE__); - strcpy(texto_tempo_upload, "Tempo estimado de upload: "); - sprintf(temp, "%d",calcula_tempo_upload() ); - printf("Linha %d\n", __LINE__); - strcat(texto_tempo_upload, temp); - printf("Linha %d\n", __LINE__); - strcat(texto_tempo_upload, " segundos"); - printf("Linha %d\n", __LINE__); - gtk_label_set_text(GTK_LABEL(label_tempo_upload), texto_tempo_upload); - printf("Linha %d\n", __LINE__); - data->dado2 = button_stg4_final_sair; - data->dado3 = data_ant->dado4; - data->dado4 = data_ant->dado3; - data->dado5 = data_ant->dado5; - data->dado1 = window_stg4_final; - data->builder = builder; - printf("Linha %d\n", __LINE__); - g_signal_connect (G_OBJECT (window_stg4_final), "key_press_event", G_CALLBACK (on_key_press), data); //Conecta os sinais pra quando apertar uma tecla - g_signal_connect(button_help_4at, "clicked", G_CALLBACK(help_screen), NULL); - printf("Linha %d\n", __LINE__); - g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload), data); - //g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload_teste), data); - //g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload_dummy), data); - printf("Linha %d\n", __LINE__); - g_signal_connect(button_stg4_final_sair, "clicked", G_CALLBACK(mata_janela_e_chama_tela_principal), data); - printf("Linha %d\n", __LINE__); - gtk_widget_hide(janela_ant); - printf("Linha %d\n", __LINE__); - gtk_widget_show_all(window_stg4_final); - printf("Linha %d\n", __LINE__); + #ifdef DEBUG + puts("Vai popular os parametros do script de clonagem da imagem"); + puts(""); + #endif /*DEBUG*/ + + acha_tm_scripts(tmscripts); //Acha a pasta tm_scripts no sistema + strcpy(version, gtk_entry_get_text(GTK_ENTRY(data_ant->dado4))); //Pega o nome da imagem que o usuario informou + strcat(version, ".r1"); //versão será lidada pela api depois, por isso é a versão .r1 + strcpy(home, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_ant->dado3))); //Pega a pasta que o usuário decidiu que a imagem será gerada + strcpy(pasta_do_stg4, home); + strcat(home, "/pasta-"); //Adiciona o nome da pasta gerada para comportar a imagem não compactada + strcat(home, version); //adiciona o nome da imagem + strcat(tmscripts, "/scripts"); //Adiciona /scripts para apontar para aonde está o script de clonagem do stage4 + + //strcpy(argv[0], CLONE_STG4_SCRIPT_DUMMY); //Se quiser testar a GUI e não gerar uma nova imagem, descomente essa linha e comente a debaixo + strcpy(argv[0], CLONE_STG4_SCRIPT); + strcpy(argv[1], tmscripts); + strcpy(argv[2], pasta_do_stg4); + strcpy(argv[3], "local"); + strcpy(argv[4], home ); + strcpy(argv[5], version); + if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data_ant->dado6))) //Caso o usuário tenha selecioando que quer remover a imagem não compactada + strcpy(argv[6], "1"); + else + strcpy(argv[6], "0"); + + sprintf(number_of_parts_str, "%d", NUMBER_OF_PARTS); //Passa como argumento o número de partes que foi dividida a imagem + strcpy(argv[7], number_of_parts_str); + + argv[8] = NULL;//ESSE ULTIMO PARAMETRO DEVE SER NULO, ele é o sentinela e informa o g_spawn onde acabam os parametros de invocação + + #ifdef DEBUG + puts("Vai spawnar o processo com o script de clonagem de imagem"); + puts(""); + #endif /*DEBUG*/ + + g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL);//NAO USE FORK PARA SPAWNAR SCRIPTS, use essa função. Documentação em: https://developer.gnome.org/glib/stable/glib-Spawning-Processes.html#g-spawn-sync + + data->dado6 = loading_screen; + data->dado2 = window_stg4_final; + data->dado4 = data_ant->dado4; //Nome da imagem + data->dado3 = data_ant->dado3; //Pasta da imagem + data->dado1 = data_ant->dado1; + + data->pid = pid; + + handler = stg4_2a_tela; //Função que será chamada quando o g_spawn sair + + #ifdef DEBUG + puts("Vai adicionar o processo ao child watch"); + puts(""); + #endif /*DEBUG*/ + g_child_watch_add(pid, handler, data); //Chama o handler quando o spawn acabar } @@ -234,82 +260,93 @@ void stg4_clique_2a_tela(GtkWidget *w,gpointer p){ // Função que exibe a segunda tela, pedindo os dados necessários ao usuário void stg4_clique_1a_tela(GtkWidget *w,gpointer p){ + + #ifdef DEBUG + puts("stg4_clique_1a_tela"); + puts(""); + #endif /*DEBUG*/ + GtkWidget *window_stg4_escolha, *janela_ant, *button_clonar, *entry_imagem, *file_chooser_local, *button_help_2at, *check_button_remove; GtkBuilder *builder; - dados *data_ant = p; - janela_ant = (GtkWidget*) data_ant->dado1; + dados *data_ant = p; //Pega os dados recebidos pela chamada da função + janela_ant = (GtkWidget*) data_ant->dado1; //Pega a janela antiga que chamou essa nova janela builder = data_ant->builder; window_stg4_escolha = GTK_WIDGET(gtk_builder_get_object(builder, "window_stg4_escolha")); - g_signal_connect(window_stg4_escolha, "destroy", G_CALLBACK(chama_tela_principal), NULL); + g_signal_connect(window_stg4_escolha, "destroy", G_CALLBACK(chama_tela_principal), NULL); //Chama a tela principal ao destruir essa janela check_button_remove = GTK_WIDGET(gtk_builder_get_object(builder, "check_button_remove")); button_help_2at = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_2at")); file_chooser_local = GTK_WIDGET(gtk_builder_get_object(builder, "file_chooser_local")); button_clonar = GTK_WIDGET(gtk_builder_get_object(builder, "button_clonar")); entry_imagem = GTK_WIDGET(gtk_builder_get_object(builder, "entry_imagem")); - //entry_versao = GTK_WIDGET(gtk_builder_get_object(builder, "entry_versao")); - gtk_file_chooser_set_create_folders(GTK_FILE_CHOOSER(file_chooser_local), TRUE); + gtk_file_chooser_set_create_folders(GTK_FILE_CHOOSER(file_chooser_local), TRUE); //Ativa a opção de criar diretórios do gtk_filechooser gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(file_chooser_local), "/home"); struct dados *data = malloc(sizeof(*data)); data->dado1 = window_stg4_escolha; data->builder = builder; - data->dado2 = button_clonar; - data->dado3 = file_chooser_local; - data->dado4 = entry_imagem; - //data->dado5 = entry_versao; - data->dado6 = check_button_remove; - data->control = 0; + data->dado2 = button_clonar; //Para se o page-up for pressionado, ele avança pro próximo passo + data->dado3 = file_chooser_local; //Guarda a pasta selecionada por ele + data->dado4 = entry_imagem; //Guarda o nome da imagem + data->dado6 = check_button_remove; //Guarda se o usuario selecionou que quer deletar a imagem não compactada g_signal_connect(entry_imagem, "activate", G_CALLBACK(stg4_clique_2a_tela), data); - //g_signal_connect(entry_versao, "activate", G_CALLBACK(stg4_clique_2a_tela), data); g_signal_connect (G_OBJECT (window_stg4_escolha), "key_press_event", G_CALLBACK (on_key_press), data); //Conecta os sinais pra quando apertar uma tecla g_signal_connect(button_help_2at, "clicked", G_CALLBACK(help_screen), data); - g_signal_connect(button_clonar, "clicked", G_CALLBACK(stg4_clique_2a_tela), data); + g_signal_connect(button_clonar, "clicked", G_CALLBACK(stg4_clique_2a_tela_caller), data); - gtk_widget_hide(janela_ant); + gtk_widget_hide(janela_ant); //Esconde a janela anterior gtk_widget_show_all(window_stg4_escolha); } -//função que exibe a primeira tela do stg 4, informando o usuário que ele iniciou o programa +//função que exibe a primeira tela do processo de clonagem, informando o usuário que ele deve instalar os pacotes desejados void stg4_inicio(GtkWidget *w,gpointer p){ + #ifdef DEBUG + puts("stg4_inicio"); + puts(""); + #endif /*DEBUG*/ + GtkWidget *window_stg4_inic, *janela_ant, *button_geren, *button_stg4_proximo, *button_help_1at; GtkBuilder *builder; - dados *data_ant = p; - janela_ant = (GtkWidget*) data_ant->dado1; + dados *data_ant = p; //Pega os dados recebidos pela chamada da função + janela_ant = (GtkWidget*) data_ant->dado1; //Pega a janela antiga que chamou essa nova janela builder = data_ant->builder; button_help_1at = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_1at")); button_stg4_proximo = GTK_WIDGET(gtk_builder_get_object(builder, "button_stg4_proximo")); window_stg4_inic = GTK_WIDGET(gtk_builder_get_object(builder, "window_stg4_inic")); button_geren = GTK_WIDGET(gtk_builder_get_object(builder, "button_geren")); - //button_shell = GTK_WIDGET(gtk_builder_get_object(builder, "button_shell")); - - g_signal_connect(window_stg4_inic, "destroy", G_CALLBACK(chama_tela_principal), NULL); + g_signal_connect(window_stg4_inic, "destroy", G_CALLBACK(chama_tela_principal), NULL); //Chama a tela principal ao destruir essa janela struct dados *data = malloc(sizeof(*data)); data->dado1 = window_stg4_inic; data->builder = builder; data->dado2 = button_stg4_proximo; - data->control = 1; g_signal_connect (G_OBJECT (window_stg4_inic), "key_press_event", G_CALLBACK (on_key_press), data); //Conecta os sinais pra quando apertar uma tecla g_signal_connect(button_help_1at, "clicked", G_CALLBACK(help_screen), data); - if(!(strcmp(gtk_widget_get_name(w), "atualizar"))){ + if(!(strcmp(gtk_widget_get_name(w), "atualizar"))){ //Caso ele tenha clicado no botão de atualizar uma imagem + #ifdef DEBUG + puts("Clicou em atualizar"); + puts(""); + #endif /*DEBUG*/ g_signal_connect(button_stg4_proximo, "clicked", G_CALLBACK(stg4_tela_img_select), data); }else{ - g_signal_connect(button_stg4_proximo, "clicked", G_CALLBACK(stg4_clique_1a_tela), data); + #ifdef DEBUG + puts("Clicou em gerar"); + puts(""); + #endif /*DEBUG*/ + g_signal_connect(button_stg4_proximo, "clicked", G_CALLBACK(stg4_clique_1a_tela), data); //Caso ele tenha clicado em gerar imagem } g_signal_connect(button_geren, "clicked", G_CALLBACK(abre_software_center), data); - //g_signal_connect(button_shell, "clicked", G_CALLBACK(abre_shell), data); - gtk_widget_hide(janela_ant); + gtk_widget_hide(janela_ant); //Esconde a janela anterior gtk_widget_show_all(window_stg4_inic); diff --git a/useful/stg312/stg4.h b/useful/stg312/stg4.h index 461788452af71ef4c6cce5d2dcf57c16877d58d8..acbab847de9dbe1d8d6fe3ee0867a608072fc3da 100644 --- a/useful/stg312/stg4.h +++ b/useful/stg312/stg4.h @@ -5,10 +5,10 @@ #include <stdlib.h> #include <string.h> #include <errno.h> -#include <sys/wait.h> -void stg4_tela_confirmacao_upload(GtkWidget *w,gpointer p); +//void stg4_tela_confirmacao_upload(GtkWidget *w,gpointer p); +void stg4_tela_confirmacao_upload(GPid pid, gint status,gpointer p); // A função que exibe a quarta tela do programa, a tela final diff --git a/useful/stg312/upload b/useful/stg312/upload new file mode 100755 index 0000000000000000000000000000000000000000..59c5cd22ecb28a43be4f8372bec1cd8958ecfd72 Binary files /dev/null and b/useful/stg312/upload differ diff --git a/useful/stg312/upload-utils.c b/useful/stg312/upload-utils.c new file mode 100644 index 0000000000000000000000000000000000000000..ec4c5b5e3fcceef8fa3f1f053167a8f64addb4de --- /dev/null +++ b/useful/stg312/upload-utils.c @@ -0,0 +1,593 @@ + +#include <gtk/gtk.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +//#include <sys/wait.h> +#include <gdk/gdkkeysyms.h> +#include <gdk/gdk.h> +#include <glib.h> +#include "utils.h" +#include <curl/curl.h> +#include <curl/easy.h> +#include <jansson.h> +#include <time.h> +//#include <gcrypt.h> +#include <sys/types.h> +#include <signal.h> + +//Função que faz logout do sistema +void logout(){ + + #ifdef DEBUG + puts("logout"); + puts(""); + #endif /*DEBUG*/ + + CURL *curl; + + + curl = curl_easy_init(); + if(curl) { + + //para entender melhor o que é cada opção do Curl, leia: https://curl.haxx.se/libcurl/c/libcurl-tutorial.html + curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0"); + curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1 ); + curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookie"); + curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie"); + + curl_easy_setopt(curl, CURLOPT_VERBOSE, 0); + curl_easy_setopt(curl, CURLOPT_HEADER, 0); + + //curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.6/slx-admin/api.php?do=webservice"); + curl_easy_setopt(curl, CURLOPT_URL, API_URL); + curl_easy_setopt(curl, CURLOPT_POST, 1); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "request=logout"); + + #ifdef DEBUG + puts("Vai fazer o logout com o curl"); + puts(""); + #endif /*DEBUG*/ + curl_easy_perform(curl); //faz logout + } + +} + +//Checa se existe algum upload antigo em progresso +int checa_upload_antigo(){ + + #ifdef DEBUG + puts("checa_upload_antigo"); + puts(""); + #endif /*DEBUG*/ + + FILE *upload_in_progress; + char *old_upload; + old_upload = malloc(255*sizeof(char)); + + + #ifdef DEBUG + puts("Vai abrir arquivo de upload em progresso"); + puts(""); + #endif /*DEBUG*/ + + upload_in_progress = fopen(".progress.out", "a+"); //Abre o arquivo que contem os dados do upload antigo + + rewind(upload_in_progress); + fscanf(upload_in_progress, "%s", old_upload); + + puts(old_upload); + if(!(strcmp(old_upload, "Upload"))){ + return 1; //Tem um upload antigo + } + return 0; //Não tem um upload antigo, continua normalmente +} + +//Estima o tempo de upload, não faz a estimativa correta, mas só deus sabe como fazer essa joça realmente. O curl faz muita coisa que demora mais que só o upload, eu assumo +int calcula_tempo_upload(){ + + #ifdef DEBUG + puts("Calcula_tempo_upload"); + puts(""); + #endif /*DEBUG*/ + + FILE *velocidade_upload; + + #ifdef DEBUG + puts("Vai abrir arquivo contendo a velocidade de upload"); + puts(""); + #endif /*DEBUG*/ + + velocidade_upload = fopen(".speed.out", "r"); + + char *velocidade; + velocidade = malloc(255*sizeof(char)); + int velocidade_f; + + fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora + fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora + fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora + fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora + fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora + fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora + fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora + fscanf(velocidade_upload, "%s", velocidade); //Le a velocidade de upload + velocidade_f = atoi(velocidade); //Transforma em float + return((1953)/velocidade_f*3); // *3 para levar em conta problemas de rede. +} + +//Função que gera o arquivo de dados do usuario, tanto os que foram recebidos do banco quanto informaçõs de sistema. Esse arquivo +// sera submetido junto à imagem quando o upload for feito. +void gera_arquivo_dados_usuario(){ + + #ifdef DEBUG + puts("gera_arquivo_dados_usuario"); + puts(""); + #endif /*DEBUG*/ + + user_info dados_do_user; //Estrutura definida em openslx_gui.h para guardar os dados do usuario + pega_dados_do_usuario(&dados_do_user); //Abre o arquivo gerado no Login e coloca os dados do usuario na estrutura dados_do_user + FILE *user_data_file; + + #ifdef DEBUG + puts("Abre o arquivo de dados do usuario para sobrescrever"); + puts(""); + #endif /*DEBUG*/ + + user_data_file = fopen("user_data.info", "wr"); //Arquivo com os dados do usuario que será feito o upload + + fputs("Nome do criador da imagem: ", user_data_file); + fputs(dados_do_user.name, user_data_file); + fputs("\nLogin do criador da imagem: ", user_data_file); + fputs(dados_do_user.login, user_data_file); + fputs("\nEmail do criador da imagem: ", user_data_file); + fputs(dados_do_user.email, user_data_file); + fputs("\nCidade do criador da imagem: ", user_data_file); + fputs(dados_do_user.city, user_data_file); + + #ifdef DEBUG + puts("Vai pegar o tempo do sistema"); + puts(""); + #endif /*DEBUG*/ + + time_t timer; + time(&timer); //pega o tempo de criação da imagem + fputs("\nData da criação da imagem: ", user_data_file); + fputs(ctime(&timer), user_data_file); //Coloca o tempo de criação da imagem no arquivo + + #ifdef DEBUG + puts("Vai pegar os dados do sistema rodando o software"); + puts(""); + #endif /*DEBUG*/ + + fclose(user_data_file); + system("uname -a >> user_data.info"); //Coloca informações sobre o usuario no arquivo + system("lsb_release -a >> user_data.info"); //Coloca informações sobre o sistema no arquivo + + +} + +//Função que checa o arquivo .login.out para verificar o suceso do login. +int checa_sucesso_do_login(){ + + #ifdef DEBUG + puts("checa_sucesso_do_login"); + puts(""); + #endif /*DEBUG*/ + + FILE *login; + char *user_data_str; + + #ifdef DEBUG + puts("Vai abrir o arquivo com o resultado do login"); + puts(""); + #endif /*DEBUG*/ + + login = fopen(".login.out", "r"); //Arquivo que contem a resposta do login + user_data_str = malloc(2550*sizeof(char)); + fgets(user_data_str,2550*sizeof(char), login ); + + #ifdef DEBUG + puts("Dados lidos do pacote:"); + puts(user_data_str); + puts("Vai ler o pacote json recebido pelo servidor"); + puts(""); + #endif /*DEBUG*/ + + json_t *root; + json_error_t error; + root = json_loads(user_data_str,0, &error); //Pega os dados do arquivo em formato json + + if(!root){ //Caso não tenha conseguido carregar os dados + puts("Erro ao carregar dados!"); + } + + if(!json_is_object(root)) + { + fprintf(stderr, "Dados não estão em formato Json\n"); + json_decref(root); + } + + json_t *sha; + + const char *message_text; + + sha = json_object_get(root, "status"); //Pega o Status da resposta + + if(json_is_string(sha)) + { + message_text = json_string_value(sha); //coloca o valor de status na string + }else{ + puts("Erro, o valor lido não é uma string"); + return 0; + } + + if(!(strcmp("ok", message_text))){ //Caso o status seja diferente de OK + return 1; + } + + return 0; +} + +//Função que utiliza o arquivo gerado pela chamada Curl com os dados do usuario e coloca eles na estrutura user_info *dados +void pega_dados_do_usuario(user_info *dados){ + + #ifdef DEBUG + puts("pega_dados_do_usuario"); + puts(""); + #endif /*DEBUG*/ + + FILE *user_data; + char *user_data_str; + user_data_str = malloc(2550*sizeof(char)); + + #ifdef DEBUG + puts("Vai abrir o arquivo com os dados do usuário"); + puts(""); + #endif /*DEBUG*/ + + user_data = fopen(".data.out", "r"); //Abre arquivo contendo os dados do usuário + fgets(user_data_str,2550*sizeof(char), user_data ); + + #ifdef DEBUG + puts("Dados lidos do pacote:"); + puts(user_data_str); + puts("Vai ler o pacote json recebido pelo servidor"); + puts(""); + #endif /*DEBUG*/ + + json_t *root; + json_error_t error; + root = json_loads(user_data_str,0, &error); //Pega os dados do arquivo em formato json + if(!root){ //Caso não tenha conseguido carregar os dados + puts("erro ao carregar dados!"); + //exit(0); + } + + if(!json_is_object(root)) + { + fprintf(stderr, "Dados não estão em formato Json\n"); + json_decref(root); + } + + json_t *sha; + const char *message_text; + sha = json_object_get(root, "name"); //Pega nome + if(json_is_string(sha)) + { + message_text = json_string_value(sha); //coloca o valor de status na string + puts(message_text); + strcpy(dados->name, message_text); + }else{ + dados->name[0] = '\0'; //Caso o campo seja nulo no banco de dados + puts("Erro! O dado lido não é uma String."); + } + + sha = json_object_get(root, "login"); //Pega nome + if(json_is_string(sha)) + { + message_text = json_string_value(sha); //coloca o valor de status na string + puts(message_text); + strcpy(dados->login, message_text); + + }else{ + dados->login[0] = '\0'; //Caso o campo seja nulo no banco de dados + puts("Erro! O dado lido não é uma String."); + } + + sha = json_object_get(root, "email"); //Pega nome + if(json_is_string(sha)) + { + message_text = json_string_value(sha); //coloca o valor de status na string + puts(message_text); + strcpy(dados->email, message_text); + + }else{ + dados->email[0] = '\0'; //Caso o campo seja nulo no banco de dados + puts("Erro! O dado lido não é uma String."); + } + + sha = json_object_get(root, "city"); //Pega nome + if(json_is_string(sha)) + { + message_text = json_string_value(sha); //coloca o valor de status na string + puts(message_text); + strcpy(dados->city, message_text); + + }else{ + dados->city[0] = '\0'; //Caso o campo seja nulo no banco de dados + puts("Erro! O dado lido não é uma String."); + } +} + +int checa_sucesso_get_info(){ + + #ifdef DEBUG + puts("checa_sucesso_get_info"); + puts(""); + #endif /*DEBUG*/ + + FILE *user_data; + char *user_data_str; + user_data_str = malloc(2550*sizeof(char)); + + #ifdef DEBUG + puts("Vai abrir o arquivo que contem os dados do usuário recebido."); + puts(""); + #endif /*DEBUG*/ + + user_data = fopen(".data.out", "r"); //Arquivo que contém o retorno do get info e os dados do usuário + fgets(user_data_str,2550*sizeof(char), user_data ); + + #ifdef DEBUG + puts("Dados lidos do pacote:"); + puts(user_data_str); + puts("Vai ler o pacote json recebido pelo servidor"); + puts(""); + #endif /*DEBUG*/ + + json_t *root; + json_error_t error; + root = json_loads(user_data_str,0, &error); //Pega os dados do arquivo em formato json + if(!root){ //Caso não tenha conseguido carregar os dados + puts("erro ao carregar dados!"); + //exit(0); + } + + if(!json_is_object(root)) + { + fprintf(stderr, "Dados não estão em formato Json\n"); + json_decref(root); + } + + json_t *sha; + const char *message_text; + sha = json_object_get(root, "status"); //Pega o Status da resposta + if(json_is_string(sha)) + { + message_text = json_string_value(sha); //coloca o valor de status na string + puts(message_text); + if(!(strcmp(message_text, "ok"))){ + return 1; + } + return 0; + }else{ + puts("Erro Crítico. Não encontrou a mensagem de erro. Se esse erro persistir, informe o suporte técnico."); + return 0; + } + + +} +//Função que faz o Login do usuario no sistema. Utiliza a biblioteca Libcurlc para realizar as requisições http. +// Guarda as saidas em arquivos para uso posterior. Guarda o cookie para uso posterior tbm +int faz_login(GtkWidget *w, gpointer p){ + + #ifdef DEBUG + puts("faz_login"); + puts(""); + #endif /*DEBUG*/ + + dados *data_ant = p; //Pega os dados recebidos pela chamada da função + CURL *curl; + char *data = malloc(255*sizeof(char)); + strcpy(data, "login="); + char * resp; + FILE *dados_do_user, *login_out; + resp = malloc(255*sizeof(char)); + + strcat(data, gtk_entry_get_text(GTK_ENTRY(data_ant->dado3))); //Login do usuario + strcat(data, "&passwd="); + strcat(data, gtk_entry_get_text(GTK_ENTRY(data_ant->dado4))); //Senha do usuario + strcat(data, "&request=login"); + + #ifdef DEBUG + puts("Vai abrir os arquivos de dados do usuário e de resultado do login"); + puts(""); + #endif /*DEBUG*/ + + dados_do_user = fopen(".data.out", "wr"); + login_out = fopen(".login.out", "wr"); + + + curl = curl_easy_init(); + + #ifdef DEBUG + puts("Vai iniciar os processos de login com o curl"); + puts(""); + #endif /*DEBUG*/ + + if(curl) { + + //para entender melhor o que é cada opção do Curl, leia: https://curl.haxx.se/libcurl/c/libcurl-tutorial.html + curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0"); + curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1 ); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, login_out); + curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookie"); + curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie"); + + curl_easy_setopt(curl, CURLOPT_VERBOSE, 0); + curl_easy_setopt(curl, CURLOPT_HEADER, 0); + + curl_easy_setopt(curl, CURLOPT_URL, API_URL); + curl_easy_setopt(curl, CURLOPT_POST, 1); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); + + #ifdef DEBUG + puts("Fazendo login."); + puts(""); + #endif /*DEBUG*/ + curl_easy_perform(curl); //Faz login + + fclose(login_out); + + #ifdef DEBUG + puts("Vai checar o sucesso do login"); + puts(""); + #endif /*DEBUG*/ + if(checa_sucesso_do_login()){ //Se o login foi bem sucedido, pega as informações do usuário + + + char *data2="request=getinfo"; //Muda a requisição para getinfo, recebendo os dados do usuario + curl_easy_setopt(curl, CURLOPT_WRITEDATA, dados_do_user); + curl_easy_setopt(curl, CURLOPT_POST, 1); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 0); + curl_easy_setopt(curl, CURLOPT_HEADER, 0); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data2); + + #ifdef DEBUG + puts("Pegando informaçes do usuário."); + puts(""); + #endif /*DEBUG*/ + curl_easy_perform(curl); //Pega informações + fclose(dados_do_user); + if(!(checa_sucesso_get_info())){ //nao conseguiu pegar informações + + puts("Erro ao carregar informações do usuário. Por favor tente novamente. Se o erro persistir avisse o suporte técnico."); + + } + //curl_easy_setopt(curl, CURLOPT_URL, "192.168.0.5/apply/upload"); + //res = curl_easy_perform(curl); + + if(curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &resp) == CURLE_OK) + puts(resp); + else + puts("Nao pegou dados"); + curl_easy_cleanup(curl); + + #ifdef DEBUG + puts("Vai checar se tem um upload em progresso."); + puts(""); + #endif /*DEBUG*/ + if(checa_upload_antigo()){ //Verifica se existe um upload antigo nessa máquina + tela_upload_antigo(NULL, data_ant); //Se tiver, chama a tela de uplaod antigo + }else{ + tela_principal(NULL, data_ant); //Se não, chama a tela principal + } + return 1; + } + + } + + gtk_label_set_text(GTK_LABEL(data_ant->dado5), "Login nao encontrado!"); //O login não foi bem sucedido + + return 0; +} + +//Função que faz o upload da imagem + dados para a api do site. Atualmente faz upload só de UM arquivo + +//função de teste que faz upload da imagem teste.r1 +void faz_upload_teste(GtkWidget *w, gpointer p){ + + #ifdef DEBUG + puts("faz_upload_teste"); + puts(""); + #endif /*DEBUG*/ + + GtkWidget *loading; + GtkBuilder *builder; + dados *data_ant = p; //Pega os dados recebidos pela chamada da função + int i; + struct dados *data = malloc(sizeof(*data)); + GPid pid; + GChildWatchFunc handler; + char **argv; //Vetor de argumentos para a g_spawn + argv = malloc(10*sizeof(char*)); + for (i=0; i < 10; i++){ + argv[i] = malloc(255*sizeof(char)); + } + + builder = gtk_builder_new(); //Cria um novo Builder gtk + gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets + loading = GTK_WIDGET(gtk_builder_get_object(builder, "loading_screen")); + + gtk_widget_show_all(loading); + strcpy(argv[0], "./upload"); //Comando a ser invocado pelo shell + strcpy(argv[1], "/home/ent13/Desktop/pasta-teste"); //Local do arquivo de uplaod teste + strcpy(argv[2], "teste"); //nome da imagem + strcpy(argv[3], ".r1"); //versão da imagem + argv[4] = NULL; //ESSE ULTIMO PARAMETRO DEVE SER NULO, ele é o sentinela e informa o g_spawn onde acabam os parametros de invocação + g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL); //NAO USE FORK PARA SPAWNAR SCRIPTS, use essa função. Documentação em: https://developer.gnome.org/glib/stable/glib-Spawning-Processes.html#g-spawn-sync + handler = stg4_tela_confirmacao_upload; //Função a ser chamada quando o g_spawn sair + data->dado6 = loading; + data->dado1 = data_ant->dado1; + data->pid = pid; + g_child_watch_add(pid, handler, data); //Chamará a função apontada por handler ao sair do processo criado pelo g_spawn +} + +void faz_upload(GtkWidget *w, gpointer p){ + + #ifdef DEBUG + puts("faz_upload"); + puts(""); + #endif /*DEBUG*/ + + GtkWidget *loading; + dados *data_ant = p; //Pega os dados recebidos pela chamada da função + GtkBuilder *builder; + struct dados *data = malloc(sizeof(*data)); + int i; + GPid pid; + GChildWatchFunc handler; + char **argv; //Vetor de argumentos do G_spawn + argv = malloc(10*sizeof(char*)); + for (i=0; i < 10; i++){ + argv[i] = malloc(255*sizeof(char)); + } + + builder = gtk_builder_new(); //Cria um novo Builder gtk + gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets + loading = GTK_WIDGET(gtk_builder_get_object(builder, "loading_screen")); + + gtk_widget_show_all(loading); + + #ifdef DEBUG + puts("Vai popular o vetor de argumentos para o script de upload."); + puts(""); + #endif /*DEBUG*/ + strcpy(argv[0], "./upload"); //Comando a ser invocado pelo shell + strcpy(argv[1], gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_ant->dado4))); //Caminho para a imagem criada pelo usuario + strcpy(argv[2], gtk_entry_get_text(GTK_ENTRY(data_ant->dado3))); //Nome da imagem + strcpy(argv[3], ".r1"); //versão, isso será depois lidado pela api, por isso o .r1 + argv[4] = NULL; //ESSE ULTIMO PARAMETRO DEVE SER NULO, ele é o sentinela e informa o g_spawn onde acabam os parametros de invocação + + #ifdef DEBUG + puts("Vai spawnar o processo de upload."); + puts(""); + #endif /*DEBUG*/ + g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL); //NAO USE FORK PARA SPAWNAR SCRIPTS, use essa função. Documentação em: https://developer.gnome.org/glib/stable/glib-Spawning-Processes.html#g-spawn-sync + + + + handler = stg4_tela_confirmacao_upload; //Função a ser chamada quando o g_spawn sair + data->dado6 = loading; + data->dado1 = data_ant->dado1; + data->pid = pid; + + + #ifdef DEBUG + puts("Vai adicionar o processo ao child watch"); + puts(""); + #endif /*DEBUG*/ + g_child_watch_add(pid, handler, data); //Chamará a função apontada por handler ao sair do processo criado pelo g_spawn +} diff --git a/useful/stg312/upload-utils.h b/useful/stg312/upload-utils.h new file mode 100644 index 0000000000000000000000000000000000000000..234b0cdde9fc0d27046171450044811aa3c26ae0 --- /dev/null +++ b/useful/stg312/upload-utils.h @@ -0,0 +1,22 @@ + +#include <gtk/gtk.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +//Aviso a quem vai editar esse código. Boa sorte com a libcurl, a documentação é muito escassa e mal explicada, nada faz sentido +// a opção de debug não indica nada importante e as soluções são extremamente Cripticas se vc não tem um conhecimento grande de +// como funcionam requisições web. + +void logout(); +int checa_upload_antigo(); +int calcula_tempo_upload(); +void gera_arquivo_dados_usuario(); +int checa_sucesso_do_login(); +void pega_dados_do_usuario(user_info *dados); +int checa_sucesso_get_info(); +int faz_login(GtkWidget *w, gpointer p); +void faz_upload_dummy(GtkWidget *w, gpointer p); +void faz_upload_teste(GtkWidget *w, gpointer p); +void faz_upload(GtkWidget *w, gpointer p); diff --git a/useful/stg312/upload.c b/useful/stg312/upload.c index c8f09c9015c5abc1b84d6cdc3f9a8b1a31f09ca4..a3e1f1c4f57e8517c9e0e2b05b215de45a839412 100644 --- a/useful/stg312/upload.c +++ b/useful/stg312/upload.c @@ -3,7 +3,7 @@ #include <stdlib.h> #include <string.h> #include <errno.h> -#include <sys/wait.h> +//#include <sys/wait.h> #include <gdk/gdkkeysyms.h> #include <gdk/gdk.h> #include <glib.h> @@ -12,60 +12,85 @@ #include <curl/easy.h> #include <jansson.h> #include <time.h> -#include <gcrypt.h> +//#include <gcrypt.h> #include <sys/types.h> #include <signal.h> +#include "upload-utils.h" +//Função que checa o sucesso do upload feito; int checa_sucesso_upload(){ + #ifdef DEBUG + puts("checa_sucesso_upload"); + puts(""); + #endif /*DEBUG*/ + FILE *user_data; char *user_data_str; user_data_str = malloc(2550*sizeof(char)); - user_data = fopen(".upload.out", "r"); + + #ifdef DEBUG + puts("Vai abrir arquivo com a resposta do upload."); + puts(""); + #endif /*DEBUG*/ + user_data = fopen(".upload.out", "r"); //Abre arquivo contendo a resposta do servidor + fgets(user_data_str,2550*sizeof(char), user_data ); - puts("User data: "); - puts(user_data_str); - puts("User data end "); + #ifdef DEBUG + puts("Dados lidos do pacote:"); + system("cat .upload.out"); //Para debug + puts("Vai ler o pacote json recebido pelo servidor"); + puts(""); + #endif /*DEBUG*/ json_t *root; json_error_t error; - root = json_loads(user_data_str,0, &error); - if(!root){ + root = json_loads(user_data_str,0, &error); //carrega o pacote json com a resposta + if(!root){ //falha ao abrir o pacote puts("erro ao carregar dados!"); + return 116; //exit(0); } if(!json_is_object(root)) { - fprintf(stderr, "error: root is not an array\n"); + fprintf(stderr, "O arquivo de saida não contem um objeto json."); json_decref(root); } json_t *sha; const char *message_text; - sha = json_object_get(root, "status"); + sha = json_object_get(root, "status"); //Pega o status if(json_is_string(sha)) { - message_text = json_string_value(sha); + message_text = json_string_value(sha); //Coloca o status no string puts(message_text); }else{ - puts("error, not string"); + puts("Erro! O dado lido não é uma String."); //Status não é um string + } - if(!(strcmp(message_text, "ok"))){ + if(!(strcmp(message_text, "ok"))){ //Tudo certo, o programa vai continuar return 1; } - sha = json_object_get(root, "code"); + sha = json_object_get(root, "code"); //Se não esta tudo certo, pega o codigo de erro if(json_is_string(sha)) { - message_text = json_string_value(sha); + message_text = json_string_value(sha); //Coloca o codigo em uma string puts(message_text); }else{ - puts("error, not string"); + puts("Erro! O dado lido não é uma String."); //O código não é uma string + return 116; } + //Para entender que erro é o que verifique documentação da API que está no Redmine (https://redmine.c3sl.ufpr.br/projects/openslx-dnbd3/files arquivo api_webservice_report) ou Taiga + + #ifdef DEBUG + puts("Irá procurar o erro."); + puts(""); + #endif /*DEBUG*/ if(!(strcmp(message_text, "109"))){ puts("Erro 109: Uploadid nao informado, caso esteja vendo esse erro repita todo o processo de criação de imagem."); return 0; @@ -98,75 +123,91 @@ int checa_sucesso_upload(){ if(!(strcmp(message_text, "115"))){ puts("Erro 115: Erro ao fazer o upload, o programa tentará reenviar agora."); - return 115; + return 115; //Vai enviar a próxima parte, pois a primeira já foi enviada } if(!(strcmp(message_text, "116"))){ puts("Erro 116: Erro ao fazer o upload, o programa tentará reenviar agora."); return 116; } - return 0; + puts("Não identificou o erro. O programa tentará reenviar agora."); + return 116; } +//Função que vai pegar o upload ip fornecido pela api int pega_upload_id(char *id){ + #ifdef DEBUG + puts("pega_uplaod_id"); + puts(""); + #endif /*DEBUG*/ + FILE *user_data; char *user_data_str; user_data_str = malloc(2550*sizeof(char)); - user_data = fopen(".upid.out", "r"); + + #ifdef DEBUG + puts("Vai abrir o arquivo contendo o upload id"); + puts(""); + #endif /*DEBUG*/ + user_data = fopen(".upid.out", "r"); //Abre o arquivo que contém o upload id fgets(user_data_str,2550*sizeof(char), user_data ); - puts("User data: "); - puts(user_data_str); - puts("User data end "); + + #ifdef DEBUG + puts("Dados lidos do pacote:"); + puts(user_data_str); + puts("Vai ler o pacote json recebido pelo servidor"); + puts(""); + #endif /*DEBUG*/ json_t *root; json_error_t error; - root = json_loads(user_data_str,0, &error); + root = json_loads(user_data_str,0, &error); //carrega o pacote json com o upload id if(!root){ - puts("erro ao carregar dados!"); + puts("erro ao carregar dados!"); //Não achou o arquivo //exit(0); } if(!json_is_object(root)) { - fprintf(stderr, "error: root is not an array\n"); + fprintf(stderr, "O arquivo de saida não contem um objeto json."); json_decref(root); } json_t *sha; const char *message_text; - sha = json_object_get(root, "status"); + sha = json_object_get(root, "status"); //Pega status if(json_is_string(sha)) { message_text = json_string_value(sha); puts(message_text); }else{ - puts("error, not string"); + puts("Erro! O dado lido não é uma String."); } - if(!(strcmp(message_text, "ok"))){ - sha = json_object_get(root, "uploadid"); + if(!(strcmp(message_text, "ok"))){ //Se o status estiver OK, continua + sha = json_object_get(root, "uploadid"); //pega o uploadid do json if(json_is_string(sha)) { message_text = json_string_value(sha); puts(message_text); }else{ - puts("error, not string"); + puts("Erro! O dado lido não é uma String."); } - strcpy(id, message_text); + strcpy(id, message_text); //copia o uploadid pra id return 1; } - sha = json_object_get(root, "code"); + sha = json_object_get(root, "code"); //Se o status não OK if(json_is_string(sha)) { message_text = json_string_value(sha); puts(message_text); }else{ - puts("error, not string"); + puts("Erro! O dado lido não é uma String."); } if(!(strcmp(message_text, "108"))){ @@ -178,11 +219,18 @@ int pega_upload_id(char *id){ int main(int argc, char *argv[]){ + #ifdef DEBUG + puts("main do upload.c"); + puts(""); + #endif /*DEBUG*/ + + system("echo n > .result.out"); //Inicia o arquivo de sucesso com falha + CURL *curl; char *version, *upload_name, *part_suffix, *old_upload, *uploadid; struct curl_httppost *formpost=NULL; struct curl_httppost *lastptr=NULL; - int i, check_response; + int i, check_response, timeout_count = 0; uploadid = malloc(255*sizeof(char)); version = malloc(255*sizeof(char)); @@ -193,44 +241,44 @@ int main(int argc, char *argv[]){ //strcpy(version, ARQUIVO_TESTE); FILE *upid, *sha_calc, *upload_output, *upload_in_progress; + + #ifdef DEBUG + puts("Vai abrir o arquivo para o upload id"); + puts(""); + #endif /*DEBUG*/ upid = fopen(".upid.out", "wr"); curl = curl_easy_init(); if(curl) { - curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0"); + //para entender melhor o que é cada opção do Curl, leia: https://curl.haxx.se/libcurl/c/libcurl-tutorial.html + curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0"); //Useragent utilizado curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1 ); - //curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookie"); curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie"); curl_easy_setopt(curl, CURLOPT_VERBOSE, 0); curl_easy_setopt(curl, CURLOPT_HEADER, 0); - // curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.6/slx-admin/api.php?do=webservice"); curl_easy_setopt(curl, CURLOPT_URL, API_URL); - //char *data2="request=newupload&nparts=10"; curl_easy_setopt(curl, CURLOPT_POST, 1); - //curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data2); - upload_in_progress = fopen(".progress.out", "a+"); - printf("Linha %d\n", __LINE__); + upload_in_progress = fopen(".progress.out", "a+"); //Abre o arquivo com o possível upload antigo em progresso. rewind(upload_in_progress); fscanf(upload_in_progress, "%s", old_upload); - printf("Linha %d\n", __LINE__); i = 0; - puts(old_upload); - if(!(strcmp(old_upload, "Upload"))){ + + if(!(strcmp(old_upload, "Upload"))){ //Verifica se existe um upload antigo puts("Achou um upload antigo, continuando ele"); fscanf(upload_in_progress, "%s", old_upload); - strcpy(uploadid, old_upload); + strcpy(uploadid, old_upload); //Le o uploadid do upload em andamento fscanf(upload_in_progress, "%s", old_upload); fscanf(upload_in_progress, "%s", old_upload); - strcpy(part_suffix, old_upload); - fscanf(upload_in_progress, "%d", &i); + strcpy(part_suffix, old_upload); //Le em qual parte está o upload + fscanf(upload_in_progress, "%d", &i); //Le o int de qual parte esta o upload fscanf(upload_in_progress, "%s", old_upload); - strcpy(version, old_upload); - }else{ + strcpy(version, old_upload); //Le a versão do upload + }else{ //Se não achou um upload antigo, pede um upload id da API strcpy(version, argv[1]); strcat(version, "/"); strcat(version, argv[2]); @@ -241,20 +289,27 @@ int main(int argc, char *argv[]){ strcat(upload_name, "&version="); strcat(upload_name, argv[3]); - puts("Upload_name: "); - puts(upload_name); + + #ifdef DEBUG + puts("Upload_name: "); + puts(upload_name); + puts(""); + #endif /*DEBUG*/ curl_easy_setopt(curl, CURLOPT_POSTFIELDS, upload_name); curl_easy_setopt(curl, CURLOPT_WRITEDATA, upid); - puts("Pegando UploadId."); - curl_easy_perform(curl); - printf("Linha %d\n", __LINE__); + + #ifdef DEBUG + puts("Pegando UploadId."); + puts(""); + #endif /*DEBUG*/ + curl_easy_perform(curl); //Pega o uploadid fclose(upid); if(!(pega_upload_id(uploadid))){ - puts("Erro ao iniciar um novo Upload. Tente novamente."); + puts("Erro ao iniciar um novo Upload. Tente novamente."); //Não conseguiu pegar um uploadid novo return 0; } @@ -262,28 +317,30 @@ int main(int argc, char *argv[]){ } fclose(upload_in_progress); - - printf("Linha %d\n", __LINE__); + // Vai preparar pra fazer o upload. char *calculated_sha = malloc(255*sizeof(char)); char *sha_command_line = malloc(255*sizeof(char)); - printf("Linha %d\n", __LINE__); + curl_easy_setopt(curl, CURLOPT_POST, 0); struct curl_slist *list = NULL; list = curl_slist_append(list, "Expect: "); curl_easy_setopt(curl,CURLOPT_HTTPHEADER,list); curl_formadd(&formpost,&lastptr,CURLFORM_COPYNAME, "request", CURLFORM_COPYCONTENTS,"upload",CURLFORM_END); - printf("Linha %d\n", __LINE__); curl_formadd(&formpost,&lastptr,CURLFORM_COPYNAME, "uploadid", CURLFORM_COPYCONTENTS, uploadid,CURLFORM_END); + //começa a fazer o upload for(; i < NUMBER_OF_PARTS; ++i){ - puts(version); strcpy(upload_name, version); strcat(upload_name, part_suffix); + #ifdef DEBUG + puts("Vai abrir o arquivo que irá conter o upload antigo."); + puts(""); + #endif /*DEBUG*/ upload_output = fopen(".upload.out", "wr"); - strcpy(sha_command_line, "openssl dgst -sha1 "); + strcpy(sha_command_line, "openssl dgst -sha1 "); //calcula o sha do arquivo strcat(sha_command_line, upload_name); sha_calc = popen(sha_command_line, "r"); fscanf(sha_calc, "%s", calculated_sha); @@ -293,26 +350,44 @@ int main(int argc, char *argv[]){ curl_formadd(&formpost,&lastptr,CURLFORM_COPYNAME, "sha1", CURLFORM_COPYCONTENTS,calculated_sha,CURLFORM_END); curl_easy_setopt(curl, CURLOPT_WRITEDATA, upload_output); curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); - puts("Fazendo Upload de:"); - puts(part_suffix); - upload_in_progress = fopen(".progress.out", "wr"); - fprintf(upload_in_progress, "Upload\n%s\n%s\n%s\n%d\n%s", uploadid, upload_name, part_suffix, i, version); - fclose(upload_in_progress); + #ifdef DEBUG + puts("Fazendo Upload de:"); + puts(part_suffix); + puts(""); + #endif /*DEBUG*/ - curl_easy_perform(curl); + upload_in_progress = fopen(".progress.out", "wr"); //Abre o arquivo que conterá os dados necessários para continuar o upload caso esse falhe + fprintf(upload_in_progress, "Upload\n%s\n%s\n%s\n%d\n%s", uploadid, upload_name, part_suffix, i, version); //Insere os dados necessários para continuar o upload em caso de falha + fclose(upload_in_progress); //fecha o arquivo, obriga um sync dele + + #ifdef DEBUG + puts("Vai fazer o upload usando o curl."); + puts(""); + #endif /*DEBUG*/ + curl_easy_perform(curl); //Faz o upload propriamente dito fclose(upload_output); - printf("Linha %d\n", __LINE__); - check_response = checa_sucesso_upload(); - printf("Linha %d\n", __LINE__); + + #ifdef DEBUG + puts("Vai checar o sucesos do upload:"); + puts(""); + #endif /*DEBUG*/ + check_response = checa_sucesso_upload(); //Checa se o upload foi feito com sucesso if(check_response == 1){ puts("Parte enviada para o servidor com suceso."); part_suffix[9]++; + timeout_count = 0; }else{ puts("Parte não enviada para o servidor com sucesso."); if(check_response == 116){ puts("Sistema irá tentar reenviar a ultima parte."); + --i; + timeout_count++; + if(timeout_count == 5){ //Caso o banco não esteja respondendo. + puts("Conexão com o banco perdida. Tente novamente."); + return 0; + } } if(check_response == 115){ puts("Sistema irá enviar a próxima parte."); @@ -320,14 +395,16 @@ int main(int argc, char *argv[]){ --i; } } - printf("Linha %d\n", __LINE__); + } - printf("Linha %d\n", __LINE__); + //Fez o upload, vai atualizar o arquivo de upload em progresso + upload_in_progress = fopen(".progress.out", "wr"); - printf("Linha %d\n", __LINE__); + fprintf(upload_in_progress, "Nothing to see here, move along now"); - printf("Linha %d\n", __LINE__); + curl_easy_cleanup(curl); } + system("echo s > .result.out"); //Terminou tudo corretamente, atualiza o arquivo de checagem de sucesso! return(0); } diff --git a/useful/stg312/utils.c b/useful/stg312/utils.c index 1eb6b9e5519fee506aca4051eb54f63784eae0a2..567b34c325af9e0d7d4d60993c7c4f24c251cc18 100644 --- a/useful/stg312/utils.c +++ b/useful/stg312/utils.c @@ -5,7 +5,7 @@ #include <stdlib.h> #include <string.h> #include <errno.h> -#include <sys/wait.h> +//#include <sys/wait.h> #include <gdk/gdkkeysyms.h> #include <gdk/gdk.h> #include <glib.h> @@ -14,518 +14,64 @@ #include <curl/easy.h> #include <jansson.h> #include <time.h> -#include <gcrypt.h> +//#include <gcrypt.h> #include <sys/types.h> #include <signal.h> -int checa_upload_antigo(){ - - FILE *upload_in_progress; - char *old_upload; - old_upload = malloc(255*sizeof(char)); - - upload_in_progress = fopen(".progress.out", "a+"); - printf("Linha %d\n", __LINE__); - rewind(upload_in_progress); - fscanf(upload_in_progress, "%s", old_upload); - printf("Linha %d\n", __LINE__); - - puts(old_upload); - if(!(strcmp(old_upload, "Upload"))){ - return 1; - } - return 0; -} - -int calcula_tempo_upload(){ - - FILE *velocidade_upload; - velocidade_upload = fopen(".speed.out", "r"); - - char *velocidade; - velocidade = malloc(255*sizeof(char)); - int velocidade_f; - - fscanf(velocidade_upload, "%s", velocidade); - puts(velocidade); - fscanf(velocidade_upload, "%s", velocidade); - puts(velocidade); - fscanf(velocidade_upload, "%s", velocidade); - puts(velocidade); - fscanf(velocidade_upload, "%s", velocidade); - puts(velocidade); - fscanf(velocidade_upload, "%s", velocidade); - puts(velocidade); - fscanf(velocidade_upload, "%s", velocidade); - puts(velocidade); - fscanf(velocidade_upload, "%s", velocidade); - puts(velocidade); - fscanf(velocidade_upload, "%s", velocidade); - puts(velocidade); - puts("vai calcular"); - velocidade_f = atoi(velocidade); - puts("calculou"); - puts("chegou aqui"); - return((1953)/velocidade_f*3); // *3 para levar em conta problemas de rede. -} - -//Função que gera o arquivo de dados do usuario, tanto os que foram recebidos do banco quanto informaçõs de sistema. Esse arquivo -// sera submetido junto à imagem quando o upload for feito. -void gera_arquivo_dados_usuario(){ - - user_info dados_do_user; - pega_dados_do_usuario(&dados_do_user); - FILE *user_data_file; - user_data_file = fopen("user_data.info", "wr"); - - fputs("Nome do criador da imagem: ", user_data_file); - fputs(dados_do_user.name, user_data_file); - fputs("\nLogin do criador da imagem: ", user_data_file); - fputs(dados_do_user.login, user_data_file); - fputs("\nEmail do criador da imagem: ", user_data_file); - fputs(dados_do_user.email, user_data_file); - fputs("\nCidade do criador da imagem: ", user_data_file); - fputs(dados_do_user.city, user_data_file); - - time_t timer; - time(&timer); - fputs("\nData da criação da imagem: ", user_data_file); - fputs(ctime(&timer), user_data_file); - - fclose(user_data_file); - system("uname -a >> user_data.info"); - system("lsb_release -a >> user_data.info"); - - - - -} - -//Função que checa o arquivo .login.out para verificar o suceso do login. -int checa_sucesso_do_login(){ - - FILE *login; - char *user_data_str; - login = fopen(".login.out", "r");; - user_data_str = malloc(2550*sizeof(char)); - fgets(user_data_str,2550*sizeof(char), login ); - - printf("%zu tamanho da string\n", strlen(user_data_str)); - puts(user_data_str); - - json_t *root; - json_error_t error; - root = json_loads(user_data_str,0, &error); - printf("Linha %d\n", __LINE__); - - if(!root){ - puts("erro ao carregar dados!"); - //exit(0); - } - printf("Linha %d\n", __LINE__); - - if(!json_is_object(root)) - { - fprintf(stderr, "error: root is not an array\n"); - json_decref(root); - } - printf("Linha %d\n", __LINE__); - - json_t *sha; - printf("Linha %d\n", __LINE__); - - const char *message_text; - printf("Linha %d\n", __LINE__); - - sha = json_object_get(root, "status"); - printf("Linha %d\n", __LINE__); - - if(json_is_string(sha)) - { - printf("Linha %d\n", __LINE__); - message_text = json_string_value(sha); - printf("Linha %d\n", __LINE__); - puts(message_text); - printf("Linha %d\n", __LINE__); - }else{ - printf("Linha %d\n", __LINE__); - puts("error, not string"); - return 0; - printf("Linha %d\n", __LINE__); - } - - if(!(strcmp("ok", message_text))){ - printf("Linha %d\n", __LINE__); - puts(message_text); - return 1; - } - - printf("Linha %d\n", __LINE__); - return 0; - - -} - -//Função que utiliza o arquivo gerado pela chamada Curl com os dados do usuario e coloca eles na estrutura user_info *dados -void pega_dados_do_usuario(user_info *dados){ - - FILE *user_data; - char *user_data_str; - user_data_str = malloc(2550*sizeof(char)); - user_data = fopen(".data.out", "r"); - fgets(user_data_str,2550*sizeof(char), user_data ); - puts("User data: "); - puts(user_data_str); - puts("User data end "); - - json_t *root; - json_error_t error; - root = json_loads(user_data_str,0, &error); - if(!root){ - puts("erro ao carregar dados!"); - //exit(0); - } - - if(!json_is_object(root)) - { - fprintf(stderr, "error: root is not an array\n"); - json_decref(root); - } - - json_t *sha; - const char *message_text; - sha = json_object_get(root, "name"); - if(json_is_string(sha)) - { - message_text = json_string_value(sha); - puts(message_text); - strcpy(dados->name, message_text); - }else{ - dados->name[0] = '\0'; - puts("error, not string"); - } - - sha = json_object_get(root, "login"); - if(json_is_string(sha)) - { - message_text = json_string_value(sha); - puts(message_text); - strcpy(dados->login, message_text); - - }else{ - dados->login[0] = '\0'; - puts("error, not string"); - } - - sha = json_object_get(root, "email"); - if(json_is_string(sha)) - { - message_text = json_string_value(sha); - puts(message_text); - strcpy(dados->email, message_text); - - }else{ - dados->email[0] = '\0'; - puts("error, not string"); - } - - sha = json_object_get(root, "city"); - if(json_is_string(sha)) - { - message_text = json_string_value(sha); - puts(message_text); - strcpy(dados->city, message_text); - - }else{ - dados->city[0] = '\0'; - puts("error, not string"); - } -} - -int checa_sucesso_get_info(){ - - FILE *user_data; - char *user_data_str; - user_data_str = malloc(2550*sizeof(char)); - user_data = fopen(".data.out", "r"); - fgets(user_data_str,2550*sizeof(char), user_data ); - puts("User data: "); - puts(user_data_str); - puts("User data end "); - - json_t *root; - json_error_t error; - root = json_loads(user_data_str,0, &error); - if(!root){ - puts("erro ao carregar dados!"); - //exit(0); - } - - if(!json_is_object(root)) - { - fprintf(stderr, "error: root is not an array\n"); - json_decref(root); - } - - json_t *sha; - const char *message_text; - sha = json_object_get(root, "status"); - if(json_is_string(sha)) - { - message_text = json_string_value(sha); - puts(message_text); - if(!(strcmp(message_text, "ok"))){ - return 1; - } - return 0; - }else{ - puts("Erro Crítico. Não encontrou a mensagem de erro. Se esse erro persistir, informe o suporte técnico."); - return 0; - } - - -} -//Função que faz o Login do usuario no sistema. Utiliza a biblioteca Libcurlc para realizar as requisições http. -// Guarda as saidas em arquivos para uso posterios. Guarda o cookie para uso posterios tbm -int faz_login_dummy(GtkWidget *w, gpointer p){ - dados *data_ant = p; - tela_principal(NULL, data_ant); - return 1; -} - -int faz_login(GtkWidget *w, gpointer p){ - - dados *data_ant = p; - CURL *curl; - char *data = malloc(255*sizeof(char)); - strcpy(data, "login="); - char * resp; - FILE *dados_do_user, *login_out; - resp = malloc(255*sizeof(char)); - puts("teste"); - puts(gtk_entry_get_text(GTK_ENTRY(data_ant->dado3))); - strcat(data, gtk_entry_get_text(GTK_ENTRY(data_ant->dado3))); - strcat(data, "&passwd="); - strcat(data, gtk_entry_get_text(GTK_ENTRY(data_ant->dado4))); - strcat(data, "&request=login"); - puts(data); - - dados_do_user = fopen(".data.out", "wr"); - login_out = fopen(".login.out", "wr"); - - - curl = curl_easy_init(); - if(curl) { - - curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0"); - curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1 ); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, login_out); - curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookie"); - curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie"); - - curl_easy_setopt(curl, CURLOPT_VERBOSE, 0); - curl_easy_setopt(curl, CURLOPT_HEADER, 0); - - //curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.6/slx-admin/api.php?do=webservice"); - curl_easy_setopt(curl, CURLOPT_URL, API_URL); - curl_easy_setopt(curl, CURLOPT_POST, 1); - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); - puts("Fazendo login."); - curl_easy_perform(curl); - - puts("teste 2"); - fclose(login_out); - printf("Linha antes checagem %d\n", __LINE__); - if(checa_sucesso_do_login()){ - - printf("Linha %d\n", __LINE__); - char *data2="request=getinfo"; - curl_easy_setopt(curl, CURLOPT_WRITEDATA, dados_do_user); - curl_easy_setopt(curl, CURLOPT_POST, 1); - curl_easy_setopt(curl, CURLOPT_VERBOSE, 0); - curl_easy_setopt(curl, CURLOPT_HEADER, 0); - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data2); - printf("Linha %d\n", __LINE__); - puts("pegando informação."); - curl_easy_perform(curl); - fclose(dados_do_user); - if(!(checa_sucesso_get_info())){ //nao conseguiu pegar informações - - puts("Erro ao carregar informações do usuário. Por favor tente novamente. Se o erro persistir avisse o suporte técnico."); - - } - //curl_easy_setopt(curl, CURLOPT_URL, "192.168.0.5/apply/upload"); - //res = curl_easy_perform(curl); - - if(curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &resp) == CURLE_OK) - puts(resp); - else - puts("Nao pegou dados"); - curl_easy_cleanup(curl); - puts("teste"); - if(checa_upload_antigo()){ - tela_upload_antigo(NULL, data_ant); - }else{ - if(data_ant->control == 0){ - tela_principal(NULL, data_ant); - } - } - return 1; - } - printf("Linha %d\n", __LINE__); - } - printf("Linha %d\n", __LINE__); - gtk_label_set_text(GTK_LABEL(data_ant->dado5), "Login nao encontrado!"); - printf("Linha %d\n", __LINE__); - return 0; -} - -void pega_upload_id(char *id){ - - FILE *user_data; - char *user_data_str; - user_data_str = malloc(2550*sizeof(char)); - user_data = fopen(".upid.out", "r"); - fgets(user_data_str,2550*sizeof(char), user_data ); - puts("User data: "); - puts(user_data_str); - puts("User data end "); - - json_t *root; - json_error_t error; - root = json_loads(user_data_str,0, &error); - if(!root){ - puts("erro ao carregar dados!"); - //exit(0); - } - - if(!json_is_object(root)) - { - fprintf(stderr, "error: root is not an array\n"); - json_decref(root); - } - - json_t *sha; - const char *message_text; - sha = json_object_get(root, "uploadid"); - if(json_is_string(sha)) - { - message_text = json_string_value(sha); - puts(message_text); - }else{ - puts("error, not string"); - } - - strcpy(id, message_text); -} - -//Função que faz o upload da imagem + dados para a api do site. Atualmente faz upload só de UM arquivo -void faz_upload_dummy(GtkWidget *w, gpointer p){ - stg4_tela_confirmacao_upload(NULL, p); -}//Função de teste dummy - -//função de teste que faz upload da imagem teste.r1 -void faz_upload_teste(GtkWidget *w, gpointer p){ - - GtkWidget *loading; - GtkBuilder *builder; - int i; - struct dados *data = malloc(sizeof(*data)); - GPid pid; - GChildWatchFunc handler; - char **argv; - argv = malloc(10*sizeof(char*)); - for (i=0; i < 10; i++){ - argv[i] = malloc(255*sizeof(char)); - } - - builder = gtk_builder_new(); - gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); - loading = GTK_WIDGET(gtk_builder_get_object(builder, "loading_screen")); - - gtk_widget_show_all(loading); - strcpy(argv[0], "./upload"); - strcpy(argv[1], "/home/ent13/Desktop/pasta-teste"); - strcpy(argv[2], "teste"); - strcpy(argv[3], ".r1"); - argv[4] = NULL; - g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL); - handler = sai_do_script; - data->dado6 = loading; - data->pid = pid; - g_child_watch_add(pid, handler, data); - stg4_tela_confirmacao_upload(NULL, p); - -} - -void faz_upload(GtkWidget *w, gpointer p){ - - GtkWidget *loading; - dados *data_ant = p; - GtkBuilder *builder; - struct dados *data = malloc(sizeof(*data)); - int i; - GPid pid; - GChildWatchFunc handler; - char **argv; - argv = malloc(10*sizeof(char*)); - for (i=0; i < 10; i++){ - argv[i] = malloc(255*sizeof(char)); - } - - builder = gtk_builder_new(); - gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); - loading = GTK_WIDGET(gtk_builder_get_object(builder, "loading_screen")); - - gtk_widget_show_all(loading); - strcpy(argv[0], "./upload"); - strcpy(argv[1], gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_ant->dado4))); - strcpy(argv[2], gtk_entry_get_text(GTK_ENTRY(data_ant->dado3))); - strcpy(argv[3], ".r1"); - argv[4] = NULL; - g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL); - handler = sai_do_script; - data->dado6 = loading; - data->pid = pid; - g_child_watch_add(pid, handler, data); - stg4_tela_confirmacao_upload(NULL, p); - -} - //FUnção que acha o caminho para o tm-scripts, utilizada no arquivo clone_stage4.sh void acha_tm_scripts(char *path){ - - char *cam_tm_scripts; - char *first_p; - char paths[1024]; - getcwd(paths, sizeof(paths)); // Pega o current working directory - cam_tm_scripts = strstr(paths, "tm-scripts"); //Acha onde esta escrito tm-scripts - puts(cam_tm_scripts); - first_p = strchr(cam_tm_scripts, 'p');//acha o primeiro 'p' em tm scripts - first_p += 3; //anda o ponteiro - *first_p = '\0'; //termina a string, sim, tem um leak de memoria. - strcpy(path, paths); - + #ifdef DEBUG + puts("acha_tm_scripts"); + puts(""); + #endif /*DEBUG*/ + + char *cam_tm_scripts; + char *first_p; + char paths[1024]; + getcwd(paths, sizeof(paths)); // Pega o current working directory + cam_tm_scripts = strstr(paths, "tm-scripts"); //Acha onde esta escrito tm-scripts + puts(cam_tm_scripts); + first_p = strchr(cam_tm_scripts, 'p');//acha o primeiro 'p' em tm scripts + first_p += 3; //anda o ponteiro + *first_p = '\0'; //termina a string, sim, tem um leak de memoria. + strcpy(path, paths); } - -gboolean on_key_press (GtkWidget *w, GdkEventKey *event, gpointer p){ //funcção que lida com os inputs do teclado. Ver https://git.gnome.org/browse/gtk+/plain/gdk/gdkkeysyms.h para uma lista completa das Macros de teclas. - +//função que lida com os inputs do teclado. Ver https://git.gnome.org/browse/gtk+/plain/gdk/gdkkeysyms.h para uma lista completa das Macros de teclas. +gboolean on_key_press (GtkWidget *w, GdkEventKey *event, gpointer p){ + #ifdef DEBUG + puts("on_key_press"); + puts(""); + #endif /*DEBUG*/ gpointer window, button; window = w; - dados *data_ant = p; + dados *data_ant = p; //Pega os dados recebidos pela chamada da função button = data_ant->dado2; //Botão que da continuidade ao software, dado->2 por comodidade. switch (event->keyval){ - case GDK_KEY_F10: //Apertoyu f10 - help_screen(NULL, NULL); + case GDK_KEY_F10: //Apertou f10 + if(strcmp(gtk_widget_get_name(w), "login")){ + #ifdef DEBUG + puts("Vai abrir o a tela de ajuda"); + puts(""); + #endif /*DEBUG*/ + help_screen(NULL, NULL); + } + break; - case GDK_KEY_F6: //Apertoyu f10 - if(data_ant->control == 1) + case GDK_KEY_F6: //Apertou f6 + + + if(!strcmp(gtk_widget_get_name(w), "instal_window")){ + #ifdef DEBUG + puts("Vai abrir o shell"); + puts(""); + #endif /*DEBUG*/ abre_shell(NULL, NULL); + } break; case GDK_KEY_Escape: //Apertou esc, destroi a janela @@ -533,7 +79,7 @@ gboolean on_key_press (GtkWidget *w, GdkEventKey *event, gpointer p){ //funcçã g_signal_emit_by_name(window, "destroy"); break; - case GDK_KEY_Page_Up://Apertou pageup, clica no botao. Não consigo fazer isso pro enter, só enter do key pad + case GDK_KEY_Page_Up://Apertou pageup, clica no botao. g_signal_emit_by_name(button, "clicked"); break; @@ -544,122 +90,104 @@ gboolean on_key_press (GtkWidget *w, GdkEventKey *event, gpointer p){ //funcçã return FALSE; } +//Função que abre o software center do sistema void abre_software_center(GtkWidget *w, gpointer p){ - + #ifdef DEBUG + puts("abre_software_center"); + puts("Vai abrir o synaptic."); + puts(""); + #endif /*DEBUG*/ int status; + g_spawn_command_line_sync("synaptic", NULL, NULL, &status, NULL); //Abre o synaptic. Quando melhorarem o software center usar o software center - g_spawn_command_line_sync("software-center", NULL, NULL, &status, NULL); - /*pid_t pid; - int status; - - pid = fork(); - - //pid = 2; - if(pid == 0){ - execlp("software-center", "", NULL); - perror("O comando não foi executado corretamente. Erro: Saindo do programa. "); // Caso ocorra algum erro com o execlp. - - gtk_main_quit(); - exit(1); - } - waitpid(pid, &status, 0); // Espera o script terminar de rodar*/ } +//Função que abre um shell para instalar os pacotes. void abre_shell(GtkWidget *w, gpointer p){ - + #ifdef DEBUG + puts("abre_shell"); + puts("Vai abrir o shell."); + puts(""); + #endif /*DEBUG*/ int status; - - g_spawn_command_line_sync("x-terminal-emulator", NULL, NULL, &status, NULL); // Executa o script + g_spawn_command_line_sync("x-terminal-emulator", NULL, NULL, &status, NULL); // Abre o shell - /*pid_t pid; - int status; - - pid = fork(); - - - //pid = 2; - if(pid == 0){ - execlp("x-terminal-emulator", "", NULL); - perror("O comando não foi executado corretamente. Erro: Saindo do programa. "); // Caso ocorra algum erro com o execlp. - - gtk_main_quit(); - exit(1); - } - waitpid(pid, &status, 0); // Espera o script terminar de rodar*/ } -void logout(){ - - CURL *curl; - - - curl = curl_easy_init(); - if(curl) { - - curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0"); - curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1 ); - curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookie"); - curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie"); +void abre_site(GtkWidget *w, gpointer p){ + #ifdef DEBUG + puts("abre_site"); + puts("Vai abrir o site do openslx."); + puts(""); + #endif /*DEBUG*/ + int status; + g_spawn_command_line_sync("xdg-open http://slxboxdev.c3sl.ufpr.br", NULL, NULL, &status, NULL); // Abre o site. - curl_easy_setopt(curl, CURLOPT_VERBOSE, 0); - curl_easy_setopt(curl, CURLOPT_HEADER, 0); - - //curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.6/slx-admin/api.php?do=webservice"); - curl_easy_setopt(curl, CURLOPT_URL, API_URL); - curl_easy_setopt(curl, CURLOPT_POST, 1); - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "request=logout"); - curl_easy_perform(curl); - } } +//Função que sai do programa, fazendo logout antes void sair(GtkWidget *w, gpointer p){ - + #ifdef DEBUG + puts("sair"); + puts("Vai fazer o logout."); + puts(""); + #endif /*DEBUG*/ logout(); gtk_main_quit(); } -// Função que checa se os scripts foram rodados com sucesso. Ela é utilizada tanto na tela 2 quanto na tela 3. +// Função que checa se os scripts foram rodados com sucesso. int checa_sucesso(){ - + #ifdef DEBUG + puts("checa_sucesso"); + puts(""); + #endif /*DEBUG*/ FILE *resultado; // Arquivo utilizado para ler o resultado do script. char controle; GtkWidget *dialogo; GtkBuilder *builder; - builder = gtk_builder_new(); - gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); - - //controle = (char*) malloc(5*sizeof(char)); + builder = gtk_builder_new(); //Cria um novo Builder gtk + gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets - dialogo = GTK_WIDGET(gtk_builder_get_object(builder, "error_dialog")); + dialogo = GTK_WIDGET(gtk_builder_get_object(builder, "error_dialog")); //Carrega o dialogo de erro + #ifdef DEBUG + puts("Vai abrir o arquivo contendo o resultdo da operação"); + puts(""); + #endif /*DEBUG*/ resultado = fopen(".result.out", "r"); // .result.out é o arquivo que armazena se o script foi executado corretamente ou não if(resultado != NULL){ - fread(&controle, sizeof(char), 1, resultado); - //printf("Controle = %c\n", controle); - if(controle == 'n'){ //Caso o script não tenha sido executado com sucesso o programa informa o usuário por meio de uma janela de dialogo do GTK + fread(&controle, sizeof(char), 1, resultado); //Lê a saida do script + + #ifdef DEBUG + printf("Controle = %c\n", controle); + puts(""); + #endif /*DEBUG*/ + + if(controle == 's'){ //Caso o script não tenha sido executado com sucesso o programa informa o usuário por meio de uma janela de dialogo do GTK + system("rm .result.out"); - gtk_dialog_run(GTK_DIALOG(dialogo)); - gtk_widget_destroy(dialogo); - system("rm .result.out"); // Remove o arquivo após a verificação para não dar conflito com o segundo script e execuções futuras do programa - gtk_main_quit(); - exit(1); }else{ if(controle == 'p'){ //Caso o script não tenha sido executado com sucesso o programa informa o usuário por meio de uma janela de dialogo do GTK return(1); }else{ - system("rm .result.out"); // Remove o arquivo para não dar conflito com o segundo script e execuções futuras do programa, mesmo se o script foi rodado com sucesso. + gtk_dialog_run(GTK_DIALOG(dialogo)); //Mostra a janela de erro + gtk_widget_destroy(dialogo); + system("rm .result.out"); // Remove o arquivo após a verificação para não dar conflito com o segundo script e execuções futuras do programa + gtk_main_quit(); + exit(1); // Remove o arquivo para não dar conflito com o segundo script e execuções futuras do programa, mesmo se o script foi rodado com sucesso. } } - }else{ //Se o arquivo não existir algo de errado aconteceu na execução do programa, como por exemplo o usuário não informou nenhum campo na segunda tela. + }else{ //Se o arquivo não existir algo de errado aconteceu na execução do programa, como por exemplo o usuário não informou nenhum campo na tela de clonagem. puts("Arquivo não encontrado, erro crítico. Saíndo do programa."); gtk_main_quit(); exit(1); @@ -667,20 +195,53 @@ int checa_sucesso(){ return(0); } -// Acha o caminho para o tm-scripts +// Função que verifica se o usuário inseriu um nome com espaços no campo nome da imagem +void stg4_clique_2a_tela_caller(GtkWidget *w, gpointer p){ + #ifdef DEBUG + puts("stg4_clique_2a_tela_caller"); + puts(""); + #endif /*DEBUG*/ + GtkWidget *entry; + dados *data_ant = p; //Pega os dados recebidos pela chamada da função + GtkWidget *dialogo; + GtkBuilder *builder; + + builder = gtk_builder_new(); //Cria um novo Builder gtk + gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets + dialogo = GTK_WIDGET(gtk_builder_get_object(builder, "space_dialog")); //Carrega o dialogo de erro caso ele tenha utilizado espaços + entry = data_ant->dado4; + + if(strchr(gtk_entry_get_text(GTK_ENTRY(entry)), ' ') == NULL){ //Verifica se ele utilizou espaços + stg4_clique_2a_tela(w, p); //Caso ele não tenha inserido espaços + }else{ + gtk_dialog_run(GTK_DIALOG(dialogo)); //Caso tenha inserido espaços + gtk_widget_destroy(dialogo); + } +} + +//Altera o texto da janela de ajuda void altera_texto_help(GtkWidget *w, gpointer p){ + #ifdef DEBUG + puts("altera_texto_help"); + puts(""); + #endif /*DEBUG*/ + const char *nome; int nome_int; - GtkWidget *label; + GtkWidget *label_titulo, *label_conteudo, *label_descricao, *label_como_help, *label_oque_help; - dados *data_ant = p; - label = data_ant->dado1; + dados *data_ant = p; //Pega os dados recebidos pela chamada da função + label_titulo = data_ant->dado1; + label_descricao = data_ant->dado2; + label_conteudo = data_ant->dado3; + label_oque_help = data_ant->dado4; + label_como_help = data_ant->dado5; nome = gtk_widget_get_name(w); @@ -690,53 +251,95 @@ void altera_texto_help(GtkWidget *w, gpointer p){ switch (nome_int){ case 1: - gtk_label_set_text(GTK_LABEL(label), "Janela Principal!\n\nNessa janela escolha o que deseja fazer no sofware!\n\nClique no botão Gerar sua Imagem para iniciar o\nprocesso de criação de imagem!"); + gtk_label_set_text(GTK_LABEL(label_oque_help), "O que essa página faz?"); + gtk_label_set_text(GTK_LABEL(label_como_help), "Como faço o que quero nessa janela?"); + gtk_label_set_text(GTK_LABEL(label_titulo), "Janela Inicial"); + gtk_label_set_text(GTK_LABEL(label_descricao), "Nessa janela você pode escolher o que deseja fazer no software"); + gtk_label_set_text(GTK_LABEL(label_conteudo), "Seja bem vindo ao software de criação de sistemas personalizados do OpenSLX.\nPara criar seu sistema com todos os programas que deseja ter, clique em \"Gerar seu sistema!\".\nPara atualizar um sistema que já está em nossa base de dados, clique em \"Atualizar seus sistemas!\"\n\nAtalhos úteis do software:\nF10: Abre essa janela de ajuda em qualquer tela\nPage Up: Avança para o próximo passo do programa\nEscape/Esc: Sai da janela que você está e volta para a janela principal."); break; case 2: - gtk_label_set_text(GTK_LABEL(label), "Janela de instalação de pacotes!\n\nNesta janela clique em algum dos botões para abrir\no assistente de instalação de pacotes do Ubuntu ou\num shell para instalar manualmente os pacotes\ndesejados.\n\nAo instalar todos os pacotes necessários para sua\nimagem clique em \"Pronto!\" para ser levado para o\npróximo passo!"); + gtk_label_set_text(GTK_LABEL(label_oque_help), "O que essa página faz?"); + gtk_label_set_text(GTK_LABEL(label_como_help), "Como faço o que quero nessa janela?"); + gtk_label_set_text(GTK_LABEL(label_titulo), "Instalação de pacotes"); + gtk_label_set_text(GTK_LABEL(label_descricao), "Instale os pacotes que deseja em seu sistema novo nessa janela"); + gtk_label_set_text(GTK_LABEL(label_conteudo), "Aqui é aonde você edita o sistema para ter tudo que você deseja.\nClique em \"Selecionar e instalar softwares\" para ser levado ao Synaptic, um software de ajuda de instalação de pacotes.\nCaso ache desnecessária a ajuda do Synaptic, aperte f6 no seu teclado que uma janela shell será aberta para você instalar manualmente os pacotes que deseja.\nApós instalar todos os pacotes e softwares desejados em seu sistema, clique em Avançar para ir para a próxima tela."); break; case 3: - gtk_label_set_text(GTK_LABEL(data_ant->dado1), "Janela de geração da imagem!\n\nNesta janela escolha o local onde será gerada a\nimagem por meio do escolhedor de arquivos!\n\nEste local não pode ser nenhum dos seguintes:\n/src\n/etc\n/var\n...\n\nInforme também o nome desejado para a versão!\nPode ser qualquer nome permitido pelo linux!\nEx: minha-versao_linux, escola-XXXXXXX_versão02\n\nInforme um identificador de versão no campo Versão\nque será utilizado para controle de versão!\nEx: .r1, .v1, .v2, .versão3, .tipo2\n\nApós escolher todos esses dados, clique em \"Gerar!\"\npara gerar sua imagem e ser levado à janela de compactação!"); + gtk_label_set_text(GTK_LABEL(label_oque_help), "O que essa página faz?"); + gtk_label_set_text(GTK_LABEL(label_como_help), "Como faço o que quero nessa janela?"); + gtk_label_set_text(GTK_LABEL(label_titulo), "Criação do sistema novo"); + gtk_label_set_text(GTK_LABEL(label_descricao), "Crie o seu sistema novo nessa janela"); + gtk_label_set_text(GTK_LABEL(label_conteudo), "Agora que você instalou todos os pacotes necesários para o seus sistema, é necessário criar o arquivo que será carregado para a nossa base de dados.\nPara fazer isso, informe em \"Destino do sistema\" uma pasta com pelo menos 8 Gigas de espaço livre e dê um nome para seu sistema, infelizmente esse nome não pode contêr espaços, mas tente usar _ ou - no lugar de espaços para facilitar a leitura do nome depois.\nClique na caixa \"Remover sistema no compactado\" se quiser mantêr os arquivos gerados pela criação do sistema por qualquer razão. Deixe a opção marcada caso não tenha interesse nisso.\nApós dar um nome e escolher um lugar apropriado para o sistema ser colocado, clique em \"Gerar!\" para avançar para o próximo passo."); break; case 4: - gtk_label_set_text(GTK_LABEL(data_ant->dado1), "Janela de compactação!\n\nNessa janela a sua imagem já foi gerada! Agora só\nfalta gerar uma versão compactada dela para ser\nutilizada por nós!\n\nCaso deseje manter a versão descompactada,\ndesmarque a opção ao lado do botão. Manter ou \ndeletar a versão integral NÃO afeta de maneira \nalguma o funcionamento do software. Mas por \nquestões de espaço guarde a imagem não\ncompactada somente se quiser.\n\nQuando quiser iniciar o processo de compactação\nclique em \"Compactar!\"!\nOBS: Não tente utilizar o computador durante esse estágio,\nele consome muitos recursos da máquina e\nisso a deixa muito lenta."); + gtk_label_set_text(GTK_LABEL(label_oque_help), "O que essa página faz?"); + gtk_label_set_text(GTK_LABEL(label_como_help), "Como faço o que quero nessa janela?"); + gtk_label_set_text(GTK_LABEL(label_titulo), "Upload do sistema"); + gtk_label_set_text(GTK_LABEL(label_descricao), "Faça o upload do seu sistema por essa janela"); + gtk_label_set_text(GTK_LABEL(label_conteudo), "Para carregar o sistema em nossa base de dados, é só clicar em \"Upload!\". Caso tenha cometido um erro, esquecido de um pacote ou não possui tempo para fazer o upload, clique em \"Sair\" para voltar para a janela principal. Leve em consideração o \"Tempo estimado de Upload\", sabendo que pode demorar mais ou menos que a quantidade informada.\nCaso a internet caia ou algo pare o carregamento enquanto ele está sendo efetuado não se preocupe, simplesmente execute esse programa novamente que ele continuará de onde parou!"); break; case 5: - gtk_label_set_text(GTK_LABEL(data_ant->dado1), "Janela de finalização & Upload da imagem!\n\nAgora sua imagem já está completa!\nClique em \"Upload!\" para fazer o Upload\ndela para nosso site! Possibilitando o uso dela\nem outras máquinas!"); + gtk_label_set_text(GTK_LABEL(label_oque_help), "O que essa página faz?"); + gtk_label_set_text(GTK_LABEL(label_como_help), "Como faço o que quero nessa janela?"); + gtk_label_set_text(GTK_LABEL(label_titulo), "Confirmação de upload"); + gtk_label_set_text(GTK_LABEL(label_descricao), "Entre no site e configure seu sistema se desejar por essa janela"); + gtk_label_set_text(GTK_LABEL(label_conteudo), "Tudo deu certo até agora!\nSeu sistema está em nossa base de dados e pronto para uso!\nCaso queira modificar alguma coisa no sistema, clique em \"Ir para o site\" para ser levado ao nosso site e configurar o sistema com as opções que deseja."); + break; + case 6: + gtk_label_set_text(GTK_LABEL(label_titulo), "Glossário"); + gtk_label_set_text(GTK_LABEL(label_descricao), "Nomenclaturas necessárias para o entendimento do software"); + gtk_label_set_text(GTK_LABEL(label_oque_help), "Glossário para aliviar dúvidas"); + gtk_label_set_text(GTK_LABEL(label_como_help), "Procure a palavra que você tem dúvida abaixo"); + gtk_label_set_text(GTK_LABEL(label_conteudo), "Sistema: Um sistema é o que você está criando para utilizar depois junto com seu pendrive do OpenSLX! Ele é uma versão de linux que tem todos os programas que você escolheu instalados e prontos para serem utilizados!\n\n Pacotes: Pacotes são os programas do linux. Instale eles pelo synaptic em nossa tela de instalação d epacotes ou usando os comandos shell."); break; } } +//Janela de ajuda void help_screen(GtkWidget *w, gpointer p){ - GtkWidget *window_help, *button_help_inicio, *button_help_2a_tela, *button_help_3a_tela, *button_help_4a_tela, *button_help_5a_tela, *label_help_info; + + #ifdef DEBUG + puts("help_screen"); + puts(""); + #endif /*DEBUG*/ + GtkWidget *window_help, *button_help_inicio, *button_help_pacotes, *button_help_criacao, *button_help_upload,*label_como_help, *label_oque_help, *button_help_confirmacao, *label_titulo, *label_descricao, *label_conteudo, *button_glossario; GtkBuilder *builder; - builder = gtk_builder_new(); - gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); + builder = gtk_builder_new(); //Cria um novo Builder gtk + gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets button_help_inicio = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_inicio")); - button_help_2a_tela = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_2a_tela")); - button_help_3a_tela = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_3a_tela")); - button_help_4a_tela = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_4a_tela")); - button_help_5a_tela = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_5a_tela")); - label_help_info = GTK_WIDGET(gtk_builder_get_object(builder, "label_help_info")); + button_help_pacotes= GTK_WIDGET(gtk_builder_get_object(builder, "button_help_pacotes")); + button_help_upload = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_upload")); + button_help_criacao = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_criacao")); + button_help_confirmacao = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_confirmacao")); + button_glossario = GTK_WIDGET(gtk_builder_get_object(builder, "button_glossario")); + label_titulo = GTK_WIDGET(gtk_builder_get_object(builder, "label_titulo")); + label_descricao = GTK_WIDGET(gtk_builder_get_object(builder, "label_descricao")); + label_conteudo = GTK_WIDGET(gtk_builder_get_object(builder, "label_conteudo")); + label_oque_help = GTK_WIDGET(gtk_builder_get_object(builder, "label_oque_help")); + label_como_help = GTK_WIDGET(gtk_builder_get_object(builder, "label_como_help")); struct dados *data = malloc(sizeof(*data));; - data->dado1 = label_help_info; + data->dado1 = label_titulo; + data->dado2 = label_descricao; + data->dado3 = label_conteudo; + data->dado4 = label_oque_help; + data->dado5 = label_como_help; window_help = GTK_WIDGET(gtk_builder_get_object(builder, "window_help")); - g_signal_connect(button_help_5a_tela, "clicked", G_CALLBACK(altera_texto_help), data); - g_signal_connect(button_help_4a_tela, "clicked", G_CALLBACK(altera_texto_help), data); - g_signal_connect(button_help_3a_tela, "clicked", G_CALLBACK(altera_texto_help), data); - g_signal_connect(button_help_2a_tela, "clicked", G_CALLBACK(altera_texto_help), data); + g_signal_connect(button_help_pacotes, "clicked", G_CALLBACK(altera_texto_help), data); + g_signal_connect(button_glossario, "clicked", G_CALLBACK(altera_texto_help), data); + g_signal_connect(button_help_criacao, "clicked", G_CALLBACK(altera_texto_help), data); + g_signal_connect(button_help_upload, "clicked", G_CALLBACK(altera_texto_help), data); + g_signal_connect(button_help_confirmacao, "clicked", G_CALLBACK(altera_texto_help), data); g_signal_connect(button_help_inicio, "clicked", G_CALLBACK(altera_texto_help), data); - //g_signal_connect(window_help, "destroy", G_CALLBACK(destroi_help), NULL); gtk_widget_show_all(window_help); @@ -744,32 +347,49 @@ void help_screen(GtkWidget *w, gpointer p){ } +//Sai do script chamado, verificando o sucesso void sai_do_script(GPid pid, gint status, gpointer p){ + #ifdef DEBUG + puts("sai_do_script"); + puts(""); + #endif /*DEBUG*/ + GtkWidget *loading; - dados *data_ant = p; + dados *data_ant = p; //Pega os dados recebidos pela chamada da função loading = data_ant->dado6; pid = data_ant->pid; - gtk_widget_hide(loading); - //checa_sucesso(); - g_spawn_close_pid(pid); + gtk_widget_hide(loading); //Esconde a tela de loading + + #ifdef DEBUG + puts("Vai checar o sucesso do script"); + puts(""); + #endif /*DEBUG*/ + checa_sucesso(); //Checa se o script foi executdo corretamente + g_spawn_close_pid(pid); //Mata o processo do script } +//Fecha a janela que chama essa função e mostra a janela principal void mata_janela_e_chama_tela_principal(GtkWidget *w, gpointer p){ - dados *data_ant = p; - puts("teste3"); + + #ifdef DEBUG + puts("mata_janela_e_chama_tela_principal"); + puts(""); + #endif /*DEBUG*/ + dados *data_ant = p; //Pega os dados recebidos pela chamada da função GtkWidget *janela_ant; - puts("teste2"); janela_ant = data_ant->dado1; - puts("teste"); - gtk_widget_hide(janela_ant);//Nao achou isso, nao cuspiu teste 4 - puts("teste4"); - g_signal_emit_by_name(janela_ant, "destroy"); - puts("teste5"); + gtk_widget_hide(janela_ant); //Esconde a janela anterior + g_signal_emit_by_name(janela_ant, "destroy"); //Emite o sinal de destroy pra janela pra fazer certo as coisas quando fechar } +//Chama a tela principal void chama_tela_principal(GtkWidget *w, gpointer p){ + #ifdef DEBUG + puts("chama_tela_principal"); + puts(""); + #endif /*DEBUG*/ struct dados *data = malloc(sizeof(*data)); data->dado1 = NULL; tela_principal(NULL,data); diff --git a/useful/stg312/utils.h b/useful/stg312/utils.h index 6d8b2eff5d266c5c35b6c642ca16c911cd0e5ff4..9ed1ac756ce35aaa94c31c07ac790bca1292139c 100644 --- a/useful/stg312/utils.h +++ b/useful/stg312/utils.h @@ -5,32 +5,19 @@ #include <stdlib.h> #include <string.h> #include <errno.h> -#include <sys/wait.h> #include "openslx_gui.h" #include "stg4.h" +#include "upload-utils.h" static const char UPLOAD_REQUEST[] = "request=newupload&nparts=10&name="; //nparts HAS to be the same as NUMBER_OF_PARTS -static const char API_URL[] = "http://192.168.0.6/slx-admin/api.php?do=webservice"; +//static const char API_URL[] = "http://192.168.0.6/slx-admin/api.php?do=webservice"; +static const char API_URL[] = "http://slxboxdev.c3sl.ufpr.br/slx-admin/api.php?do=webservice"; static const int NUMBER_OF_PARTS = 10; // static const char CLONE_STG4_SCRIPT[] = "./clone_stage4.sh"; static const char CLONE_STG4_SCRIPT_DUMMY[] = "./clone_stage4-dummy.sh"; static const char ARQUIVO_TESTE[] = "/home/ent13/Desktop/pasta-teste/teste.r1"; -int calcula_tempo_upload(); - -void pega_dados_do_usuario(user_info *dados); - -void gera_arquivo_dados_usuario(); - -int faz_login_dummy(GtkWidget *w, gpointer p); - -int faz_login(GtkWidget *w, gpointer p); - -void faz_upload_dummy(GtkWidget *w, gpointer p); - -void faz_upload_teste(GtkWidget *w, gpointer p); - -void faz_upload(GtkWidget *w, gpointer p); +void stg4_clique_2a_tela_caller(GtkWidget *w, gpointer p); gboolean on_key_press (GtkWidget *widget, GdkEventKey *event, gpointer user_data); @@ -40,6 +27,8 @@ void sai_do_script(GPid pid, gint status, gpointer p); void abre_shell(GtkWidget *w, gpointer p); +void abre_site(GtkWidget *w, gpointer p); + void sair(GtkWidget *w, gpointer p); // Função que checa se os scripts foram rodados com sucesso. Ela é utilizada tanto na tela 2 quanto na tela 3.