Update crontab entries on source update

This commit is contained in:
Tim Van Baak 2023-06-22 21:47:16 -07:00
parent 7737db1883
commit ff13c845eb
5 changed files with 20 additions and 29 deletions

View File

@ -46,9 +46,11 @@ intake
}
```
Each key under `action` defines an action that can be taken for the source. A minimal `intake.json` must contain a `fetch` action with an `exe`. All other configs are optional.
Each key under `action` defines an action that can be taken for the source. An action must contain `exe` and may contain `args`. A source must have a `fetch` action.
The `fetch` action is executed by `intake update`. All other actions are executable with `intake action`. `intake crontab` will create a crontab entry for each source with a `cron` config defined. The value of `cron` is the crontab spec according to which the source should be updated.
Each key under `env` defines an environment variable that will be set when actions are executed.
If `cron` is present, it must define a crontab schedule. Intake will automatically create crontab entries to update each source according to its cron schedule.
## Interface for source programs
@ -66,7 +68,7 @@ The `fetch` action is used to fetch the current state of the feed source. It rec
An item must have a key under `action` with that action's name to support executing that action for that item. The value under that key may be any JSON structure used to manage the item-specific state.
All encoding is done with UTF-8. If an item cannot be parsed or the exit code of the process is nonzero, Intake will consider the action to be a failure. No items or other feed changes will happen as a result of a failed action, except for changes to `state` done by the action process.
All input and output is treated as UTF-8. If an item cannot be parsed or the exit code of the process is nonzero, Intake will consider the action to be a failure. No items or other feed changes will happen as a result of a failed action, except for changes to `state` done by the action process.
## Top-level item fields

View File

@ -67,19 +67,21 @@
# Include some demo instructions
environment.etc.issue.text = ''
###
# Welcome to the intake demo! Log in as `alice` with password `alpha` to begin.
#
# Exit the VM with ctrl+a x, or switch to the qemu console with ctrl+a c and `quit`.
###
'';
users.motd = ''
###
# To set a password for the web interface, run `intake passwd` and set a password.
#
# Within this demo VM, the main intake entry point can be found at localhost:8080. This is also exposed on the host machine at localhost:5234. After you set a password, navigate to localhost:5234 on your host machine and log in to see the web interface.
# Try updating the currenttime source by running `intake update -s currenttime`. You should see a new item after refreshing the source's feed.
# The `echo` source demonstrates the use of `env` source configuration. Try changing the message in the web interface or via `intake edit -s echo`, then updating the source.
#
# Try updating the `echo` source by running `intake update -s echo`. You should see a new item after refreshing the source's feed. This source uses `env` source configuration, so use `intake edit -s echo` or the web interface to change the message, then update the source again.
#
# Updating a source will also trigger intake to update the user crontab. If you run `crontab -l`, you should see that the `currenttime` source has a crontab entry. You can change this source's cron schedule in the source config.
###
'';
}

View File

@ -19,6 +19,7 @@ from flask import (
)
from intake.core import intake_data_dir
from intake.crontab import update_crontab_entries
from intake.source import LocalSource, execute_action, Item
# Globals
@ -273,6 +274,7 @@ def source_edit(name):
error_message, config = _parse_source_config(config_str)
if not error_message:
source.save_config(config)
update_crontab_entries(data_path)
return redirect(url_for("root"))
# For GET, load the config

View File

@ -82,6 +82,7 @@ def cmd_edit(cmd_args):
return 0
tmp_path.replace(source.source_path / "intake.json")
update_crontab_entries(data_path)
break
return 0
@ -297,24 +298,6 @@ def cmd_passwd(cmd_args):
return 0
def cmd_crontab(cmd_args):
"""Update cron with configured source cron entries."""
parser = argparse.ArgumentParser(
prog="intake crontab",
description=cmd_crontab.__doc__,
)
parser.add_argument(
"--data",
"-d",
help="Path to the intake data directory containing source directories",
)
args = parser.parse_args(cmd_args)
data_path: Path = Path(args.data) if args.data else intake_data_dir()
update_crontab_entries(data_path)
return 0
def cmd_run(cmd_args):
"""Run the default Flask server."""
parser = argparse.ArgumentParser(

View File

@ -112,6 +112,8 @@ in {
systemd.services =
let
runScript = userName: pkgs.writeShellScript "intake-run.sh" ''
# Add the setuid wrapper directory so `crontab` is accessible
export PATH="${config.security.wrapperDir}:$PATH"
${pythonEnv}/bin/intake run -d /home/${userName}/.local/share/intake --port ${toString userPort.${userName}}
'';
# systemd service definition for a single user, given `services.intake.users.userName` = `userCfg`