add example
This commit is contained in:
113
main/sshd_task.c
Normal file
113
main/sshd_task.c
Normal file
@@ -0,0 +1,113 @@
|
||||
#include <esp_littlefs.h>
|
||||
#include <libssh/libssh.h>
|
||||
#include <libssh/server.h>
|
||||
#include <libssh/callbacks.h>
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include <sys/queue.h>
|
||||
#include "example.h"
|
||||
#include "sshd.h"
|
||||
|
||||
#define BASE_PATH "/littlefs"
|
||||
#define CERT_KEY_PATH BASE_PATH "/key"
|
||||
#define CERT_PUB_PATH BASE_PATH "/key.pub"
|
||||
|
||||
#define BUF_SIZE 256
|
||||
|
||||
static char key[BUF_SIZE];
|
||||
|
||||
static struct ssh_user hardcoded_example_users[] = {
|
||||
{
|
||||
.su_user = "odroid",
|
||||
.su_password = "odroid",
|
||||
},
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
static esp_err_t init_storage()
|
||||
{
|
||||
esp_err_t ret;
|
||||
esp_vfs_littlefs_conf_t conf = {
|
||||
.base_path = "/littlefs",
|
||||
.partition_label = "storage",
|
||||
.format_if_mount_failed = true,
|
||||
.dont_mount = false,
|
||||
};
|
||||
|
||||
ret = esp_vfs_littlefs_register(&conf);
|
||||
if (ret != ESP_OK)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
static esp_err_t load_key_pair(char *path, char* buf, size_t buf_size)
|
||||
{
|
||||
FILE *fp;
|
||||
size_t size;
|
||||
fp = fopen(path, "r");
|
||||
esp_err_t ret;
|
||||
if (fp == NULL)
|
||||
{
|
||||
return ESP_FAIL;
|
||||
}
|
||||
|
||||
memset(buf, 0, buf_size);
|
||||
|
||||
fseek(fp, 0, SEEK_END);
|
||||
size = ftell(fp);
|
||||
rewind(fp);
|
||||
|
||||
if (fread(buf, 1, buf_size, fp) == size)
|
||||
{
|
||||
ret = ESP_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = ESP_FAIL;
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct ssh_user *
|
||||
lookup_user(struct server_ctx *sc, const char *user)
|
||||
{
|
||||
struct ssh_user *su;
|
||||
for (su = hardcoded_example_users; su->su_user; su++) {
|
||||
if (strcmp(user, su->su_user) == 0)
|
||||
return su;
|
||||
}
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
sshd_task(void *arg)
|
||||
{
|
||||
struct server_ctx *sc;
|
||||
sc = calloc(1, sizeof(struct server_ctx));
|
||||
if (!sc)
|
||||
return;
|
||||
sc->sc_host_key = key;
|
||||
sc->sc_lookup_user = lookup_user;
|
||||
sc->sc_begin_interactive_session = minicli_begin_interactive_session;
|
||||
sc->sc_auth_methods = SSH_AUTH_METHOD_PASSWORD;
|
||||
sshd_main(sc);
|
||||
|
||||
vTaskDelete(NULL);
|
||||
}
|
||||
|
||||
void
|
||||
start_sshd(void)
|
||||
{
|
||||
init_storage();
|
||||
load_key_pair(CERT_KEY_PATH, key, BUF_SIZE);
|
||||
|
||||
puts(key);
|
||||
|
||||
xTaskCreate(sshd_task, "sshd", 32768, NULL, 10, NULL);
|
||||
}
|
||||
Reference in New Issue
Block a user