1*4882a593Smuzhiyun#!/usr/bin/env python3 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# BitBake Toaster Implementation 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun# Copyright (C) 2015 Intel Corporation 6*4882a593Smuzhiyun# 7*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only 8*4882a593Smuzhiyun# 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun"""Custom management command checksocket.""" 11*4882a593Smuzhiyun 12*4882a593Smuzhiyunimport errno 13*4882a593Smuzhiyunimport socket 14*4882a593Smuzhiyun 15*4882a593Smuzhiyunfrom django.core.management.base import BaseCommand, CommandError 16*4882a593Smuzhiyunfrom django.utils.encoding import force_text 17*4882a593Smuzhiyun 18*4882a593SmuzhiyunDEFAULT_ADDRPORT = "0.0.0.0:8000" 19*4882a593Smuzhiyun 20*4882a593Smuzhiyunclass Command(BaseCommand): 21*4882a593Smuzhiyun """Custom management command.""" 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun help = 'Check if Toaster can listen on address:port' 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun def add_arguments(self, parser): 26*4882a593Smuzhiyun parser.add_argument('addrport', nargs='?', default=DEFAULT_ADDRPORT, 27*4882a593Smuzhiyun help='ipaddr:port to check, %s by default' % \ 28*4882a593Smuzhiyun DEFAULT_ADDRPORT) 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun def handle(self, *args, **options): 31*4882a593Smuzhiyun addrport = options['addrport'] 32*4882a593Smuzhiyun if ':' not in addrport: 33*4882a593Smuzhiyun raise CommandError('Invalid addr:port specified: %s' % addrport) 34*4882a593Smuzhiyun splitted = addrport.split(':') 35*4882a593Smuzhiyun try: 36*4882a593Smuzhiyun splitted[1] = int(splitted[1]) 37*4882a593Smuzhiyun except ValueError: 38*4882a593Smuzhiyun raise CommandError('Invalid port specified: %s' % splitted[1]) 39*4882a593Smuzhiyun self.stdout.write('Check if toaster can listen on %s' % addrport) 40*4882a593Smuzhiyun try: 41*4882a593Smuzhiyun sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 42*4882a593Smuzhiyun sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 43*4882a593Smuzhiyun sock.bind(tuple(splitted)) 44*4882a593Smuzhiyun except (socket.error, OverflowError) as err: 45*4882a593Smuzhiyun errors = { 46*4882a593Smuzhiyun errno.EACCES: 'You don\'t have permission to access port %s' \ 47*4882a593Smuzhiyun % splitted[1], 48*4882a593Smuzhiyun errno.EADDRINUSE: 'Port %s is already in use' % splitted[1], 49*4882a593Smuzhiyun errno.EADDRNOTAVAIL: 'IP address can\'t be assigned to', 50*4882a593Smuzhiyun } 51*4882a593Smuzhiyun if hasattr(err, 'errno') and err.errno in errors: 52*4882a593Smuzhiyun errtext = errors[err.errno] 53*4882a593Smuzhiyun else: 54*4882a593Smuzhiyun errtext = force_text(err) 55*4882a593Smuzhiyun raise CommandError(errtext) 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun self.stdout.write("OK") 58