Skip to content

Commit

Permalink
incorrect user set bug
Browse files Browse the repository at this point in the history
broadcast errror on no network
  • Loading branch information
witlox committed Jul 1, 2019
1 parent 1408514 commit 88aefda
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 13 deletions.
7 changes: 5 additions & 2 deletions dcron/application.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ def main():
parser.add_argument('-p', '--storage-path', default=None, help='directory where to store cache')
parser.add_argument('-u', '--udp-communication-port', type=int, default=12345, help='communication port (default: 12345)')
parser.add_argument('-c', '--cron', default=None, help='crontab to use (default: /etc/crontab, use `memory` to not save to file')
parser.add_argument('-d', '--cron-user', default=None, help='user to user for storing cron entries')
parser.add_argument('-d', '--cron-user', default=None, help='user for storing cron entries')
parser.add_argument('-w', '--web-port', type=int, default=8080, help='web hosting port (default: 8080)')
parser.add_argument('-n', '--ntp-server', default='pool.ntp.org', help='NTP server to detect clock skew (default: pool.ntp.org)')
parser.add_argument('-s', '--node-staleness', type=int, default=180, help='Time in seconds of non-communication for a node to be marked as stale (defailt: 180s)')
Expand Down Expand Up @@ -155,7 +155,10 @@ async def save_schedule():

logger.info("starting web application server on http://{0}:{1}/".format(get_ip(), args.web_port))

s = Site(storage, args.udp_communication_port, cron=processor.cron, hash_key=hash_key)
if args.cron_user:
s = Site(storage, args.udp_communication_port, cron=processor.cron, user=args.cron_user, hash_key=hash_key)
else:
s = Site(storage, args.udp_communication_port, cron=processor.cron, hash_key=hash_key)
runner = AppRunner(s.app)
loop.run_until_complete(runner.setup())
site_instance = TCPSite(runner, port=args.web_port)
Expand Down
18 changes: 10 additions & 8 deletions dcron/datagram/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,19 @@ def client(port, data):
logger = logging.getLogger('udp_client')

addr = ('255.255.255.255', port)
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

if hasattr(socket, 'SO_BROADCAST'):
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as udp_socket:

if udp_socket.sendto(data, addr):
logger.debug("sent data {0} to port {1}".format(data, port))
else:
logger.warning("failed to send data to port {0}".format(port))
if hasattr(socket, 'SO_BROADCAST'):
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

udp_socket.close()
try:
if udp_socket.sendto(data, addr):
logger.debug("sent data {0} to port {1}".format(data, port))
else:
logger.warning("failed to send data to port {0}".format(port))
except OSError as e:
logger.error("failure sending UDP data: {0}".format(e))


def broadcast(udp_port, packets):
Expand Down
2 changes: 1 addition & 1 deletion dcron/processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ def add_job(self, new_job):
new_job.user = self.user
if self.cron and not new_job.cron:
new_job.cron = self.cron
self.logger.info("adding job {0} to cron {1}".format(new_job, self.cron.filename))
self.logger.info("adding job {0} to cron {1} for user {2}".format(new_job, self.cron.filename, new_job.user))
self.cron.append(new_job)
self.cron.write()
else:
Expand Down
5 changes: 5 additions & 0 deletions dcron/protocols/udpserializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

import logging
import pickle
import hashlib
import hmac
Expand All @@ -38,6 +39,8 @@ class UdpSerializer(object):
"""
Serialization methods for UDP Packets
"""

logger = logging.getLogger(__name__)

@staticmethod
def dump(obj, hash_key=None):
Expand Down Expand Up @@ -76,6 +79,7 @@ def load(data, hash_key=None):
given = [i.index for i in packets]
missing = [x for x in expected if x not in given]
if len(missing) > 0:
UdpSerializer.logger.debug("packet validation failed, probably partial")
return None
# validation passed
buffer = b''
Expand All @@ -86,5 +90,6 @@ def load(data, hash_key=None):
if digest == hmac.new(hash_key.encode('utf-8'), data, hashlib.sha1).digest():
return pickle.loads(data)
else:
UdpSerializer.logger.warning("invalid message signature")
return None
return pickle.loads(buffer)
7 changes: 6 additions & 1 deletion dcron/site.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,11 @@ class Site(object):

root = pathlib.Path(__file__).parent

def __init__(self, storage, udp_port, cron=None, hash_key=None):
def __init__(self, storage, udp_port, cron=None, user=None, hash_key=None):
self.cron = cron
self.storage = storage
self.udp_port = udp_port
self.user = user
self.hash_key = hash_key
self.app = web.Application()
aiohttp_jinja2.setup(self.app, loader=jinja2.PackageLoader('dcron', 'templates'))
Expand Down Expand Up @@ -293,6 +294,10 @@ async def import_data(self, request):
def generate_cron_item(self, data, removable=False):

cron_item = CronItem(command=data['command'])
if self.user:
cron_item.user = self.user
else:
cron_item.user = 'root'
cron_item.remove = removable

pattern = '{0} {1} {2} {3} {4}'.format(data['minute'], data['hour'], data['dom'], data['month'], data['dow'])
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

from setuptools import setup

version = "0.9.12"
version = "0.9.13"

requirements = ['aiohttp',
'aiofiles',
Expand Down

0 comments on commit 88aefda

Please sign in to comment.