Main.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include <beaker.h>
  2. #include <curl/curl.h>
  3. #include <libxml/parser.h>
  4. #include <signal.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include "Cache/Cache.h"
  8. #include "Config.h"
  9. #include "Infobox/Wikipedia.h"
  10. #include "Proxy/Proxy.h"
  11. #include "Routes/Home.h"
  12. #include "Routes/ImageProxy.h"
  13. #include "Routes/Images.h"
  14. #include "Routes/Search.h"
  15. #include "Scraping/Scraping.h"
  16. Config global_config;
  17. int handle_opensearch(UrlParams *params) {
  18. (void)params;
  19. extern Config global_config;
  20. TemplateContext ctx = new_context();
  21. context_set(&ctx, "domain", global_config.domain);
  22. char *rendered = render_template("opensearch.xml", &ctx);
  23. serve_data(rendered, strlen(rendered), "application/opensearchdescription+xml");
  24. free(rendered);
  25. free_context(&ctx);
  26. return 0;
  27. }
  28. int main() {
  29. sigset_t mask;
  30. sigemptyset(&mask);
  31. sigaddset(&mask, SIGPIPE);
  32. pthread_sigmask(SIG_BLOCK, &mask, NULL);
  33. LIBXML_TEST_VERSION
  34. xmlInitParser();
  35. curl_global_init(CURL_GLOBAL_DEFAULT);
  36. Config cfg = {.host = DEFAULT_HOST,
  37. .port = DEFAULT_PORT,
  38. .domain = "",
  39. .proxy = "",
  40. .proxy_list_file = "",
  41. .max_proxy_retries = DEFAULT_MAX_PROXY_RETRIES,
  42. .randomize_username = 0,
  43. .randomize_password = 0,
  44. .cache_dir = DEFAULT_CACHE_DIR,
  45. .cache_ttl_search = DEFAULT_CACHE_TTL_SEARCH,
  46. .cache_ttl_infobox = DEFAULT_CACHE_TTL_INFOBOX};
  47. if (load_config("config.ini", &cfg) != 0) {
  48. fprintf(stderr, "[WARN] Could not load config file, using defaults\n");
  49. }
  50. global_config = cfg;
  51. if (cache_init(cfg.cache_dir) != 0) {
  52. fprintf(stderr,
  53. "[WARN] Failed to initialize cache, continuing without caching\n");
  54. } else {
  55. fprintf(stderr, "[INFO] Cache initialized at %s\n", cfg.cache_dir);
  56. cache_cleanup(cfg.cache_ttl_search);
  57. }
  58. set_cache_ttl_search(cfg.cache_ttl_search);
  59. set_cache_ttl_infobox(cfg.cache_ttl_infobox);
  60. if (cfg.proxy_list_file[0] != '\0') {
  61. if (load_proxy_list(cfg.proxy_list_file) < 0) {
  62. fprintf(stderr,
  63. "[WARN] Failed to load proxy list, continuing without proxies\n");
  64. }
  65. }
  66. max_proxy_retries = cfg.max_proxy_retries;
  67. set_proxy_config(cfg.proxy, cfg.randomize_username, cfg.randomize_password);
  68. if (proxy_url[0] != '\0') {
  69. fprintf(stderr, "[INFO] Using proxy: %s\n", proxy_url);
  70. } else if (proxy_count > 0) {
  71. fprintf(stderr, "[INFO] Using %d proxies from %s\n", proxy_count,
  72. cfg.proxy_list_file);
  73. }
  74. set_handler("/", home_handler);
  75. set_handler("/opensearch.xml", handle_opensearch);
  76. set_handler("/search", results_handler);
  77. set_handler("/images", images_handler);
  78. set_handler("/proxy", image_proxy_handler);
  79. fprintf(stderr, "[INFO] Starting Omnisearch on %s:%d\n", cfg.host, cfg.port);
  80. int result = beaker_run(cfg.host, cfg.port);
  81. if (result != 0) {
  82. fprintf(stderr, "[ERROR] Beaker server failed to start.\n");
  83. curl_global_cleanup();
  84. xmlCleanupParser();
  85. return EXIT_FAILURE;
  86. }
  87. curl_global_cleanup();
  88. xmlCleanupParser();
  89. free_proxy_list();
  90. cache_shutdown();
  91. return EXIT_SUCCESS;
  92. }