예제 #1
0
    def handleClient(self, conn, addr):
        trans = Transfer(conn)
        username = trans.recvData().decode()
        if username in self.clients:
            trans.send(b"in-use")
            return
        self.clients[username] = trans
        print(f"{username} has connected!")
        trans.send(b"success")

        while True:
            raw = trans.recvData()

            if not raw: break
            if raw == b"drop": break

            data = pickle.loads(raw)

            if data["type"] == "msg":
                msg = data["content"]
                date = datetime.datetime.now().strftime("%d-%m-%Y %H:%M")
                data = {"type": "msg", "sender": username, "date": date, 
                    "content": msg}
                self.sendAll(pickle.dumps(data))

        print(f"{username} has disconnected.")
        del self.clients[username]
예제 #2
0
class Client:
    def __init__(self, addr, api, username):
        self.addr = addr
        self.api = api
        self.username = username
        self.connected = False

    def connect(self):
        self.s = socket.socket()
        self.s.settimeout(5)
        try:
            self.s.connect(self.addr)
        except socket.error:
            return "Server not found. Try again."

        self.trans = Transfer(self.s)
        self.trans.send(self.username.encode())
        response = self.trans.recvData()
        if not response:
            return "Server not responding."
        if response == b"in-use":
            return "Username already in use."
        if response == b"success":
            self.s.settimeout(None)
            self.connected = True
            self.s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 5000, 3000))
            threading.Thread(target=self.mainThread, daemon=True).start()
            return True

    def disconnect(self):
        self.trans.send(b"drop")
        self.connected = False

    def sendMessage(self, content):
        data = {"type": "msg", "content": content}
        self.trans.sendDataPickle(data)

    def mainThread(self):
        while self.connected:
            raw = self.trans.recvData()
            if not raw:
                break
            if raw == b"drop":
                self.api.disconnection("Server closed connection.")
                return

            data = pickle.loads(raw)
            if data["type"] == "msg":
                if data["sender"] == self.username:
                    self.api.addMessage(data["content"], "true", data["date"],
                                        "Me")
                else:
                    self.api.addMessage(data["content"], "false", data["date"],
                                        data["sender"])
        else:
            return

        self.api.disconnection("Connection lost.")
예제 #3
0
def main():
    pm.COMMANDLINE = True
    args = parse_args()

    pwd = None

    try:
        if not args.free:
            if KEYRING:
                pwd = keyring.get_password('pyfilemail', args.username)

            elif pm.NETRC:
                machine = pm._netrc.authenticators(args.username)
                if machine:
                    pwd = machine[2]

                else:
                    pwd = None

            if pwd is None:
                pwd = getpass.getpass('Please enter Filemail password: '******'pyfilemail', args.username, pwd)

        fm_user = User(args.username, password=pwd)

        transfer = Transfer(
            fm_user,
            to=args.to,
            subject=args.subject,
            message=args.message,
            notify=args.notify,
            confirmation=args.confirm,
            days=args.days,
            downloads=args.downloads,
            password=args.password,
            checksum=args.checksum,
            zip_=args.compress
            )

        transfer.add_files(args.payload)

        res = transfer.send()

        if res.status_code == 200:
            msg = '\nTransfer complete!'
            logger.info(msg)

    except KeyboardInterrupt:
        msg = '\nAborted by user!'
        logger.warning(msg)
