| @@ -276,7 +276,6 @@ matrix_mautrix_telegram_login_shared_secret: "{{ matrix_synapse_ext_password_pro | |||||
| # | # | ||||
| ###################################################################### | ###################################################################### | ||||
| ###################################################################### | ###################################################################### | ||||
| # | # | ||||
| # matrix-bridge-mautrix-whatsapp | # matrix-bridge-mautrix-whatsapp | ||||
| @@ -305,6 +304,33 @@ matrix_mautrix_whatsapp_login_shared_secret: "{{ matrix_synapse_ext_password_pro | |||||
| # | # | ||||
| ###################################################################### | ###################################################################### | ||||
| ###################################################################### | |||||
| # | |||||
| # matrix-sms-bridge | |||||
| # | |||||
| ###################################################################### | |||||
| # We don't enable bridges by default. | |||||
| matrix_sms_bridge_enabled: false | |||||
| matrix_sms_bridge_systemd_required_services_list: | | |||||
| {{ | |||||
| ['docker.service'] | |||||
| + | |||||
| (['matrix-synapse.service'] if matrix_synapse_enabled else []) | |||||
| }} | |||||
| matrix_sms_bridge_appservice_token: "{{ matrix_synapse_macaroon_secret_key | password_hash('sha512', 'sms.as.token') | to_uuid }}" | |||||
| matrix_sms_bridge_homeserver_token: "{{ matrix_synapse_macaroon_secret_key | password_hash('sha512', 'sms.hs.token') | to_uuid }}" | |||||
| matrix_sms_bridge_database_password: "{{ matrix_synapse_macaroon_secret_key | password_hash('sha512', 'sms.db.password') | to_uuid }}" | |||||
| ###################################################################### | |||||
| # | |||||
| # /matrix-sms-bridge | |||||
| # | |||||
| ###################################################################### | |||||
| ###################################################################### | ###################################################################### | ||||
| # | # | ||||
| @@ -0,0 +1,151 @@ | |||||
| # matrix-sms-bridge is a Matrix <-> SMS bridge | |||||
| # See: https://github.com/benkuly/matrix-sms-bridge | |||||
| matrix_sms_bridge_enabled: true | |||||
| matrix_sms_bridge_docker_image: "folivonet/matrix-sms-bridge:latest" | |||||
| matrix_sms_bridge_docker_image_force_pull: "{{ matrix_sms_bridge_docker_image.endswith(':latest') }}" | |||||
| matrix_sms_bridge_database_docker_image: "neo4j:latest" | |||||
| matrix_sms_bridge_database_docker_image_force_pull: "{{ matrix_sms_bridge_docker_image.endswith(':latest') }}" | |||||
| matrix_sms_bridge_base_path: "{{ matrix_base_data_path }}/matrix-sms-bridge" | |||||
| matrix_sms_bridge_config_path: "{{ matrix_base_data_path }}/matrix-sms-bridge/config" | |||||
| matrix_sms_bridge_data_path: "{{ matrix_base_data_path }}/matrix-sms-bridge/data" | |||||
| matrix_sms_bridge_data_spool_path: "{{ matrix_base_data_path }}/matrix-sms-bridge/data/spool" | |||||
| matrix_sms_bridge_data_spool_inbox_path: "{{ matrix_base_data_path }}/matrix-sms-bridge/data/spool/inbox" | |||||
| matrix_sms_bridge_data_spool_inbox_processed_path: "{{ matrix_base_data_path }}/matrix-sms-bridge/data/spool/inbox_processed" | |||||
| matrix_sms_bridge_data_spool_outbox_path: "{{ matrix_base_data_path }}/matrix-sms-bridge/data/spool/outbox" | |||||
| matrix_sms_bridge_data_spool_sent_path: "{{ matrix_base_data_path }}/matrix-sms-bridge/data/spool/sent" | |||||
| matrix_sms_bridge_data_spool_error_path: "{{ matrix_base_data_path }}/matrix-sms-bridge/data/spool/error" | |||||
| matrix_sms_bridge_database_path: "{{ matrix_base_data_path }}/matrix-sms-bridge/database" | |||||
| matrix_sms_bridge_appservice_token: '' | |||||
| matrix_sms_bridge_homeserver_token: '' | |||||
| matrix_sms_bridge_database_username: 'matrix-sms-bridge' | |||||
| matrix_sms_bridge_database_password: '' | |||||
| matrix_sms_bridge_container_http_host_bind_port: '' | |||||
| # A list of extra arguments to pass to the container | |||||
| matrix_sms_bridge_container_extra_arguments: [] | |||||
| # List of systemd services that matrix-appservice-discord.service depends on. | |||||
| matrix_sms_bridge_systemd_required_services_list: ['docker.service'] | |||||
| # List of systemd services that matrix-appservice-discord.service wants | |||||
| matrix_sms_bridge_systemd_wanted_services_list: [] | |||||
| matrix_sms_bridge_appservice_url: 'http://matrix-sms-bridge:8080' | |||||
| matrix_sms_bridge_database_url: 'bolt://matrix-sms-bridge-database:7687' | |||||
| matrix_sms_bridge_homeserver_hostname: 'matrix-synapse' | |||||
| matrix_sms_bridge_homeserver_port: '8008' | |||||
| matrix_sms_bridge_homserver_domain: "{{ matrix_domain }}" | |||||
| matrix_sms_bridge_default_room: '' | |||||
| matrix_sms_bridge_gammu_modem: '' | |||||
| matrix_sms_bridge_configuration_yaml: | | |||||
| #jinja2: lstrip_blocks: "True" | |||||
| # Database connection | |||||
| org: | |||||
| neo4j: | |||||
| driver: | |||||
| uri: {{ matrix_sms_bridge_database_url }} | |||||
| authentication: | |||||
| username: {{ matrix_sms_bridge_database_username }} | |||||
| password: {{ matrix_sms_bridge_database_password }} | |||||
| matrix: | |||||
| bridge: | |||||
| sms: | |||||
| # (optional) SMS messages without a valid token a routed to this room. | |||||
| # Note that you must invite @smsbot:yourHomeServer to this room. | |||||
| defaultRoomId: "{{ matrix_sms_bridge_default_room }}" | |||||
| templates: | |||||
| # (optional) The message, that will be sent as SMS. Valid placeholders are {sender}, {body} and {token}. | |||||
| outgoingMessage: "{sender} wrote:\n\n{body}\n\nTo answer to this message add this token to your message: {token}" | |||||
| # (optional) The message, that will be sent as SMS, when an incoming SMS didn't contain a valid token | |||||
| # and was routed to a default room. By default no answer will be sent. | |||||
| answerInvalidTokenWithDefaultRoom: "Your token was invalid. The message will be sent to a default matrix room." | |||||
| # (optional) The message, that will be sent as SMS, when an incoming SMS didn't contain a valid token | |||||
| # and no default room is configured. | |||||
| answerInvalidTokenWithoutDefaultRoom: "Your message did not contain any valid token. Nobody will read your message.", | |||||
| # (optional) The message, that will be sent to a matrix room, when sending a bridged message via SMS failed. | |||||
| sendSmsError: "Could not send SMS to this user. Please try it again later." | |||||
| # (optional) The content of bridged SMS message into the default room. Valid placeholders are {sender} and {body}. | |||||
| defaultRoomIncomingMessage: "{sender} wrote:\n{body}" | |||||
| provider: | |||||
| gammu: | |||||
| # (optional) default is disabled | |||||
| enabled: true | |||||
| # (optional) Path to the Gammu-Inbox directory. Default is "/var/spool/gammu/inbox". | |||||
| inboxPath: "{{ matrix_sms_bridge_data_path }}/spool/inbox" | |||||
| # (optional) Path to the directory, where to put processed messages. Default is "/var/spool/gammu/inbox_processed". | |||||
| inboxProcessedPath: "{{ matrix_sms_bridge_data_path }}/spool/inbox_processed" | |||||
| bot: | |||||
| # The domain-part of matrix-ids. E. g. example.org when your userIds look like @unicorn:example.org | |||||
| serverName: {{ matrix_sms_bridge_homserver_domain }} | |||||
| client: | |||||
| homeServer: | |||||
| # The hostname of your Homeserver. | |||||
| hostname: {{ matrix_sms_bridge_homeserver_hostname }} | |||||
| # (optional) The port of your Homeserver. Default is 443. | |||||
| port: {{ matrix_sms_bridge_homeserver_port }} | |||||
| # (optional) Use http or https. Default is true (so uses https). | |||||
| secure: false | |||||
| # The token to authenticate against the Homeserver. | |||||
| token: {{ matrix_sms_bridge_appservice_token }} | |||||
| appservice: | |||||
| # A unique token for Homeservers to use to authenticate requests to this application service. | |||||
| hsToken: {{ matrix_sms_bridge_homeserver_token }} | |||||
| matrix_sms_bridge_configuration_extension_yaml: | | |||||
| # Your custom YAML configuration goes here. | |||||
| # This configuration extends the default starting configuration (`matrix_sms_bridge_configuration_yaml`). | |||||
| # | |||||
| # You can override individual variables from the default configuration, or introduce new ones. | |||||
| # | |||||
| # If you need something more special, you can take full control by | |||||
| # completely redefining `matrix_sms_bridge_configuration_yaml`. | |||||
| matrix_sms_bridge_configuration_extension: "{{ matrix_sms_bridge_configuration_extension_yaml|from_yaml if matrix_sms_bridge_configuration_extension_yaml|from_yaml is mapping else {} }}" | |||||
| matrix_sms_bridge_gammu_configuration: | | |||||
| [gammu] | |||||
| Device = /dev/ttyModem | |||||
| LogFile = {{ matrix_sms_bridge_data_path }}/log/gammu.log | |||||
| debugLevel = 1 | |||||
| [smsd] | |||||
| Service = files | |||||
| LoopSleep = 2 | |||||
| InboxPath = {{ matrix_sms_bridge_data_path }}/spool/inbox/ | |||||
| OutboxPath = {{ matrix_sms_bridge_data_path }}/spool/outbox/ | |||||
| SentSMSPath = {{ matrix_sms_bridge_data_path }}/spool/sent/ | |||||
| ErrorSMSPath = {{ matrix_sms_bridge_data_path }}/spool/error/ | |||||
| InboxFormat = detail | |||||
| OutboxFormat = detail | |||||
| TransmitFormat = auto | |||||
| debugLevel = 1 | |||||
| LogFile = {{ matrix_sms_bridge_data_path }}/log/smsd.log | |||||
| DeliveryReport = log | |||||
| DeliveryReportDelay = 7200 | |||||
| HangupCalls = 1 | |||||
| CheckBattery = 0 | |||||
| matrix_sms_bridge_registration_yaml: | | |||||
| id: sms | |||||
| as_token: "{{ matrix_sms_bridge_appservice_token }}" | |||||
| hs_token: "{{ matrix_sms_bridge_homeserver_token }}" | |||||
| namespaces: | |||||
| users: | |||||
| - exclusive: true | |||||
| regex: '^@sms_.+:{{ matrix_sms_bridge_homserver_domain|regex_escape }}$' | |||||
| url: {{ matrix_sms_bridge_appservice_url }} | |||||
| sender_localpart: smsbot | |||||
| rate_limited: false | |||||
| @@ -0,0 +1,24 @@ | |||||
| # If the matrix-synapse role is not used, `matrix_synapse_role_executed` won't exist. | |||||
| # We don't want to fail in such cases. | |||||
| - name: Fail if matrix-synapse role already executed | |||||
| fail: | |||||
| msg: >- | |||||
| The matrix-sms-bridge role needs to execute before the matrix-synapse role. | |||||
| when: "matrix_sms_bridge_enabled and matrix_synapse_role_executed|default(False)" | |||||
| - set_fact: | |||||
| matrix_systemd_services_list: "{{ matrix_systemd_services_list + ['matrix-sms-bridge','matrix-sms-bridge-database'] }}" | |||||
| when: matrix_sms_bridge_enabled|bool | |||||
| # If the matrix-synapse role is not used, these variables may not exist. | |||||
| - set_fact: | |||||
| matrix_synapse_container_extra_arguments: > | |||||
| {{ matrix_synapse_container_extra_arguments|default([]) }} | |||||
| + | |||||
| ["--mount type=bind,src={{ matrix_sms_bridge_config_path }}/registration.yaml,dst=/matrix-sms-bridge-registration.yaml,ro"] | |||||
| matrix_synapse_app_service_config_files: > | |||||
| {{ matrix_synapse_app_service_config_files|default([]) }} | |||||
| + | |||||
| {{ ["/matrix-sms-bridge-registration.yaml"] }} | |||||
| when: matrix_sms_bridge_enabled|bool | |||||
| @@ -0,0 +1,21 @@ | |||||
| - import_tasks: "{{ role_path }}/tasks/init.yml" | |||||
| tags: | |||||
| - always | |||||
| - import_tasks: "{{ role_path }}/tasks/validate_config.yml" | |||||
| when: "run_setup|bool and matrix_sms_bridge_enabled|bool" | |||||
| tags: | |||||
| - setup-all | |||||
| - setup-matrix-sms-bridge | |||||
| - import_tasks: "{{ role_path }}/tasks/setup_install.yml" | |||||
| when: "run_setup|bool and matrix_sms_bridge_enabled|bool" | |||||
| tags: | |||||
| - setup-all | |||||
| - setup-matrix-sms-bridge | |||||
| - import_tasks: "{{ role_path }}/tasks/setup_uninstall.yml" | |||||
| when: "run_setup|bool and not matrix_sms_bridge_enabled|bool" | |||||
| tags: | |||||
| - setup-all | |||||
| - setup-matrix-sms-bridge | |||||
| @@ -0,0 +1,71 @@ | |||||
| --- | |||||
| - name: Ensure matrix-sms-bridge image is pulled | |||||
| docker_image: | |||||
| name: "{{ matrix_sms_bridge_docker_image }}" | |||||
| source: "{{ 'pull' if ansible_version.major > 2 or ansible_version.minor > 7 else omit }}" | |||||
| force_source: "{{ matrix_sms_bridge_docker_image_force_pull if ansible_version.major > 2 or ansible_version.minor >= 8 else omit }}" | |||||
| force: "{{ omit if ansible_version.major > 2 or ansible_version.minor >= 8 else matrix_sms_bridge_docker_image_force_pull }}" | |||||
| - name: Ensure matrix-sms-bridge databse image is pulled | |||||
| docker_image: | |||||
| name: "{{ matrix_sms_bridge_database_docker_image }}" | |||||
| source: "{{ 'pull' if ansible_version.major > 2 or ansible_version.minor > 7 else omit }}" | |||||
| force_source: "{{ matrix_sms_bridge_database_docker_image_force_pull if ansible_version.major > 2 or ansible_version.minor >= 8 else omit }}" | |||||
| force: "{{ omit if ansible_version.major > 2 or ansible_version.minor >= 8 else matrix_sms_bridge_database_docker_image_force_pull }}" | |||||
| - name: Ensure matrix-sms-bridge paths exist | |||||
| file: | |||||
| path: "{{ item }}" | |||||
| state: directory | |||||
| mode: 0750 | |||||
| owner: "{{ matrix_user_username }}" | |||||
| group: "{{ matrix_user_groupname }}" | |||||
| with_items: | |||||
| - "{{ matrix_sms_bridge_base_path }}" | |||||
| - "{{ matrix_sms_bridge_config_path }}" | |||||
| - "{{ matrix_sms_bridge_data_path }}" | |||||
| - "{{ matrix_sms_bridge_data_spool_path }}" | |||||
| - "{{ matrix_sms_bridge_data_spool_inbox_path }}" | |||||
| - "{{ matrix_sms_bridge_data_spool_inbox_processed_path }}" | |||||
| - "{{ matrix_sms_bridge_data_spool_outbox_path }}" | |||||
| - "{{ matrix_sms_bridge_data_spool_sent_path }}" | |||||
| - "{{ matrix_sms_bridge_data_spool_error_path }}" | |||||
| - "{{ matrix_sms_bridge_database_path }}" | |||||
| - name: Ensure matrix-sms-bridge application.yml installed | |||||
| copy: | |||||
| content: "{{ matrix_sms_bridge_configuration|to_nice_yaml }}" | |||||
| dest: "{{ matrix_sms_bridge_config_path }}/application.yml" | |||||
| mode: 0644 | |||||
| owner: "{{ matrix_user_username }}" | |||||
| group: "{{ matrix_user_groupname }}" | |||||
| - name: Ensure matrix-sms-bridge registration.yaml installed | |||||
| copy: | |||||
| content: "{{ matrix_sms_bridge_registration|to_nice_yaml }}" | |||||
| dest: "{{ matrix_sms_bridge_config_path }}/registration.yaml" | |||||
| mode: 0644 | |||||
| owner: "{{ matrix_user_username }}" | |||||
| group: "{{ matrix_user_groupname }}" | |||||
| - name: Ensure matrix-sms-bridge gammu-smsdrc installed | |||||
| copy: | |||||
| content: "{{ matrix_sms_bridge_registration }}" | |||||
| dest: "{{ matrix_sms_bridge_config_path }}/gammu-smsdrc" | |||||
| mode: 0644 | |||||
| owner: "{{ matrix_user_username }}" | |||||
| group: "{{ matrix_user_groupname }}" | |||||
| - name: Ensure matrix-sms-bridge.service installed | |||||
| template: | |||||
| src: "{{ role_path }}/templates/systemd/matrix-sms-bridge.service.j2" | |||||
| dest: "{{ matrix_systemd_path }}/matrix-sms-bridge.service" | |||||
| mode: 0644 | |||||
| register: matrix_sms_bridge_systemd_service_result | |||||
| - name: Ensure systemd reloaded after matrix-sms-bridge.service installation | |||||
| service: | |||||
| daemon_reload: yes | |||||
| when: "matrix_sms_bridge_systemd_service_result.changed" | |||||
| @@ -0,0 +1,24 @@ | |||||
| --- | |||||
| - name: Check existence of matrix-sms-bridge service | |||||
| stat: | |||||
| path: "{{ matrix_systemd_path }}/matrix-sms-bridge.service" | |||||
| register: matrix_sms_bridge_service_stat | |||||
| - name: Ensure matrix-sms-bridge is stopped | |||||
| service: | |||||
| name: matrix-sms-bridge | |||||
| state: stopped | |||||
| daemon_reload: yes | |||||
| when: "matrix_sms_bridge_service_stat.stat.exists" | |||||
| - name: Ensure matrix-sms-bridge.service doesn't exist | |||||
| file: | |||||
| path: "{{ matrix_systemd_path }}/matrix-sms-bridge.service" | |||||
| state: absent | |||||
| when: "matrix_sms_bridge_service_stat.stat.exists" | |||||
| - name: Ensure systemd reloaded after matrix-sms-bridge.service removal | |||||
| service: | |||||
| daemon_reload: yes | |||||
| when: "matrix_sms_bridge_service_stat.stat.exists" | |||||
| @@ -0,0 +1,12 @@ | |||||
| --- | |||||
| - name: Fail if required settings not defined | |||||
| fail: | |||||
| msg: >- | |||||
| You need to define a required configuration setting (`{{ item }}`). | |||||
| when: "vars[item] == ''" | |||||
| with_items: | |||||
| - "matrix_sms_bridge_appservice_token" | |||||
| - "matrix_sms_bridge_homeserver_token" | |||||
| - "matrix_sms_bridge_database_password" | |||||
| - "matrix_sms_bridge_gammu_modem" | |||||
| @@ -0,0 +1,59 @@ | |||||
| #jinja2: lstrip_blocks: "True" | |||||
| [Unit] | |||||
| Description=matrix-sms-bridge server | |||||
| {% for service in matrix_sms_bridge_systemd_required_services_list %} | |||||
| Requires={{ service }} | |||||
| After={{ service }} | |||||
| {% endfor %} | |||||
| {% for service in matrix_sms_bridge_systemd_wanted_services_list %} | |||||
| Wants={{ service }} | |||||
| {% endfor %} | |||||
| [Service] | |||||
| Type=simple | |||||
| ExecStartPre=-/usr/bin/docker kill matrix-sms-bridge | |||||
| ExecStartPre=-/usr/bin/docker rm matrix-sms-bridge | |||||
| ExecStartPre=-/usr/bin/docker kill matrix-sms-bridge-database | |||||
| ExecStartPre=-/usr/bin/docker rm matrix-sms-bridge-database | |||||
| ExecStartPre=/usr/bin/docker run --rm --name matrix-sms-bridge-database \ | |||||
| --log-driver=none \ | |||||
| --user={{ matrix_user_uid }}:{{ matrix_user_gid }} \ | |||||
| --cap-drop=ALL \ | |||||
| --network={{ matrix_docker_network }} \ | |||||
| {% if matrix_sms_bridge_container_http_host_bind_port %} | |||||
| -p {{ matrix_sms_bridge_container_http_host_bind_port }}:7687 \ | |||||
| {% endif %} | |||||
| -v {{ matrix_sms_bridge_database_path }}:/data:z \ | |||||
| -e NEO4J_AUTH={{ matrix_sms_bridge_database_username }}/{{ matrix_sms_bridge_database_password }} | |||||
| {{ matrix_sms_bridge_database_docker_image }} | |||||
| # Intentional delay, so that the homeserver (we likely depend on) can manage to start. | |||||
| ExecStartPre=/bin/sleep 5 | |||||
| ExecStart=/usr/bin/docker run --rm --name matrix-sms-bridge \ | |||||
| --log-driver=none \ | |||||
| --user={{ matrix_user_uid }}:{{ matrix_user_gid }} \ | |||||
| --cap-drop=ALL \ | |||||
| --network={{ matrix_docker_network }} \ | |||||
| {% if matrix_sms_bridge_container_http_host_bind_port %} | |||||
| -p {{ matrix_sms_bridge_container_http_host_bind_port }}:8080 \ | |||||
| {% endif %} | |||||
| -v {{ matrix_sms_bridge_config_path }}:/config:z \ | |||||
| -v {{ matrix_sms_bridge_data_path }}:/data:z \ | |||||
| --device {{ matrix_sms_bridge_gammu_modem }}:/dev/ttyModem | |||||
| {% for arg in matrix_sms_bridge_container_extra_arguments %} | |||||
| {{ arg }} \ | |||||
| {% endfor %} | |||||
| {{ matrix_sms_bridge_docker_image }} | |||||
| ExecStop=-/usr/bin/docker kill matrix-sms-bridge | |||||
| ExecStop=-/usr/bin/docker rm matrix-sms-bridge | |||||
| ExecStop=-/usr/bin/docker kill matrix-sms-database | |||||
| ExecStop=-/usr/bin/docker rm matrix-sms-database | |||||
| Restart=always | |||||
| RestartSec=30 | |||||
| SyslogIdentifier=matrix-sms-bridge | |||||
| [Install] | |||||
| WantedBy=multi-user.target | |||||