#!/bin/bash set -e services_path="/etc/yunohost/services.yml" do_init_regen() { if [[ $EUID -ne 0 ]]; then echo "You must be root to run this script" 1>&2 exit 1 fi cd /usr/share/yunohost/templates/yunohost [[ -d /etc/yunohost ]] || mkdir -p /etc/yunohost # set default current_host [[ -f /etc/yunohost/current_host ]] \ || echo "yunohost.org" > /etc/yunohost/current_host # copy default services and firewall [[ -f $services_path ]] \ || cp services.yml "$services_path" [[ -f /etc/yunohost/firewall.yml ]] \ || cp firewall.yml /etc/yunohost/firewall.yml # allow users to access /media directory [[ -d /etc/skel/media ]] \ || (mkdir -p /media && ln -s /media /etc/skel/media) } do_pre_regen() { pending_dir=$1 cd /usr/share/yunohost/templates/yunohost # update services.yml if [[ -f $services_path ]]; then tmp_services_path="${services_path}-tmp" new_services_path="${services_path}-new" cp "$services_path" "$tmp_services_path" _update_services "$new_services_path" || { mv "$tmp_services_path" "$services_path" exit 1 } if [[ -f $new_services_path ]]; then # replace services.yml with new one mv "$new_services_path" "$services_path" mv "$tmp_services_path" "${services_path}-old" else rm -f "$tmp_services_path" fi else cp services.yml /etc/yunohost/services.yml fi # add cron job for diagnosis to be ran at 7h and 19h + a random delay between # 0 and 10min, meant to avoid every instances running their diagnosis at # exactly the same time, which may overload the diagnosis server. mkdir -p $pending_dir/etc/cron.d/ cat > $pending_dir/etc/cron.d/yunohost-diagnosis << EOF SHELL=/bin/bash 0 7,19 * * * root : YunoHost Diagnosis; sleep \$((RANDOM\\%600)); yunohost diagnosis run > /dev/null EOF } _update_services() { python2 - << EOF import yaml with open('services.yml') as f: new_services = yaml.load(f) with open('/etc/yunohost/services.yml') as f: services = yaml.load(f) updated = False for service, conf in new_services.items(): # remove service with empty conf if conf is None: if service in services: print("removing '{0}' from services".format(service)) del services[service] updated = True # add new service elif not services.get(service, None): print("adding '{0}' to services".format(service)) services[service] = conf updated = True # update service conf else: conffiles = services[service].pop('conffiles', {}) # status need to be removed if "status" not in conf and "status" in services[service]: print("update '{0}' service status access".format(service)) del services[service]["status"] updated = True if services[service] != conf: print("update '{0}' service".format(service)) services[service].update(conf) updated = True if conffiles: services[service]['conffiles'] = conffiles # Remove legacy /var/log/daemon.log and /var/log/syslog from log entries # because they are too general. Instead, now the journalctl log is # returned by default which is more relevant. if "log" in services[service]: if services[service]["log"] in ["/var/log/syslog", "/var/log/daemon.log"]: del services[service]["log"] if updated: with open('/etc/yunohost/services.yml-new', 'w') as f: yaml.safe_dump(services, f, default_flow_style=False) EOF } FORCE=${2:-0} DRY_RUN=${3:-0} case "$1" in pre) do_pre_regen $4 ;; post) ;; init) do_init_regen ;; *) echo "hook called with unknown argument \`$1'" >&2 exit 1 ;; esac exit 0