diff --git a/src/cron/cli.v b/src/cron/cli.v index 8e6b0f1..4d2b133 100644 --- a/src/cron/cli.v +++ b/src/cron/cli.v @@ -10,6 +10,9 @@ pub: api_key string address string base_image string = 'archlinux:base-devel' + max_concurrent_builds int = 1 + api_update_frequency int = 60 + global_schedule string } // cmd returns the cli module that handles the cron daemon. diff --git a/src/cron/cron.v b/src/cron/cron.v index 3ba9d0f..3d3ea9a 100644 --- a/src/cron/cron.v +++ b/src/cron/cron.v @@ -2,17 +2,23 @@ module cron import git import time - -struct ScheduledBuild { - repo git.GitRepo - timestamp time.Time -} - -fn (r1 ScheduledBuild) < (r2 ScheduledBuild) bool { - return r1.timestamp < r2.timestamp -} +import log +import util +import cron.daemon // cron starts a cron daemon & starts periodically scheduling builds. pub fn cron(conf Config) ? { - println('WIP') + // Configure logger + log_level := log.level_from_tag(conf.log_level) or { + util.exit_with_message(1, 'Invalid log level. The allowed values are FATAL, ERROR, WARN, INFO & DEBUG.') + } + + mut logger := log.Log{ + level: log_level + } + + logger.set_full_logpath(conf.log_file) + logger.log_to_console_too() + + d := daemon.init(conf) } diff --git a/src/cron/daemon/daemon.v b/src/cron/daemon/daemon.v new file mode 100644 index 0000000..a887717 --- /dev/null +++ b/src/cron/daemon/daemon.v @@ -0,0 +1,54 @@ +module daemon + +import git +import time +import log +import datatypes + +struct ScheduledBuild { + repo git.GitRepo + timestamp time.Time +} + +fn (r1 ScheduledBuild) < (r2 ScheduledBuild) bool { + return r1.timestamp < r2.timestamp +} + +pub struct Daemon { +mut: + conf Config + // Repos currently loaded from API. + repos_map map[string]git.GitRepo + // At what point to update the list of repositories. + api_update_timestamp time.Time + queue datatypes.MinHeap + // Which builds are currently running + builds []git.GitRepo + // Atomic variables used to detect when a build has finished; length is the + // same as builds + atomics []u64 + logger shared log.Log +} + +// init +pub fn init(conf Config) Daemon { + return Daemon{ + conf: conf + atomics: [conf.max_concurrent_builds]u64{} + } +} + +fn (mut d Daemon) run() ? { + d.renew_repos() ? + d.renew_queue() ? +} + +fn (mut d Daemon) renew_repos() ? { + mut new_repos := git.get_repos(d.conf.address, d.conf.api_key) ? + + d.repos_map = new_repos.move() +} + +fn (mut d Daemon) renew_queue() ? { + +} diff --git a/src/cron/daemon/log.v b/src/cron/daemon/log.v new file mode 100644 index 0000000..003898b --- /dev/null +++ b/src/cron/daemon/log.v @@ -0,0 +1,35 @@ +module daemon + +import log + +// log reate a log message with the given level +pub fn (mut d Daemon) log(msg &string, level log.Level) { + lock d.logger { + d.logger.send_output(msg, level) + } +} + +// lfatal create a log message with the fatal level +pub fn (mut d Daemon) lfatal(msg &string) { + d.log(msg, log.Level.fatal) +} + +// lerror create a log message with the error level +pub fn (mut d Daemon) lerror(msg &string) { + d.log(msg, log.Level.error) +} + +// lwarn create a log message with the warn level +pub fn (mut d Daemon) lwarn(msg &string) { + d.log(msg, log.Level.warn) +} + +// linfo create a log message with the info level +pub fn (mut d Daemon) linfo(msg &string) { + d.log(msg, log.Level.info) +} + +// ldebug create a log message with the debug level +pub fn (mut d Daemon) ldebug(msg &string) { + d.log(msg, log.Level.debug) +} diff --git a/src/cron/expression.v b/src/cron/expression.v index 0a35541..b35c568 100644 --- a/src/cron/expression.v +++ b/src/cron/expression.v @@ -241,7 +241,7 @@ fn parse_expression(exp string) ?CronExpression { // This for loop allows us to more clearly propagate the error to the user. for i, min in mins { part_results << parse_part(parts[i], min, maxs[i]) or { - return error('An error occurred with part $i: $err.msg') + return error('An error occurred with part $i: $err.msg()') } } diff --git a/src/git/git.v b/src/git/git.v index eaec895..45aed60 100644 --- a/src/git/git.v +++ b/src/git/git.v @@ -14,6 +14,8 @@ pub mut: arch []string // Which repo the builder should publish packages to repo string + // Cron schedule describing how frequently to build the repo. + schedule string } // patch_from_params patches a GitRepo from a map[string]string, usually