Merge pull request #11 from lakinduakash/install-script

Install script
This commit is contained in:
Lakindu Akash 2019-04-17 02:45:38 +05:30 committed by GitHub
commit 34af49b462
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 461 additions and 56 deletions

View File

@ -1,13 +1,14 @@
PREFIX=/usr
MANDIR=$(PREFIX)/share/man
BINDIR=$(PREFIX)/bin
all:
@echo "Run 'make install' for installation."
@echo "Run 'make uninstall' for uninstallation."
mkdir -p build
cd build && cmake -G "CodeBlocks - Unix Makefiles" ../src
$(MAKE) -C build
install:
$(MAKE) -C src/scripts install
$(MAKE) -C build install_build
uninstall:
$(MAKE) -C src/scripts uninstall
$(MAKE) -C build uninstall_build

View File

@ -1,12 +1,53 @@
## Linux Wifi Hotspot
### Features
* Share your wifi like in Windows - Share wifi on same interface which you are connected to internet.
* Share access point from any network interface
* Includes Both command line and gui.
* Support both 2.4GHz and 5GHz (Need to compatible with your wifi adapter). Ex: You have connected to 5GHz and share connection with 2.4GHz.
* Select Channel to share.
* Share your wifi like in Windows - Share wifi on same interface while you are connected to a network
### Dependencies
* Support both 2.4GHz and 5GHz (Need to compatible with your wifi adapter). Ex: You have connected to 5GHz and share connection with 2.4GHz
#### General
* bash
* util-linux (for getopt)
* procps or procps-ng
* hostapd
* iproute2
* iw
* iwconfig (you only need this if 'iw' can not recognize your adapter)
* haveged (optional)
* Select Channel to share
_Make sure you have those dependencies by typing them in terminal. If any of dependencies fail
install it using your distro's package manager_
#### For 'NATed' or 'None' Internet sharing method
* dnsmasq
* iptables
#### For building from source
* cmake (https://cmake.org)
* make
* gcc and g++
* build-essential
* pkg-config
* gtk
### Installing
## Installation
git clone https://github.com/lakinduakash/linux-wifi-hotspot
cd linux-wifi-hotspot
make
sudo make install
## Uninstallation
sudo make uninstall
Tested with Ubuntu 18.10. If any issue found file a issue on github.
**credits** - oblique

View File

@ -12,15 +12,35 @@ set (CMAKE_CXX_STANDARD 11)
add_executable(wihotspot ui/main.c ui/h_prop.c ui/h_prop.h ui/ui.c ui/ui.h ui/read_config.cpp ui/read_config.h ui/util.c ui/util.h)
target_link_libraries(${PROJECT_NAME} ${GTK_LIBRARIES} ${X11_LIBRARIES} config)
target_link_libraries(${PROJECT_NAME} ${GTK_LIBRARIES} ${X11_LIBRARIES})
include_directories(/usr/include)
set (source "${CMAKE_SOURCE_DIR}/ui/glade")
set (destination "${CMAKE_CURRENT_BINARY_DIR}/glade")
add_custom_command(
TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink ${source} ${destination}
DEPENDS ${destination}
COMMENT "symbolic link resources folder from ${source} => ${destination}"
)
set (appdir "/usr/share")
set (appbin "/usr/bin")
add_custom_target(install_build
COMMAND mkdir -p ${appdir}/${PROJECT_NAME}
COMMAND mkdir -p ${appdir}/${PROJECT_NAME}/glade
COMMAND install -Dm755 ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME} ${appdir}/${PROJECT_NAME}/${PROJECT_NAME}
COMMAND install -Dm755 ${CMAKE_CURRENT_BINARY_DIR}/glade/* ${appdir}/${PROJECT_NAME}/glade/
COMMAND ${CMAKE_COMMAND} -E create_symlink ${appdir}/${PROJECT_NAME}/${PROJECT_NAME} ${appbin}/${PROJECT_NAME}
DEPENDS ${PROJECT_NAME}
COMMENT Installing files...
)
add_custom_target(uninstall_build
COMMAND rm -r ${appdir}/${PROJECT_NAME}
COMMAND rm -f ${appbin}/${PROJECT_NAME}
COMMENT Unstalling files...
)

View File

@ -12,7 +12,10 @@
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
<property name="margin_right">10</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
@ -149,7 +152,215 @@
</packing>
</child>
<child>
<placeholder/>
<object class="GtkExpander">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">25</property>
<property name="margin_top">10</property>
<property name="row_spacing">5</property>
<property name="row_homogeneous">True</property>
<property name="column_homogeneous">True</property>
<child>
<object class="GtkCheckButton" id="cb_hidden">
<property name="label" translatable="yes">Hidden</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="cb_psk">
<property name="label" translatable="yes">Use psk</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">2</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="cb_mac">
<property name="label" translatable="yes">Set MAC</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">3</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="entry_mac">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">start</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">3</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="cb_novirt">
<property name="label" translatable="yes">No Virt</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">Do not create virtual interface</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">4</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="cb_channel">
<property name="label" translatable="yes">Channel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">5</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="entry_channel">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">start</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">5</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="rb_freq_2">
<property name="label" translatable="yes">2.4Ghz</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
<property name="group">rb_freq_auto</property>
</object>
<packing>
<property name="left_attach">2</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="rb_freq_auto">
<property name="label" translatable="yes">Auto</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<property name="group">rb_freq_5</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Frequency band</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="rb_freq_5">
<property name="label" translatable="yes">5Ghz</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
<property name="group">rb_freq_auto</property>
</object>
<packing>
<property name="left_attach">3</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Advance</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkBox">

View File

@ -4,13 +4,13 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <libconfig.h>
//#include <libconfig.h>
#include "h_prop.h"
#include "read_config.h"
#define BUFSIZE 1024
#define BUFSIZE 512
#define SUDO "pkexec --user root"
@ -28,11 +28,12 @@ char cmd_kill[BUFSIZE];
char running_info[BUFSIZE];
char interface_list[BUFSIZE];
char wifi_interface_list[BUFSIZE];
const char* g_ssid=NULL;
const char* g_pass=NULL;
config_t cfg;
//config_t cfg;
static int parse_output(const char *cmd) {
@ -93,38 +94,38 @@ const char* build_kill_create_ap_command(char* pid){
return cmd_kill;
}
int write_config(char* file){
config_t cfg;
config_setting_t *root, *setting, *group, *array;
int i;
config_init(&cfg);
root = config_root_setting(&cfg);
/* Add some settings to the configuration. */
setting = config_setting_add(root, SSID, CONFIG_TYPE_STRING);
config_setting_set_string(setting, "myssid");
setting = config_setting_add(root, PASSPHRASE, CONFIG_TYPE_STRING);
config_setting_set_string(setting, "123456789");
/* Write out the new configuration. */
if(! config_write_file(&cfg, get_config_file(CONFIG_FILE_NAME)))
{
fprintf(stderr, "Error while writing file.\n");
config_destroy(&cfg);
return(EXIT_FAILURE);
}
fprintf(stderr, "New configuration successfully written to: %s\n",
get_config_file(CONFIG_FILE_NAME));
config_destroy(&cfg);
return(EXIT_SUCCESS);
}
//int write_config(char* file){
//
// config_t cfg;
// config_setting_t *root, *setting, *group, *array;
// int i;
//
// config_init(&cfg);
// root = config_root_setting(&cfg);
//
// /* Add some settings to the configuration. */
//
//
// setting = config_setting_add(root, SSID, CONFIG_TYPE_STRING);
// config_setting_set_string(setting, "myssid");
//
// setting = config_setting_add(root, PASSPHRASE, CONFIG_TYPE_STRING);
// config_setting_set_string(setting, "123456789");
//
// /* Write out the new configuration. */
// if(! config_write_file(&cfg, get_config_file(CONFIG_FILE_NAME)))
// {
// fprintf(stderr, "Error while writing file.\n");
// config_destroy(&cfg);
// return(EXIT_FAILURE);
// }
//
// fprintf(stderr, "New configuration successfully written to: %s\n",
// get_config_file(CONFIG_FILE_NAME));
//
// config_destroy(&cfg);
// return(EXIT_SUCCESS);
//}
static int init_get_running(){
@ -247,3 +248,68 @@ char** get_interface_list(int *length){
return NULL;
}
static int init_get_wifi_interface_list(){
const char* cmd="iw dev | awk '$1==\"Interface\"{print $2}' ";
FILE *fp;
if ((fp = popen(cmd, "r")) == NULL) {
printf("Error opening pipe!\n");
return -1;
}
while (fgets(wifi_interface_list, BUFSIZE, fp) != NULL) {
// Do whatever you want here...
}
if (pclose(fp)) {
printf("Command not found or exited with error status\n");
return -1;
}
return 0;
}
char** get_wifi_interface_list(int *length){
if(init_get_wifi_interface_list()==0){
char *a=strdup(wifi_interface_list);
char *b=strdup(wifi_interface_list);
char * pch;
pch = strtok (a,"\n");
int i=0;
while (pch != NULL)
{
pch = strtok (NULL, "\n");
i++;
}
static char** arr;
arr =malloc(i * sizeof(char*));
free(a);
pch = strtok (b,"\n");
i=0;
while (pch != NULL)
{
arr[i]=strdup(pch);
pch = strtok (NULL, "\n");
i++;
}
*length= i;
return arr;
}
return NULL;
}

View File

@ -23,4 +23,6 @@ static int init_get_interface_list();
char** get_interface_list(int*);
const char* build_kill_create_ap_command(char* pid);
char** get_wifi_interface_list(int *length);
#endif //WIHOTSPOT_H_PROP_H

View File

@ -13,19 +13,31 @@
#include "read_config.h"
#include "util.h"
#define BUFSIZE 1024
#define BUFSIZE 512
#define AP_ENABLED "AP-ENABLED"
GtkBuilder *builder;
GObject *window;
GtkButton *button_create_hp;
GtkButton *button_stop_hp;
GtkEntry *entry_ssd;
GtkEntry *entry_pass;
GtkEntry *entry_mac;
GtkEntry *entry_channel;
GtkComboBox *combo_wifi;
GtkComboBox *combo_internet;
GtkRadioButton *rb_freq_auto;
GtkRadioButton *rb_freq_2;
GtkRadioButton *rb_freq_5;
GtkCheckButton *cb_hidden;
GtkCheckButton *cb_psk;
GtkCheckButton *cb_mac;
GtkCheckButton *cb_novirt;
GtkProgressBar *progress_bar;
GtkLabel *label_status;
@ -34,16 +46,17 @@ GError *error = NULL;
const char** iface_list;
const char** wifi_iface_list;
int iface_list_length;
int wifi_iface_list_length;
char* running_info[3];
guint id;
void *stopHp();
void *stopHp() {
static void *stopHp() {
if(running_info[0]!=NULL){
gtk_label_set_label(label_status,"Stopping ...");
start_pb_pulse();
lock_all_views(TRUE);
startShell(build_kill_create_ap_command(running_info[0]));
@ -93,13 +106,32 @@ int initUi(int argc, char *argv[]){
gtk_init(&argc, &argv);
/* Construct a GtkBuilder instance and load our UI description */
const char* debug_glade_file="glade/wifih.ui";
const char* prod_glade_file="/usr/share/wihotspot/glade/wifih.ui";
FILE *file;
builder = gtk_builder_new();
if (gtk_builder_add_from_file(builder, "glade/wifih.ui", &error) == 0) {
g_printerr("Error loading file: %s\n", error->message);
g_clear_error(&error);
if ((file = fopen(debug_glade_file, "r"))){
fclose(file);
if (gtk_builder_add_from_file(builder, debug_glade_file, &error) == 0) {
g_printerr("Error loading file: %s\n", error->message);
g_clear_error(&error);
return 1;
}
}
else if ((file = fopen(prod_glade_file, "r"))){
fclose(file);
if (gtk_builder_add_from_file(builder, prod_glade_file, &error) == 0) {
g_printerr("Error loading file: %s\n", error->message);
g_clear_error(&error);
return 1;
}
} else{
return 1;
}
/* Connect signal handlers to the constructed widgets. */
window = gtk_builder_get_object(builder, "window");
g_signal_connect (window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
@ -111,17 +143,23 @@ int initUi(int argc, char *argv[]){
entry_ssd = (GtkEntry *) gtk_builder_get_object(builder, "entry_ssid");
entry_pass = (GtkEntry *) gtk_builder_get_object(builder, "entry_pass");
entry_mac = (GtkEntry *) gtk_builder_get_object(builder, "entry_mac");
entry_channel = (GtkEntry *) gtk_builder_get_object(builder, "entry_channel");
combo_wifi = (GtkComboBox *) gtk_builder_get_object(builder, "combo_wifi");
combo_internet = (GtkComboBox *) gtk_builder_get_object(builder, "combo_internet");
cb_hidden = (GtkCheckButton *) gtk_builder_get_object(builder, "cb_hidden");
cb_psk = (GtkCheckButton *) gtk_builder_get_object(builder, "cb_psk");
cb_mac = (GtkCheckButton *) gtk_builder_get_object(builder, "cb_mac");
cb_novirt = (GtkCheckButton *) gtk_builder_get_object(builder, "cb_novirt");
label_status = (GtkLabel *) gtk_builder_get_object(builder, "label_status");
progress_bar = (GtkProgressBar *) gtk_builder_get_object(builder, "progress_bar");
//gtk_entry_set_visibility(entry_pass,FALSE);
WIData wiData = {
.pass= entry_pass,
@ -159,7 +197,7 @@ void init_ui_from_config(WIData* data){
gtk_entry_set_text(data->pass,values->pass);
if(values->iface_wifi!=NULL){
int idw=find_str(values->iface_wifi,iface_list,iface_list_length);
int idw=find_str(values->iface_wifi,wifi_iface_list,wifi_iface_list_length);
if(idw !=-1){
gtk_combo_box_set_active(combo_wifi,idw);
@ -180,13 +218,19 @@ void init_ui_from_config(WIData* data){
void init_interface_list(){
iface_list_length=0;
wifi_iface_list_length=0;
iface_list=(const char**)get_interface_list(&iface_list_length);
wifi_iface_list=(const char**)get_wifi_interface_list(&wifi_iface_list_length);
for (int i = 0; i < iface_list_length; i++){
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_wifi), iface_list[i]);
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_internet), iface_list[i]);
}
for (int i = 0; i < wifi_iface_list_length; i++){
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_wifi), wifi_iface_list[i]);
}
}
@ -260,6 +304,8 @@ void* init_running_info(){
clear_running_info();
lock_all_views(TRUE);
gtk_label_set_label(label_status,"Getting running info...");
get_running_info(running_info);
if(running_info[0]!=NULL){

View File

@ -32,4 +32,6 @@ static guint start_pb_pulse();
static void on_create_hp_clicked(GtkWidget *widget,gpointer data);
static void *stopHp();
#endif //WIHOTSPOT_UI_H

View File

@ -3,6 +3,8 @@
//
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include "util.h"
int find_str(char *find, const char **array, int length) {
@ -18,3 +20,16 @@ int find_str(char *find, const char **array, int length) {
return -1;
}
void rand_str(char *dest, size_t length) {
char charset[] = "0123456789"
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
while (length-- > 0) {
size_t index = (size_t) ((double) rand() / RAND_MAX * (sizeof charset - 1));
*dest++ = charset[index];
}
*dest = '\0';
}

View File

@ -6,5 +6,6 @@
#define WIHOTSPOT_UTIL_H
int find_str(char *find, const char **array, int length);
void rand_str(char *dest, size_t length);
#endif //WIHOTSPOT_UTIL_H