예제 #4
0
class pyUpdater:
    def __init__(self, verbose=False):
        self.classname = "pyUpdater"
        self.version = "0.1"
        self.configdir = "/opt/pyUpdater"
        self.configfile = "conf/pyUpdater.json"
        self.configCustomFile = ""
        self.verbose = verbose
        self.loadConfig()
        logging.basicConfig(filename=self.config['logfile'],
                            level=self.config['loglevel'],
                            format=self.config['logformat'])
        self.preservefile = self.config['whitelist'].split(';')
        self.createTmpDir()

        # INIT transfer module
        self.tr = Tr()
        self.init_transfer()

    def loadConfig(self):
        print(self.configCustomFile)
        if (self.configCustomFile == ""):
            with open(self.configdir + '/' + self.configfile, 'r') as f:
                self.config = json.load(f)
        else:
            with open(self.configCustomFile, 'r') as f:
                self.config = json.load(f)

    def setConfigFile(self, path):
        self.configCustomFile = path
        self.loadConfig()

    def init_transfer(self):
        self.tr.server = self.config['transfer']['server']
        self.tr.username = self.config['transfer']['username']
        self.tr.password = self.config['transfer']['password']

    def createTmpDir(self):
        self.tmpdir = td.mkdtemp()
        self.log("Create temporary directory: " + self.tmpdir)

    def extractUpdate(self):
        self.log("Extract update!")
        archive_name = os.path.join(self.tmpdir, self.config['updatefile'])
        shutil.unpack_archive(archive_name, self.config['dstdir'])

    def backup(self):
        archive_name = os.path.join(self.config['backupdir'], 'backup')
        shutil.make_archive(archive_name, 'gztar', self.config['dstdir'])
        self.log("Create backup file: " + archive_name + ".tar.gz")

    def restore(self):
        archive_name = os.path.join(self.config['backupdir'],
                                    'backup') + '.tar.gz'
        shutil.unpack_archive(archive_name, self.config['dstdir'])
        self.log("Restored file in " + archive_name + ".tar.gz to " +
                 self.config['dstdir'])

    def update(self):
        if self.checkupdate():
            self.log("New update present. Start updating ...")
            self.backup_whitelist()
            self.remove_old_file()
            self.extractUpdate()
            self.restore_whitelist()
        else:
            self.log("New version not found!")
            quit(0)

    def dump(self):
        self.log("Dump database")
        self.dump_database()
        self.tr.send(self.config['backupdir'] + self.dumpname,
                     "/tmp" + self.dumpname)

    def restoredump(self):
        self.log("Restore database from dump")
        self.restore_database()
        # todo: remote copy

    def checkupdate(self):
        self.log("Start update procedure.")
        url = self.config['updateserver'] + "/" + self.config['updatefile']
        r = requests.get(url)
        if r.status_code != 200:
            self.log("Update not present. Error code: " +
                     r.status_code.__str__())
            return False
        else:
            with open(os.path.join(self.tmpdir, self.config['updatefile']),
                      'wb') as f:
                f.write(r.content)
        return True

    def backup_whitelist(self):
        for f in self.preservefile:
            self.log("Save file: " + os.path.join(self.config['dstdir'], f))
            shutil.copy2(os.path.join(self.config['dstdir'], f),
                         self.tmpdir + '/')

    def restore_whitelist(self):
        for f in self.preservefile:
            self.log("Restore file: " + os.path.join(self.config['dstdir'], f))
            filename = os.path.basename(self.tmpdir + '/' + f)
            shutil.copy2(self.tmpdir + '/' + filename,
                         os.path.join(self.config['dstdir'], f))

    def remove_old_file(self):
        for r, d, f in os.walk(self.config['dstdir']):
            for file in f:
                os.remove(os.path.join(r, file))

    def dump_database(self):
        try:
            timestamp = str(int(time.time()))
            self.dumpname = "/dump_" + self.config[
                'db_name'] + "_" + timestamp + ".sql.gz"
            p = subprocess.Popen("mysqldump -h " + self.config['db_host'] +
                                 " -u " + self.config['db_user'] + " -p" +
                                 self.config['db_pass'] + " " +
                                 self.config['db_name'] + " | gzip > " +
                                 self.config['backupdir'] + self.dumpname,
                                 shell=True)
            # Wait for completion
            p.communicate()
            # Check for errors
            if (p.returncode != 0):
                raise "Backup return code: " + p.returncode
            self.log("Backup done for " + self.config['db_name'])
        except:
            self.log("Backup failed for " + self.config['db_name'])

    def restore_database(self):
        try:
            # trovare ultimo dump sotto la directory dei backup
            list_of_files = glob.glob(self.config['backupdir'] + '/*.sql.gz')
            latest_file = max(list_of_files, key=os.path.getctime)
            if latest_file != '':
                p = subprocess.Popen("zcat  " + latest_file + " | mysql -h " +
                                     self.config['db_host'] + " -u " +
                                     self.config['db_user'] + " -p" +
                                     self.config['db_pass'] + " " +
                                     self.config['db_name'],
                                     shell=True)
                # Wait for completion
                p.communicate()
                # Check for errors
                if p.returncode != 0:
                    raise "Restore return code: " + p.returncode
                self.log("Restore done for " + latest_file)
            # no dump found
            else:
                self.log("No dumps found in " + self.config['backupdir'] +
                         ". Cannot restore anything, sorry.")
        except:
            self.log("Restore failed for " + latest_file)

    def log(self, msg, level='debug'):
        if self.verbose:
            print(msg)
        logging.debug(msg)

    def test(self):
        # check if destination directory exist and is writeable
        print("")
        print("-------------------# CHECK FILESYSTEM #-------------------")
        if os.path.exists(self.config['dstdir']):
            print(bcolors.OKBLUE + '[ok]' + bcolors.ENDC,
                  self.config['dstdir'] + ' exist.')
            if os.access(self.config['dstdir'], os.W_OK):
                print(bcolors.OKBLUE + '[ok]' + bcolors.ENDC,
                      self.config['dstdir'] + ' is writeable.')
            else:
                print(bcolors.FAIL + '[fail]' + bcolors.ENDC,
                      self.config['dstdir'] + ' is not writeable.')
        else:
            print(bcolors.FAIL + '[fail]' + bcolors.ENDC,
                  self.config['dstdir'] + ' not exist. Create this folder.')

        # check if backup directory exist and is writeable
        if os.path.exists(self.config['backupdir']):
            print(bcolors.OKBLUE + '[ok]' + bcolors.ENDC,
                  self.config['backupdir'] + ' exist.')
            if os.access(self.config['backupdir'], os.W_OK):
                print(bcolors.OKBLUE + '[ok]' + bcolors.ENDC,
                      self.config['backupdir'] + ' is writeable.')
            else:
                print(bcolors.FAIL + '[fail]' + bcolors.ENDC,
                      self.config['backupdir'] + ' is not writeable.')
        else:
            print(bcolors.FAIL + '[fail]' + bcolors.ENDC,
                  self.config['backupdir'] + ' not exist. Create this folder.')

        # check if config file exists and readable
        if os.path.exists(self.configdir + '/' + self.configfile):
            print(bcolors.OKBLUE + '[ok]' + bcolors.ENDC,
                  self.configdir + '/' + self.configfile + ' exist.')
            if os.access(self.configdir + '/' + self.configfile, os.R_OK):
                print(bcolors.OKBLUE + '[ok]' + bcolors.ENDC,
                      self.configdir + '/' + self.configfile + ' is readable.')
            else:
                print(
                    bcolors.FAIL + '[fail]' + bcolors.ENDC, self.configdir +
                    '/' + self.configfile + ' is not readable.')
        else:
            print(
                bcolors.FAIL + '[fail]' + bcolors.ENDC, self.configdir + '/' +
                self.configfile + ' not exist. Create this folder.')

        print("----------------------# END #-----------------------------")
        print("")
        print("")
        print("---------------------# DB CHECK #-------------------------")
        # check database connection
        try:
            connection = mysql.connector.connect(
                host=self.config['db_host'],
                database=self.config['db_name'],
                user=self.config['db_user'],
                password=self.config['db_pass'])
            if connection.is_connected():
                db_info = connection.get_server_info()
                print(
                    bcolors.OKBLUE + '[ok]' + bcolors.ENDC +
                    " connected to MySQL database... MySQL Server version on ",
                    db_info)
                cursor = connection.cursor()
                cursor.execute("select database();")
                record = cursor.fetchone()
                print("Your connected to - ", record)
        except Error as e:
            print(bcolors.FAIL + '[fail]' + bcolors.ENDC +
                  " error while connecting to MySQL")
            pass

        print("----------------------# END #-----------------------------")
        print("")
        print("")
        print("---------------------# SSH CHECK #-------------------------")
        if self.tr.checkconnection():
            print(
                bcolors.OKBLUE + '[ok]' + bcolors.ENDC,
                'server: ' + self.tr.server + ' and user: '******' - connection succesfuly.')
        else:
            print(
                bcolors.FAIL + '[fail]' + bcolors.ENDC,
                'server: ' + self.tr.server + ' and user: '******' - connection failed.')
        print("----------------------# END #-----------------------------")
        print("")

    def __del__(self):
        shutil.rmtree(self.tmpdir)