aboutsummaryrefslogtreecommitdiff
path: root/captain/captain.f90
diff options
context:
space:
mode:
authorJeffrey Armstrong <jeff@approximatrix.com>2021-05-06 10:17:52 -0400
committerJeffrey Armstrong <jeff@approximatrix.com>2021-05-06 10:17:52 -0400
commitb9cac9bb26fe388abff34fa4fc562b0804cabb2e (patch)
treeef226cdcb40e627b74f013ff7fc962a72054debb /captain/captain.f90
parent8ca6d21882c521fb78f1325e9a88a558364b3ad4 (diff)
downloadlevitating-b9cac9bb26fe388abff34fa4fc562b0804cabb2e.tar.gz
levitating-b9cac9bb26fe388abff34fa4fc562b0804cabb2e.zip
Fixed spelling of captain.
Diffstat (limited to 'captain/captain.f90')
-rw-r--r--captain/captain.f90140
1 files changed, 140 insertions, 0 deletions
diff --git a/captain/captain.f90 b/captain/captain.f90
new file mode 100644
index 0000000..76ea768
--- /dev/null
+++ b/captain/captain.f90
@@ -0,0 +1,140 @@
+! Copyright (c) 2021 Approximatrix, LLC <support@approximatrix.com>
+!
+! Permission is hereby granted, free of charge, to any person obtaining a copy
+! of this software and associated documentation files (the "Software"), to deal
+! in the Software without restriction, including without limitation the rights
+! to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+! copies of the Software, and to permit persons to whom the Software is
+! furnished to do so, subject to the following conditions:
+!
+! The above copyright notice and this permission notice shall be included in
+! all copies or substantial portions of the Software.
+!
+! The Software shall be used for Good, not Evil.
+!
+! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+! IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+! FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+! AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+! LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+! OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+! SOFTWARE.
+
+program captain
+use captain_db
+use config
+use logging, only: initialize_log => initialize, shutdown_log => shutdown, write_log, LOG_INFO
+use gemini, only: handle_gemini => handle_request
+use web, only: handle_web => handle_request
+implicit none
+
+ integer::mode
+ integer, parameter::MODE_GEMINI = 1, &
+ MODE_CGI_HTML = 2
+
+ call random_seed() ! For possible crypto
+
+ call parse_options()
+
+ call initialize_log(log_filename, loglevel)
+
+ call initialize_db(database_filename)
+
+ select case(mode)
+ case(MODE_GEMINI)
+ call handle_gemini()
+ case(MODE_CGI_HTML)
+ call handle_web()
+ end select
+
+ call shutdown_db()
+
+ call write_log("Process complete", LOG_INFO)
+
+ call shutdown_log()
+
+contains
+
+ subroutine usage()
+ implicit none
+
+ character(len=256)::pname
+
+ call get_command_argument(0, pname)
+
+ Print *, "Usage: "//trim(pname)//" <options>"
+ Print *, " "
+
+ Print *, "Options:"
+ Print *, " -h Display this help"
+ Print *, " -c <configfile> Use the specified config file"
+ Print *, " -g Operate in Gemini mode"
+ Print *, " -w Operate in CGI mode (default)"
+ Print *, " "
+ Print *, "Config file can also be specified via the environment variables:"
+ Print *, " LEVITATING_CONFIG_CGI Path to config for CGI mode"
+ Print *, " LEVITATING_CONFIG_GEMINI Path to config for Gemini mode"
+
+ end subroutine usage
+
+ subroutine parse_options
+ use config
+ implicit none
+
+ character(len=1024)::option
+ logical::config_loaded
+ integer::i
+
+ config_loaded = .false.
+ mode = MODE_CGI_HTML
+ loglevel = 3
+
+ i = 1
+ do while(i <= command_argument_count())
+ call get_command_argument(i, option)
+
+ if(trim(option) == "-h") then
+ call usage()
+ stop
+
+ else if(trim(option) == "-g") then
+ mode = MODE_GEMINI
+
+ else if(trim(option) == "-c") then
+ i = i + 1
+ call get_command_argument(i, option)
+ call load_configuration(trim(option))
+ config_loaded = .true.
+
+ end if
+
+ i = i + 1
+ end do
+
+ if(.not. config_loaded) then
+ call get_environment_variable("LEVITATING_CONFIG_CGI", value=option, status=i)
+ if(i == 0) then
+ call load_configuration(trim(option))
+ config_loaded = .true.
+ mode = MODE_CGI_HTML
+ end if
+ end if
+
+ if(.not. config_loaded) then
+ call get_environment_variable("LEVITATING_CONFIG_GEMINI", value=option, status=i)
+ if(i == 0) then
+ call load_configuration(trim(option))
+ config_loaded = .true.
+ mode = MODE_GEMINI
+ end if
+ end if
+
+ ! Assign working directory from command if not specified
+ if(.not. config_loaded) then
+ Print *, "No configuration file specified"
+ stop
+ end if
+
+ end subroutine parse_options
+
+end program captain \ No newline at end of file